From c772ff511d91ea30ceffa3eb2e2346dd29e6772b Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 12:19:09 -0800 Subject: [PATCH 001/215] Make sure airdates are > 1 (really 693595) in webapi to stop erroring when unaired episodes are asked for info Fixes https://github.com/SiCKRAGETV/sickrage-issues/issues/3512 --- sickbeard/webapi.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 0220b2e72..f2420e539 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -749,10 +749,15 @@ class CMD_Episode(ApiCall): episode["location"] = episode["location"][showPathLength:] elif not showPath: # show dir is broken ... episode path will be empty episode["location"] = "" + # convert stuff to human form - episode['airdate'] = sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting( - network_timezones.parse_date_time(int(episode['airdate']), showObj.airs, showObj.network)), - d_preset=dateFormat) + if helpers.tryInt(episode['airdate'], 1) > 693595: # 1900 + episode['airdate'] = sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting( + network_timezones.parse_date_time(int(episode['airdate']), showObj.airs, showObj.network)), + d_preset=dateFormat) + else: + episode['airdate'] = 'Never' + status, quality = Quality.splitCompositeStatus(int(episode["status"])) episode["status"] = _get_status_Strings(status) episode["quality"] = get_quality_string(quality) @@ -1915,7 +1920,7 @@ class CMD_Show(ApiCall): showDict["network"] = "" showDict["status"] = showObj.status - if showObj.nextaired: + if helpers.tryInt(showObj.nextaired, 1) > 693595: dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( network_timezones.parse_date_time(showObj.nextaired, showDict['airs'], showDict['network'])) showDict['airs'] = sbdatetime.sbdatetime.sbftime(dtEpisodeAirs, t_preset=timeFormat).lstrip('0').replace( @@ -2529,9 +2534,12 @@ class CMD_ShowSeasons(ApiCall): status, quality = Quality.splitCompositeStatus(int(row["status"])) row["status"] = _get_status_Strings(status) row["quality"] = get_quality_string(quality) - dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( - network_timezones.parse_date_time(row['airdate'], showObj.airs, showObj.network)) - row['airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) + if helpers.tryInt(row['airdate'], 1) > 693595: # 1900 + dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( + network_timezones.parse_date_time(row['airdate'], showObj.airs, showObj.network)) + row['airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) + else: + row['airdate'] = 'Never' curSeason = int(row["season"]) curEpisode = int(row["episode"]) del row["season"] @@ -2553,9 +2561,12 @@ class CMD_ShowSeasons(ApiCall): status, quality = Quality.splitCompositeStatus(int(row["status"])) row["status"] = _get_status_Strings(status) row["quality"] = get_quality_string(quality) - dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( - network_timezones.parse_date_time(row['airdate'], showObj.airs, showObj.network)) - row['airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) + if helpers.tryInt(row['airdate'], 1) > 693595: # 1900 + dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( + network_timezones.parse_date_time(row['airdate'], showObj.airs, showObj.network)) + row['airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) + else: + row['airdate'] = 'Never' if not curEpisode in seasons: seasons[curEpisode] = {} seasons[curEpisode] = row @@ -2812,7 +2823,7 @@ class CMD_Shows(ApiCall): "subtitles": (0, 1)[curShow.subtitles], } - if curShow.nextaired: + if helpers.tryInt(curShow.nextaired, 1) > 693595: # 1900 dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( network_timezones.parse_date_time(curShow.nextaired, curShow.airs, showDict['network'])) showDict['next_ep_airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) -- GitLab From 3ee22fe9711cd9a4641a49140268ebf18e7cb134 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 14:59:59 -0800 Subject: [PATCH 002/215] Fix setting home layout. Will be more issues popping up now that mako cache is working! --- gui/slick/views/home.mako | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako index 667736fad..5e963666e 100644 --- a/gui/slick/views/home.mako +++ b/gui/slick/views/home.mako @@ -10,7 +10,6 @@ myDB = db.DBConnection() today = str(datetime.date.today().toordinal()) - layout = sickbeard.HOME_LAYOUT status_quality = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')' status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + Quality.ARCHIVED]) + ')' @@ -54,24 +53,24 @@ % endif <div id="HomeLayout" class="pull-right hidden-print" style="margin-top: -40px;"> - % if layout != 'poster': + % if sickbeard.HOME_LAYOUT != 'poster': <button id="popover" type="button" class="btn btn-inline">Select Columns <b class="caret"></b></button> % endif <span> Layout: <select name="layout" class="form-control form-control-inline input-sm" onchange="location = this.options[this.selectedIndex].value;"> - <option value="${srRoot}/setHomeLayout/?layout=poster" ${('', 'selected="selected"')[layout == 'poster']}>Poster</option> - <option value="${srRoot}/setHomeLayout/?layout=small" ${('', 'selected="selected"')[layout == 'small']}>Small Poster</option> - <option value="${srRoot}/setHomeLayout/?layout=banner" ${('', 'selected="selected"')[layout == 'banner']}>Banner</option> - <option value="${srRoot}/setHomeLayout/?layout=simple" ${('', 'selected="selected"')[layout == 'simple']}>Simple</option> + <option value="${srRoot}/setHomeLayout/?layout=poster" ${('', 'selected="selected"')[sickbeard.HOME_LAYOUT == 'poster']}>Poster</option> + <option value="${srRoot}/setHomeLayout/?layout=small" ${('', 'selected="selected"')[sickbeard.HOME_LAYOUT == 'small']}>Small Poster</option> + <option value="${srRoot}/setHomeLayout/?layout=banner" ${('', 'selected="selected"')[sickbeard.HOME_LAYOUT == 'banner']}>Banner</option> + <option value="${srRoot}/setHomeLayout/?layout=simple" ${('', 'selected="selected"')[sickbeard.HOME_LAYOUT == 'simple']}>Simple</option> </select> - % if layout != 'poster': + % if sickbeard.HOME_LAYOUT != 'poster': Search: <input class="search form-control form-control-inline input-sm input200" type="search" data-column="2" placeholder="Search Show Name"> <button type="button" class="resetsorting btn btn-inline">Reset Search</button> % endif </span> - % if layout == 'poster': + % if sickbeard.HOME_LAYOUT == 'poster': <span> Sort By: <select id="postersort" class="form-control form-control-inline input-sm"> @@ -99,8 +98,8 @@ % if curListType == "Anime": <h1 class="header">Anime List</h1> % endif -% if layout == 'poster': -<div id="${('container', 'container-anime')[curListType == 'Anime' and layout == 'poster']}" class="clearfix"> +% if sickbeard.HOME_LAYOUT == 'poster': +<div id="${('container', 'container-anime')[curListType == 'Anime' and sickbeard.HOME_LAYOUT == 'poster']}" class="clearfix"> <div class="posterview"> % for curLoadingShow in sickbeard.showQueueScheduler.action.loadingShowList: % if curLoadingShow.show == None: @@ -220,7 +219,7 @@ </td> <td class="show-table"> - % if layout != 'simple': + % if sickbeard.HOME_LAYOUT != 'simple': % if curShow.network: <span title="${curShow.network}"><img class="show-network-image" src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=network" alt="${curShow.network}" title="${curShow.network}" /></span> % else: @@ -377,28 +376,28 @@ <td align="center" class="nowrap"></td> % endif - % if layout == 'small': + % if sickbeard.HOME_LAYOUT == 'small': <td class="tvShow"> - <div class="imgsmallposter ${layout}"> + <div class="imgsmallposter ${sickbeard.HOME_LAYOUT}"> <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}" title="${curShow.name}"> - <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=poster_thumb" class="${layout}" alt="${curShow.indexerid}"/> + <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=poster_thumb" class="${sickbeard.HOME_LAYOUT}" alt="${curShow.indexerid}"/> </a> <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}" style="vertical-align: middle;">${curShow.name}</a> </div> </td> - % elif layout == 'banner': + % elif sickbeard.HOME_LAYOUT == 'banner': <td> <span style="display: none;">${curShow.name}</span> - <div class="imgbanner ${layout}"> + <div class="imgbanner ${sickbeard.HOME_LAYOUT}"> <a href="${srRoot}/home/displayShow?show=${curShow.indexerid}"> - <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=banner" class="${layout}" alt="${curShow.indexerid}" title="${curShow.name}"/> + <img src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=banner" class="${sickbeard.HOME_LAYOUT}" alt="${curShow.indexerid}" title="${curShow.name}"/> </div> </td> - % elif layout == 'simple': + % elif sickbeard.HOME_LAYOUT == 'simple': <td class="tvShow"><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></td> % endif - % if layout != 'simple': + % if sickbeard.HOME_LAYOUT != 'simple': <td align="center"> % if curShow.network: <span title="${curShow.network}" class="hidden-print"><img id="network" width="54" height="27" src="${srRoot}/showPoster/?show=${curShow.indexerid}&which=network" alt="${curShow.network}" title="${curShow.network}" /></span> -- GitLab From 4f1a13b3a4c0295aba67b47508515abf9154d3d1 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 16:49:51 -0800 Subject: [PATCH 003/215] Fix show download statistics (downloaded, snatched, totals) cache issue Move SQL out of home.mako. Replaces #2635 --- gui/slick/views/home.mako | 30 ------------------------------ sickbeard/webserve.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako index 5e963666e..33b95391c 100644 --- a/gui/slick/views/home.mako +++ b/gui/slick/views/home.mako @@ -7,36 +7,6 @@ from sickbeard import db, sbdatetime, network_timezones import datetime import re - - myDB = db.DBConnection() - today = str(datetime.date.today().toordinal()) - - status_quality = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')' - status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + Quality.ARCHIVED]) + ')' - - sql_statement = 'SELECT showid, ' - - sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + status_quality + ') AS ep_snatched, ' - sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + status_download + ') AS ep_downloaded, ' - sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 ' - sql_statement += ' AND ((airdate <= ' + today + ' AND (status = ' + str(SKIPPED) + ' OR status = ' + str(WANTED) + ' OR status = ' + str(FAILED) + ')) ' - sql_statement += ' OR (status IN ' + status_quality + ') OR (status IN ' + status_download + '))) AS ep_total, ' - - sql_statement += ' (SELECT airdate FROM tv_episodes WHERE showid=tv_eps.showid AND airdate >= ' + today + ' AND (status = ' + str(UNAIRED) + ' OR status = ' + str(WANTED) + ') ORDER BY airdate ASC LIMIT 1) AS ep_airs_next, ' - sql_statement += ' (SELECT airdate FROM tv_episodes WHERE showid=tv_eps.showid AND airdate > 1 AND status <> ' + str(UNAIRED) + ' ORDER BY airdate DESC LIMIT 1) AS ep_airs_prev ' - sql_statement += ' FROM tv_episodes tv_eps GROUP BY showid' - - sql_result = myDB.select(sql_statement) - - show_stat = {} - max_download_count = 1000 - - for cur_result in sql_result: - show_stat[cur_result['showid']] = cur_result - if cur_result['ep_total'] > max_download_count: - max_download_count = cur_result['ep_total'] - - max_download_count = max_download_count * 100 %> <%block name="metas"> <meta data-var="max_download_count" data-content="${max_download_count}"> diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 69689ea9c..5b98cfd52 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -673,7 +673,42 @@ class Home(WebRoot): else: showlists = [["Shows", sickbeard.showList]] - return t.render(title="Home", header="Show List", topmenu="home", showlists=showlists) + stats = self.show_statistics() + return t.render(title="Home", header="Show List", topmenu="home", showlists=showlists, show_stat=stats[0], max_download_count=stats[1]) + + @staticmethod + def show_statistics(): + myDB = db.DBConnection() + today = str(datetime.date.today().toordinal()) + + status_quality = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')' + status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + Quality.ARCHIVED]) + ')' + + sql_statement = 'SELECT showid, ' + + sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + status_quality + ') AS ep_snatched, ' + sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + status_download + ') AS ep_downloaded, ' + sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 ' + sql_statement += ' AND ((airdate <= ' + today + ' AND (status = ' + str(SKIPPED) + ' OR status = ' + str(WANTED) + ' OR status = ' + str(FAILED) + ')) ' + sql_statement += ' OR (status IN ' + status_quality + ') OR (status IN ' + status_download + '))) AS ep_total, ' + + sql_statement += ' (SELECT airdate FROM tv_episodes WHERE showid=tv_eps.showid AND airdate >= ' + today + ' AND (status = ' + str(UNAIRED) + ' OR status = ' + str(WANTED) + ') ORDER BY airdate ASC LIMIT 1) AS ep_airs_next, ' + sql_statement += ' (SELECT airdate FROM tv_episodes WHERE showid=tv_eps.showid AND airdate > 1 AND status <> ' + str(UNAIRED) + ' ORDER BY airdate DESC LIMIT 1) AS ep_airs_prev ' + sql_statement += ' FROM tv_episodes tv_eps GROUP BY showid' + + sql_result = myDB.select(sql_statement) + + show_stat = {} + max_download_count = 1000 + for cur_result in sql_result: + show_stat[cur_result['showid']] = cur_result + if cur_result['ep_total'] > max_download_count: + max_download_count = cur_result['ep_total'] + + max_download_count *= 100 + + return show_stat, max_download_count + def is_alive(self, *args, **kwargs): if 'callback' in kwargs and '_' in kwargs: -- GitLab From bda03f4af8ff08ccd61697fb07cee137055bbe40 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 22:26:22 -0800 Subject: [PATCH 004/215] Remove feedcache, update feedparser --- lib/feedcache/__init__.py | 44 - lib/feedcache/cache.py | 212 - lib/feedcache/cachestoragelock.py | 69 - lib/feedcache/example.py | 63 - lib/feedcache/example_threads.py | 144 - lib/feedcache/test_cache.py | 323 -- lib/feedcache/test_cachestoragelock.py | 90 - lib/feedcache/test_server.py | 241 -- lib/feedcache/test_shovefilesystem.py | 89 - lib/feedparser/__init__.py | 44 + lib/feedparser/api.py | 247 ++ lib/feedparser/datetimes/__init__.py | 41 + lib/feedparser/datetimes/asctime.py | 32 + lib/feedparser/datetimes/greek.py | 56 + lib/feedparser/datetimes/hungarian.py | 43 + lib/feedparser/datetimes/iso8601.py | 120 + lib/feedparser/datetimes/korean.py | 47 + lib/feedparser/datetimes/perforce.py | 25 + lib/feedparser/datetimes/rfc822.py | 109 + lib/feedparser/datetimes/w3dtf.py | 88 + lib/feedparser/encodings.py | 279 ++ lib/feedparser/exceptions.py | 52 + lib/feedparser/feedparser.py | 3820 ----------------- lib/feedparser/feedparsertest.py | 871 ---- lib/feedparser/html.py | 213 + lib/feedparser/http.py | 231 + lib/feedparser/mixin.py | 754 ++++ lib/feedparser/namespaces/__init__.py | 0 lib/feedparser/namespaces/_base.py | 499 +++ lib/feedparser/namespaces/admin.py | 55 + lib/feedparser/namespaces/cc.py | 71 + lib/feedparser/namespaces/dc.py | 136 + lib/feedparser/namespaces/georss.py | 264 ++ lib/feedparser/namespaces/itunes.py | 111 + lib/feedparser/namespaces/mediarss.py | 142 + lib/feedparser/namespaces/psc.py | 72 + lib/feedparser/parsers/__init__.py | 0 lib/feedparser/parsers/loose.py | 72 + lib/feedparser/parsers/strict.py | 135 + lib/feedparser/sanitizer.py | 466 ++ lib/feedparser/sgml.py | 76 + lib/feedparser/sgmllib.py | 547 --- .../tests/compression/deflate-no-headers.z | Bin 50 -> 0 bytes .../compression/deflate-not-compressed.z | 1 - lib/feedparser/tests/compression/deflate.z | Bin 56 -> 0 bytes .../tests/compression/gzip-not-compressed.gz | Bin 32 -> 0 bytes .../tests/compression/gzip-struct-error.gz | Bin 79 -> 0 bytes lib/feedparser/tests/compression/gzip.gz | Bin 79 -> 0 bytes lib/feedparser/tests/compression/sample.xml | 1 - lib/feedparser/tests/encoding/big5.xml | 8 - .../tests/encoding/bozo_bogus_encoding.xml | 7 - .../encoding/bozo_double-encoded-html.xml | 13 - .../encoding/bozo_encoding_mismatch_crash.xml | 10 - .../tests/encoding/bozo_http_i18n.xml | 11 - .../tests/encoding/bozo_http_text_plain.xml | 8 - .../encoding/bozo_http_text_plain_charset.xml | 8 - .../encoding/bozo_invalid-bytes-with-bom.xml | 10 - .../tests/encoding/bozo_linenoise.xml | 13 - lib/feedparser/tests/encoding/csucs4.xml | Bin 736 -> 0 bytes lib/feedparser/tests/encoding/csunicode.xml | Bin 386 -> 0 bytes .../tests/encoding/demoronize-1.xml | 13 - .../tests/encoding/demoronize-2.xml | 13 - .../tests/encoding/demoronize-3.xml | 13 - .../tests/encoding/double-encoded-html.xml | 13 - .../encoding/encoding_attribute_crash.xml | 9 - .../encoding/encoding_attribute_crash_2.xml | 9 - .../tests/encoding/euc-kr-attribute.xml | 14 - lib/feedparser/tests/encoding/euc-kr-item.xml | 14 - lib/feedparser/tests/encoding/euc-kr.xml | 12 - .../http_application_atom_xml_charset.xml | 8 - ...on_atom_xml_charset_overrides_encoding.xml | 8 - .../http_application_atom_xml_default.xml | 8 - .../http_application_atom_xml_encoding.xml | 8 - ...tp_application_atom_xml_gb2312_charset.xml | 9 - ..._xml_gb2312_charset_overrides_encoding.xml | 9 - ...p_application_atom_xml_gb2312_encoding.xml | 9 - .../http_application_rss_xml_charset.xml | 8 - ...ion_rss_xml_charset_overrides_encoding.xml | 8 - .../http_application_rss_xml_default.xml | 8 - .../http_application_rss_xml_encoding.xml | 8 - .../encoding/http_application_xml_charset.xml | 8 - ...ication_xml_charset_overrides_encoding.xml | 8 - .../encoding/http_application_xml_default.xml | 8 - .../http_application_xml_dtd_charset.xml | 8 - ...ion_xml_dtd_charset_overrides_encoding.xml | 8 - .../http_application_xml_dtd_default.xml | 8 - .../http_application_xml_dtd_encoding.xml | 8 - .../http_application_xml_encoding.xml | 8 - .../http_application_xml_epe_charset.xml | 8 - ...ion_xml_epe_charset_overrides_encoding.xml | 8 - .../http_application_xml_epe_default.xml | 8 - .../http_application_xml_epe_encoding.xml | 8 - .../http_encoding_attribute_crash.xml | 13 - lib/feedparser/tests/encoding/http_i18n.xml | 13 - .../encoding/http_text_atom_xml_charset.xml | 8 - ...xt_atom_xml_charset_overrides_encoding.xml | 8 - .../encoding/http_text_atom_xml_default.xml | 8 - .../encoding/http_text_atom_xml_encoding.xml | 8 - .../encoding/http_text_rss_xml_charset.xml | 8 - ...ext_rss_xml_charset_overrides_encoding.xml | 8 - .../encoding/http_text_rss_xml_default.xml | 8 - .../encoding/http_text_rss_xml_encoding.xml | 8 - .../encoding/http_text_xml_bogus_charset.xml | 8 - .../encoding/http_text_xml_bogus_param.xml | 8 - .../tests/encoding/http_text_xml_charset.xml | 8 - .../encoding/http_text_xml_charset_2.xml | 16 - ...tp_text_xml_charset_overrides_encoding.xml | 8 - ..._text_xml_charset_overrides_encoding_2.xml | 17 - .../tests/encoding/http_text_xml_default.xml | 8 - .../encoding/http_text_xml_epe_charset.xml | 8 - ...ext_xml_epe_charset_overrides_encoding.xml | 8 - .../encoding/http_text_xml_epe_default.xml | 8 - .../encoding/http_text_xml_epe_encoding.xml | 8 - .../tests/encoding/http_text_xml_qs.xml | 8 - .../tests/encoding/iso-10646-ucs-2.xml | Bin 422 -> 0 bytes .../tests/encoding/iso-10646-ucs-4.xml | Bin 844 -> 0 bytes .../encoding/no_content_type_default.xml | 7 - .../encoding/no_content_type_encoding.xml | 7 - lib/feedparser/tests/encoding/u16.xml | Bin 350 -> 0 bytes lib/feedparser/tests/encoding/ucs-2.xml | Bin 362 -> 0 bytes lib/feedparser/tests/encoding/ucs-4.xml | Bin 724 -> 0 bytes .../tests/encoding/utf-16be-autodetect.xml | Bin 452 -> 0 bytes .../tests/encoding/utf-16be-bom.xml | Bin 464 -> 0 bytes lib/feedparser/tests/encoding/utf-16be.xml | Bin 448 -> 0 bytes .../tests/encoding/utf-16le-autodetect.xml | Bin 458 -> 0 bytes .../tests/encoding/utf-16le-bom.xml | Bin 470 -> 0 bytes lib/feedparser/tests/encoding/utf-16le.xml | Bin 454 -> 0 bytes .../tests/encoding/utf-32be-autodetect.xml | Bin 904 -> 0 bytes .../tests/encoding/utf-32be-bom.xml | Bin 928 -> 0 bytes lib/feedparser/tests/encoding/utf-32be.xml | Bin 896 -> 0 bytes .../tests/encoding/utf-32le-autodetect.xml | Bin 916 -> 0 bytes .../tests/encoding/utf-32le-bom.xml | Bin 940 -> 0 bytes lib/feedparser/tests/encoding/utf-32le.xml | Bin 908 -> 0 bytes lib/feedparser/tests/encoding/utf-8-bom.xml | 8 - lib/feedparser/tests/encoding/utf16.xml | Bin 362 -> 0 bytes lib/feedparser/tests/encoding/utf_16.xml | Bin 368 -> 0 bytes lib/feedparser/tests/encoding/utf_32.xml | Bin 736 -> 0 bytes lib/feedparser/tests/encoding/x80_437.xml | 9 - lib/feedparser/tests/encoding/x80_850.xml | 9 - lib/feedparser/tests/encoding/x80_852.xml | 9 - lib/feedparser/tests/encoding/x80_855.xml | 9 - lib/feedparser/tests/encoding/x80_857.xml | 9 - lib/feedparser/tests/encoding/x80_860.xml | 9 - lib/feedparser/tests/encoding/x80_861.xml | 9 - lib/feedparser/tests/encoding/x80_862.xml | 9 - lib/feedparser/tests/encoding/x80_863.xml | 9 - lib/feedparser/tests/encoding/x80_865.xml | 9 - lib/feedparser/tests/encoding/x80_866.xml | 9 - lib/feedparser/tests/encoding/x80_cp037.xml | 1 - lib/feedparser/tests/encoding/x80_cp1125.xml | 9 - lib/feedparser/tests/encoding/x80_cp1250.xml | 9 - lib/feedparser/tests/encoding/x80_cp1251.xml | 9 - lib/feedparser/tests/encoding/x80_cp1252.xml | 9 - lib/feedparser/tests/encoding/x80_cp1253.xml | 9 - lib/feedparser/tests/encoding/x80_cp1254.xml | 9 - lib/feedparser/tests/encoding/x80_cp1255.xml | 9 - lib/feedparser/tests/encoding/x80_cp1256.xml | 9 - lib/feedparser/tests/encoding/x80_cp1257.xml | 9 - lib/feedparser/tests/encoding/x80_cp1258.xml | 9 - lib/feedparser/tests/encoding/x80_cp437.xml | 9 - lib/feedparser/tests/encoding/x80_cp500.xml | 1 - lib/feedparser/tests/encoding/x80_cp737.xml | 9 - lib/feedparser/tests/encoding/x80_cp775.xml | 9 - lib/feedparser/tests/encoding/x80_cp850.xml | 9 - lib/feedparser/tests/encoding/x80_cp852.xml | 9 - lib/feedparser/tests/encoding/x80_cp855.xml | 9 - lib/feedparser/tests/encoding/x80_cp856.xml | 9 - lib/feedparser/tests/encoding/x80_cp857.xml | 9 - lib/feedparser/tests/encoding/x80_cp860.xml | 9 - lib/feedparser/tests/encoding/x80_cp861.xml | 9 - lib/feedparser/tests/encoding/x80_cp862.xml | 9 - lib/feedparser/tests/encoding/x80_cp863.xml | 9 - lib/feedparser/tests/encoding/x80_cp864.xml | 9 - lib/feedparser/tests/encoding/x80_cp865.xml | 9 - lib/feedparser/tests/encoding/x80_cp866.xml | 9 - lib/feedparser/tests/encoding/x80_cp874.xml | 9 - lib/feedparser/tests/encoding/x80_cp875.xml | 1 - lib/feedparser/tests/encoding/x80_cp_is.xml | 9 - .../tests/encoding/x80_csibm037.xml | 1 - .../tests/encoding/x80_csibm500.xml | 1 - .../tests/encoding/x80_csibm855.xml | 9 - .../tests/encoding/x80_csibm857.xml | 9 - .../tests/encoding/x80_csibm860.xml | 9 - .../tests/encoding/x80_csibm861.xml | 9 - .../tests/encoding/x80_csibm863.xml | 9 - .../tests/encoding/x80_csibm864.xml | 9 - .../tests/encoding/x80_csibm865.xml | 9 - .../tests/encoding/x80_csibm866.xml | 9 - lib/feedparser/tests/encoding/x80_cskoi8r.xml | 9 - .../tests/encoding/x80_csmacintosh.xml | 9 - .../tests/encoding/x80_cspc775baltic.xml | 9 - .../encoding/x80_cspc850multilingual.xml | 9 - .../tests/encoding/x80_cspc862latinhebrew.xml | 9 - .../tests/encoding/x80_cspc8codepage437.xml | 9 - .../tests/encoding/x80_cspcp852.xml | 9 - lib/feedparser/tests/encoding/x80_dbcs.xml | 9 - .../tests/encoding/x80_ebcdic-cp-be.xml | 1 - .../tests/encoding/x80_ebcdic-cp-ca.xml | 1 - .../tests/encoding/x80_ebcdic-cp-ch.xml | 1 - .../tests/encoding/x80_ebcdic-cp-nl.xml | 1 - .../tests/encoding/x80_ebcdic-cp-us.xml | 1 - .../tests/encoding/x80_ebcdic-cp-wt.xml | 1 - .../tests/encoding/x80_ebcdic_cp_be.xml | 1 - .../tests/encoding/x80_ebcdic_cp_ca.xml | 1 - .../tests/encoding/x80_ebcdic_cp_ch.xml | 1 - .../tests/encoding/x80_ebcdic_cp_nl.xml | 1 - .../tests/encoding/x80_ebcdic_cp_us.xml | 1 - .../tests/encoding/x80_ebcdic_cp_wt.xml | 1 - lib/feedparser/tests/encoding/x80_ibm037.xml | 1 - lib/feedparser/tests/encoding/x80_ibm039.xml | 1 - lib/feedparser/tests/encoding/x80_ibm1140.xml | 1 - lib/feedparser/tests/encoding/x80_ibm437.xml | 9 - lib/feedparser/tests/encoding/x80_ibm500.xml | 1 - lib/feedparser/tests/encoding/x80_ibm775.xml | 9 - lib/feedparser/tests/encoding/x80_ibm850.xml | 9 - lib/feedparser/tests/encoding/x80_ibm852.xml | 9 - lib/feedparser/tests/encoding/x80_ibm855.xml | 9 - lib/feedparser/tests/encoding/x80_ibm857.xml | 9 - lib/feedparser/tests/encoding/x80_ibm860.xml | 9 - lib/feedparser/tests/encoding/x80_ibm861.xml | 9 - lib/feedparser/tests/encoding/x80_ibm862.xml | 9 - lib/feedparser/tests/encoding/x80_ibm863.xml | 9 - lib/feedparser/tests/encoding/x80_ibm864.xml | 9 - lib/feedparser/tests/encoding/x80_ibm865.xml | 9 - lib/feedparser/tests/encoding/x80_ibm866.xml | 9 - lib/feedparser/tests/encoding/x80_koi8-r.xml | 9 - lib/feedparser/tests/encoding/x80_koi8-t.xml | 9 - lib/feedparser/tests/encoding/x80_koi8-u.xml | 9 - .../tests/encoding/x80_mac-cyrillic.xml | 9 - lib/feedparser/tests/encoding/x80_mac.xml | 9 - .../tests/encoding/x80_maccentraleurope.xml | 9 - .../tests/encoding/x80_maccyrillic.xml | 9 - .../tests/encoding/x80_macgreek.xml | 9 - .../tests/encoding/x80_maciceland.xml | 9 - .../tests/encoding/x80_macintosh.xml | 9 - .../tests/encoding/x80_maclatin2.xml | 9 - .../tests/encoding/x80_macroman.xml | 9 - .../tests/encoding/x80_macturkish.xml | 9 - lib/feedparser/tests/encoding/x80_ms-ansi.xml | 9 - lib/feedparser/tests/encoding/x80_ms-arab.xml | 9 - lib/feedparser/tests/encoding/x80_ms-cyrl.xml | 9 - lib/feedparser/tests/encoding/x80_ms-ee.xml | 9 - .../tests/encoding/x80_ms-greek.xml | 9 - lib/feedparser/tests/encoding/x80_ms-hebr.xml | 9 - lib/feedparser/tests/encoding/x80_ms-turk.xml | 9 - .../tests/encoding/x80_tcvn-5712.xml | 9 - lib/feedparser/tests/encoding/x80_tcvn.xml | 9 - .../tests/encoding/x80_tcvn5712-1.xml | 9 - lib/feedparser/tests/encoding/x80_viscii.xml | 9 - .../tests/encoding/x80_winbaltrim.xml | 9 - .../tests/encoding/x80_windows-1250.xml | 9 - .../tests/encoding/x80_windows-1251.xml | 9 - .../tests/encoding/x80_windows-1252.xml | 9 - .../tests/encoding/x80_windows-1253.xml | 9 - .../tests/encoding/x80_windows-1254.xml | 9 - .../tests/encoding/x80_windows-1255.xml | 9 - .../tests/encoding/x80_windows-1256.xml | 9 - .../tests/encoding/x80_windows-1257.xml | 9 - .../tests/encoding/x80_windows-1258.xml | 9 - .../tests/encoding/x80_windows_1250.xml | 9 - .../tests/encoding/x80_windows_1251.xml | 9 - .../tests/encoding/x80_windows_1252.xml | 9 - .../tests/encoding/x80_windows_1253.xml | 9 - .../tests/encoding/x80_windows_1254.xml | 9 - .../tests/encoding/x80_windows_1255.xml | 9 - .../tests/encoding/x80_windows_1256.xml | 9 - .../tests/encoding/x80_windows_1257.xml | 9 - .../tests/encoding/x80_windows_1258.xml | 9 - lib/feedparser/tests/entities/160.xml | 9 - lib/feedparser/tests/entities/732.xml | 9 - lib/feedparser/tests/entities/8216.xml | 9 - lib/feedparser/tests/entities/8217.xml | 9 - lib/feedparser/tests/entities/8220.xml | 9 - lib/feedparser/tests/entities/8221.xml | 9 - lib/feedparser/tests/entities/9830.xml | 9 - lib/feedparser/tests/entities/aacute.xml | 9 - lib/feedparser/tests/entities/acirc.xml | 9 - lib/feedparser/tests/entities/acute.xml | 9 - lib/feedparser/tests/entities/aelig.xml | 9 - lib/feedparser/tests/entities/agrave.xml | 9 - lib/feedparser/tests/entities/alefsym.xml | 9 - lib/feedparser/tests/entities/alpha.xml | 9 - lib/feedparser/tests/entities/and.xml | 9 - lib/feedparser/tests/entities/ang.xml | 9 - lib/feedparser/tests/entities/aring.xml | 9 - lib/feedparser/tests/entities/asymp.xml | 9 - lib/feedparser/tests/entities/atilde.xml | 9 - lib/feedparser/tests/entities/attr_amp.xml | 7 - lib/feedparser/tests/entities/auml.xml | 9 - lib/feedparser/tests/entities/bdquo.xml | 9 - lib/feedparser/tests/entities/beta.xml | 9 - lib/feedparser/tests/entities/brvbar.xml | 9 - lib/feedparser/tests/entities/bull.xml | 9 - lib/feedparser/tests/entities/cap.xml | 9 - lib/feedparser/tests/entities/ccedil.xml | 9 - lib/feedparser/tests/entities/cedil.xml | 9 - lib/feedparser/tests/entities/cent.xml | 9 - lib/feedparser/tests/entities/chi.xml | 9 - lib/feedparser/tests/entities/circ.xml | 9 - lib/feedparser/tests/entities/clubs.xml | 9 - lib/feedparser/tests/entities/cong.xml | 9 - lib/feedparser/tests/entities/copy.xml | 9 - lib/feedparser/tests/entities/crarr.xml | 9 - lib/feedparser/tests/entities/cup.xml | 9 - lib/feedparser/tests/entities/curren.xml | 9 - lib/feedparser/tests/entities/dagger.xml | 9 - lib/feedparser/tests/entities/darr.xml | 9 - lib/feedparser/tests/entities/deg.xml | 9 - lib/feedparser/tests/entities/delta.xml | 9 - lib/feedparser/tests/entities/diams.xml | 9 - lib/feedparser/tests/entities/divide.xml | 9 - .../tests/entities/doesnotexist.xml | 9 - lib/feedparser/tests/entities/eacute.xml | 9 - lib/feedparser/tests/entities/ecirc.xml | 9 - lib/feedparser/tests/entities/egrave.xml | 9 - lib/feedparser/tests/entities/empty.xml | 9 - lib/feedparser/tests/entities/emsp.xml | 9 - lib/feedparser/tests/entities/ensp.xml | 9 - lib/feedparser/tests/entities/epsilon.xml | 9 - lib/feedparser/tests/entities/equiv.xml | 9 - lib/feedparser/tests/entities/eta.xml | 9 - lib/feedparser/tests/entities/eth.xml | 9 - lib/feedparser/tests/entities/euml.xml | 9 - lib/feedparser/tests/entities/euro.xml | 9 - lib/feedparser/tests/entities/exist.xml | 9 - lib/feedparser/tests/entities/fnof.xml | 9 - lib/feedparser/tests/entities/forall.xml | 9 - lib/feedparser/tests/entities/frac12.xml | 9 - lib/feedparser/tests/entities/frac14.xml | 9 - lib/feedparser/tests/entities/frac34.xml | 9 - lib/feedparser/tests/entities/frasl.xml | 9 - lib/feedparser/tests/entities/gamma.xml | 9 - lib/feedparser/tests/entities/ge.xml | 9 - lib/feedparser/tests/entities/hArr.xml | 9 - lib/feedparser/tests/entities/hearts.xml | 9 - lib/feedparser/tests/entities/hellip.xml | 9 - .../tests/entities/hex_entity_x_lowercase.xml | 9 - .../tests/entities/hex_entity_x_uppercase.xml | 9 - lib/feedparser/tests/entities/iacute.xml | 9 - lib/feedparser/tests/entities/icirc.xml | 9 - lib/feedparser/tests/entities/iexcl.xml | 9 - lib/feedparser/tests/entities/igrave.xml | 9 - lib/feedparser/tests/entities/image.xml | 9 - lib/feedparser/tests/entities/infin.xml | 9 - lib/feedparser/tests/entities/int.xml | 9 - lib/feedparser/tests/entities/iota.xml | 9 - lib/feedparser/tests/entities/iquest.xml | 9 - lib/feedparser/tests/entities/isin.xml | 9 - lib/feedparser/tests/entities/iuml.xml | 9 - lib/feedparser/tests/entities/kappa.xml | 9 - lib/feedparser/tests/entities/lArr.xml | 9 - lib/feedparser/tests/entities/lambda.xml | 9 - lib/feedparser/tests/entities/lang.xml | 9 - lib/feedparser/tests/entities/laquo.xml | 9 - lib/feedparser/tests/entities/lceil.xml | 9 - lib/feedparser/tests/entities/ldquo.xml | 9 - lib/feedparser/tests/entities/le.xml | 9 - lib/feedparser/tests/entities/lfloor.xml | 9 - lib/feedparser/tests/entities/lowast.xml | 9 - lib/feedparser/tests/entities/loz.xml | 9 - lib/feedparser/tests/entities/lrm.xml | 9 - lib/feedparser/tests/entities/lsaquo.xml | 9 - lib/feedparser/tests/entities/lsquo.xml | 9 - lib/feedparser/tests/entities/macr.xml | 9 - lib/feedparser/tests/entities/mdash.xml | 9 - lib/feedparser/tests/entities/micro.xml | 9 - lib/feedparser/tests/entities/middot.xml | 9 - lib/feedparser/tests/entities/minus.xml | 9 - lib/feedparser/tests/entities/mu.xml | 9 - lib/feedparser/tests/entities/nabla.xml | 9 - lib/feedparser/tests/entities/nbsp.xml | 9 - lib/feedparser/tests/entities/ndash.xml | 9 - lib/feedparser/tests/entities/ne.xml | 9 - lib/feedparser/tests/entities/ni.xml | 9 - lib/feedparser/tests/entities/not.xml | 9 - lib/feedparser/tests/entities/notin.xml | 9 - lib/feedparser/tests/entities/nsub.xml | 9 - lib/feedparser/tests/entities/ntilde.xml | 9 - lib/feedparser/tests/entities/nu.xml | 9 - lib/feedparser/tests/entities/oacute.xml | 9 - lib/feedparser/tests/entities/ocirc.xml | 9 - lib/feedparser/tests/entities/oelig.xml | 9 - lib/feedparser/tests/entities/ograve.xml | 9 - lib/feedparser/tests/entities/oline.xml | 9 - lib/feedparser/tests/entities/omega.xml | 9 - lib/feedparser/tests/entities/omicron.xml | 9 - lib/feedparser/tests/entities/oplus.xml | 9 - lib/feedparser/tests/entities/or.xml | 9 - lib/feedparser/tests/entities/ordf.xml | 9 - lib/feedparser/tests/entities/ordm.xml | 9 - lib/feedparser/tests/entities/oslash.xml | 9 - lib/feedparser/tests/entities/otilde.xml | 9 - lib/feedparser/tests/entities/otimes.xml | 9 - lib/feedparser/tests/entities/ouml.xml | 9 - lib/feedparser/tests/entities/para.xml | 9 - lib/feedparser/tests/entities/part.xml | 9 - lib/feedparser/tests/entities/permil.xml | 9 - lib/feedparser/tests/entities/perp.xml | 9 - lib/feedparser/tests/entities/phi.xml | 9 - lib/feedparser/tests/entities/pi.xml | 9 - lib/feedparser/tests/entities/piv.xml | 9 - lib/feedparser/tests/entities/plusmn.xml | 9 - lib/feedparser/tests/entities/pound.xml | 9 - lib/feedparser/tests/entities/prime.xml | 9 - lib/feedparser/tests/entities/prod.xml | 9 - lib/feedparser/tests/entities/prop.xml | 9 - lib/feedparser/tests/entities/psi.xml | 9 - .../tests/entities/query_variable_entry.xml | 11 - .../tests/entities/query_variable_feed.xml | 9 - lib/feedparser/tests/entities/radic.xml | 9 - lib/feedparser/tests/entities/rang.xml | 9 - lib/feedparser/tests/entities/raquo.xml | 9 - lib/feedparser/tests/entities/rarr.xml | 9 - lib/feedparser/tests/entities/rceil.xml | 9 - lib/feedparser/tests/entities/rdquo.xml | 9 - lib/feedparser/tests/entities/real.xml | 9 - lib/feedparser/tests/entities/reg.xml | 9 - lib/feedparser/tests/entities/rfloor.xml | 9 - lib/feedparser/tests/entities/rho.xml | 9 - lib/feedparser/tests/entities/rlm.xml | 9 - lib/feedparser/tests/entities/rsaquo.xml | 9 - lib/feedparser/tests/entities/rsquo.xml | 9 - lib/feedparser/tests/entities/sbquo.xml | 9 - lib/feedparser/tests/entities/scaron.xml | 9 - lib/feedparser/tests/entities/sdot.xml | 9 - lib/feedparser/tests/entities/sect.xml | 9 - lib/feedparser/tests/entities/shy.xml | 9 - lib/feedparser/tests/entities/sigma.xml | 9 - lib/feedparser/tests/entities/sigmaf.xml | 9 - lib/feedparser/tests/entities/sim.xml | 9 - lib/feedparser/tests/entities/spades.xml | 9 - lib/feedparser/tests/entities/sub.xml | 9 - lib/feedparser/tests/entities/sube.xml | 9 - lib/feedparser/tests/entities/sum.xml | 9 - lib/feedparser/tests/entities/sup.xml | 9 - lib/feedparser/tests/entities/sup1.xml | 9 - lib/feedparser/tests/entities/sup2.xml | 9 - lib/feedparser/tests/entities/sup3.xml | 9 - lib/feedparser/tests/entities/supe.xml | 9 - lib/feedparser/tests/entities/szlig.xml | 9 - lib/feedparser/tests/entities/tau.xml | 9 - lib/feedparser/tests/entities/there4.xml | 9 - lib/feedparser/tests/entities/theta.xml | 9 - lib/feedparser/tests/entities/thetasym.xml | 9 - lib/feedparser/tests/entities/thinsp.xml | 9 - lib/feedparser/tests/entities/thorn.xml | 9 - lib/feedparser/tests/entities/tilde.xml | 9 - lib/feedparser/tests/entities/times.xml | 9 - lib/feedparser/tests/entities/trade.xml | 9 - lib/feedparser/tests/entities/uacute.xml | 9 - lib/feedparser/tests/entities/uarr.xml | 9 - lib/feedparser/tests/entities/ucirc.xml | 9 - lib/feedparser/tests/entities/ugrave.xml | 9 - lib/feedparser/tests/entities/uml.xml | 9 - lib/feedparser/tests/entities/upper_AElig.xml | 9 - .../tests/entities/upper_Aacute.xml | 9 - lib/feedparser/tests/entities/upper_Acirc.xml | 9 - .../tests/entities/upper_Agrave.xml | 9 - lib/feedparser/tests/entities/upper_Alpha.xml | 9 - lib/feedparser/tests/entities/upper_Aring.xml | 9 - .../tests/entities/upper_Atilde.xml | 9 - lib/feedparser/tests/entities/upper_Auml.xml | 9 - lib/feedparser/tests/entities/upper_Beta.xml | 9 - .../tests/entities/upper_Ccedil.xml | 9 - lib/feedparser/tests/entities/upper_Chi.xml | 9 - .../tests/entities/upper_Dagger.xml | 9 - lib/feedparser/tests/entities/upper_Delta.xml | 9 - lib/feedparser/tests/entities/upper_ETH.xml | 9 - .../tests/entities/upper_Eacute.xml | 9 - lib/feedparser/tests/entities/upper_Ecirc.xml | 9 - .../tests/entities/upper_Egrave.xml | 9 - .../tests/entities/upper_Epsilon.xml | 9 - lib/feedparser/tests/entities/upper_Eta.xml | 9 - lib/feedparser/tests/entities/upper_Euml.xml | 9 - lib/feedparser/tests/entities/upper_Gamma.xml | 9 - .../tests/entities/upper_Iacute.xml | 9 - lib/feedparser/tests/entities/upper_Icirc.xml | 9 - .../tests/entities/upper_Igrave.xml | 9 - lib/feedparser/tests/entities/upper_Iota.xml | 9 - lib/feedparser/tests/entities/upper_Iuml.xml | 9 - lib/feedparser/tests/entities/upper_Kappa.xml | 9 - .../tests/entities/upper_Lambda.xml | 9 - lib/feedparser/tests/entities/upper_Mu.xml | 9 - .../tests/entities/upper_Ntilde.xml | 9 - lib/feedparser/tests/entities/upper_Nu.xml | 9 - lib/feedparser/tests/entities/upper_OElig.xml | 9 - .../tests/entities/upper_Oacute.xml | 9 - lib/feedparser/tests/entities/upper_Ocirc.xml | 9 - .../tests/entities/upper_Ograve.xml | 9 - lib/feedparser/tests/entities/upper_Omega.xml | 9 - .../tests/entities/upper_Omicron.xml | 9 - .../tests/entities/upper_Oslash.xml | 9 - .../tests/entities/upper_Otilde.xml | 9 - lib/feedparser/tests/entities/upper_Ouml.xml | 9 - lib/feedparser/tests/entities/upper_Phi.xml | 9 - lib/feedparser/tests/entities/upper_Pi.xml | 9 - lib/feedparser/tests/entities/upper_Prime.xml | 9 - lib/feedparser/tests/entities/upper_Psi.xml | 9 - lib/feedparser/tests/entities/upper_Rho.xml | 9 - .../tests/entities/upper_Scaron.xml | 9 - lib/feedparser/tests/entities/upper_Sigma.xml | 9 - lib/feedparser/tests/entities/upper_THORN.xml | 9 - lib/feedparser/tests/entities/upper_Tau.xml | 9 - lib/feedparser/tests/entities/upper_Theta.xml | 9 - .../tests/entities/upper_Uacute.xml | 9 - lib/feedparser/tests/entities/upper_Ucirc.xml | 9 - .../tests/entities/upper_Ugrave.xml | 9 - .../tests/entities/upper_Upsilon.xml | 9 - lib/feedparser/tests/entities/upper_Uuml.xml | 9 - lib/feedparser/tests/entities/upper_Xi.xml | 9 - .../tests/entities/upper_Yacute.xml | 9 - lib/feedparser/tests/entities/upper_Yuml.xml | 9 - lib/feedparser/tests/entities/upper_Zeta.xml | 9 - lib/feedparser/tests/entities/upsih.xml | 9 - lib/feedparser/tests/entities/upsilon.xml | 9 - lib/feedparser/tests/entities/uuml.xml | 9 - lib/feedparser/tests/entities/weierp.xml | 9 - lib/feedparser/tests/entities/xi.xml | 9 - lib/feedparser/tests/entities/yacute.xml | 9 - lib/feedparser/tests/entities/yen.xml | 9 - lib/feedparser/tests/entities/yuml.xml | 9 - lib/feedparser/tests/entities/zeta.xml | 9 - lib/feedparser/tests/entities/zwj.xml | 9 - lib/feedparser/tests/entities/zwnj.xml | 9 - .../tests/http/http_redirect_to_304.xml | 7 - lib/feedparser/tests/http/http_status_301.xml | 7 - lib/feedparser/tests/http/http_status_302.xml | 7 - lib/feedparser/tests/http/http_status_303.xml | 7 - lib/feedparser/tests/http/http_status_304.xml | 9 - lib/feedparser/tests/http/http_status_307.xml | 7 - lib/feedparser/tests/http/http_status_404.xml | 6 - .../tests/http/http_status_9001.xml | 6 - lib/feedparser/tests/http/target.xml | 7 - .../tests/illformed/aaa_illformed.xml | 6 - .../tests/illformed/always_strip_doctype.xml | 10 - .../tests/illformed/chardet/big5.xml | 8 - .../tests/illformed/chardet/eucjp.xml | 13 - .../tests/illformed/chardet/euckr.xml | 13 - .../tests/illformed/chardet/gb2312.xml | 12 - .../tests/illformed/chardet/koi8r.xml | 14 - .../tests/illformed/chardet/shiftjis.xml | 11 - .../tests/illformed/chardet/tis620.xml | 12 - .../tests/illformed/chardet/windows1255.xml | 14 - .../tests/illformed/http_high_bit_date.xml | 12 - .../tests/illformed/non-ascii-tag.xml | 12 - .../illformed/rdf_channel_empty_textinput.xml | 26 - .../tests/illformed/rss_empty_document.xml | 4 - .../tests/illformed/rss_incomplete_cdata.xml | 13 - .../tests/illformed/undeclared_namespace.xml | 10 - .../tests/microformats/hcard/2-4-2-vcard.xml | 23 - .../hcard/3-1-1-fn-unicode-char.xml | 14 - .../tests/microformats/hcard/3-1-1-fn.xml | 17 - .../microformats/hcard/3-1-2-n-2-plural.xml | 26 - .../microformats/hcard/3-1-2-n-2-singular.xml | 30 - .../microformats/hcard/3-1-2-n-plural.xml | 23 - .../microformats/hcard/3-1-2-n-singular.xml | 23 - .../hcard/3-1-3-nickname-2-plural.xml | 17 - .../hcard/3-1-3-nickname-2-singular.xml | 18 - .../microformats/hcard/3-1-3-nickname.xml | 17 - .../microformats/hcard/3-1-4-photo-inline.xml | 17 - .../tests/microformats/hcard/3-1-4-photo.xml | 17 - .../tests/microformats/hcard/3-1-5-bday-2.xml | 17 - .../tests/microformats/hcard/3-1-5-bday-3.xml | 17 - .../tests/microformats/hcard/3-1-5-bday.xml | 17 - .../tests/microformats/hcard/3-2-1-adr.xml | 25 - .../tests/microformats/hcard/3-2-2-label.xml | 30 - .../tests/microformats/hcard/3-3-1-tel.xml | 23 - .../microformats/hcard/3-3-2-email-2.xml | 17 - .../microformats/hcard/3-3-2-email-3.xml | 20 - .../tests/microformats/hcard/3-3-2-email.xml | 17 - .../tests/microformats/hcard/3-3-3-mailer.xml | 17 - .../tests/microformats/hcard/3-4-1-tz-2.xml | 20 - .../tests/microformats/hcard/3-4-1-tz.xml | 17 - .../tests/microformats/hcard/3-4-2-geo.xml | 20 - .../tests/microformats/hcard/3-5-1-title.xml | 17 - .../tests/microformats/hcard/3-5-2-role.xml | 17 - .../tests/microformats/hcard/3-5-3-logo-2.xml | 17 - .../tests/microformats/hcard/3-5-3-logo.xml | 17 - .../microformats/hcard/3-5-4-agent-2.xml | 20 - .../tests/microformats/hcard/3-5-4-agent.xml | 17 - .../tests/microformats/hcard/3-5-5-org.xml | 21 - .../hcard/3-6-1-categories-2-plural.xml | 22 - .../hcard/3-6-1-categories-2-singular.xml | 20 - .../microformats/hcard/3-6-1-categories.xml | 17 - .../tests/microformats/hcard/3-6-2-note.xml | 17 - .../tests/microformats/hcard/3-6-4-rev-2.xml | 17 - .../tests/microformats/hcard/3-6-4-rev.xml | 17 - .../hcard/3-6-5-sort-string-2.xml | 21 - .../hcard/3-6-5-sort-string-3.xml | 19 - .../hcard/3-6-5-sort-string-4.xml | 25 - .../hcard/3-6-5-sort-string-5.xml | 19 - .../microformats/hcard/3-6-5-sort-string.xml | 27 - .../microformats/hcard/3-6-6-sound-2.xml | 20 - .../tests/microformats/hcard/3-6-6-sound.xml | 20 - .../tests/microformats/hcard/3-6-7-uid.xml | 18 - .../tests/microformats/hcard/3-6-8-url.xml | 17 - .../microformats/hcard/3-7-1-class-2.xml | 17 - .../microformats/hcard/3-7-1-class-3.xml | 17 - .../tests/microformats/hcard/3-7-1-class.xml | 17 - .../tests/microformats/hcard/3-7-2-key.xml | 20 - .../tests/microformats/hcard/7-authors.xml | 64 - .../rel_enclosure/rel_enclosure_href.xml | 14 - ...l_enclosure_href_autodetect_by_ext_avi.xml | 14 - ...l_enclosure_href_autodetect_by_ext_bin.xml | 14 - ...l_enclosure_href_autodetect_by_ext_bz2.xml | 14 - ...l_enclosure_href_autodetect_by_ext_deb.xml | 14 - ...l_enclosure_href_autodetect_by_ext_dmg.xml | 14 - ...l_enclosure_href_autodetect_by_ext_exe.xml | 14 - ...el_enclosure_href_autodetect_by_ext_gz.xml | 14 - ...l_enclosure_href_autodetect_by_ext_hqx.xml | 14 - ...l_enclosure_href_autodetect_by_ext_img.xml | 14 - ...l_enclosure_href_autodetect_by_ext_iso.xml | 14 - ...l_enclosure_href_autodetect_by_ext_jar.xml | 14 - ...l_enclosure_href_autodetect_by_ext_m4a.xml | 14 - ...l_enclosure_href_autodetect_by_ext_m4v.xml | 14 - ...l_enclosure_href_autodetect_by_ext_mp2.xml | 14 - ...l_enclosure_href_autodetect_by_ext_mp3.xml | 14 - ...l_enclosure_href_autodetect_by_ext_mp4.xml | 14 - ...l_enclosure_href_autodetect_by_ext_msi.xml | 14 - ...l_enclosure_href_autodetect_by_ext_ogg.xml | 14 - ...l_enclosure_href_autodetect_by_ext_rar.xml | 14 - ...l_enclosure_href_autodetect_by_ext_rpm.xml | 14 - ...l_enclosure_href_autodetect_by_ext_sit.xml | 14 - ..._enclosure_href_autodetect_by_ext_sitx.xml | 14 - ...l_enclosure_href_autodetect_by_ext_tar.xml | 14 - ..._enclosure_href_autodetect_by_ext_tbz2.xml | 14 - ...l_enclosure_href_autodetect_by_ext_tgz.xml | 14 - ...l_enclosure_href_autodetect_by_ext_wma.xml | 14 - ...l_enclosure_href_autodetect_by_ext_wmv.xml | 14 - ...rel_enclosure_href_autodetect_by_ext_z.xml | 14 - ...l_enclosure_href_autodetect_by_ext_zip.xml | 14 - ...ref_autodetect_by_type_application_ogg.xml | 14 - ...nclosure_href_autodetect_by_type_audio.xml | 14 - ...nclosure_href_autodetect_by_type_video.xml | 14 - .../rel_enclosure_href_invalid.xml | 14 - .../rel_enclosure_no_autodetect.xml | 14 - .../rel_enclosure_no_autodetect_xml.xml | 14 - .../rel_enclosure/rel_enclosure_title.xml | 14 - .../rel_enclosure_title_from_link_text.xml | 14 - ...el_enclosure_title_overrides_link_text.xml | 14 - .../rel_enclosure/rel_enclosure_type.xml | 14 - .../rel_tag/rel_tag_duplicate.xml | 15 - .../microformats/rel_tag/rel_tag_label.xml | 14 - .../microformats/rel_tag/rel_tag_scheme.xml | 14 - .../microformats/rel_tag/rel_tag_term.xml | 14 - .../rel_tag/rel_tag_term_trailing_slash.xml | 14 - .../microformats/xfn/xfn_acquaintance.xml | 14 - .../tests/microformats/xfn/xfn_brother.xml | 14 - .../tests/microformats/xfn/xfn_child.xml | 14 - .../microformats/xfn/xfn_co-resident.xml | 14 - .../tests/microformats/xfn/xfn_co-worker.xml | 14 - .../tests/microformats/xfn/xfn_colleague.xml | 14 - .../tests/microformats/xfn/xfn_contact.xml | 14 - .../tests/microformats/xfn/xfn_coresident.xml | 14 - .../tests/microformats/xfn/xfn_coworker.xml | 14 - .../tests/microformats/xfn/xfn_crush.xml | 14 - .../tests/microformats/xfn/xfn_date.xml | 14 - .../tests/microformats/xfn/xfn_friend.xml | 14 - .../tests/microformats/xfn/xfn_href.xml | 14 - .../tests/microformats/xfn/xfn_husband.xml | 14 - .../tests/microformats/xfn/xfn_kin.xml | 14 - .../tests/microformats/xfn/xfn_me.xml | 14 - .../tests/microformats/xfn/xfn_met.xml | 14 - .../tests/microformats/xfn/xfn_multiple.xml | 14 - .../tests/microformats/xfn/xfn_muse.xml | 14 - .../tests/microformats/xfn/xfn_name.xml | 14 - .../tests/microformats/xfn/xfn_neighbor.xml | 14 - .../tests/microformats/xfn/xfn_parent.xml | 14 - .../tests/microformats/xfn/xfn_relative.xml | 14 - .../tests/microformats/xfn/xfn_sibling.xml | 14 - .../tests/microformats/xfn/xfn_sister.xml | 14 - .../tests/microformats/xfn/xfn_spouse.xml | 14 - .../tests/microformats/xfn/xfn_sweetheart.xml | 14 - .../tests/microformats/xfn/xfn_wife.xml | 14 - lib/feedparser/tests/wellformed/amp/amp01.xml | 9 - lib/feedparser/tests/wellformed/amp/amp02.xml | 9 - lib/feedparser/tests/wellformed/amp/amp03.xml | 9 - lib/feedparser/tests/wellformed/amp/amp04.xml | 9 - lib/feedparser/tests/wellformed/amp/amp05.xml | 9 - lib/feedparser/tests/wellformed/amp/amp06.xml | 9 - lib/feedparser/tests/wellformed/amp/amp07.xml | 9 - lib/feedparser/tests/wellformed/amp/amp08.xml | 9 - lib/feedparser/tests/wellformed/amp/amp09.xml | 9 - lib/feedparser/tests/wellformed/amp/amp10.xml | 9 - lib/feedparser/tests/wellformed/amp/amp11.xml | 9 - lib/feedparser/tests/wellformed/amp/amp12.xml | 9 - lib/feedparser/tests/wellformed/amp/amp13.xml | 9 - lib/feedparser/tests/wellformed/amp/amp14.xml | 9 - lib/feedparser/tests/wellformed/amp/amp15.xml | 9 - lib/feedparser/tests/wellformed/amp/amp16.xml | 9 - lib/feedparser/tests/wellformed/amp/amp17.xml | 9 - lib/feedparser/tests/wellformed/amp/amp18.xml | 9 - lib/feedparser/tests/wellformed/amp/amp19.xml | 9 - lib/feedparser/tests/wellformed/amp/amp20.xml | 9 - lib/feedparser/tests/wellformed/amp/amp21.xml | 9 - lib/feedparser/tests/wellformed/amp/amp22.xml | 9 - lib/feedparser/tests/wellformed/amp/amp23.xml | 9 - lib/feedparser/tests/wellformed/amp/amp24.xml | 9 - lib/feedparser/tests/wellformed/amp/amp25.xml | 9 - lib/feedparser/tests/wellformed/amp/amp26.xml | 9 - lib/feedparser/tests/wellformed/amp/amp27.xml | 9 - lib/feedparser/tests/wellformed/amp/amp28.xml | 9 - lib/feedparser/tests/wellformed/amp/amp29.xml | 9 - lib/feedparser/tests/wellformed/amp/amp30.xml | 9 - lib/feedparser/tests/wellformed/amp/amp31.xml | 9 - lib/feedparser/tests/wellformed/amp/amp32.xml | 9 - lib/feedparser/tests/wellformed/amp/amp33.xml | 9 - lib/feedparser/tests/wellformed/amp/amp34.xml | 9 - lib/feedparser/tests/wellformed/amp/amp35.xml | 9 - lib/feedparser/tests/wellformed/amp/amp36.xml | 9 - lib/feedparser/tests/wellformed/amp/amp37.xml | 9 - lib/feedparser/tests/wellformed/amp/amp38.xml | 9 - lib/feedparser/tests/wellformed/amp/amp39.xml | 9 - lib/feedparser/tests/wellformed/amp/amp40.xml | 9 - lib/feedparser/tests/wellformed/amp/amp41.xml | 9 - lib/feedparser/tests/wellformed/amp/amp42.xml | 9 - lib/feedparser/tests/wellformed/amp/amp43.xml | 9 - lib/feedparser/tests/wellformed/amp/amp44.xml | 9 - lib/feedparser/tests/wellformed/amp/amp45.xml | 9 - lib/feedparser/tests/wellformed/amp/amp46.xml | 9 - lib/feedparser/tests/wellformed/amp/amp47.xml | 9 - lib/feedparser/tests/wellformed/amp/amp48.xml | 9 - lib/feedparser/tests/wellformed/amp/amp49.xml | 9 - lib/feedparser/tests/wellformed/amp/amp50.xml | 9 - lib/feedparser/tests/wellformed/amp/amp51.xml | 9 - lib/feedparser/tests/wellformed/amp/amp52.xml | 9 - lib/feedparser/tests/wellformed/amp/amp53.xml | 9 - lib/feedparser/tests/wellformed/amp/amp54.xml | 9 - lib/feedparser/tests/wellformed/amp/amp55.xml | 9 - lib/feedparser/tests/wellformed/amp/amp56.xml | 9 - lib/feedparser/tests/wellformed/amp/amp57.xml | 9 - lib/feedparser/tests/wellformed/amp/amp58.xml | 9 - lib/feedparser/tests/wellformed/amp/amp59.xml | 9 - lib/feedparser/tests/wellformed/amp/amp60.xml | 9 - lib/feedparser/tests/wellformed/amp/amp61.xml | 9 - lib/feedparser/tests/wellformed/amp/amp62.xml | 9 - lib/feedparser/tests/wellformed/amp/amp63.xml | 9 - lib/feedparser/tests/wellformed/amp/amp64.xml | 9 - .../tests/wellformed/amp/attr01.xml | 9 - .../tests/wellformed/amp/attr02.xml | 9 - .../tests/wellformed/amp/attr03.xml | 9 - .../tests/wellformed/amp/attr04.xml | 9 - .../tests/wellformed/amp/attr05.xml | 9 - .../tests/wellformed/amp/attr06.xml | 9 - .../wellformed/atom/atom_namespace_1.xml | 7 - .../wellformed/atom/atom_namespace_2.xml | 7 - .../wellformed/atom/atom_namespace_3.xml | 7 - .../wellformed/atom/atom_namespace_4.xml | 7 - .../wellformed/atom/atom_namespace_5.xml | 7 - .../wellformed/atom/entry_author_email.xml | 13 - .../wellformed/atom/entry_author_homepage.xml | 13 - .../atom/entry_author_map_author.xml | 13 - .../atom/entry_author_map_author_2.xml | 12 - .../wellformed/atom/entry_author_name.xml | 13 - .../wellformed/atom/entry_author_uri.xml | 13 - .../wellformed/atom/entry_author_url.xml | 13 - .../atom/entry_content_mode_base64.xml | 11 - .../atom/entry_content_mode_escaped.xml | 9 - .../wellformed/atom/entry_content_type.xml | 9 - .../atom/entry_content_type_text_plain.xml | 9 - .../wellformed/atom/entry_content_value.xml | 9 - .../atom/entry_contributor_email.xml | 13 - .../atom/entry_contributor_homepage.xml | 13 - .../atom/entry_contributor_multiple.xml | 18 - .../atom/entry_contributor_name.xml | 13 - .../wellformed/atom/entry_contributor_uri.xml | 13 - .../wellformed/atom/entry_contributor_url.xml | 13 - .../tests/wellformed/atom/entry_created.xml | 9 - .../atom/entry_created_multiple_values.xml | 10 - .../wellformed/atom/entry_created_parsed.xml | 9 - .../tests/wellformed/atom/entry_id.xml | 9 - .../wellformed/atom/entry_id_map_guid.xml | 9 - .../tests/wellformed/atom/entry_issued.xml | 9 - .../wellformed/atom/entry_issued_parsed.xml | 9 - .../atom/entry_link_alternate_map_link.xml | 9 - .../atom/entry_link_alternate_map_link_2.xml | 9 - .../tests/wellformed/atom/entry_link_href.xml | 9 - .../wellformed/atom/entry_link_multiple.xml | 10 - .../tests/wellformed/atom/entry_link_rel.xml | 9 - .../wellformed/atom/entry_link_title.xml | 9 - .../tests/wellformed/atom/entry_link_type.xml | 9 - .../tests/wellformed/atom/entry_modified.xml | 9 - .../entry_modified_map_updated_parsed.xml | 9 - .../atom/entry_published_parsed.xml | 9 - ...ntry_published_parsed_date_overwriting.xml | 10 - .../atom/entry_source_updated_parsed.xml | 11 - .../tests/wellformed/atom/entry_summary.xml | 9 - .../wellformed/atom/entry_summary_base64.xml | 11 - .../atom/entry_summary_base64_2.xml | 11 - .../entry_summary_content_mode_base64.xml | 11 - .../entry_summary_content_mode_escaped.xml | 9 - .../atom/entry_summary_content_type.xml | 9 - .../entry_summary_content_type_text_plain.xml | 9 - .../atom/entry_summary_content_value.xml | 9 - .../atom/entry_summary_escaped_markup.xml | 9 - .../atom/entry_summary_inline_markup.xml | 9 - .../atom/entry_summary_inline_markup_2.xml | 9 - .../atom/entry_summary_naked_markup.xml | 9 - .../atom/entry_summary_text_plain.xml | 9 - .../tests/wellformed/atom/entry_title.xml | 9 - .../wellformed/atom/entry_title_base64.xml | 11 - .../wellformed/atom/entry_title_base64_2.xml | 11 - .../atom/entry_title_content_mode_base64.xml | 11 - .../atom/entry_title_content_mode_escaped.xml | 9 - .../atom/entry_title_content_type.xml | 9 - .../entry_title_content_type_text_plain.xml | 9 - .../atom/entry_title_content_value.xml | 9 - .../atom/entry_title_escaped_markup.xml | 9 - .../atom/entry_title_inline_markup.xml | 9 - .../atom/entry_title_inline_markup_2.xml | 9 - .../atom/entry_title_naked_markup.xml | 9 - .../atom/entry_title_text_plain.xml | 9 - .../atom/entry_title_text_plain_brackets.xml | 9 - .../atom/entry_updated_multiple_values.xml | 10 - .../wellformed/atom/entry_updated_parsed.xml | 9 - .../wellformed/atom/feed_author_email.xml | 11 - .../wellformed/atom/feed_author_homepage.xml | 11 - .../atom/feed_author_map_author.xml | 11 - .../atom/feed_author_map_author_2.xml | 10 - .../wellformed/atom/feed_author_name.xml | 11 - .../tests/wellformed/atom/feed_author_uri.xml | 11 - .../tests/wellformed/atom/feed_author_url.xml | 11 - .../atom/feed_contributor_email.xml | 11 - .../atom/feed_contributor_homepage.xml | 11 - .../atom/feed_contributor_multiple.xml | 16 - .../wellformed/atom/feed_contributor_name.xml | 11 - .../wellformed/atom/feed_contributor_uri.xml | 11 - .../wellformed/atom/feed_contributor_url.xml | 11 - .../tests/wellformed/atom/feed_copyright.xml | 7 - .../wellformed/atom/feed_copyright_base64.xml | 9 - .../atom/feed_copyright_base64_2.xml | 9 - .../feed_copyright_content_mode_base64.xml | 9 - .../feed_copyright_content_mode_escaped.xml | 7 - .../atom/feed_copyright_content_type.xml | 7 - ...feed_copyright_content_type_text_plain.xml | 7 - .../atom/feed_copyright_content_value.xml | 7 - .../atom/feed_copyright_escaped_markup.xml | 7 - .../atom/feed_copyright_inline_markup.xml | 7 - .../atom/feed_copyright_inline_markup_2.xml | 7 - .../atom/feed_copyright_naked_markup.xml | 7 - .../atom/feed_copyright_text_plain.xml | 7 - .../tests/wellformed/atom/feed_generator.xml | 7 - .../wellformed/atom/feed_generator_name.xml | 7 - .../wellformed/atom/feed_generator_url.xml | 7 - .../atom/feed_generator_version.xml | 7 - .../tests/wellformed/atom/feed_id.xml | 7 - .../wellformed/atom/feed_id_map_guid.xml | 7 - .../tests/wellformed/atom/feed_info.xml | 7 - .../wellformed/atom/feed_info_base64.xml | 9 - .../wellformed/atom/feed_info_base64_2.xml | 9 - .../atom/feed_info_content_mode_base64.xml | 9 - .../atom/feed_info_content_mode_escaped.xml | 7 - .../atom/feed_info_content_type.xml | 7 - .../feed_info_content_type_text_plain.xml | 7 - .../atom/feed_info_content_value.xml | 7 - .../atom/feed_info_escaped_markup.xml | 7 - .../atom/feed_info_inline_markup.xml | 7 - .../atom/feed_info_inline_markup_2.xml | 7 - .../atom/feed_info_naked_markup.xml | 7 - .../wellformed/atom/feed_info_text_plain.xml | 7 - .../atom/feed_link_alternate_map_link.xml | 7 - .../atom/feed_link_alternate_map_link_2.xml | 7 - .../tests/wellformed/atom/feed_link_href.xml | 7 - .../wellformed/atom/feed_link_multiple.xml | 8 - .../tests/wellformed/atom/feed_link_rel.xml | 7 - .../tests/wellformed/atom/feed_link_title.xml | 7 - .../tests/wellformed/atom/feed_link_type.xml | 7 - .../tests/wellformed/atom/feed_modified.xml | 9 - .../atom/feed_modified_map_updated_parsed.xml | 9 - .../tests/wellformed/atom/feed_tagline.xml | 7 - .../wellformed/atom/feed_tagline_base64.xml | 9 - .../wellformed/atom/feed_tagline_base64_2.xml | 9 - .../atom/feed_tagline_content_mode_base64.xml | 9 - .../feed_tagline_content_mode_escaped.xml | 7 - .../atom/feed_tagline_content_type.xml | 7 - .../feed_tagline_content_type_text_plain.xml | 7 - .../atom/feed_tagline_content_value.xml | 7 - .../atom/feed_tagline_escaped_markup.xml | 7 - .../atom/feed_tagline_inline_markup.xml | 7 - .../atom/feed_tagline_inline_markup_2.xml | 7 - .../atom/feed_tagline_naked_markup.xml | 7 - .../atom/feed_tagline_text_plain.xml | 7 - .../tests/wellformed/atom/feed_title.xml | 7 - .../wellformed/atom/feed_title_base64.xml | 9 - .../wellformed/atom/feed_title_base64_2.xml | 9 - .../atom/feed_title_content_mode_base64.xml | 9 - .../atom/feed_title_content_mode_escaped.xml | 7 - .../atom/feed_title_content_type.xml | 7 - .../feed_title_content_type_text_plain.xml | 7 - .../atom/feed_title_content_value.xml | 7 - .../atom/feed_title_escaped_markup.xml | 7 - .../atom/feed_title_inline_markup.xml | 7 - .../atom/feed_title_inline_markup_2.xml | 7 - .../atom/feed_title_naked_markup.xml | 7 - .../wellformed/atom/feed_title_text_plain.xml | 7 - .../wellformed/atom/feed_updated_parsed.xml | 7 - .../tests/wellformed/atom/media_player1.xml | 10 - .../tests/wellformed/atom/media_thumbnail.xml | 11 - .../tests/wellformed/atom/relative_uri.xml | 7 - .../wellformed/atom/relative_uri_inherit.xml | 7 - .../atom/relative_uri_inherit_2.xml | 7 - .../wellformed/atom10/ampersand_in_attr.xml | 7 - .../wellformed/atom10/atom10_namespace.xml | 7 - .../wellformed/atom10/atom10_version.xml | 6 - .../wellformed/atom10/entry_author_email.xml | 13 - .../atom10/entry_author_map_author.xml | 13 - .../atom10/entry_author_map_author_2.xml | 12 - .../wellformed/atom10/entry_author_name.xml | 13 - .../wellformed/atom10/entry_author_uri.xml | 13 - .../wellformed/atom10/entry_author_url.xml | 13 - .../wellformed/atom10/entry_authors_email.xml | 15 - .../wellformed/atom10/entry_authors_name.xml | 15 - .../wellformed/atom10/entry_authors_uri.xml | 15 - .../wellformed/atom10/entry_authors_url.xml | 15 - .../atom10/entry_category_label.xml | 9 - .../atom10/entry_category_scheme.xml | 9 - .../wellformed/atom10/entry_category_term.xml | 9 - .../atom10/entry_category_term_non_ascii.xml | 9 - .../atom10/entry_content_application_xml.xml | 9 - .../atom10/entry_content_base64.xml | 11 - .../atom10/entry_content_base64_2.xml | 11 - .../entry_content_div_escaped_markup.xml | 9 - .../atom10/entry_content_escaped_markup.xml | 9 - .../atom10/entry_content_inline_markup.xml | 9 - .../atom10/entry_content_inline_markup_2.xml | 9 - .../wellformed/atom10/entry_content_src.xml | 9 - .../atom10/entry_content_text_plain.xml | 9 - .../entry_content_text_plain_brackets.xml | 9 - .../wellformed/atom10/entry_content_type.xml | 9 - .../atom10/entry_content_type_text.xml | 9 - .../wellformed/atom10/entry_content_value.xml | 9 - .../atom10/entry_contributor_email.xml | 13 - .../atom10/entry_contributor_multiple.xml | 18 - .../atom10/entry_contributor_name.xml | 13 - .../atom10/entry_contributor_uri.xml | 13 - .../atom10/entry_contributor_url.xml | 13 - .../tests/wellformed/atom10/entry_id.xml | 9 - .../wellformed/atom10/entry_id_map_guid.xml | 9 - .../atom10/entry_id_no_normalization_1.xml | 9 - .../atom10/entry_id_no_normalization_2.xml | 9 - .../atom10/entry_id_no_normalization_3.xml | 9 - .../atom10/entry_id_no_normalization_4.xml | 9 - .../atom10/entry_id_no_normalization_5.xml | 9 - .../atom10/entry_id_no_normalization_6.xml | 9 - .../atom10/entry_id_no_normalization_7.xml | 9 - .../atom10/entry_id_with_attributes.xml | 9 - .../atom10/entry_link_alternate_map_link.xml | 9 - .../entry_link_alternate_map_link_2.xml | 9 - .../entry_link_alternate_map_link_3.xml | 11 - .../wellformed/atom10/entry_link_href.xml | 9 - .../wellformed/atom10/entry_link_hreflang.xml | 9 - .../wellformed/atom10/entry_link_length.xml | 9 - .../wellformed/atom10/entry_link_multiple.xml | 10 - .../wellformed/atom10/entry_link_no_rel.xml | 9 - .../wellformed/atom10/entry_link_rel.xml | 9 - .../atom10/entry_link_rel_enclosure.xml | 9 - ...ink_rel_enclosure_map_enclosure_length.xml | 9 - ..._link_rel_enclosure_map_enclosure_type.xml | 9 - ...y_link_rel_enclosure_map_enclosure_url.xml | 9 - .../atom10/entry_link_rel_license.xml | 9 - .../atom10/entry_link_rel_other.xml | 9 - .../atom10/entry_link_rel_related.xml | 9 - .../wellformed/atom10/entry_link_rel_self.xml | 9 - .../wellformed/atom10/entry_link_rel_via.xml | 9 - .../wellformed/atom10/entry_link_title.xml | 9 - .../wellformed/atom10/entry_link_type.xml | 9 - .../tests/wellformed/atom10/entry_rights.xml | 9 - .../atom10/entry_rights_content_value.xml | 9 - .../atom10/entry_rights_escaped_markup.xml | 9 - .../atom10/entry_rights_inline_markup.xml | 9 - .../atom10/entry_rights_inline_markup_2.xml | 9 - .../atom10/entry_rights_text_plain.xml | 9 - .../entry_rights_text_plain_brackets.xml | 9 - .../atom10/entry_rights_type_default.xml | 9 - .../atom10/entry_rights_type_text.xml | 9 - .../atom10/entry_source_author_email.xml | 15 - .../atom10/entry_source_author_map_author.xml | 15 - .../entry_source_author_map_author_2.xml | 14 - .../atom10/entry_source_author_name.xml | 15 - .../atom10/entry_source_author_uri.xml | 15 - .../atom10/entry_source_authors_email.xml | 17 - .../atom10/entry_source_authors_name.xml | 17 - .../atom10/entry_source_authors_uri.xml | 17 - .../atom10/entry_source_authors_url.xml | 17 - .../atom10/entry_source_category_label.xml | 11 - .../atom10/entry_source_category_scheme.xml | 11 - .../atom10/entry_source_category_term.xml | 11 - .../entry_source_category_term_non_ascii.xml | 11 - .../atom10/entry_source_contributor_email.xml | 15 - .../entry_source_contributor_multiple.xml | 20 - .../atom10/entry_source_contributor_name.xml | 15 - .../atom10/entry_source_contributor_uri.xml | 15 - .../atom10/entry_source_generator.xml | 11 - .../atom10/entry_source_generator_name.xml | 11 - .../atom10/entry_source_generator_uri.xml | 11 - .../atom10/entry_source_generator_version.xml | 11 - .../wellformed/atom10/entry_source_icon.xml | 11 - .../wellformed/atom10/entry_source_id.xml | 11 - .../entry_source_link_alternate_map_link.xml | 11 - ...entry_source_link_alternate_map_link_2.xml | 11 - .../atom10/entry_source_link_href.xml | 11 - .../atom10/entry_source_link_hreflang.xml | 11 - .../atom10/entry_source_link_length.xml | 11 - .../atom10/entry_source_link_multiple.xml | 12 - .../atom10/entry_source_link_no_rel.xml | 11 - .../atom10/entry_source_link_rel.xml | 11 - .../atom10/entry_source_link_rel_other.xml | 11 - .../atom10/entry_source_link_rel_related.xml | 11 - .../atom10/entry_source_link_rel_self.xml | 11 - .../atom10/entry_source_link_rel_via.xml | 11 - .../atom10/entry_source_link_title.xml | 11 - .../atom10/entry_source_link_type.xml | 11 - .../wellformed/atom10/entry_source_logo.xml | 11 - .../wellformed/atom10/entry_source_rights.xml | 11 - .../atom10/entry_source_rights_base64.xml | 13 - .../atom10/entry_source_rights_base64_2.xml | 13 - .../entry_source_rights_content_type.xml | 11 - .../entry_source_rights_content_type_text.xml | 11 - .../entry_source_rights_content_value.xml | 11 - .../entry_source_rights_escaped_markup.xml | 11 - .../entry_source_rights_inline_markup.xml | 11 - .../entry_source_rights_inline_markup_2.xml | 11 - .../atom10/entry_source_rights_text_plain.xml | 11 - ...ntry_source_subittle_content_type_text.xml | 11 - .../atom10/entry_source_subtitle.xml | 11 - .../atom10/entry_source_subtitle_base64.xml | 13 - .../atom10/entry_source_subtitle_base64_2.xml | 13 - .../entry_source_subtitle_content_type.xml | 11 - .../entry_source_subtitle_content_value.xml | 11 - .../entry_source_subtitle_escaped_markup.xml | 11 - .../entry_source_subtitle_inline_markup.xml | 11 - .../entry_source_subtitle_inline_markup_2.xml | 11 - .../entry_source_subtitle_text_plain.xml | 11 - .../wellformed/atom10/entry_source_title.xml | 11 - .../atom10/entry_source_title_base64.xml | 13 - .../atom10/entry_source_title_base64_2.xml | 13 - .../entry_source_title_content_type.xml | 11 - .../entry_source_title_content_type_text.xml | 11 - .../entry_source_title_content_value.xml | 11 - .../entry_source_title_escaped_markup.xml | 11 - .../entry_source_title_inline_markup.xml | 11 - .../entry_source_title_inline_markup_2.xml | 11 - .../atom10/entry_source_title_text_plain.xml | 11 - .../tests/wellformed/atom10/entry_summary.xml | 9 - .../atom10/entry_summary_base64.xml | 11 - .../atom10/entry_summary_base64_2.xml | 11 - .../atom10/entry_summary_content_value.xml | 9 - .../atom10/entry_summary_escaped_markup.xml | 9 - .../atom10/entry_summary_inline_markup.xml | 9 - .../atom10/entry_summary_inline_markup_2.xml | 9 - .../atom10/entry_summary_text_plain.xml | 9 - .../atom10/entry_summary_type_default.xml | 9 - .../atom10/entry_summary_type_text.xml | 9 - .../tests/wellformed/atom10/entry_title.xml | 9 - .../wellformed/atom10/entry_title_base64.xml | 11 - .../atom10/entry_title_base64_2.xml | 11 - .../atom10/entry_title_content_value.xml | 9 - .../atom10/entry_title_escaped_markup.xml | 9 - .../atom10/entry_title_inline_markup.xml | 9 - .../atom10/entry_title_inline_markup_2.xml | 9 - .../atom10/entry_title_text_plain.xml | 9 - .../entry_title_text_plain_brackets.xml | 9 - .../atom10/entry_title_type_default.xml | 9 - .../atom10/entry_title_type_text.xml | 9 - .../wellformed/atom10/feed_author_email.xml | 11 - .../atom10/feed_author_map_author.xml | 11 - .../atom10/feed_author_map_author_2.xml | 10 - .../wellformed/atom10/feed_author_name.xml | 11 - .../wellformed/atom10/feed_author_uri.xml | 11 - .../wellformed/atom10/feed_author_url.xml | 11 - .../wellformed/atom10/feed_authors_email.xml | 13 - .../wellformed/atom10/feed_authors_name.xml | 13 - .../wellformed/atom10/feed_authors_uri.xml | 13 - .../wellformed/atom10/feed_authors_url.xml | 13 - .../atom10/feed_contributor_email.xml | 11 - .../atom10/feed_contributor_multiple.xml | 16 - .../atom10/feed_contributor_name.xml | 11 - .../atom10/feed_contributor_uri.xml | 11 - .../atom10/feed_contributor_url.xml | 11 - .../wellformed/atom10/feed_generator.xml | 7 - .../wellformed/atom10/feed_generator_name.xml | 7 - .../wellformed/atom10/feed_generator_url.xml | 7 - .../atom10/feed_generator_version.xml | 7 - .../tests/wellformed/atom10/feed_icon.xml | 7 - .../tests/wellformed/atom10/feed_id.xml | 7 - .../wellformed/atom10/feed_id_map_guid.xml | 7 - .../atom10/feed_link_alternate_map_link.xml | 7 - .../atom10/feed_link_alternate_map_link_2.xml | 7 - .../wellformed/atom10/feed_link_href.xml | 7 - .../wellformed/atom10/feed_link_hreflang.xml | 7 - .../wellformed/atom10/feed_link_length.xml | 7 - .../wellformed/atom10/feed_link_multiple.xml | 8 - .../wellformed/atom10/feed_link_no_rel.xml | 7 - .../tests/wellformed/atom10/feed_link_rel.xml | 7 - .../wellformed/atom10/feed_link_rel_other.xml | 7 - .../atom10/feed_link_rel_related.xml | 7 - .../wellformed/atom10/feed_link_rel_self.xml | 7 - .../feed_link_rel_self_default_type.xml | 7 - .../wellformed/atom10/feed_link_rel_via.xml | 7 - .../wellformed/atom10/feed_link_title.xml | 7 - .../wellformed/atom10/feed_link_type.xml | 7 - .../tests/wellformed/atom10/feed_logo.xml | 7 - .../tests/wellformed/atom10/feed_rights.xml | 7 - .../wellformed/atom10/feed_rights_base64.xml | 9 - .../atom10/feed_rights_base64_2.xml | 9 - .../atom10/feed_rights_content_type.xml | 7 - .../atom10/feed_rights_content_type_text.xml | 7 - .../atom10/feed_rights_content_value.xml | 7 - .../atom10/feed_rights_escaped_markup.xml | 7 - .../atom10/feed_rights_inline_markup.xml | 7 - .../atom10/feed_rights_inline_markup_2.xml | 7 - .../atom10/feed_rights_text_plain.xml | 7 - .../tests/wellformed/atom10/feed_subtitle.xml | 7 - .../atom10/feed_subtitle_base64.xml | 9 - .../atom10/feed_subtitle_base64_2.xml | 9 - .../atom10/feed_subtitle_content_type.xml | 7 - .../feed_subtitle_content_type_text.xml | 7 - .../atom10/feed_subtitle_content_value.xml | 7 - .../atom10/feed_subtitle_escaped_markup.xml | 7 - .../atom10/feed_subtitle_inline_markup.xml | 7 - .../atom10/feed_subtitle_inline_markup_2.xml | 7 - .../atom10/feed_subtitle_text_plain.xml | 7 - .../tests/wellformed/atom10/feed_title.xml | 7 - .../wellformed/atom10/feed_title_base64.xml | 9 - .../wellformed/atom10/feed_title_base64_2.xml | 9 - .../atom10/feed_title_content_type.xml | 7 - .../atom10/feed_title_content_type_text.xml | 7 - .../atom10/feed_title_content_value.xml | 7 - .../atom10/feed_title_escaped_markup.xml | 7 - .../atom10/feed_title_inline_markup.xml | 7 - .../atom10/feed_title_inline_markup_2.xml | 7 - .../atom10/feed_title_text_plain.xml | 7 - .../atom10/item_media_category_label.xml | 11 - .../atom10/item_media_category_multiple.xml | 12 - .../atom10/item_media_category_scheme1.xml | 11 - .../atom10/item_media_category_scheme2.xml | 11 - .../atom10/item_media_category_term.xml | 11 - .../atom10/item_media_title_type_plain.xml | 11 - .../atom10/missing_quote_in_attr.xml | 7 - .../tests/wellformed/atom10/qna.xml | 9 - .../tests/wellformed/atom10/quote_in_attr.xml | 7 - .../tests/wellformed/atom10/relative_uri.xml | 7 - .../atom10/relative_uri_inherit.xml | 7 - .../atom10/relative_uri_inherit_2.xml | 7 - .../tests/wellformed/atom10/tag_in_attr.xml | 7 - .../base/cdf_item_abstract_xml_base.xml | 18 - .../base/entry_content_xml_base.xml | 9 - .../base/entry_content_xml_base_inherit.xml | 9 - .../base/entry_content_xml_base_inherit_2.xml | 9 - .../base/entry_content_xml_base_inherit_3.xml | 10 - .../base/entry_content_xml_base_inherit_4.xml | 10 - .../base/entry_summary_xml_base.xml | 9 - .../base/entry_summary_xml_base_inherit.xml | 9 - .../base/entry_summary_xml_base_inherit_2.xml | 9 - .../base/entry_summary_xml_base_inherit_3.xml | 10 - .../base/entry_summary_xml_base_inherit_4.xml | 10 - .../wellformed/base/entry_title_xml_base.xml | 9 - .../base/entry_title_xml_base_inherit.xml | 9 - .../base/entry_title_xml_base_inherit_2.xml | 9 - .../base/entry_title_xml_base_inherit_3.xml | 10 - .../base/entry_title_xml_base_inherit_4.xml | 10 - .../base/feed_copyright_xml_base.xml | 7 - .../base/feed_copyright_xml_base_inherit.xml | 7 - .../feed_copyright_xml_base_inherit_2.xml | 7 - .../feed_copyright_xml_base_inherit_3.xml | 8 - .../feed_copyright_xml_base_inherit_4.xml | 8 - .../wellformed/base/feed_info_xml_base.xml | 7 - .../base/feed_info_xml_base_inherit.xml | 7 - .../base/feed_info_xml_base_inherit_2.xml | 7 - .../base/feed_info_xml_base_inherit_3.xml | 8 - .../base/feed_info_xml_base_inherit_4.xml | 8 - .../base/feed_link_xml_base_iri.xml | 7 - .../wellformed/base/feed_tagline_xml_base.xml | 7 - .../base/feed_tagline_xml_base_inherit.xml | 7 - .../base/feed_tagline_xml_base_inherit_2.xml | 7 - .../base/feed_tagline_xml_base_inherit_3.xml | 8 - .../base/feed_tagline_xml_base_inherit_4.xml | 8 - .../wellformed/base/feed_title_xml_base.xml | 7 - .../base/feed_title_xml_base_inherit.xml | 7 - .../base/feed_title_xml_base_inherit_2.xml | 7 - .../base/feed_title_xml_base_inherit_3.xml | 8 - .../base/feed_title_xml_base_inherit_4.xml | 8 - ...ttp_channel_docs_base_content_location.xml | 10 - .../base/http_channel_docs_base_docuri.xml | 9 - ...ttp_channel_link_base_content_location.xml | 10 - .../base/http_channel_link_base_docuri.xml | 9 - ...entry_author_url_base_content_location.xml | 12 - .../http_entry_author_url_base_docuri.xml | 11 - ...y_content_base64_base_content_location.xml | 12 - .../http_entry_content_base64_base_docuri.xml | 11 - ...tp_entry_content_base_content_location.xml | 10 - .../base/http_entry_content_base_docuri.xml | 9 - ...y_content_inline_base_content_location.xml | 10 - .../http_entry_content_inline_base_docuri.xml | 9 - ..._contributor_url_base_content_location.xml | 12 - ...http_entry_contributor_url_base_docuri.xml | 11 - .../http_entry_id_base_content_location.xml | 10 - .../base/http_entry_id_base_docuri.xml | 9 - .../http_entry_link_base_content_location.xml | 10 - .../base/http_entry_link_base_docuri.xml | 9 - ...y_summary_base64_base_content_location.xml | 12 - .../http_entry_summary_base64_base_docuri.xml | 11 - ...tp_entry_summary_base_content_location.xml | 10 - .../base/http_entry_summary_base_docuri.xml | 9 - ...y_summary_inline_base_content_location.xml | 10 - .../http_entry_summary_inline_base_docuri.xml | 9 - ...try_title_base64_base_content_location.xml | 12 - .../http_entry_title_base64_base_docuri.xml | 11 - ...http_entry_title_base_content_location.xml | 10 - .../base/http_entry_title_base_docuri.xml | 9 - ...try_title_inline_base_content_location.xml | 10 - .../http_entry_title_inline_base_docuri.xml | 9 - ..._feed_author_url_base_content_location.xml | 10 - .../base/http_feed_author_url_base_docuri.xml | 9 - ..._contributor_url_base_content_location.xml | 10 - .../http_feed_contributor_url_base_docuri.xml | 9 - ...copyright_base64_base_content_location.xml | 10 - ...http_feed_copyright_base64_base_docuri.xml | 9 - ...p_feed_copyright_base_content_location.xml | 8 - .../base/http_feed_copyright_base_docuri.xml | 7 - ...copyright_inline_base_content_location.xml | 8 - ...http_feed_copyright_inline_base_docuri.xml | 7 - ...ed_generator_url_base_content_location.xml | 8 - .../http_feed_generator_url_base_docuri.xml | 7 - .../http_feed_id_base_content_location.xml | 8 - .../base/http_feed_id_base_docuri.xml | 7 - ...feed_info_base64_base_content_location.xml | 10 - .../http_feed_info_base64_base_docuri.xml | 9 - .../http_feed_info_base_content_location.xml | 8 - .../base/http_feed_info_base_docuri.xml | 7 - ...feed_info_inline_base_content_location.xml | 8 - .../http_feed_info_inline_base_docuri.xml | 7 - .../http_feed_link_base_content_location.xml | 8 - .../base/http_feed_link_base_docuri.xml | 7 - ...d_tagline_base64_base_content_location.xml | 10 - .../http_feed_tagline_base64_base_docuri.xml | 9 - ...ttp_feed_tagline_base_content_location.xml | 8 - .../base/http_feed_tagline_base_docuri.xml | 7 - ...d_tagline_inline_base_content_location.xml | 8 - .../http_feed_tagline_inline_base_docuri.xml | 7 - ...eed_title_base64_base_content_location.xml | 10 - .../http_feed_title_base64_base_docuri.xml | 9 - .../http_feed_title_base_content_location.xml | 8 - .../base/http_feed_title_base_docuri.xml | 7 - ...eed_title_inline_base_content_location.xml | 8 - .../http_feed_title_inline_base_docuri.xml | 7 - .../http_item_body_base_content_location.xml | 12 - .../base/http_item_body_base_docuri.xml | 11 - ...tp_item_comments_base_content_location.xml | 12 - .../base/http_item_comments_base_docuri.xml | 11 - ..._content_encoded_base_content_location.xml | 12 - .../http_item_content_encoded_base_docuri.xml | 11 - ...item_description_base_content_location.xml | 12 - .../http_item_description_base_docuri.xml | 11 - .../base/http_item_description_spaces.xml | 11 - ...tp_item_fullitem_base_content_location.xml | 12 - .../base/http_item_fullitem_base_docuri.xml | 11 - .../http_item_link_base_content_location.xml | 12 - .../base/http_item_link_base_docuri.xml | 11 - ...m_wfw_commentRSS_base_content_location.xml | 12 - .../http_item_wfw_commentRSS_base_docuri.xml | 11 - ...item_wfw_comment_base_content_location.xml | 12 - .../http_item_wfw_comment_base_docuri.xml | 11 - ..._item_xhtml_body_base_content_location.xml | 12 - .../base/http_item_xhtml_body_base_docuri.xml | 11 - .../base/http_relative_xml_base.xml | 10 - .../base/http_relative_xml_base_2.xml | 10 - .../wellformed/base/item_media_title1.xml | 11 - .../wellformed/base/item_media_title2.xml | 12 - .../wellformed/base/item_media_title3.xml | 12 - .../tests/wellformed/base/malformed_base.xml | 9 - .../base/rel_uri_with_unicode_character.xml | 11 - .../wellformed/base/relative_xml_base.xml | 9 - .../wellformed/base/relative_xml_base_2.xml | 9 - .../tests/wellformed/base/unsafe_base.xml | 10 - .../cdf/channel_abstract_map_description.xml | 7 - .../cdf/channel_abstract_map_tagline.xml | 7 - .../wellformed/cdf/channel_href_map_link.xml | 6 - .../wellformed/cdf/channel_href_map_links.xml | 6 - .../tests/wellformed/cdf/channel_lastmod.xml | 6 - .../wellformed/cdf/channel_lastmod_parsed.xml | 6 - .../tests/wellformed/cdf/channel_title.xml | 7 - .../cdf/item_abstract_map_description.xml | 9 - .../cdf/item_abstract_map_summary.xml | 9 - .../wellformed/cdf/item_href_map_link.xml | 8 - .../wellformed/cdf/item_href_map_links.xml | 8 - .../tests/wellformed/cdf/item_lastmod.xml | 8 - .../wellformed/cdf/item_lastmod_parsed.xml | 8 - .../tests/wellformed/cdf/item_title.xml | 9 - .../feedburner/feedburner_browserfriendly.xml | 9 - .../headers_content_location-relative.xml | 8 - .../http/headers_content_location-unsafe.xml | 9 - .../tests/wellformed/http/headers_etag.xml | 7 - .../tests/wellformed/http/headers_foo.xml | 7 - .../tests/wellformed/http/headers_no_etag.xml | 7 - .../itunes/itunes_channel_block.xml | 9 - .../itunes/itunes_channel_block_false.xml | 9 - .../itunes/itunes_channel_block_no.xml | 9 - .../itunes/itunes_channel_block_true.xml | 9 - .../itunes/itunes_channel_block_uppercase.xml | 9 - .../itunes_channel_block_whitespace.xml | 9 - .../itunes/itunes_channel_category.xml | 9 - .../itunes/itunes_channel_category_nested.xml | 11 - .../itunes/itunes_channel_category_scheme.xml | 9 - .../itunes/itunes_channel_explicit.xml | 9 - .../itunes/itunes_channel_explicit_clean.xml | 9 - .../itunes/itunes_channel_explicit_false.xml | 9 - .../itunes/itunes_channel_explicit_no.xml | 9 - .../itunes/itunes_channel_explicit_true.xml | 9 - .../itunes_channel_explicit_uppercase.xml | 9 - .../itunes_channel_explicit_whitespace.xml | 9 - .../itunes/itunes_channel_image.xml | 9 - .../itunes/itunes_channel_image_no_href.xml | 12 - .../itunes/itunes_channel_image_url.xml | 9 - .../itunes/itunes_channel_keywords.xml | 9 - .../itunes_channel_keywords_duplicate.xml | 9 - .../itunes_channel_keywords_duplicate_2.xml | 10 - .../itunes_channel_keywords_multiple.xml | 9 - .../itunes/itunes_channel_link_image.xml | 9 - .../itunes/itunes_channel_owner_email.xml | 12 - .../itunes/itunes_channel_owner_name.xml | 12 - .../itunes/itunes_channel_subtitle.xml | 9 - .../itunes/itunes_channel_summary.xml | 9 - .../itunes/itunes_core_element_uppercase.xml | 9 - .../itunes/itunes_item_author_map_author.xml | 11 - .../wellformed/itunes/itunes_item_block.xml | 11 - .../itunes/itunes_item_block_false.xml | 11 - .../itunes/itunes_item_block_no.xml | 11 - .../itunes/itunes_item_block_true.xml | 11 - .../itunes/itunes_item_block_uppercase.xml | 11 - .../itunes/itunes_item_block_whitespace.xml | 11 - .../itunes/itunes_item_category.xml | 11 - .../itunes/itunes_item_category_nested.xml | 13 - .../itunes/itunes_item_category_scheme.xml | 11 - .../itunes/itunes_item_duration.xml | 11 - .../itunes/itunes_item_explicit.xml | 11 - .../itunes/itunes_item_explicit_clean.xml | 11 - .../itunes/itunes_item_explicit_false.xml | 11 - .../itunes/itunes_item_explicit_no.xml | 11 - .../itunes/itunes_item_explicit_true.xml | 11 - .../itunes/itunes_item_explicit_uppercase.xml | 11 - .../itunes_item_explicit_whitespace.xml | 11 - .../wellformed/itunes/itunes_item_image.xml | 11 - .../itunes/itunes_item_image_url.xml | 11 - .../itunes/itunes_item_link_image.xml | 11 - .../itunes/itunes_item_subtitle.xml | 11 - .../wellformed/itunes/itunes_item_summary.xml | 11 - .../wellformed/itunes/itunes_namespace.xml | 9 - .../itunes/itunes_namespace_example.xml | 9 - .../itunes/itunes_namespace_lowercase.xml | 9 - .../itunes/itunes_namespace_uppercase.xml | 9 - .../wellformed/lang/channel_dc_language.xml | 9 - .../wellformed/lang/channel_language.xml | 9 - .../lang/entry_content_xml_lang.xml | 9 - .../lang/entry_content_xml_lang_blank.xml | 9 - .../lang/entry_content_xml_lang_blank_2.xml | 9 - .../lang/entry_content_xml_lang_blank_3.xml | 12 - .../lang/entry_content_xml_lang_inherit.xml | 9 - .../lang/entry_content_xml_lang_inherit_2.xml | 9 - .../lang/entry_content_xml_lang_inherit_3.xml | 10 - .../lang/entry_content_xml_lang_inherit_4.xml | 10 - .../entry_content_xml_lang_underscore.xml | 9 - .../lang/entry_summary_xml_lang.xml | 9 - .../lang/entry_summary_xml_lang_blank.xml | 9 - .../lang/entry_summary_xml_lang_inherit.xml | 9 - .../lang/entry_summary_xml_lang_inherit_2.xml | 9 - .../lang/entry_summary_xml_lang_inherit_3.xml | 10 - .../lang/entry_summary_xml_lang_inherit_4.xml | 10 - .../wellformed/lang/entry_title_xml_lang.xml | 9 - .../lang/entry_title_xml_lang_blank.xml | 9 - .../lang/entry_title_xml_lang_inherit.xml | 9 - .../lang/entry_title_xml_lang_inherit_2.xml | 9 - .../lang/entry_title_xml_lang_inherit_3.xml | 10 - .../lang/entry_title_xml_lang_inherit_4.xml | 10 - .../lang/feed_copyright_xml_lang.xml | 7 - .../lang/feed_copyright_xml_lang_blank.xml | 7 - .../lang/feed_copyright_xml_lang_inherit.xml | 7 - .../feed_copyright_xml_lang_inherit_2.xml | 7 - .../feed_copyright_xml_lang_inherit_3.xml | 8 - .../feed_copyright_xml_lang_inherit_4.xml | 8 - .../wellformed/lang/feed_info_xml_lang.xml | 7 - .../lang/feed_info_xml_lang_blank.xml | 7 - .../lang/feed_info_xml_lang_inherit.xml | 7 - .../lang/feed_info_xml_lang_inherit_2.xml | 7 - .../lang/feed_info_xml_lang_inherit_3.xml | 8 - .../lang/feed_info_xml_lang_inherit_4.xml | 8 - .../tests/wellformed/lang/feed_language.xml | 9 - .../lang/feed_language_override.xml | 9 - .../wellformed/lang/feed_not_xml_lang.xml | 7 - .../wellformed/lang/feed_not_xml_lang_2.xml | 7 - .../wellformed/lang/feed_tagline_xml_lang.xml | 7 - .../lang/feed_tagline_xml_lang_blank.xml | 7 - .../lang/feed_tagline_xml_lang_inherit.xml | 7 - .../lang/feed_tagline_xml_lang_inherit_2.xml | 7 - .../lang/feed_tagline_xml_lang_inherit_3.xml | 8 - .../lang/feed_tagline_xml_lang_inherit_4.xml | 8 - .../wellformed/lang/feed_title_xml_lang.xml | 7 - .../lang/feed_title_xml_lang_blank.xml | 7 - .../lang/feed_title_xml_lang_inherit.xml | 7 - .../lang/feed_title_xml_lang_inherit_2.xml | 7 - .../lang/feed_title_xml_lang_inherit_3.xml | 8 - .../lang/feed_title_xml_lang_inherit_4.xml | 8 - .../tests/wellformed/lang/feed_xml_lang.xml | 6 - .../lang/feed_xml_lang_underscore.xml | 6 - .../wellformed/lang/http_content_language.xml | 7 - ...p_content_language_entry_title_inherit.xml | 10 - ...content_language_entry_title_inherit_2.xml | 11 - .../http_content_language_feed_language.xml | 10 - .../http_content_language_feed_xml_lang.xml | 7 - .../lang/item_content_encoded_xml_lang.xml | 11 - .../item_content_encoded_xml_lang_inherit.xml | 11 - .../wellformed/lang/item_dc_language.xml | 11 - .../lang/item_fullitem_xml_lang.xml | 11 - .../lang/item_fullitem_xml_lang_inherit.xml | 11 - .../lang/item_xhtml_body_xml_lang.xml | 13 - .../lang/item_xhtml_body_xml_lang_inherit.xml | 13 - .../wellformed/mf_hcard/3-5-5-org-unicode.xml | 14 - .../mf_rel_tag/rel_tag_term_no_term.xml | 12 - .../tests/wellformed/namespace/atommathml.xml | 9 - .../tests/wellformed/namespace/atomsvg.xml | 9 - .../wellformed/namespace/atomsvgdctitle.xml | 36 - .../wellformed/namespace/atomsvgdesc.xml | 9 - .../wellformed/namespace/atomsvgtitle.xml | 9 - .../wellformed/namespace/atomthreading.xml | 5 - .../namespace/atomthreadingwithentry.xml | 6 - .../tests/wellformed/namespace/atomxlink.xml | 9 - .../namespace/rss1.0withModules.xml | 47 - .../namespace/rss1.0withModulesNoDefNS.xml | 48 - ...rss1.0withModulesNoDefNSLocalNameClash.xml | 53 - .../namespace/rss2.0NSwithModules.xml | 50 - .../namespace/rss2.0NSwithModulesNoDefNS.xml | 50 - ...s2.0NSwithModulesNoDefNSLocalNameClash.xml | 58 - .../wellformed/namespace/rss2.0mathml.xml | 11 - .../namespace/rss2.0noNSwithModules.xml | 49 - .../rss2.0noNSwithModulesLocalNameClash.xml | 57 - .../tests/wellformed/namespace/rss2.0svg.xml | 11 - .../tests/wellformed/namespace/rss2.0svg5.xml | 11 - .../wellformed/namespace/rss2.0svgtitle.xml | 11 - .../wellformed/namespace/rss2.0withAtomNS.xml | 27 - .../wellformed/namespace/rss2.0xlink.xml | 11 - .../atom10_arbitrary_element.xml | 18 - .../wellformed/node_precedence/atom10_id.xml | 18 - .../node_precedence/atom10_title.xml | 18 - .../rdf/doctype_contains_entity_decl.xml | 17 - .../rdf/rdf_channel_description.xml | 9 - .../tests/wellformed/rdf/rdf_channel_link.xml | 9 - .../wellformed/rdf/rdf_channel_title.xml | 9 - .../wellformed/rdf/rdf_item_description.xml | 16 - .../tests/wellformed/rdf/rdf_item_link.xml | 16 - .../wellformed/rdf/rdf_item_rdf_about.xml | 15 - .../tests/wellformed/rdf/rdf_item_title.xml | 16 - .../wellformed/rdf/rss090_channel_title.xml | 12 - .../wellformed/rdf/rss090_item_title.xml | 12 - .../tests/wellformed/rdf/rss_version_10.xml | 6 - .../rdf/rss_version_10_not_default_ns.xml | 8 - .../tests/wellformed/rss/aaa_wellformed.xml | 6 - .../tests/wellformed/rss/channel_author.xml | 9 - ...channel_author_map_author_detail_email.xml | 9 - ...annel_author_map_author_detail_email_2.xml | 9 - ...annel_author_map_author_detail_email_3.xml | 9 - .../channel_author_map_author_detail_name.xml | 9 - ...hannel_author_map_author_detail_name_2.xml | 9 - .../tests/wellformed/rss/channel_category.xml | 9 - .../rss/channel_category_domain.xml | 9 - .../rss/channel_category_multiple.xml | 10 - .../rss/channel_category_multiple_2.xml | 10 - .../wellformed/rss/channel_cloud_domain.xml | 9 - .../wellformed/rss/channel_cloud_path.xml | 9 - .../wellformed/rss/channel_cloud_port.xml | 9 - .../wellformed/rss/channel_cloud_protocol.xml | 9 - .../rss/channel_cloud_registerProcedure.xml | 9 - .../wellformed/rss/channel_copyright.xml | 9 - .../wellformed/rss/channel_dc_author.xml | 9 - ...nnel_dc_author_map_author_detail_email.xml | 9 - ...annel_dc_author_map_author_detail_name.xml | 9 - .../wellformed/rss/channel_dc_contributor.xml | 9 - .../wellformed/rss/channel_dc_creator.xml | 9 - ...nel_dc_creator_map_author_detail_email.xml | 9 - ...nnel_dc_creator_map_author_detail_name.xml | 9 - .../tests/wellformed/rss/channel_dc_date.xml | 9 - .../wellformed/rss/channel_dc_date_parsed.xml | 9 - .../wellformed/rss/channel_dc_publisher.xml | 9 - .../rss/channel_dc_publisher_email.xml | 9 - .../rss/channel_dc_publisher_name.xml | 9 - .../wellformed/rss/channel_dc_rights.xml | 9 - .../wellformed/rss/channel_dc_subject.xml | 9 - .../wellformed/rss/channel_dc_subject_2.xml | 9 - .../rss/channel_dc_subject_multiple.xml | 10 - .../tests/wellformed/rss/channel_dc_title.xml | 9 - .../rss/channel_dcterms_created.xml | 9 - .../rss/channel_dcterms_created_parsed.xml | 9 - .../wellformed/rss/channel_dcterms_issued.xml | 9 - .../rss/channel_dcterms_issued_parsed.xml | 9 - .../rss/channel_dcterms_modified.xml | 9 - .../rss/channel_dcterms_modified_parsed.xml | 9 - .../wellformed/rss/channel_description.xml | 9 - .../channel_description_escaped_markup.xml | 9 - .../rss/channel_description_map_tagline.xml | 9 - .../rss/channel_description_naked_markup.xml | 9 - .../rss/channel_description_shorttag.xml | 10 - .../tests/wellformed/rss/channel_docs.xml | 9 - .../wellformed/rss/channel_generator.xml | 9 - .../rss/channel_image_description.xml | 16 - .../wellformed/rss/channel_image_height.xml | 16 - .../wellformed/rss/channel_image_link.xml | 16 - .../rss/channel_image_link_bleed.xml | 12 - .../rss/channel_image_link_conflict.xml | 12 - .../wellformed/rss/channel_image_title.xml | 16 - .../rss/channel_image_title_conflict.xml | 12 - .../wellformed/rss/channel_image_url.xml | 16 - .../wellformed/rss/channel_image_width.xml | 16 - .../wellformed/rss/channel_lastBuildDate.xml | 9 - .../rss/channel_lastBuildDate_parsed.xml | 9 - .../tests/wellformed/rss/channel_link.xml | 9 - .../wellformed/rss/channel_managingEditor.xml | 9 - ...managingEditor_map_author_detail_email.xml | 9 - ..._managingEditor_map_author_detail_name.xml | 9 - .../tests/wellformed/rss/channel_pubDate.xml | 9 - .../channel_pubDate_map_updated_parsed.xml | 9 - .../rss/channel_textInput_description.xml | 14 - ...channel_textInput_description_conflict.xml | 12 - .../wellformed/rss/channel_textInput_link.xml | 12 - .../rss/channel_textInput_link_bleed.xml | 12 - .../rss/channel_textInput_link_conflict.xml | 12 - .../wellformed/rss/channel_textInput_name.xml | 11 - .../rss/channel_textInput_title.xml | 12 - .../rss/channel_textInput_title_conflict.xml | 12 - .../tests/wellformed/rss/channel_title.xml | 9 - .../wellformed/rss/channel_title_apos.xml | 9 - .../tests/wellformed/rss/channel_title_gt.xml | 9 - .../tests/wellformed/rss/channel_title_lt.xml | 9 - .../tests/wellformed/rss/channel_ttl.xml | 9 - .../wellformed/rss/channel_webMaster.xml | 9 - .../rss/channel_webMaster_email.xml | 9 - .../wellformed/rss/channel_webMaster_name.xml | 9 - .../wellformed/rss/entity_in_doctype.xml | 16 - .../tests/wellformed/rss/item_author.xml | 11 - .../item_author_map_author_detail_email.xml | 11 - .../item_author_map_author_detail_email2.xml | 11 - .../item_author_map_author_detail_email3.xml | 11 - .../item_author_map_author_detail_name.xml | 11 - .../item_author_map_author_detail_name2.xml | 11 - .../item_author_map_author_detail_name3.xml | 11 - .../tests/wellformed/rss/item_category.xml | 11 - .../wellformed/rss/item_category_domain.xml | 11 - .../wellformed/rss/item_category_image.xml | 17 - .../wellformed/rss/item_category_multiple.xml | 12 - .../rss/item_category_multiple_2.xml | 12 - .../tests/wellformed/rss/item_cc_license.xml | 12 - .../tests/wellformed/rss/item_comments.xml | 11 - .../wellformed/rss/item_content_encoded.xml | 11 - .../rss/item_content_encoded_mode.xml | 11 - .../rss/item_content_encoded_type.xml | 11 - .../rss/item_creativeCommons_license.xml | 12 - .../tests/wellformed/rss/item_dc_author.xml | 11 - ...item_dc_author_map_author_detail_email.xml | 11 - .../item_dc_author_map_author_detail_name.xml | 11 - .../wellformed/rss/item_dc_contributor.xml | 11 - .../tests/wellformed/rss/item_dc_creator.xml | 11 - ...tem_dc_creator_map_author_detail_email.xml | 11 - ...item_dc_creator_map_author_detail_name.xml | 11 - .../tests/wellformed/rss/item_dc_date.xml | 11 - .../wellformed/rss/item_dc_date_parsed.xml | 11 - .../wellformed/rss/item_dc_description.xml | 11 - .../wellformed/rss/item_dc_publisher.xml | 11 - .../rss/item_dc_publisher_email.xml | 11 - .../wellformed/rss/item_dc_publisher_name.xml | 11 - .../tests/wellformed/rss/item_dc_rights.xml | 11 - .../tests/wellformed/rss/item_dc_subject.xml | 11 - .../wellformed/rss/item_dc_subject_2.xml | 11 - .../rss/item_dc_subject_multiple.xml | 12 - .../tests/wellformed/rss/item_dc_title.xml | 11 - .../wellformed/rss/item_dcterms_created.xml | 11 - .../rss/item_dcterms_created_parsed.xml | 11 - .../wellformed/rss/item_dcterms_issued.xml | 11 - .../rss/item_dcterms_issued_parsed.xml | 11 - .../wellformed/rss/item_dcterms_modified.xml | 11 - .../rss/item_dcterms_modified_parsed.xml | 11 - .../tests/wellformed/rss/item_description.xml | 11 - .../rss/item_description_and_summary.xml | 12 - .../wellformed/rss/item_description_br.xml | 11 - .../rss/item_description_br_shorttag.xml | 12 - .../rss/item_description_code_br.xml | 12 - .../rss/item_description_escaped_markup.xml | 11 - .../rss/item_description_map_summary.xml | 11 - .../rss/item_description_naked_markup.xml | 11 - .../rss/item_description_not_a_doctype.xml | 9 - .../rss/item_description_not_a_doctype2.xml | 9 - .../wellformed/rss/item_enclosure_length.xml | 12 - .../rss/item_enclosure_multiple.xml | 13 - .../wellformed/rss/item_enclosure_type.xml | 12 - .../wellformed/rss/item_enclosure_url.xml | 12 - .../wellformed/rss/item_expirationDate.xml | 11 - .../item_expirationDate_multiple_values.xml | 12 - .../rss/item_expirationDate_parsed.xml | 11 - .../tests/wellformed/rss/item_fullitem.xml | 11 - .../wellformed/rss/item_fullitem_mode.xml | 11 - .../wellformed/rss/item_fullitem_type.xml | 11 - .../tests/wellformed/rss/item_guid.xml | 11 - .../rss/item_guid_conflict_link.xml | 12 - .../wellformed/rss/item_guid_guidislink.xml | 11 - .../item_guid_isPermaLink_conflict_link.xml | 12 - ...PermaLink_conflict_link_not_guidislink.xml | 12 - .../rss/item_guid_isPermaLink_guidislink.xml | 11 - .../rss/item_guid_isPermaLink_map_link.xml | 11 - .../wellformed/rss/item_guid_map_link.xml | 11 - .../rss/item_guid_not_permalink.xml | 11 - .../item_guid_not_permalink_conflict_link.xml | 12 - ...item_guid_not_permalink_not_guidislink.xml | 11 - ...em_guid_not_permalink_not_guidislink_2.xml | 12 - .../rss/item_guid_not_permalink_not_url.xml | 11 - .../wellformed/rss/item_image_link_bleed.xml | 14 - .../rss/item_image_link_conflict.xml | 14 - .../tests/wellformed/rss/item_link.xml | 11 - .../tests/wellformed/rss/item_pubDate.xml | 11 - .../rss/item_pubDate_map_updated_parsed.xml | 11 - .../tests/wellformed/rss/item_source.xml | 11 - .../tests/wellformed/rss/item_source_url.xml | 11 - .../rss/item_summary_and_description.xml | 12 - .../tests/wellformed/rss/item_title.xml | 11 - .../tests/wellformed/rss/item_xhtml_body.xml | 13 - .../wellformed/rss/item_xhtml_body_mode.xml | 13 - .../wellformed/rss/item_xhtml_body_type.xml | 13 - .../tests/wellformed/rss/newlocation.xml | 9 - .../tests/wellformed/rss/rss_namespace_1.xml | 9 - .../tests/wellformed/rss/rss_namespace_2.xml | 9 - .../tests/wellformed/rss/rss_namespace_3.xml | 9 - .../tests/wellformed/rss/rss_namespace_4.xml | 9 - .../tests/wellformed/rss/rss_version_090.xml | 6 - .../rss/rss_version_091_netscape.xml | 7 - .../rss/rss_version_091_userland.xml | 6 - .../tests/wellformed/rss/rss_version_092.xml | 6 - .../tests/wellformed/rss/rss_version_093.xml | 6 - .../tests/wellformed/rss/rss_version_094.xml | 6 - .../tests/wellformed/rss/rss_version_20.xml | 6 - .../tests/wellformed/rss/rss_version_201.xml | 6 - .../tests/wellformed/rss/rss_version_21.xml | 6 - .../wellformed/rss/rss_version_missing.xml | 9 - .../sanitize/acceptable_attribute_abbr.xml | 9 - .../acceptable_attribute_accept-charset.xml | 9 - .../sanitize/acceptable_attribute_accept.xml | 9 - .../acceptable_attribute_accesskey.xml | 9 - .../sanitize/acceptable_attribute_action.xml | 9 - .../sanitize/acceptable_attribute_align.xml | 9 - .../sanitize/acceptable_attribute_alt.xml | 9 - .../acceptable_attribute_autocomplete.xml | 9 - .../acceptable_attribute_autofocus.xml | 9 - .../acceptable_attribute_autoplay.xml | 9 - .../sanitize/acceptable_attribute_axis.xml | 9 - .../acceptable_attribute_background.xml | 9 - .../sanitize/acceptable_attribute_balance.xml | 9 - .../sanitize/acceptable_attribute_bgcolor.xml | 9 - .../acceptable_attribute_bgproperties.xml | 9 - .../sanitize/acceptable_attribute_border.xml | 9 - .../acceptable_attribute_bordercolor.xml | 9 - .../acceptable_attribute_bordercolordark.xml | 9 - .../acceptable_attribute_bordercolorlight.xml | 9 - .../acceptable_attribute_bottompadding.xml | 9 - .../acceptable_attribute_cellpadding.xml | 9 - .../acceptable_attribute_cellspacing.xml | 9 - .../sanitize/acceptable_attribute_ch.xml | 9 - .../acceptable_attribute_challenge.xml | 9 - .../sanitize/acceptable_attribute_char.xml | 9 - .../sanitize/acceptable_attribute_charoff.xml | 9 - .../sanitize/acceptable_attribute_charset.xml | 9 - .../sanitize/acceptable_attribute_checked.xml | 9 - .../sanitize/acceptable_attribute_choff.xml | 9 - .../sanitize/acceptable_attribute_cite.xml | 9 - .../sanitize/acceptable_attribute_class.xml | 9 - .../sanitize/acceptable_attribute_clear.xml | 9 - .../sanitize/acceptable_attribute_color.xml | 9 - .../sanitize/acceptable_attribute_cols.xml | 9 - .../sanitize/acceptable_attribute_colspan.xml | 9 - .../sanitize/acceptable_attribute_compact.xml | 9 - .../acceptable_attribute_contenteditable.xml | 9 - .../sanitize/acceptable_attribute_coords.xml | 9 - .../sanitize/acceptable_attribute_data.xml | 9 - .../sanitize/acceptable_attribute_datafld.xml | 9 - .../acceptable_attribute_datapagesize.xml | 9 - .../sanitize/acceptable_attribute_datasrc.xml | 9 - .../acceptable_attribute_datetime.xml | 9 - .../sanitize/acceptable_attribute_default.xml | 9 - .../sanitize/acceptable_attribute_delay.xml | 9 - .../sanitize/acceptable_attribute_dir.xml | 9 - .../acceptable_attribute_disabled.xml | 9 - .../acceptable_attribute_draggable.xml | 9 - .../sanitize/acceptable_attribute_dynsrc.xml | 9 - .../sanitize/acceptable_attribute_enctype.xml | 9 - .../sanitize/acceptable_attribute_end.xml | 9 - .../sanitize/acceptable_attribute_face.xml | 9 - .../sanitize/acceptable_attribute_for.xml | 9 - .../sanitize/acceptable_attribute_form.xml | 9 - .../sanitize/acceptable_attribute_frame.xml | 9 - .../acceptable_attribute_galleryimg.xml | 9 - .../sanitize/acceptable_attribute_gutter.xml | 9 - .../sanitize/acceptable_attribute_headers.xml | 9 - .../sanitize/acceptable_attribute_height.xml | 9 - .../sanitize/acceptable_attribute_hidden.xml | 9 - .../acceptable_attribute_hidefocus.xml | 9 - .../sanitize/acceptable_attribute_high.xml | 9 - .../sanitize/acceptable_attribute_href.xml | 9 - .../acceptable_attribute_hreflang.xml | 9 - .../sanitize/acceptable_attribute_hspace.xml | 9 - .../sanitize/acceptable_attribute_icon.xml | 9 - .../sanitize/acceptable_attribute_id.xml | 9 - .../acceptable_attribute_inputmode.xml | 9 - .../sanitize/acceptable_attribute_ismap.xml | 9 - .../sanitize/acceptable_attribute_keytype.xml | 9 - .../sanitize/acceptable_attribute_label.xml | 9 - .../sanitize/acceptable_attribute_lang.xml | 9 - .../acceptable_attribute_leftspacing.xml | 9 - .../sanitize/acceptable_attribute_list.xml | 9 - .../acceptable_attribute_longdesc.xml | 9 - .../sanitize/acceptable_attribute_loop.xml | 9 - .../acceptable_attribute_loopcount.xml | 9 - .../sanitize/acceptable_attribute_loopend.xml | 9 - .../acceptable_attribute_loopstart.xml | 9 - .../sanitize/acceptable_attribute_low.xml | 9 - .../sanitize/acceptable_attribute_lowsrc.xml | 9 - .../sanitize/acceptable_attribute_max.xml | 9 - .../acceptable_attribute_maxlength.xml | 9 - .../sanitize/acceptable_attribute_media.xml | 9 - .../sanitize/acceptable_attribute_method.xml | 9 - .../sanitize/acceptable_attribute_min.xml | 9 - .../acceptable_attribute_multiple.xml | 9 - .../sanitize/acceptable_attribute_name.xml | 9 - .../sanitize/acceptable_attribute_nohref.xml | 9 - .../sanitize/acceptable_attribute_noshade.xml | 9 - .../sanitize/acceptable_attribute_nowrap.xml | 9 - .../sanitize/acceptable_attribute_open.xml | 9 - .../sanitize/acceptable_attribute_optimum.xml | 9 - .../sanitize/acceptable_attribute_pattern.xml | 9 - .../sanitize/acceptable_attribute_ping.xml | 9 - .../acceptable_attribute_point-size.xml | 9 - .../sanitize/acceptable_attribute_poster.xml | 9 - .../sanitize/acceptable_attribute_pqg.xml | 9 - .../sanitize/acceptable_attribute_preload.xml | 9 - .../sanitize/acceptable_attribute_prompt.xml | 9 - .../acceptable_attribute_radiogroup.xml | 9 - .../acceptable_attribute_readonly.xml | 9 - .../sanitize/acceptable_attribute_rel.xml | 9 - .../acceptable_attribute_repeat-max.xml | 9 - .../acceptable_attribute_repeat-min.xml | 9 - .../sanitize/acceptable_attribute_replace.xml | 9 - .../acceptable_attribute_required.xml | 9 - .../sanitize/acceptable_attribute_rev.xml | 9 - .../acceptable_attribute_rightspacing.xml | 9 - .../sanitize/acceptable_attribute_rows.xml | 9 - .../sanitize/acceptable_attribute_rowspan.xml | 9 - .../sanitize/acceptable_attribute_rules.xml | 9 - .../sanitize/acceptable_attribute_scope.xml | 9 - .../acceptable_attribute_selected.xml | 9 - .../sanitize/acceptable_attribute_shape.xml | 9 - .../sanitize/acceptable_attribute_size.xml | 9 - .../sanitize/acceptable_attribute_span.xml | 9 - .../sanitize/acceptable_attribute_src.xml | 9 - .../sanitize/acceptable_attribute_start.xml | 9 - .../sanitize/acceptable_attribute_step.xml | 9 - .../sanitize/acceptable_attribute_summary.xml | 9 - .../acceptable_attribute_suppress.xml | 9 - .../acceptable_attribute_tabindex.xml | 9 - .../sanitize/acceptable_attribute_target.xml | 9 - .../acceptable_attribute_template.xml | 9 - .../sanitize/acceptable_attribute_title.xml | 9 - .../acceptable_attribute_toppadding.xml | 9 - .../sanitize/acceptable_attribute_type.xml | 9 - .../acceptable_attribute_unselectable.xml | 9 - .../sanitize/acceptable_attribute_urn.xml | 9 - .../sanitize/acceptable_attribute_usemap.xml | 9 - .../sanitize/acceptable_attribute_valign.xml | 9 - .../sanitize/acceptable_attribute_value.xml | 9 - .../acceptable_attribute_variable.xml | 9 - .../sanitize/acceptable_attribute_volume.xml | 9 - .../sanitize/acceptable_attribute_vrml.xml | 9 - .../sanitize/acceptable_attribute_vspace.xml | 9 - .../sanitize/acceptable_attribute_width.xml | 9 - .../sanitize/acceptable_attribute_wrap.xml | 9 - .../sanitize/acceptable_element_a.xml | 9 - .../sanitize/acceptable_element_abbr.xml | 9 - .../sanitize/acceptable_element_acronym.xml | 9 - .../sanitize/acceptable_element_address.xml | 9 - .../sanitize/acceptable_element_area.xml | 9 - .../sanitize/acceptable_element_article.xml | 9 - .../sanitize/acceptable_element_aside.xml | 9 - .../sanitize/acceptable_element_audio.xml | 9 - .../sanitize/acceptable_element_b.xml | 9 - .../sanitize/acceptable_element_big.xml | 9 - .../acceptable_element_blockquote.xml | 9 - .../sanitize/acceptable_element_br.xml | 9 - .../sanitize/acceptable_element_button.xml | 9 - .../sanitize/acceptable_element_canvas.xml | 9 - .../sanitize/acceptable_element_caption.xml | 9 - .../sanitize/acceptable_element_center.xml | 9 - .../sanitize/acceptable_element_cite.xml | 9 - .../sanitize/acceptable_element_code.xml | 9 - .../sanitize/acceptable_element_col.xml | 9 - .../sanitize/acceptable_element_colgroup.xml | 9 - .../sanitize/acceptable_element_command.xml | 9 - .../sanitize/acceptable_element_datagrid.xml | 9 - .../sanitize/acceptable_element_datalist.xml | 9 - .../sanitize/acceptable_element_dd.xml | 9 - .../sanitize/acceptable_element_del.xml | 9 - .../sanitize/acceptable_element_details.xml | 9 - .../sanitize/acceptable_element_dfn.xml | 9 - .../sanitize/acceptable_element_dialog.xml | 9 - .../sanitize/acceptable_element_dir.xml | 9 - .../sanitize/acceptable_element_div.xml | 9 - .../sanitize/acceptable_element_dl.xml | 9 - .../sanitize/acceptable_element_dt.xml | 9 - .../sanitize/acceptable_element_em.xml | 9 - .../acceptable_element_event-source.xml | 9 - .../sanitize/acceptable_element_fieldset.xml | 9 - .../sanitize/acceptable_element_figure.xml | 9 - .../sanitize/acceptable_element_font.xml | 9 - .../sanitize/acceptable_element_footer.xml | 9 - .../sanitize/acceptable_element_form.xml | 9 - .../sanitize/acceptable_element_h1.xml | 9 - .../sanitize/acceptable_element_h2.xml | 9 - .../sanitize/acceptable_element_h3.xml | 9 - .../sanitize/acceptable_element_h4.xml | 9 - .../sanitize/acceptable_element_h5.xml | 9 - .../sanitize/acceptable_element_h6.xml | 9 - .../sanitize/acceptable_element_header.xml | 9 - .../sanitize/acceptable_element_hr.xml | 9 - .../sanitize/acceptable_element_i.xml | 9 - .../sanitize/acceptable_element_img.xml | 9 - .../sanitize/acceptable_element_input.xml | 9 - .../sanitize/acceptable_element_ins.xml | 9 - .../sanitize/acceptable_element_kbd.xml | 9 - .../sanitize/acceptable_element_keygen.xml | 9 - .../sanitize/acceptable_element_label.xml | 9 - .../sanitize/acceptable_element_legend.xml | 9 - .../sanitize/acceptable_element_li.xml | 9 - .../sanitize/acceptable_element_m.xml | 9 - .../sanitize/acceptable_element_map.xml | 9 - .../sanitize/acceptable_element_menu.xml | 9 - .../sanitize/acceptable_element_meter.xml | 9 - .../sanitize/acceptable_element_multicol.xml | 9 - .../sanitize/acceptable_element_nav.xml | 9 - .../sanitize/acceptable_element_nextid.xml | 9 - .../sanitize/acceptable_element_noscript.xml | 9 - .../sanitize/acceptable_element_ol.xml | 9 - .../sanitize/acceptable_element_optgroup.xml | 9 - .../sanitize/acceptable_element_option.xml | 9 - .../sanitize/acceptable_element_output.xml | 9 - .../sanitize/acceptable_element_p.xml | 9 - .../sanitize/acceptable_element_pre.xml | 9 - .../sanitize/acceptable_element_progress.xml | 9 - .../sanitize/acceptable_element_q.xml | 9 - .../sanitize/acceptable_element_s.xml | 9 - .../sanitize/acceptable_element_samp.xml | 9 - .../sanitize/acceptable_element_section.xml | 9 - .../sanitize/acceptable_element_select.xml | 9 - .../sanitize/acceptable_element_small.xml | 9 - .../sanitize/acceptable_element_sound.xml | 9 - .../sanitize/acceptable_element_source.xml | 9 - .../sanitize/acceptable_element_spacer.xml | 9 - .../sanitize/acceptable_element_span.xml | 9 - .../sanitize/acceptable_element_strike.xml | 9 - .../sanitize/acceptable_element_strong.xml | 9 - .../sanitize/acceptable_element_sub.xml | 9 - .../sanitize/acceptable_element_sup.xml | 9 - .../sanitize/acceptable_element_table.xml | 9 - .../sanitize/acceptable_element_tbody.xml | 9 - .../sanitize/acceptable_element_td.xml | 9 - .../sanitize/acceptable_element_textarea.xml | 9 - .../sanitize/acceptable_element_tfoot.xml | 9 - .../sanitize/acceptable_element_th.xml | 9 - .../sanitize/acceptable_element_thead.xml | 9 - .../sanitize/acceptable_element_time.xml | 9 - .../sanitize/acceptable_element_tr.xml | 9 - .../sanitize/acceptable_element_tt.xml | 9 - .../sanitize/acceptable_element_u.xml | 9 - .../sanitize/acceptable_element_ul.xml | 9 - .../sanitize/acceptable_element_var.xml | 9 - .../sanitize/acceptable_element_video.xml | 9 - .../blogger_dollar_sign_in_attribute.xml | 11 - .../sanitize/entry_content_applet.xml | 9 - .../sanitize/entry_content_blink.xml | 9 - .../sanitize/entry_content_crazy.xml | 75 - .../sanitize/entry_content_embed.xml | 9 - .../sanitize/entry_content_frame.xml | 9 - .../sanitize/entry_content_iframe.xml | 9 - .../sanitize/entry_content_link.xml | 9 - .../sanitize/entry_content_meta.xml | 9 - .../sanitize/entry_content_object.xml | 9 - .../sanitize/entry_content_onabort.xml | 9 - .../sanitize/entry_content_onblur.xml | 9 - .../sanitize/entry_content_onchange.xml | 9 - .../sanitize/entry_content_onclick.xml | 9 - .../sanitize/entry_content_ondblclick.xml | 9 - .../sanitize/entry_content_onerror.xml | 9 - .../sanitize/entry_content_onfocus.xml | 9 - .../sanitize/entry_content_onkeydown.xml | 9 - .../sanitize/entry_content_onkeypress.xml | 9 - .../sanitize/entry_content_onkeyup.xml | 9 - .../sanitize/entry_content_onload.xml | 9 - .../sanitize/entry_content_onmousedown.xml | 9 - .../sanitize/entry_content_onmouseout.xml | 9 - .../sanitize/entry_content_onmouseover.xml | 9 - .../sanitize/entry_content_onmouseup.xml | 9 - .../sanitize/entry_content_onreset.xml | 9 - .../sanitize/entry_content_onresize.xml | 9 - .../sanitize/entry_content_onsubmit.xml | 9 - .../sanitize/entry_content_onunload.xml | 9 - .../sanitize/entry_content_script.xml | 9 - .../sanitize/entry_content_script_base64.xml | 12 - .../sanitize/entry_content_script_cdata.xml | 9 - .../sanitize/entry_content_script_inline.xml | 9 - .../sanitize/entry_content_style.xml | 9 - .../sanitize/entry_content_style_tag.xml | 9 - .../sanitize/entry_summary_applet.xml | 9 - .../sanitize/entry_summary_blink.xml | 9 - .../sanitize/entry_summary_crazy.xml | 75 - .../sanitize/entry_summary_embed.xml | 9 - .../sanitize/entry_summary_frame.xml | 9 - .../sanitize/entry_summary_iframe.xml | 9 - .../sanitize/entry_summary_link.xml | 9 - .../sanitize/entry_summary_meta.xml | 9 - .../sanitize/entry_summary_object.xml | 9 - .../sanitize/entry_summary_onabort.xml | 9 - .../sanitize/entry_summary_onblur.xml | 9 - .../sanitize/entry_summary_onchange.xml | 9 - .../sanitize/entry_summary_onclick.xml | 9 - .../sanitize/entry_summary_ondblclick.xml | 9 - .../sanitize/entry_summary_onerror.xml | 9 - .../sanitize/entry_summary_onfocus.xml | 9 - .../sanitize/entry_summary_onkeydown.xml | 9 - .../sanitize/entry_summary_onkeypress.xml | 9 - .../sanitize/entry_summary_onkeyup.xml | 9 - .../sanitize/entry_summary_onload.xml | 9 - .../sanitize/entry_summary_onmousedown.xml | 9 - .../sanitize/entry_summary_onmouseout.xml | 9 - .../sanitize/entry_summary_onmouseover.xml | 9 - .../sanitize/entry_summary_onmouseup.xml | 9 - .../sanitize/entry_summary_onreset.xml | 9 - .../sanitize/entry_summary_onresize.xml | 9 - .../sanitize/entry_summary_onsubmit.xml | 9 - .../sanitize/entry_summary_onunload.xml | 9 - .../sanitize/entry_summary_script.xml | 9 - .../sanitize/entry_summary_script_base64.xml | 12 - .../sanitize/entry_summary_script_cdata.xml | 9 - .../sanitize/entry_summary_script_inline.xml | 9 - .../entry_summary_script_map_description.xml | 9 - .../sanitize/entry_summary_style.xml | 9 - .../sanitize/entry_title_applet.xml | 9 - .../wellformed/sanitize/entry_title_blink.xml | 9 - .../wellformed/sanitize/entry_title_crazy.xml | 75 - .../wellformed/sanitize/entry_title_embed.xml | 9 - .../wellformed/sanitize/entry_title_frame.xml | 9 - .../sanitize/entry_title_iframe.xml | 9 - .../wellformed/sanitize/entry_title_link.xml | 9 - .../wellformed/sanitize/entry_title_meta.xml | 9 - .../sanitize/entry_title_object.xml | 9 - .../sanitize/entry_title_onabort.xml | 9 - .../sanitize/entry_title_onblur.xml | 9 - .../sanitize/entry_title_onchange.xml | 9 - .../sanitize/entry_title_onclick.xml | 9 - .../sanitize/entry_title_ondblclick.xml | 9 - .../sanitize/entry_title_onerror.xml | 9 - .../sanitize/entry_title_onfocus.xml | 9 - .../sanitize/entry_title_onkeydown.xml | 9 - .../sanitize/entry_title_onkeypress.xml | 9 - .../sanitize/entry_title_onkeyup.xml | 9 - .../sanitize/entry_title_onload.xml | 9 - .../sanitize/entry_title_onmousedown.xml | 9 - .../sanitize/entry_title_onmouseout.xml | 9 - .../sanitize/entry_title_onmouseover.xml | 9 - .../sanitize/entry_title_onmouseup.xml | 9 - .../sanitize/entry_title_onreset.xml | 9 - .../sanitize/entry_title_onresize.xml | 9 - .../sanitize/entry_title_onsubmit.xml | 9 - .../sanitize/entry_title_onunload.xml | 9 - .../sanitize/entry_title_script.xml | 9 - .../sanitize/entry_title_script_cdata.xml | 9 - .../sanitize/entry_title_script_inline.xml | 9 - .../wellformed/sanitize/entry_title_style.xml | 9 - .../sanitize/feed_copyright_applet.xml | 7 - .../sanitize/feed_copyright_blink.xml | 7 - .../sanitize/feed_copyright_crazy.xml | 73 - .../sanitize/feed_copyright_embed.xml | 7 - .../sanitize/feed_copyright_frame.xml | 7 - .../sanitize/feed_copyright_iframe.xml | 7 - .../sanitize/feed_copyright_link.xml | 7 - .../sanitize/feed_copyright_meta.xml | 7 - .../sanitize/feed_copyright_object.xml | 7 - .../sanitize/feed_copyright_onabort.xml | 7 - .../sanitize/feed_copyright_onblur.xml | 7 - .../sanitize/feed_copyright_onchange.xml | 7 - .../sanitize/feed_copyright_onclick.xml | 7 - .../sanitize/feed_copyright_ondblclick.xml | 7 - .../sanitize/feed_copyright_onerror.xml | 7 - .../sanitize/feed_copyright_onfocus.xml | 7 - .../sanitize/feed_copyright_onkeydown.xml | 7 - .../sanitize/feed_copyright_onkeypress.xml | 7 - .../sanitize/feed_copyright_onkeyup.xml | 7 - .../sanitize/feed_copyright_onload.xml | 7 - .../sanitize/feed_copyright_onmousedown.xml | 7 - .../sanitize/feed_copyright_onmouseout.xml | 7 - .../sanitize/feed_copyright_onmouseover.xml | 7 - .../sanitize/feed_copyright_onmouseup.xml | 7 - .../sanitize/feed_copyright_onreset.xml | 7 - .../sanitize/feed_copyright_onresize.xml | 7 - .../sanitize/feed_copyright_onsubmit.xml | 7 - .../sanitize/feed_copyright_onunload.xml | 7 - .../sanitize/feed_copyright_script.xml | 7 - .../sanitize/feed_copyright_script_cdata.xml | 7 - .../sanitize/feed_copyright_script_inline.xml | 7 - .../sanitize/feed_copyright_style.xml | 7 - .../wellformed/sanitize/feed_info_applet.xml | 7 - .../wellformed/sanitize/feed_info_blink.xml | 7 - .../wellformed/sanitize/feed_info_crazy.xml | 73 - .../wellformed/sanitize/feed_info_embed.xml | 7 - .../wellformed/sanitize/feed_info_frame.xml | 7 - .../wellformed/sanitize/feed_info_iframe.xml | 7 - .../wellformed/sanitize/feed_info_link.xml | 7 - .../wellformed/sanitize/feed_info_meta.xml | 7 - .../wellformed/sanitize/feed_info_object.xml | 7 - .../wellformed/sanitize/feed_info_onabort.xml | 7 - .../wellformed/sanitize/feed_info_onblur.xml | 7 - .../sanitize/feed_info_onchange.xml | 7 - .../wellformed/sanitize/feed_info_onclick.xml | 7 - .../sanitize/feed_info_ondblclick.xml | 7 - .../wellformed/sanitize/feed_info_onerror.xml | 7 - .../wellformed/sanitize/feed_info_onfocus.xml | 7 - .../sanitize/feed_info_onkeydown.xml | 7 - .../sanitize/feed_info_onkeypress.xml | 7 - .../wellformed/sanitize/feed_info_onkeyup.xml | 7 - .../wellformed/sanitize/feed_info_onload.xml | 7 - .../sanitize/feed_info_onmousedown.xml | 7 - .../sanitize/feed_info_onmouseout.xml | 7 - .../sanitize/feed_info_onmouseover.xml | 7 - .../sanitize/feed_info_onmouseup.xml | 7 - .../wellformed/sanitize/feed_info_onreset.xml | 7 - .../sanitize/feed_info_onresize.xml | 7 - .../sanitize/feed_info_onsubmit.xml | 7 - .../sanitize/feed_info_onunload.xml | 7 - .../wellformed/sanitize/feed_info_script.xml | 7 - .../sanitize/feed_info_script_cdata.xml | 7 - .../sanitize/feed_info_script_inline.xml | 7 - .../wellformed/sanitize/feed_info_style.xml | 7 - .../sanitize/feed_subtitle_applet.xml | 7 - .../sanitize/feed_subtitle_blink.xml | 7 - .../sanitize/feed_subtitle_crazy.xml | 73 - .../sanitize/feed_subtitle_embed.xml | 7 - .../sanitize/feed_subtitle_frame.xml | 7 - .../sanitize/feed_subtitle_iframe.xml | 7 - .../sanitize/feed_subtitle_link.xml | 7 - .../sanitize/feed_subtitle_meta.xml | 7 - .../sanitize/feed_subtitle_object.xml | 7 - .../sanitize/feed_subtitle_onabort.xml | 7 - .../sanitize/feed_subtitle_onblur.xml | 7 - .../sanitize/feed_subtitle_onchange.xml | 7 - .../sanitize/feed_subtitle_onclick.xml | 7 - .../sanitize/feed_subtitle_ondblclick.xml | 7 - .../sanitize/feed_subtitle_onerror.xml | 7 - .../sanitize/feed_subtitle_onfocus.xml | 7 - .../sanitize/feed_subtitle_onkeydown.xml | 7 - .../sanitize/feed_subtitle_onkeypress.xml | 7 - .../sanitize/feed_subtitle_onkeyup.xml | 7 - .../sanitize/feed_subtitle_onload.xml | 7 - .../sanitize/feed_subtitle_onmousedown.xml | 7 - .../sanitize/feed_subtitle_onmouseout.xml | 7 - .../sanitize/feed_subtitle_onmouseover.xml | 7 - .../sanitize/feed_subtitle_onmouseup.xml | 7 - .../sanitize/feed_subtitle_onreset.xml | 7 - .../sanitize/feed_subtitle_onresize.xml | 7 - .../sanitize/feed_subtitle_onsubmit.xml | 7 - .../sanitize/feed_subtitle_onunload.xml | 7 - .../sanitize/feed_subtitle_script.xml | 7 - .../sanitize/feed_subtitle_script_cdata.xml | 7 - .../sanitize/feed_subtitle_script_inline.xml | 7 - .../sanitize/feed_subtitle_style.xml | 7 - .../sanitize/feed_tagline_applet.xml | 7 - .../sanitize/feed_tagline_blink.xml | 7 - .../sanitize/feed_tagline_crazy.xml | 73 - .../sanitize/feed_tagline_embed.xml | 7 - .../sanitize/feed_tagline_frame.xml | 7 - .../sanitize/feed_tagline_iframe.xml | 7 - .../wellformed/sanitize/feed_tagline_link.xml | 7 - .../wellformed/sanitize/feed_tagline_meta.xml | 7 - .../sanitize/feed_tagline_object.xml | 7 - .../sanitize/feed_tagline_onabort.xml | 7 - .../sanitize/feed_tagline_onblur.xml | 7 - .../sanitize/feed_tagline_onchange.xml | 7 - .../sanitize/feed_tagline_onclick.xml | 7 - .../sanitize/feed_tagline_ondblclick.xml | 7 - .../sanitize/feed_tagline_onerror.xml | 7 - .../sanitize/feed_tagline_onfocus.xml | 7 - .../sanitize/feed_tagline_onkeydown.xml | 7 - .../sanitize/feed_tagline_onkeypress.xml | 7 - .../sanitize/feed_tagline_onkeyup.xml | 7 - .../sanitize/feed_tagline_onload.xml | 7 - .../sanitize/feed_tagline_onmousedown.xml | 7 - .../sanitize/feed_tagline_onmouseout.xml | 7 - .../sanitize/feed_tagline_onmouseover.xml | 7 - .../sanitize/feed_tagline_onmouseup.xml | 7 - .../sanitize/feed_tagline_onreset.xml | 7 - .../sanitize/feed_tagline_onresize.xml | 7 - .../sanitize/feed_tagline_onsubmit.xml | 7 - .../sanitize/feed_tagline_onunload.xml | 7 - .../sanitize/feed_tagline_script.xml | 7 - .../sanitize/feed_tagline_script_cdata.xml | 7 - .../sanitize/feed_tagline_script_inline.xml | 7 - .../feed_tagline_script_map_description.xml | 7 - .../sanitize/feed_tagline_style.xml | 7 - .../wellformed/sanitize/feed_title_applet.xml | 7 - .../wellformed/sanitize/feed_title_blink.xml | 7 - .../wellformed/sanitize/feed_title_crazy.xml | 73 - .../wellformed/sanitize/feed_title_embed.xml | 7 - .../wellformed/sanitize/feed_title_frame.xml | 7 - .../wellformed/sanitize/feed_title_iframe.xml | 7 - .../wellformed/sanitize/feed_title_link.xml | 7 - .../wellformed/sanitize/feed_title_meta.xml | 7 - .../wellformed/sanitize/feed_title_object.xml | 7 - .../sanitize/feed_title_onabort.xml | 7 - .../wellformed/sanitize/feed_title_onblur.xml | 7 - .../sanitize/feed_title_onchange.xml | 7 - .../sanitize/feed_title_onclick.xml | 7 - .../sanitize/feed_title_ondblclick.xml | 7 - .../sanitize/feed_title_onerror.xml | 7 - .../sanitize/feed_title_onfocus.xml | 7 - .../sanitize/feed_title_onkeydown.xml | 7 - .../sanitize/feed_title_onkeypress.xml | 7 - .../sanitize/feed_title_onkeyup.xml | 7 - .../wellformed/sanitize/feed_title_onload.xml | 7 - .../sanitize/feed_title_onmousedown.xml | 7 - .../sanitize/feed_title_onmouseout.xml | 7 - .../sanitize/feed_title_onmouseover.xml | 7 - .../sanitize/feed_title_onmouseup.xml | 7 - .../sanitize/feed_title_onreset.xml | 7 - .../sanitize/feed_title_onresize.xml | 7 - .../sanitize/feed_title_onsubmit.xml | 7 - .../sanitize/feed_title_onunload.xml | 7 - .../wellformed/sanitize/feed_title_script.xml | 7 - .../sanitize/feed_title_script_cdata.xml | 7 - .../sanitize/feed_title_script_inline.xml | 7 - .../wellformed/sanitize/feed_title_style.xml | 7 - .../sanitize/feed_title_unacceptable_uri.xml | 7 - .../wellformed/sanitize/item_body_applet.xml | 11 - .../wellformed/sanitize/item_body_blink.xml | 11 - .../wellformed/sanitize/item_body_embed.xml | 11 - .../wellformed/sanitize/item_body_frame.xml | 11 - .../wellformed/sanitize/item_body_iframe.xml | 11 - .../wellformed/sanitize/item_body_link.xml | 11 - .../wellformed/sanitize/item_body_meta.xml | 11 - .../wellformed/sanitize/item_body_object.xml | 11 - .../wellformed/sanitize/item_body_onabort.xml | 11 - .../wellformed/sanitize/item_body_onblur.xml | 11 - .../sanitize/item_body_onchange.xml | 11 - .../wellformed/sanitize/item_body_onclick.xml | 11 - .../sanitize/item_body_ondblclick.xml | 11 - .../wellformed/sanitize/item_body_onerror.xml | 11 - .../wellformed/sanitize/item_body_onfocus.xml | 11 - .../sanitize/item_body_onkeydown.xml | 11 - .../sanitize/item_body_onkeypress.xml | 11 - .../wellformed/sanitize/item_body_onkeyup.xml | 11 - .../wellformed/sanitize/item_body_onload.xml | 11 - .../sanitize/item_body_onmousedown.xml | 11 - .../sanitize/item_body_onmouseout.xml | 11 - .../sanitize/item_body_onmouseover.xml | 11 - .../sanitize/item_body_onmouseup.xml | 11 - .../wellformed/sanitize/item_body_onreset.xml | 11 - .../sanitize/item_body_onresize.xml | 11 - .../sanitize/item_body_onsubmit.xml | 11 - .../sanitize/item_body_onunload.xml | 11 - .../wellformed/sanitize/item_body_script.xml | 11 - .../sanitize/item_body_script_map_content.xml | 11 - .../wellformed/sanitize/item_body_style.xml | 11 - .../sanitize/item_content_encoded_applet.xml | 11 - .../sanitize/item_content_encoded_blink.xml | 11 - .../sanitize/item_content_encoded_crazy.xml | 77 - .../sanitize/item_content_encoded_embed.xml | 11 - .../sanitize/item_content_encoded_frame.xml | 11 - .../sanitize/item_content_encoded_iframe.xml | 11 - .../sanitize/item_content_encoded_link.xml | 11 - .../item_content_encoded_map_content.xml | 11 - .../sanitize/item_content_encoded_meta.xml | 11 - .../sanitize/item_content_encoded_object.xml | 11 - .../sanitize/item_content_encoded_onabort.xml | 11 - .../sanitize/item_content_encoded_onblur.xml | 11 - .../item_content_encoded_onchange.xml | 11 - .../sanitize/item_content_encoded_onclick.xml | 11 - .../item_content_encoded_ondblclick.xml | 11 - .../sanitize/item_content_encoded_onerror.xml | 11 - .../sanitize/item_content_encoded_onfocus.xml | 11 - .../item_content_encoded_onkeydown.xml | 11 - .../item_content_encoded_onkeypress.xml | 11 - .../sanitize/item_content_encoded_onkeyup.xml | 11 - .../sanitize/item_content_encoded_onload.xml | 11 - .../item_content_encoded_onmousedown.xml | 11 - .../item_content_encoded_onmouseout.xml | 11 - .../item_content_encoded_onmouseover.xml | 11 - .../item_content_encoded_onmouseup.xml | 11 - .../sanitize/item_content_encoded_onreset.xml | 11 - .../item_content_encoded_onresize.xml | 11 - .../item_content_encoded_onsubmit.xml | 11 - .../item_content_encoded_onunload.xml | 11 - .../sanitize/item_content_encoded_script.xml | 11 - .../item_content_encoded_script_cdata.xml | 11 - ...tem_content_encoded_script_map_content.xml | 11 - ...em_content_encoded_script_nested_cdata.xml | 11 - .../sanitize/item_content_encoded_style.xml | 11 - .../sanitize/item_description_applet.xml | 11 - .../sanitize/item_description_blink.xml | 11 - .../sanitize/item_description_crazy.xml | 81 - .../sanitize/item_description_embed.xml | 11 - .../sanitize/item_description_frame.xml | 11 - .../sanitize/item_description_iframe.xml | 11 - .../sanitize/item_description_link.xml | 11 - .../sanitize/item_description_meta.xml | 11 - .../sanitize/item_description_object.xml | 11 - .../sanitize/item_description_onabort.xml | 11 - .../sanitize/item_description_onblur.xml | 11 - .../sanitize/item_description_onchange.xml | 11 - .../sanitize/item_description_onclick.xml | 11 - .../sanitize/item_description_ondblclick.xml | 11 - .../sanitize/item_description_onerror.xml | 11 - .../sanitize/item_description_onfocus.xml | 11 - .../sanitize/item_description_onkeydown.xml | 11 - .../sanitize/item_description_onkeypress.xml | 11 - .../sanitize/item_description_onkeyup.xml | 11 - .../sanitize/item_description_onload.xml | 11 - .../sanitize/item_description_onmousedown.xml | 11 - .../sanitize/item_description_onmouseout.xml | 11 - .../sanitize/item_description_onmouseover.xml | 11 - .../sanitize/item_description_onmouseup.xml | 11 - .../sanitize/item_description_onreset.xml | 11 - .../sanitize/item_description_onresize.xml | 11 - .../sanitize/item_description_onsubmit.xml | 11 - .../sanitize/item_description_onunload.xml | 11 - .../sanitize/item_description_script.xml | 11 - .../item_description_script_cdata.xml | 11 - .../item_description_script_map_summary.xml | 11 - .../sanitize/item_description_style.xml | 11 - .../sanitize/item_fullitem_applet.xml | 11 - .../sanitize/item_fullitem_blink.xml | 11 - .../sanitize/item_fullitem_crazy.xml | 77 - .../sanitize/item_fullitem_embed.xml | 11 - .../sanitize/item_fullitem_frame.xml | 11 - .../sanitize/item_fullitem_iframe.xml | 11 - .../sanitize/item_fullitem_link.xml | 11 - .../sanitize/item_fullitem_meta.xml | 11 - .../sanitize/item_fullitem_object.xml | 11 - .../sanitize/item_fullitem_onabort.xml | 11 - .../sanitize/item_fullitem_onblur.xml | 11 - .../sanitize/item_fullitem_onchange.xml | 11 - .../sanitize/item_fullitem_onclick.xml | 11 - .../sanitize/item_fullitem_ondblclick.xml | 11 - .../sanitize/item_fullitem_onerror.xml | 11 - .../sanitize/item_fullitem_onfocus.xml | 11 - .../sanitize/item_fullitem_onkeydown.xml | 11 - .../sanitize/item_fullitem_onkeypress.xml | 11 - .../sanitize/item_fullitem_onkeyup.xml | 11 - .../sanitize/item_fullitem_onload.xml | 11 - .../sanitize/item_fullitem_onmousedown.xml | 11 - .../sanitize/item_fullitem_onmouseout.xml | 11 - .../sanitize/item_fullitem_onmouseover.xml | 11 - .../sanitize/item_fullitem_onmouseup.xml | 11 - .../sanitize/item_fullitem_onreset.xml | 11 - .../sanitize/item_fullitem_onresize.xml | 11 - .../sanitize/item_fullitem_onsubmit.xml | 11 - .../sanitize/item_fullitem_onunload.xml | 11 - .../sanitize/item_fullitem_script.xml | 11 - .../sanitize/item_fullitem_script_cdata.xml | 11 - .../item_fullitem_script_map_summary.xml | 11 - .../sanitize/item_fullitem_style.xml | 11 - .../sanitize/item_xhtml_body_applet.xml | 11 - .../sanitize/item_xhtml_body_blink.xml | 11 - .../sanitize/item_xhtml_body_embed.xml | 11 - .../sanitize/item_xhtml_body_frame.xml | 11 - .../sanitize/item_xhtml_body_iframe.xml | 11 - .../sanitize/item_xhtml_body_link.xml | 11 - .../sanitize/item_xhtml_body_meta.xml | 11 - .../sanitize/item_xhtml_body_object.xml | 11 - .../sanitize/item_xhtml_body_onabort.xml | 11 - .../sanitize/item_xhtml_body_onblur.xml | 11 - .../sanitize/item_xhtml_body_onchange.xml | 11 - .../sanitize/item_xhtml_body_onclick.xml | 11 - .../sanitize/item_xhtml_body_ondblclick.xml | 11 - .../sanitize/item_xhtml_body_onerror.xml | 11 - .../sanitize/item_xhtml_body_onfocus.xml | 11 - .../sanitize/item_xhtml_body_onkeydown.xml | 11 - .../sanitize/item_xhtml_body_onkeypress.xml | 11 - .../sanitize/item_xhtml_body_onkeyup.xml | 11 - .../sanitize/item_xhtml_body_onload.xml | 11 - .../sanitize/item_xhtml_body_onmousedown.xml | 11 - .../sanitize/item_xhtml_body_onmouseout.xml | 11 - .../sanitize/item_xhtml_body_onmouseover.xml | 11 - .../sanitize/item_xhtml_body_onmouseup.xml | 11 - .../sanitize/item_xhtml_body_onreset.xml | 11 - .../sanitize/item_xhtml_body_onresize.xml | 11 - .../sanitize/item_xhtml_body_onsubmit.xml | 11 - .../sanitize/item_xhtml_body_onunload.xml | 11 - .../sanitize/item_xhtml_body_script.xml | 11 - .../item_xhtml_body_script_map_content.xml | 11 - .../sanitize/item_xhtml_body_style.xml | 11 - ..._atom_feed_that_needs_css_sanitisation.xml | 528 --- .../style_background_repeat_repeat_x.xml | 11 - .../sanitize/style_background_url.xml | 11 - .../sanitize/style_background_yellow.xml | 11 - .../wellformed/sanitize/style_border_0.xml | 11 - .../style_border_1px_solid_rgb_0_0_0_.xml | 11 - .../sanitize/style_border_3px_solid_ccc.xml | 11 - .../sanitize/style_border_bottom_0pt.xml | 11 - .../sanitize/style_border_bottom_dashed.xml | 11 - .../sanitize/style_border_bottom_dotted.xml | 11 - .../style_border_collapse_collapse.xml | 11 - .../sanitize/style_border_left_0pt.xml | 11 - .../sanitize/style_border_medium_none_.xml | 11 - .../sanitize/style_border_none_important.xml | 11 - .../sanitize/style_border_right_0pt.xml | 11 - .../style_border_solid_2px_000000.xml | 11 - .../sanitize/style_border_top_0pt.xml | 11 - .../wellformed/sanitize/style_clear_both.xml | 11 - .../sanitize/style_color_000080.xml | 11 - .../wellformed/sanitize/style_color_008.xml | 11 - .../sanitize/style_color_999999.xml | 11 - .../wellformed/sanitize/style_color_blue.xml | 11 - .../sanitize/style_color_maroon.xml | 11 - .../wellformed/sanitize/style_color_red.xml | 11 - .../sanitize/style_color_rgb_0_128_0_.xml | 11 - .../wellformed/sanitize/style_color_teal.xml | 11 - .../sanitize/style_cursor_pointer.xml | 11 - .../sanitize/style_display_block.xml | 11 - .../wellformed/sanitize/style_float_left.xml | 11 - .../wellformed/sanitize/style_float_right.xml | 11 - .../style_font_family__comic_sans_ms.xml | 11 - .../style_font_family_arial_sans_serif.xml | 11 - .../style_font_family_lucida_console_.xml | 11 - .../sanitize/style_font_family_symbol.xml | 11 - .../sanitize/style_font_size_0_9em.xml | 11 - .../sanitize/style_font_size_10pt.xml | 11 - .../sanitize/style_font_size_10px.xml | 11 - .../sanitize/style_font_size_smaller.xml | 11 - .../sanitize/style_font_style_italic.xml | 11 - .../sanitize/style_font_weight_bold.xml | 11 - .../sanitize/style_height_100px.xml | 11 - .../wellformed/sanitize/style_height_2px.xml | 11 - .../sanitize/style_letter_spacing_1px.xml | 11 - .../sanitize/style_line_height_normal.xml | 11 - .../wellformed/sanitize/style_margin_0.xml | 11 - .../sanitize/style_margin_0_15px_0_0.xml | 11 - .../sanitize/style_margin_0px_important.xml | 11 - .../wellformed/sanitize/style_margin_5px.xml | 11 - .../sanitize/style_margin_99999em.xml | 11 - .../sanitize/style_margin_bottom_0pt.xml | 11 - .../sanitize/style_margin_bottom_10px.xml | 11 - .../sanitize/style_margin_left_5px.xml | 11 - .../sanitize/style_margin_right_0px.xml | 11 - .../sanitize/style_margin_top_0in.xml | 11 - .../sanitize/style_margin_top_10px.xml | 11 - .../style_moz_background_clip_initial.xml | 11 - .../sanitize/style_mso_ansi_language_nl.xml | 11 - .../style_mso_bidi_font_weight_normal.xml | 11 - .../sanitize/style_mso_highlight_yellow.xml | 11 - .../style_mso_layout_grid_align_none.xml | 11 - .../style_mso_list_l0_level1_lfo1.xml | 11 - .../sanitize/style_mso_no_proof_yes.xml | 11 - .../sanitize/style_mso_spacerun_yes.xml | 11 - .../sanitize/style_mso_tab_count_3.xml | 11 - .../sanitize/style_overflow_auto.xml | 11 - .../wellformed/sanitize/style_padding_0.xml | 11 - .../sanitize/style_padding_0_0_12px_12px.xml | 11 - .../wellformed/sanitize/style_padding_2ex.xml | 11 - .../sanitize/style_padding_99999em.xml | 11 - .../sanitize/style_padding_left_4px.xml | 11 - .../sanitize/style_padding_right_0in.xml | 11 - .../sanitize/style_position_absolute.xml | 11 - .../sanitize/style_tab_stops_list_5in.xml | 11 - .../sanitize/style_text_align_center.xml | 11 - .../sanitize/style_text_align_left.xml | 11 - .../sanitize/style_text_align_right.xml | 11 - .../style_text_decoration_underline.xml | 11 - .../sanitize/style_text_indent_0_5in.xml | 11 - .../sanitize/style_vertical_align_bottom.xml | 11 - .../sanitize/style_vertical_align_top.xml | 11 - .../sanitize/style_white_space_nowrap.xml | 11 - .../sanitize/style_white_space_top.xml | 11 - .../wellformed/sanitize/style_width_300px.xml | 11 - .../xml_declaration_unexpected_character.xml | 7 - .../sanitize/xml_malicious_comment.xml | 7 - .../sanitize/xml_unclosed_comment.xml | 7 - .../wellformed/sgml/charref_uppercase_x.xml | 9 - .../tests/wellformed/xml/empty_xmlns_uri.xml | 9 - .../tests/wellformed/xml/escaped_apos.xml | 10 - .../wellformed/xml/xlink_ns_no_prefix.xml | 10 - lib/feedparser/urls.py | 131 + lib/feedparser/util.py | 144 + 2389 files changed, 4755 insertions(+), 30610 deletions(-) delete mode 100644 lib/feedcache/__init__.py delete mode 100644 lib/feedcache/cache.py delete mode 100644 lib/feedcache/cachestoragelock.py delete mode 100644 lib/feedcache/example.py delete mode 100644 lib/feedcache/example_threads.py delete mode 100644 lib/feedcache/test_cache.py delete mode 100644 lib/feedcache/test_cachestoragelock.py delete mode 100644 lib/feedcache/test_server.py delete mode 100644 lib/feedcache/test_shovefilesystem.py create mode 100644 lib/feedparser/api.py create mode 100644 lib/feedparser/datetimes/__init__.py create mode 100644 lib/feedparser/datetimes/asctime.py create mode 100644 lib/feedparser/datetimes/greek.py create mode 100644 lib/feedparser/datetimes/hungarian.py create mode 100644 lib/feedparser/datetimes/iso8601.py create mode 100644 lib/feedparser/datetimes/korean.py create mode 100644 lib/feedparser/datetimes/perforce.py create mode 100644 lib/feedparser/datetimes/rfc822.py create mode 100644 lib/feedparser/datetimes/w3dtf.py create mode 100644 lib/feedparser/encodings.py create mode 100644 lib/feedparser/exceptions.py delete mode 100644 lib/feedparser/feedparser.py delete mode 100644 lib/feedparser/feedparsertest.py create mode 100644 lib/feedparser/html.py create mode 100644 lib/feedparser/http.py create mode 100644 lib/feedparser/mixin.py create mode 100644 lib/feedparser/namespaces/__init__.py create mode 100644 lib/feedparser/namespaces/_base.py create mode 100644 lib/feedparser/namespaces/admin.py create mode 100644 lib/feedparser/namespaces/cc.py create mode 100644 lib/feedparser/namespaces/dc.py create mode 100644 lib/feedparser/namespaces/georss.py create mode 100644 lib/feedparser/namespaces/itunes.py create mode 100644 lib/feedparser/namespaces/mediarss.py create mode 100644 lib/feedparser/namespaces/psc.py create mode 100644 lib/feedparser/parsers/__init__.py create mode 100644 lib/feedparser/parsers/loose.py create mode 100644 lib/feedparser/parsers/strict.py create mode 100644 lib/feedparser/sanitizer.py create mode 100644 lib/feedparser/sgml.py delete mode 100644 lib/feedparser/sgmllib.py delete mode 100644 lib/feedparser/tests/compression/deflate-no-headers.z delete mode 100644 lib/feedparser/tests/compression/deflate-not-compressed.z delete mode 100644 lib/feedparser/tests/compression/deflate.z delete mode 100644 lib/feedparser/tests/compression/gzip-not-compressed.gz delete mode 100644 lib/feedparser/tests/compression/gzip-struct-error.gz delete mode 100644 lib/feedparser/tests/compression/gzip.gz delete mode 100644 lib/feedparser/tests/compression/sample.xml delete mode 100644 lib/feedparser/tests/encoding/big5.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_bogus_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_double-encoded-html.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_encoding_mismatch_crash.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_http_i18n.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_http_text_plain.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_http_text_plain_charset.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_invalid-bytes-with-bom.xml delete mode 100644 lib/feedparser/tests/encoding/bozo_linenoise.xml delete mode 100644 lib/feedparser/tests/encoding/csucs4.xml delete mode 100644 lib/feedparser/tests/encoding/csunicode.xml delete mode 100644 lib/feedparser/tests/encoding/demoronize-1.xml delete mode 100644 lib/feedparser/tests/encoding/demoronize-2.xml delete mode 100644 lib/feedparser/tests/encoding/demoronize-3.xml delete mode 100644 lib/feedparser/tests/encoding/double-encoded-html.xml delete mode 100644 lib/feedparser/tests/encoding/encoding_attribute_crash.xml delete mode 100644 lib/feedparser/tests/encoding/encoding_attribute_crash_2.xml delete mode 100644 lib/feedparser/tests/encoding/euc-kr-attribute.xml delete mode 100644 lib/feedparser/tests/encoding/euc-kr-item.xml delete mode 100644 lib/feedparser/tests/encoding/euc-kr.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_rss_xml_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_rss_xml_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_rss_xml_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_rss_xml_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_dtd_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_dtd_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_dtd_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_dtd_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_epe_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_epe_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_epe_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_application_xml_epe_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_encoding_attribute_crash.xml delete mode 100644 lib/feedparser/tests/encoding/http_i18n.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_atom_xml_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_atom_xml_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_atom_xml_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_atom_xml_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_rss_xml_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_rss_xml_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_rss_xml_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_rss_xml_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_bogus_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_bogus_param.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_charset_2.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding_2.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_epe_charset.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_epe_charset_overrides_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_epe_default.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_epe_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/http_text_xml_qs.xml delete mode 100644 lib/feedparser/tests/encoding/iso-10646-ucs-2.xml delete mode 100644 lib/feedparser/tests/encoding/iso-10646-ucs-4.xml delete mode 100644 lib/feedparser/tests/encoding/no_content_type_default.xml delete mode 100644 lib/feedparser/tests/encoding/no_content_type_encoding.xml delete mode 100644 lib/feedparser/tests/encoding/u16.xml delete mode 100644 lib/feedparser/tests/encoding/ucs-2.xml delete mode 100644 lib/feedparser/tests/encoding/ucs-4.xml delete mode 100644 lib/feedparser/tests/encoding/utf-16be-autodetect.xml delete mode 100644 lib/feedparser/tests/encoding/utf-16be-bom.xml delete mode 100644 lib/feedparser/tests/encoding/utf-16be.xml delete mode 100644 lib/feedparser/tests/encoding/utf-16le-autodetect.xml delete mode 100644 lib/feedparser/tests/encoding/utf-16le-bom.xml delete mode 100644 lib/feedparser/tests/encoding/utf-16le.xml delete mode 100644 lib/feedparser/tests/encoding/utf-32be-autodetect.xml delete mode 100644 lib/feedparser/tests/encoding/utf-32be-bom.xml delete mode 100644 lib/feedparser/tests/encoding/utf-32be.xml delete mode 100644 lib/feedparser/tests/encoding/utf-32le-autodetect.xml delete mode 100644 lib/feedparser/tests/encoding/utf-32le-bom.xml delete mode 100644 lib/feedparser/tests/encoding/utf-32le.xml delete mode 100644 lib/feedparser/tests/encoding/utf-8-bom.xml delete mode 100644 lib/feedparser/tests/encoding/utf16.xml delete mode 100644 lib/feedparser/tests/encoding/utf_16.xml delete mode 100644 lib/feedparser/tests/encoding/utf_32.xml delete mode 100644 lib/feedparser/tests/encoding/x80_437.xml delete mode 100644 lib/feedparser/tests/encoding/x80_850.xml delete mode 100644 lib/feedparser/tests/encoding/x80_852.xml delete mode 100644 lib/feedparser/tests/encoding/x80_855.xml delete mode 100644 lib/feedparser/tests/encoding/x80_857.xml delete mode 100644 lib/feedparser/tests/encoding/x80_860.xml delete mode 100644 lib/feedparser/tests/encoding/x80_861.xml delete mode 100644 lib/feedparser/tests/encoding/x80_862.xml delete mode 100644 lib/feedparser/tests/encoding/x80_863.xml delete mode 100644 lib/feedparser/tests/encoding/x80_865.xml delete mode 100644 lib/feedparser/tests/encoding/x80_866.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp037.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1125.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1250.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1251.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1252.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1253.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1254.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1255.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1256.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1257.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp1258.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp437.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp500.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp737.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp775.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp850.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp852.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp855.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp856.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp857.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp860.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp861.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp862.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp863.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp864.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp865.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp866.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp874.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp875.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cp_is.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm037.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm500.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm855.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm857.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm860.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm861.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm863.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm864.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm865.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csibm866.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cskoi8r.xml delete mode 100644 lib/feedparser/tests/encoding/x80_csmacintosh.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cspc775baltic.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cspc850multilingual.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cspc862latinhebrew.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cspc8codepage437.xml delete mode 100644 lib/feedparser/tests/encoding/x80_cspcp852.xml delete mode 100644 lib/feedparser/tests/encoding/x80_dbcs.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic-cp-be.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic-cp-ca.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic-cp-ch.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic-cp-nl.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic-cp-us.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic-cp-wt.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic_cp_be.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic_cp_ca.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic_cp_ch.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic_cp_nl.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic_cp_us.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ebcdic_cp_wt.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm037.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm039.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm1140.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm437.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm500.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm775.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm850.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm852.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm855.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm857.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm860.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm861.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm862.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm863.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm864.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm865.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ibm866.xml delete mode 100644 lib/feedparser/tests/encoding/x80_koi8-r.xml delete mode 100644 lib/feedparser/tests/encoding/x80_koi8-t.xml delete mode 100644 lib/feedparser/tests/encoding/x80_koi8-u.xml delete mode 100644 lib/feedparser/tests/encoding/x80_mac-cyrillic.xml delete mode 100644 lib/feedparser/tests/encoding/x80_mac.xml delete mode 100644 lib/feedparser/tests/encoding/x80_maccentraleurope.xml delete mode 100644 lib/feedparser/tests/encoding/x80_maccyrillic.xml delete mode 100644 lib/feedparser/tests/encoding/x80_macgreek.xml delete mode 100644 lib/feedparser/tests/encoding/x80_maciceland.xml delete mode 100644 lib/feedparser/tests/encoding/x80_macintosh.xml delete mode 100644 lib/feedparser/tests/encoding/x80_maclatin2.xml delete mode 100644 lib/feedparser/tests/encoding/x80_macroman.xml delete mode 100644 lib/feedparser/tests/encoding/x80_macturkish.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-ansi.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-arab.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-cyrl.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-ee.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-greek.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-hebr.xml delete mode 100644 lib/feedparser/tests/encoding/x80_ms-turk.xml delete mode 100644 lib/feedparser/tests/encoding/x80_tcvn-5712.xml delete mode 100644 lib/feedparser/tests/encoding/x80_tcvn.xml delete mode 100644 lib/feedparser/tests/encoding/x80_tcvn5712-1.xml delete mode 100644 lib/feedparser/tests/encoding/x80_viscii.xml delete mode 100644 lib/feedparser/tests/encoding/x80_winbaltrim.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1250.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1251.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1252.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1253.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1254.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1255.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1256.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1257.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows-1258.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1250.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1251.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1252.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1253.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1254.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1255.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1256.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1257.xml delete mode 100644 lib/feedparser/tests/encoding/x80_windows_1258.xml delete mode 100644 lib/feedparser/tests/entities/160.xml delete mode 100644 lib/feedparser/tests/entities/732.xml delete mode 100644 lib/feedparser/tests/entities/8216.xml delete mode 100644 lib/feedparser/tests/entities/8217.xml delete mode 100644 lib/feedparser/tests/entities/8220.xml delete mode 100644 lib/feedparser/tests/entities/8221.xml delete mode 100644 lib/feedparser/tests/entities/9830.xml delete mode 100644 lib/feedparser/tests/entities/aacute.xml delete mode 100644 lib/feedparser/tests/entities/acirc.xml delete mode 100644 lib/feedparser/tests/entities/acute.xml delete mode 100644 lib/feedparser/tests/entities/aelig.xml delete mode 100644 lib/feedparser/tests/entities/agrave.xml delete mode 100644 lib/feedparser/tests/entities/alefsym.xml delete mode 100644 lib/feedparser/tests/entities/alpha.xml delete mode 100644 lib/feedparser/tests/entities/and.xml delete mode 100644 lib/feedparser/tests/entities/ang.xml delete mode 100644 lib/feedparser/tests/entities/aring.xml delete mode 100644 lib/feedparser/tests/entities/asymp.xml delete mode 100644 lib/feedparser/tests/entities/atilde.xml delete mode 100644 lib/feedparser/tests/entities/attr_amp.xml delete mode 100644 lib/feedparser/tests/entities/auml.xml delete mode 100644 lib/feedparser/tests/entities/bdquo.xml delete mode 100644 lib/feedparser/tests/entities/beta.xml delete mode 100644 lib/feedparser/tests/entities/brvbar.xml delete mode 100644 lib/feedparser/tests/entities/bull.xml delete mode 100644 lib/feedparser/tests/entities/cap.xml delete mode 100644 lib/feedparser/tests/entities/ccedil.xml delete mode 100644 lib/feedparser/tests/entities/cedil.xml delete mode 100644 lib/feedparser/tests/entities/cent.xml delete mode 100644 lib/feedparser/tests/entities/chi.xml delete mode 100644 lib/feedparser/tests/entities/circ.xml delete mode 100644 lib/feedparser/tests/entities/clubs.xml delete mode 100644 lib/feedparser/tests/entities/cong.xml delete mode 100644 lib/feedparser/tests/entities/copy.xml delete mode 100644 lib/feedparser/tests/entities/crarr.xml delete mode 100644 lib/feedparser/tests/entities/cup.xml delete mode 100644 lib/feedparser/tests/entities/curren.xml delete mode 100644 lib/feedparser/tests/entities/dagger.xml delete mode 100644 lib/feedparser/tests/entities/darr.xml delete mode 100644 lib/feedparser/tests/entities/deg.xml delete mode 100644 lib/feedparser/tests/entities/delta.xml delete mode 100644 lib/feedparser/tests/entities/diams.xml delete mode 100644 lib/feedparser/tests/entities/divide.xml delete mode 100644 lib/feedparser/tests/entities/doesnotexist.xml delete mode 100644 lib/feedparser/tests/entities/eacute.xml delete mode 100644 lib/feedparser/tests/entities/ecirc.xml delete mode 100644 lib/feedparser/tests/entities/egrave.xml delete mode 100644 lib/feedparser/tests/entities/empty.xml delete mode 100644 lib/feedparser/tests/entities/emsp.xml delete mode 100644 lib/feedparser/tests/entities/ensp.xml delete mode 100644 lib/feedparser/tests/entities/epsilon.xml delete mode 100644 lib/feedparser/tests/entities/equiv.xml delete mode 100644 lib/feedparser/tests/entities/eta.xml delete mode 100644 lib/feedparser/tests/entities/eth.xml delete mode 100644 lib/feedparser/tests/entities/euml.xml delete mode 100644 lib/feedparser/tests/entities/euro.xml delete mode 100644 lib/feedparser/tests/entities/exist.xml delete mode 100644 lib/feedparser/tests/entities/fnof.xml delete mode 100644 lib/feedparser/tests/entities/forall.xml delete mode 100644 lib/feedparser/tests/entities/frac12.xml delete mode 100644 lib/feedparser/tests/entities/frac14.xml delete mode 100644 lib/feedparser/tests/entities/frac34.xml delete mode 100644 lib/feedparser/tests/entities/frasl.xml delete mode 100644 lib/feedparser/tests/entities/gamma.xml delete mode 100644 lib/feedparser/tests/entities/ge.xml delete mode 100644 lib/feedparser/tests/entities/hArr.xml delete mode 100644 lib/feedparser/tests/entities/hearts.xml delete mode 100644 lib/feedparser/tests/entities/hellip.xml delete mode 100644 lib/feedparser/tests/entities/hex_entity_x_lowercase.xml delete mode 100644 lib/feedparser/tests/entities/hex_entity_x_uppercase.xml delete mode 100644 lib/feedparser/tests/entities/iacute.xml delete mode 100644 lib/feedparser/tests/entities/icirc.xml delete mode 100644 lib/feedparser/tests/entities/iexcl.xml delete mode 100644 lib/feedparser/tests/entities/igrave.xml delete mode 100644 lib/feedparser/tests/entities/image.xml delete mode 100644 lib/feedparser/tests/entities/infin.xml delete mode 100644 lib/feedparser/tests/entities/int.xml delete mode 100644 lib/feedparser/tests/entities/iota.xml delete mode 100644 lib/feedparser/tests/entities/iquest.xml delete mode 100644 lib/feedparser/tests/entities/isin.xml delete mode 100644 lib/feedparser/tests/entities/iuml.xml delete mode 100644 lib/feedparser/tests/entities/kappa.xml delete mode 100644 lib/feedparser/tests/entities/lArr.xml delete mode 100644 lib/feedparser/tests/entities/lambda.xml delete mode 100644 lib/feedparser/tests/entities/lang.xml delete mode 100644 lib/feedparser/tests/entities/laquo.xml delete mode 100644 lib/feedparser/tests/entities/lceil.xml delete mode 100644 lib/feedparser/tests/entities/ldquo.xml delete mode 100644 lib/feedparser/tests/entities/le.xml delete mode 100644 lib/feedparser/tests/entities/lfloor.xml delete mode 100644 lib/feedparser/tests/entities/lowast.xml delete mode 100644 lib/feedparser/tests/entities/loz.xml delete mode 100644 lib/feedparser/tests/entities/lrm.xml delete mode 100644 lib/feedparser/tests/entities/lsaquo.xml delete mode 100644 lib/feedparser/tests/entities/lsquo.xml delete mode 100644 lib/feedparser/tests/entities/macr.xml delete mode 100644 lib/feedparser/tests/entities/mdash.xml delete mode 100644 lib/feedparser/tests/entities/micro.xml delete mode 100644 lib/feedparser/tests/entities/middot.xml delete mode 100644 lib/feedparser/tests/entities/minus.xml delete mode 100644 lib/feedparser/tests/entities/mu.xml delete mode 100644 lib/feedparser/tests/entities/nabla.xml delete mode 100644 lib/feedparser/tests/entities/nbsp.xml delete mode 100644 lib/feedparser/tests/entities/ndash.xml delete mode 100644 lib/feedparser/tests/entities/ne.xml delete mode 100644 lib/feedparser/tests/entities/ni.xml delete mode 100644 lib/feedparser/tests/entities/not.xml delete mode 100644 lib/feedparser/tests/entities/notin.xml delete mode 100644 lib/feedparser/tests/entities/nsub.xml delete mode 100644 lib/feedparser/tests/entities/ntilde.xml delete mode 100644 lib/feedparser/tests/entities/nu.xml delete mode 100644 lib/feedparser/tests/entities/oacute.xml delete mode 100644 lib/feedparser/tests/entities/ocirc.xml delete mode 100644 lib/feedparser/tests/entities/oelig.xml delete mode 100644 lib/feedparser/tests/entities/ograve.xml delete mode 100644 lib/feedparser/tests/entities/oline.xml delete mode 100644 lib/feedparser/tests/entities/omega.xml delete mode 100644 lib/feedparser/tests/entities/omicron.xml delete mode 100644 lib/feedparser/tests/entities/oplus.xml delete mode 100644 lib/feedparser/tests/entities/or.xml delete mode 100644 lib/feedparser/tests/entities/ordf.xml delete mode 100644 lib/feedparser/tests/entities/ordm.xml delete mode 100644 lib/feedparser/tests/entities/oslash.xml delete mode 100644 lib/feedparser/tests/entities/otilde.xml delete mode 100644 lib/feedparser/tests/entities/otimes.xml delete mode 100644 lib/feedparser/tests/entities/ouml.xml delete mode 100644 lib/feedparser/tests/entities/para.xml delete mode 100644 lib/feedparser/tests/entities/part.xml delete mode 100644 lib/feedparser/tests/entities/permil.xml delete mode 100644 lib/feedparser/tests/entities/perp.xml delete mode 100644 lib/feedparser/tests/entities/phi.xml delete mode 100644 lib/feedparser/tests/entities/pi.xml delete mode 100644 lib/feedparser/tests/entities/piv.xml delete mode 100644 lib/feedparser/tests/entities/plusmn.xml delete mode 100644 lib/feedparser/tests/entities/pound.xml delete mode 100644 lib/feedparser/tests/entities/prime.xml delete mode 100644 lib/feedparser/tests/entities/prod.xml delete mode 100644 lib/feedparser/tests/entities/prop.xml delete mode 100644 lib/feedparser/tests/entities/psi.xml delete mode 100644 lib/feedparser/tests/entities/query_variable_entry.xml delete mode 100644 lib/feedparser/tests/entities/query_variable_feed.xml delete mode 100644 lib/feedparser/tests/entities/radic.xml delete mode 100644 lib/feedparser/tests/entities/rang.xml delete mode 100644 lib/feedparser/tests/entities/raquo.xml delete mode 100644 lib/feedparser/tests/entities/rarr.xml delete mode 100644 lib/feedparser/tests/entities/rceil.xml delete mode 100644 lib/feedparser/tests/entities/rdquo.xml delete mode 100644 lib/feedparser/tests/entities/real.xml delete mode 100644 lib/feedparser/tests/entities/reg.xml delete mode 100644 lib/feedparser/tests/entities/rfloor.xml delete mode 100644 lib/feedparser/tests/entities/rho.xml delete mode 100644 lib/feedparser/tests/entities/rlm.xml delete mode 100644 lib/feedparser/tests/entities/rsaquo.xml delete mode 100644 lib/feedparser/tests/entities/rsquo.xml delete mode 100644 lib/feedparser/tests/entities/sbquo.xml delete mode 100644 lib/feedparser/tests/entities/scaron.xml delete mode 100644 lib/feedparser/tests/entities/sdot.xml delete mode 100644 lib/feedparser/tests/entities/sect.xml delete mode 100644 lib/feedparser/tests/entities/shy.xml delete mode 100644 lib/feedparser/tests/entities/sigma.xml delete mode 100644 lib/feedparser/tests/entities/sigmaf.xml delete mode 100644 lib/feedparser/tests/entities/sim.xml delete mode 100644 lib/feedparser/tests/entities/spades.xml delete mode 100644 lib/feedparser/tests/entities/sub.xml delete mode 100644 lib/feedparser/tests/entities/sube.xml delete mode 100644 lib/feedparser/tests/entities/sum.xml delete mode 100644 lib/feedparser/tests/entities/sup.xml delete mode 100644 lib/feedparser/tests/entities/sup1.xml delete mode 100644 lib/feedparser/tests/entities/sup2.xml delete mode 100644 lib/feedparser/tests/entities/sup3.xml delete mode 100644 lib/feedparser/tests/entities/supe.xml delete mode 100644 lib/feedparser/tests/entities/szlig.xml delete mode 100644 lib/feedparser/tests/entities/tau.xml delete mode 100644 lib/feedparser/tests/entities/there4.xml delete mode 100644 lib/feedparser/tests/entities/theta.xml delete mode 100644 lib/feedparser/tests/entities/thetasym.xml delete mode 100644 lib/feedparser/tests/entities/thinsp.xml delete mode 100644 lib/feedparser/tests/entities/thorn.xml delete mode 100644 lib/feedparser/tests/entities/tilde.xml delete mode 100644 lib/feedparser/tests/entities/times.xml delete mode 100644 lib/feedparser/tests/entities/trade.xml delete mode 100644 lib/feedparser/tests/entities/uacute.xml delete mode 100644 lib/feedparser/tests/entities/uarr.xml delete mode 100644 lib/feedparser/tests/entities/ucirc.xml delete mode 100644 lib/feedparser/tests/entities/ugrave.xml delete mode 100644 lib/feedparser/tests/entities/uml.xml delete mode 100644 lib/feedparser/tests/entities/upper_AElig.xml delete mode 100644 lib/feedparser/tests/entities/upper_Aacute.xml delete mode 100644 lib/feedparser/tests/entities/upper_Acirc.xml delete mode 100644 lib/feedparser/tests/entities/upper_Agrave.xml delete mode 100644 lib/feedparser/tests/entities/upper_Alpha.xml delete mode 100644 lib/feedparser/tests/entities/upper_Aring.xml delete mode 100644 lib/feedparser/tests/entities/upper_Atilde.xml delete mode 100644 lib/feedparser/tests/entities/upper_Auml.xml delete mode 100644 lib/feedparser/tests/entities/upper_Beta.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ccedil.xml delete mode 100644 lib/feedparser/tests/entities/upper_Chi.xml delete mode 100644 lib/feedparser/tests/entities/upper_Dagger.xml delete mode 100644 lib/feedparser/tests/entities/upper_Delta.xml delete mode 100644 lib/feedparser/tests/entities/upper_ETH.xml delete mode 100644 lib/feedparser/tests/entities/upper_Eacute.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ecirc.xml delete mode 100644 lib/feedparser/tests/entities/upper_Egrave.xml delete mode 100644 lib/feedparser/tests/entities/upper_Epsilon.xml delete mode 100644 lib/feedparser/tests/entities/upper_Eta.xml delete mode 100644 lib/feedparser/tests/entities/upper_Euml.xml delete mode 100644 lib/feedparser/tests/entities/upper_Gamma.xml delete mode 100644 lib/feedparser/tests/entities/upper_Iacute.xml delete mode 100644 lib/feedparser/tests/entities/upper_Icirc.xml delete mode 100644 lib/feedparser/tests/entities/upper_Igrave.xml delete mode 100644 lib/feedparser/tests/entities/upper_Iota.xml delete mode 100644 lib/feedparser/tests/entities/upper_Iuml.xml delete mode 100644 lib/feedparser/tests/entities/upper_Kappa.xml delete mode 100644 lib/feedparser/tests/entities/upper_Lambda.xml delete mode 100644 lib/feedparser/tests/entities/upper_Mu.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ntilde.xml delete mode 100644 lib/feedparser/tests/entities/upper_Nu.xml delete mode 100644 lib/feedparser/tests/entities/upper_OElig.xml delete mode 100644 lib/feedparser/tests/entities/upper_Oacute.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ocirc.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ograve.xml delete mode 100644 lib/feedparser/tests/entities/upper_Omega.xml delete mode 100644 lib/feedparser/tests/entities/upper_Omicron.xml delete mode 100644 lib/feedparser/tests/entities/upper_Oslash.xml delete mode 100644 lib/feedparser/tests/entities/upper_Otilde.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ouml.xml delete mode 100644 lib/feedparser/tests/entities/upper_Phi.xml delete mode 100644 lib/feedparser/tests/entities/upper_Pi.xml delete mode 100644 lib/feedparser/tests/entities/upper_Prime.xml delete mode 100644 lib/feedparser/tests/entities/upper_Psi.xml delete mode 100644 lib/feedparser/tests/entities/upper_Rho.xml delete mode 100644 lib/feedparser/tests/entities/upper_Scaron.xml delete mode 100644 lib/feedparser/tests/entities/upper_Sigma.xml delete mode 100644 lib/feedparser/tests/entities/upper_THORN.xml delete mode 100644 lib/feedparser/tests/entities/upper_Tau.xml delete mode 100644 lib/feedparser/tests/entities/upper_Theta.xml delete mode 100644 lib/feedparser/tests/entities/upper_Uacute.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ucirc.xml delete mode 100644 lib/feedparser/tests/entities/upper_Ugrave.xml delete mode 100644 lib/feedparser/tests/entities/upper_Upsilon.xml delete mode 100644 lib/feedparser/tests/entities/upper_Uuml.xml delete mode 100644 lib/feedparser/tests/entities/upper_Xi.xml delete mode 100644 lib/feedparser/tests/entities/upper_Yacute.xml delete mode 100644 lib/feedparser/tests/entities/upper_Yuml.xml delete mode 100644 lib/feedparser/tests/entities/upper_Zeta.xml delete mode 100644 lib/feedparser/tests/entities/upsih.xml delete mode 100644 lib/feedparser/tests/entities/upsilon.xml delete mode 100644 lib/feedparser/tests/entities/uuml.xml delete mode 100644 lib/feedparser/tests/entities/weierp.xml delete mode 100644 lib/feedparser/tests/entities/xi.xml delete mode 100644 lib/feedparser/tests/entities/yacute.xml delete mode 100644 lib/feedparser/tests/entities/yen.xml delete mode 100644 lib/feedparser/tests/entities/yuml.xml delete mode 100644 lib/feedparser/tests/entities/zeta.xml delete mode 100644 lib/feedparser/tests/entities/zwj.xml delete mode 100644 lib/feedparser/tests/entities/zwnj.xml delete mode 100644 lib/feedparser/tests/http/http_redirect_to_304.xml delete mode 100644 lib/feedparser/tests/http/http_status_301.xml delete mode 100644 lib/feedparser/tests/http/http_status_302.xml delete mode 100644 lib/feedparser/tests/http/http_status_303.xml delete mode 100644 lib/feedparser/tests/http/http_status_304.xml delete mode 100644 lib/feedparser/tests/http/http_status_307.xml delete mode 100644 lib/feedparser/tests/http/http_status_404.xml delete mode 100644 lib/feedparser/tests/http/http_status_9001.xml delete mode 100644 lib/feedparser/tests/http/target.xml delete mode 100644 lib/feedparser/tests/illformed/aaa_illformed.xml delete mode 100644 lib/feedparser/tests/illformed/always_strip_doctype.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/big5.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/eucjp.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/euckr.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/gb2312.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/koi8r.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/shiftjis.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/tis620.xml delete mode 100644 lib/feedparser/tests/illformed/chardet/windows1255.xml delete mode 100644 lib/feedparser/tests/illformed/http_high_bit_date.xml delete mode 100644 lib/feedparser/tests/illformed/non-ascii-tag.xml delete mode 100644 lib/feedparser/tests/illformed/rdf_channel_empty_textinput.xml delete mode 100644 lib/feedparser/tests/illformed/rss_empty_document.xml delete mode 100644 lib/feedparser/tests/illformed/rss_incomplete_cdata.xml delete mode 100644 lib/feedparser/tests/illformed/undeclared_namespace.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/2-4-2-vcard.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-1-fn-unicode-char.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-1-fn.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-2-n-2-plural.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-2-n-2-singular.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-2-n-plural.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-2-n-singular.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-plural.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-singular.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-3-nickname.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-4-photo-inline.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-4-photo.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-5-bday-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-5-bday-3.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-1-5-bday.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-2-1-adr.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-2-2-label.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-3-1-tel.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-3-2-email-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-3-2-email-3.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-3-2-email.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-3-3-mailer.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-4-1-tz-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-4-1-tz.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-4-2-geo.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-1-title.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-2-role.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-3-logo-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-3-logo.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-4-agent-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-4-agent.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-5-5-org.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-plural.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-singular.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-1-categories.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-2-note.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-4-rev-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-4-rev.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-3.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-4.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-5.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-5-sort-string.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-6-sound-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-6-sound.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-7-uid.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-6-8-url.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-7-1-class-2.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-7-1-class-3.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-7-1-class.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/3-7-2-key.xml delete mode 100644 lib/feedparser/tests/microformats/hcard/7-authors.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_avi.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bin.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bz2.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_deb.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_dmg.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_exe.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_gz.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_hqx.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_img.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_iso.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_jar.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4a.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4v.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp2.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp3.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp4.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_msi.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_ogg.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rar.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rpm.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sit.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sitx.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tar.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tbz2.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tgz.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wma.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wmv.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_z.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_zip.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_application_ogg.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_audio.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_video.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_invalid.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect_xml.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_from_link_text.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_overrides_link_text.xml delete mode 100644 lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_type.xml delete mode 100644 lib/feedparser/tests/microformats/rel_tag/rel_tag_duplicate.xml delete mode 100644 lib/feedparser/tests/microformats/rel_tag/rel_tag_label.xml delete mode 100644 lib/feedparser/tests/microformats/rel_tag/rel_tag_scheme.xml delete mode 100644 lib/feedparser/tests/microformats/rel_tag/rel_tag_term.xml delete mode 100644 lib/feedparser/tests/microformats/rel_tag/rel_tag_term_trailing_slash.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_acquaintance.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_brother.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_child.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_co-resident.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_co-worker.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_colleague.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_contact.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_coresident.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_coworker.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_crush.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_date.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_friend.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_href.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_husband.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_kin.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_me.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_met.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_multiple.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_muse.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_name.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_neighbor.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_parent.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_relative.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_sibling.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_sister.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_spouse.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_sweetheart.xml delete mode 100644 lib/feedparser/tests/microformats/xfn/xfn_wife.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp01.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp02.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp03.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp04.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp05.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp06.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp07.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp08.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp09.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp10.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp11.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp12.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp13.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp14.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp15.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp16.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp17.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp18.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp19.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp20.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp21.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp22.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp23.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp24.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp25.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp26.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp27.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp28.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp29.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp30.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp31.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp32.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp33.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp34.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp35.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp36.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp37.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp38.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp39.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp40.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp41.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp42.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp43.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp44.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp45.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp46.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp47.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp48.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp49.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp50.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp51.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp52.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp53.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp54.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp55.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp56.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp57.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp58.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp59.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp60.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp61.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp62.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp63.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/amp64.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/attr01.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/attr02.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/attr03.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/attr04.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/attr05.xml delete mode 100644 lib/feedparser/tests/wellformed/amp/attr06.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/atom_namespace_1.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/atom_namespace_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/atom_namespace_3.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/atom_namespace_4.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/atom_namespace_5.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_homepage.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_map_author.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_map_author_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_author_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_contributor_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_contributor_homepage.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_contributor_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_contributor_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_contributor_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_contributor_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_created.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_created_multiple_values.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_created_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_id.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_id_map_guid.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_issued.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_issued_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_href.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_link_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_modified.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_modified_map_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_published_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_published_parsed_date_overwriting.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_source_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_summary_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_title_text_plain_brackets.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_updated_multiple_values.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/entry_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_homepage.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_map_author.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_map_author_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_author_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_contributor_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_contributor_homepage.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_contributor_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_contributor_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_contributor_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_contributor_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_copyright_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_generator.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_generator_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_generator_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_generator_version.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_id.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_id_map_guid.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_info_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_href.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_link_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_modified.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_modified_map_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_tagline_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_content_mode_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_content_mode_escaped.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_content_type_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_title_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/feed_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/media_player1.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/media_thumbnail.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/relative_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/relative_uri_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/atom/relative_uri_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/ampersand_in_attr.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/atom10_namespace.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/atom10_version.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_author_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_author_map_author.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_author_map_author_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_author_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_author_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_author_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_authors_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_authors_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_authors_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_authors_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_category_label.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_category_scheme.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_category_term.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_category_term_non_ascii.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_application_xml.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_div_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_src.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_text_plain_brackets.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_contributor_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_contributor_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_contributor_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_contributor_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_contributor_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_map_guid.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_1.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_3.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_4.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_5.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_6.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_7.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_id_with_attributes.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_3.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_href.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_hreflang.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_length.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_no_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_length.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_license.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_other.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_related.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_self.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_rel_via.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_link_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain_brackets.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_type_default.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_rights_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_author_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_author_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_author_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_authors_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_authors_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_authors_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_authors_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_category_label.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_category_scheme.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_category_term.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_category_term_non_ascii.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_contributor_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_contributor_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_contributor_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_contributor_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_generator.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_generator_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_generator_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_generator_version.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_icon.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_id.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_href.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_hreflang.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_length.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_no_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_other.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_related.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_self.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_via.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_link_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_logo.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_rights_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subittle_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_source_title_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_type_default.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_summary_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_text_plain_brackets.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_type_default.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/entry_title_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_author_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_author_map_author.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_author_map_author_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_author_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_author_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_author_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_authors_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_authors_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_authors_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_authors_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_contributor_email.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_contributor_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_contributor_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_contributor_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_contributor_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_generator.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_generator_name.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_generator_url.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_generator_version.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_icon.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_id.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_id_map_guid.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_href.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_hreflang.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_length.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_no_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_rel_other.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_rel_related.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_rel_self.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_rel_self_default_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_rel_via.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_link_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_logo.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_rights_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_subtitle_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_base64_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_content_type.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_content_type_text.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_content_value.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/feed_title_text_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/item_media_category_label.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/item_media_category_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/item_media_category_scheme1.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/item_media_category_scheme2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/item_media_category_term.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/item_media_title_type_plain.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/missing_quote_in_attr.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/qna.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/quote_in_attr.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/relative_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/relative_uri_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/relative_uri_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/atom10/tag_in_attr.xml delete mode 100644 lib/feedparser/tests/wellformed/base/cdf_item_abstract_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_content_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_summary_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_title_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_copyright_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_info_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_link_xml_base_iri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_tagline_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_title_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_channel_docs_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_channel_docs_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_channel_link_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_channel_link_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_author_url_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_author_url_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_content_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_content_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_id_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_id_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_link_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_link_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_summary_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_summary_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_title_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_title_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_author_url_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_author_url_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_copyright_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_copyright_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_id_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_id_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_info_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_info_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_link_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_link_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_tagline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_tagline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_title_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_title_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_body_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_body_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_comments_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_comments_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_description_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_description_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_description_spaces.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_fullitem_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_fullitem_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_link_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_link_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_content_location.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_docuri.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_relative_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/http_relative_xml_base_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/item_media_title1.xml delete mode 100644 lib/feedparser/tests/wellformed/base/item_media_title2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/item_media_title3.xml delete mode 100644 lib/feedparser/tests/wellformed/base/malformed_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/rel_uri_with_unicode_character.xml delete mode 100644 lib/feedparser/tests/wellformed/base/relative_xml_base.xml delete mode 100644 lib/feedparser/tests/wellformed/base/relative_xml_base_2.xml delete mode 100644 lib/feedparser/tests/wellformed/base/unsafe_base.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_abstract_map_description.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_abstract_map_tagline.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_href_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_href_map_links.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_lastmod.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_lastmod_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/channel_title.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_abstract_map_description.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_abstract_map_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_href_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_href_map_links.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_lastmod.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_lastmod_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/cdf/item_title.xml delete mode 100644 lib/feedparser/tests/wellformed/feedburner/feedburner_browserfriendly.xml delete mode 100644 lib/feedparser/tests/wellformed/http/headers_content_location-relative.xml delete mode 100644 lib/feedparser/tests/wellformed/http/headers_content_location-unsafe.xml delete mode 100644 lib/feedparser/tests/wellformed/http/headers_etag.xml delete mode 100644 lib/feedparser/tests/wellformed/http/headers_foo.xml delete mode 100644 lib/feedparser/tests/wellformed/http/headers_no_etag.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_block.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_block_false.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_block_no.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_block_true.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_block_uppercase.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_block_whitespace.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_category.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_category_nested.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_category_scheme.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_clean.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_false.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_no.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_true.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_uppercase.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_whitespace.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_image.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_image_no_href.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_image_url.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate_2.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_link_image.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_email.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_name.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_subtitle.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_channel_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_core_element_uppercase.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_author_map_author.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_block.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_block_false.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_block_no.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_block_true.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_block_uppercase.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_block_whitespace.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_category.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_category_nested.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_category_scheme.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_duration.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_clean.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_false.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_no.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_true.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_uppercase.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_whitespace.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_image.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_image_url.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_link_image.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_subtitle.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_item_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_namespace.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_namespace_example.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_namespace_lowercase.xml delete mode 100644 lib/feedparser/tests/wellformed/itunes/itunes_namespace_uppercase.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/channel_dc_language.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/channel_language.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_underscore.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_title_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_info_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_language.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_language_override.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_not_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_not_xml_lang_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_title_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_blank.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_3.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_4.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/feed_xml_lang_underscore.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/http_content_language.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit_2.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/http_content_language_feed_language.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/http_content_language_feed_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_dc_language.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang_inherit.xml delete mode 100644 lib/feedparser/tests/wellformed/mf_hcard/3-5-5-org-unicode.xml delete mode 100644 lib/feedparser/tests/wellformed/mf_rel_tag/rel_tag_term_no_term.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atommathml.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomsvg.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomsvgdctitle.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomsvgdesc.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomsvgtitle.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomthreading.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomthreadingwithentry.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/atomxlink.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss1.0withModules.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNS.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNSLocalNameClash.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModules.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNS.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNSLocalNameClash.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0mathml.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModules.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModulesLocalNameClash.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0svg.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0svg5.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0svgtitle.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0withAtomNS.xml delete mode 100644 lib/feedparser/tests/wellformed/namespace/rss2.0xlink.xml delete mode 100644 lib/feedparser/tests/wellformed/node_precedence/atom10_arbitrary_element.xml delete mode 100644 lib/feedparser/tests/wellformed/node_precedence/atom10_id.xml delete mode 100644 lib/feedparser/tests/wellformed/node_precedence/atom10_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/doctype_contains_entity_decl.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_channel_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_channel_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_channel_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_item_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_item_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_item_rdf_about.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rdf_item_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rss090_channel_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rss090_item_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rss_version_10.xml delete mode 100644 lib/feedparser/tests/wellformed/rdf/rss_version_10_not_default_ns.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/aaa_wellformed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_author.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_3.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_category.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_category_domain.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_category_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_category_multiple_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_cloud_domain.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_cloud_path.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_cloud_port.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_cloud_protocol.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_cloud_registerProcedure.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_copyright.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_author.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_contributor.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_creator.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_date.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_date_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_publisher.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_publisher_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_publisher_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_rights.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_subject.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_subject_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_subject_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dc_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dcterms_created.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dcterms_created_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dcterms_issued.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dcterms_issued_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dcterms_modified.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_dcterms_modified_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_description_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_description_map_tagline.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_description_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_description_shorttag.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_docs.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_generator.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_height.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_link_bleed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_link_conflict.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_title_conflict.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_url.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_image_width.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_lastBuildDate.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_lastBuildDate_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_managingEditor.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_pubDate.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_pubDate_map_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_description_conflict.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_link_bleed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_link_conflict.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_textInput_title_conflict.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_title_apos.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_title_gt.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_title_lt.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_ttl.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_webMaster.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_webMaster_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/channel_webMaster_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/entity_in_doctype.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email3.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name3.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_category.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_category_domain.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_category_image.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_category_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_category_multiple_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_cc_license.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_comments.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_content_encoded.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_content_encoded_mode.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_content_encoded_type.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_creativeCommons_license.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_author.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_contributor.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_creator.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_date.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_date_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_publisher.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_publisher_email.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_publisher_name.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_rights.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_subject.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_subject_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_subject_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dc_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dcterms_created.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dcterms_created_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dcterms_issued.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dcterms_issued_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dcterms_modified.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_dcterms_modified_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_and_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_br.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_br_shorttag.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_code_br.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_escaped_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_map_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_naked_markup.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_enclosure_length.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_enclosure_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_enclosure_type.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_enclosure_url.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_expirationDate.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_expirationDate_multiple_values.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_expirationDate_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_fullitem.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_fullitem_mode.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_fullitem_type.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_conflict_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_guidislink.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link_not_guidislink.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_guidislink.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_map_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_not_permalink.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_conflict_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_url.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_image_link_bleed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_image_link_conflict.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_link.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_pubDate.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_pubDate_map_updated_parsed.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_source.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_source_url.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_summary_and_description.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_title.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_xhtml_body.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_xhtml_body_mode.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/item_xhtml_body_type.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/newlocation.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_namespace_1.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_namespace_2.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_namespace_3.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_namespace_4.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_090.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_091_netscape.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_091_userland.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_092.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_093.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_094.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_20.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_201.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_21.xml delete mode 100644 lib/feedparser/tests/wellformed/rss/rss_version_missing.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_abbr.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept-charset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accesskey.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_action.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_align.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_alt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autocomplete.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autofocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autoplay.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_axis.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_background.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_balance.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgcolor.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgproperties.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_border.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolor.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolordark.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolorlight.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bottompadding.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellpadding.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellspacing.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ch.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_challenge.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_char.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charoff.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_checked.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_choff.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cite.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_class.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_clear.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_color.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cols.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_colspan.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_compact.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_contenteditable.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_coords.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_data.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datafld.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datapagesize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datasrc.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datetime.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_default.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_delay.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dir.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_disabled.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_draggable.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dynsrc.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_enctype.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_end.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_face.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_for.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_form.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_galleryimg.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_gutter.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_headers.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_height.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidden.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidefocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_high.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_href.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hreflang.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hspace.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_icon.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_id.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_inputmode.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ismap.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_keytype.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_label.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lang.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_leftspacing.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_list.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_longdesc.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loop.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopcount.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopend.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopstart.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_low.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lowsrc.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_max.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_maxlength.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_media.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_method.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_min.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_multiple.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_name.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nohref.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_noshade.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nowrap.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_open.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_optimum.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pattern.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ping.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_point-size.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_poster.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pqg.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_preload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_prompt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_radiogroup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_readonly.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rel.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-max.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-min.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_replace.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_required.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rev.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rightspacing.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rows.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rowspan.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rules.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_scope.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_selected.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_shape.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_size.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_span.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_src.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_start.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_step.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_suppress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_tabindex.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_target.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_template.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_title.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_toppadding.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_type.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_unselectable.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_urn.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_usemap.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_valign.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_value.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_variable.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_volume.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vrml.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vspace.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_width.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_wrap.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_a.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_abbr.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_acronym.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_address.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_area.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_article.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_aside.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_audio.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_b.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_big.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_blockquote.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_br.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_button.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_canvas.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_caption.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_center.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_cite.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_code.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_col.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_colgroup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_command.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_datagrid.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_datalist.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_dd.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_del.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_details.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_dfn.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_dialog.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_dir.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_div.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_dl.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_dt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_em.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_event-source.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_fieldset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_figure.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_font.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_footer.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_form.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_h1.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_h2.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_h3.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_h4.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_h5.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_h6.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_header.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_hr.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_i.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_img.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_input.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_ins.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_kbd.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_keygen.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_label.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_legend.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_li.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_m.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_map.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_menu.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_meter.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_multicol.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_nav.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_nextid.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_noscript.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_ol.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_optgroup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_option.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_output.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_p.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_pre.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_progress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_q.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_s.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_samp.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_section.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_select.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_small.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_sound.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_source.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_spacer.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_span.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_strike.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_strong.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_sub.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_sup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_table.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_tbody.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_td.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_textarea.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_tfoot.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_th.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_thead.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_time.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_tr.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_tt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_u.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_ul.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_var.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/acceptable_element_video.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/blogger_dollar_sign_in_attribute.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_script_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_content_style_tag.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_script_base64.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_script_map_description.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_summary_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/entry_title_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_copyright_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_info_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_subtitle_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_map_description.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_tagline_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_script_inline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/feed_title_unacceptable_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_script_map_content.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_body_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_map_content.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_map_content.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_nested_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_content_encoded_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_script_map_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_description_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_crazy.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_cdata.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_map_summary.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_fullitem_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_applet.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_blink.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_embed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_frame.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_iframe.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_link.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_meta.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_object.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onabort.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onblur.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onchange.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_ondblclick.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onerror.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onfocus.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeydown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeypress.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeyup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmousedown.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseout.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseover.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseup.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onreset.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onresize.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onsubmit.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onunload.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script_map_content.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_style.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/large_atom_feed_that_needs_css_sanitisation.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_background_repeat_repeat_x.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_background_url.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_background_yellow.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_0.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_1px_solid_rgb_0_0_0_.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_3px_solid_ccc.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_bottom_0pt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dashed.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dotted.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_collapse_collapse.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_left_0pt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_medium_none_.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_none_important.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_right_0pt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_solid_2px_000000.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_border_top_0pt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_clear_both.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_000080.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_008.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_999999.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_blue.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_maroon.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_red.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_rgb_0_128_0_.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_color_teal.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_cursor_pointer.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_display_block.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_float_left.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_float_right.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_family__comic_sans_ms.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_family_arial_sans_serif.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_family_lucida_console_.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_family_symbol.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_size_0_9em.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_size_10pt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_size_10px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_size_smaller.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_style_italic.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_font_weight_bold.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_height_100px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_height_2px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_letter_spacing_1px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_line_height_normal.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_0.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_0_15px_0_0.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_0px_important.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_5px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_99999em.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_0pt.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_10px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_left_5px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_right_0px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_top_0in.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_margin_top_10px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_moz_background_clip_initial.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_ansi_language_nl.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_bidi_font_weight_normal.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_highlight_yellow.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_layout_grid_align_none.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_list_l0_level1_lfo1.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_no_proof_yes.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_spacerun_yes.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_mso_tab_count_3.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_overflow_auto.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_padding_0.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_padding_0_0_12px_12px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_padding_2ex.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_padding_99999em.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_padding_left_4px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_padding_right_0in.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_position_absolute.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_tab_stops_list_5in.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_text_align_center.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_text_align_left.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_text_align_right.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_text_decoration_underline.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_text_indent_0_5in.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_vertical_align_bottom.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_vertical_align_top.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_white_space_nowrap.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_white_space_top.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/style_width_300px.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/xml_declaration_unexpected_character.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/xml_malicious_comment.xml delete mode 100644 lib/feedparser/tests/wellformed/sanitize/xml_unclosed_comment.xml delete mode 100644 lib/feedparser/tests/wellformed/sgml/charref_uppercase_x.xml delete mode 100644 lib/feedparser/tests/wellformed/xml/empty_xmlns_uri.xml delete mode 100644 lib/feedparser/tests/wellformed/xml/escaped_apos.xml delete mode 100644 lib/feedparser/tests/wellformed/xml/xlink_ns_no_prefix.xml create mode 100644 lib/feedparser/urls.py create mode 100644 lib/feedparser/util.py diff --git a/lib/feedcache/__init__.py b/lib/feedcache/__init__.py deleted file mode 100644 index 96ebc1020..000000000 --- a/lib/feedcache/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -""" - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# - - -# -# Import local modules -# -from cache import Cache - -# -# Module -# diff --git a/lib/feedcache/cache.py b/lib/feedcache/cache.py deleted file mode 100644 index 7520d51ae..000000000 --- a/lib/feedcache/cache.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -""" - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -from feedparser import feedparser - -import logging -import time - -# -# Import local modules -# - - -# -# Module -# - -logger = logging.getLogger('feedcache.cache') - - -class Cache: - """A class to wrap Mark Pilgrim's Universal Feed Parser module - (http://www.feedparser.org) so that parameters can be used to - cache the feed results locally instead of fetching the feed every - time it is requested. Uses both etag and modified times for - caching. - """ - - def __init__(self, storage, timeToLiveSeconds=300, userAgent='feedcache'): - """ - Arguments: - - storage -- Backing store for the cache. It should follow - the dictionary API, with URLs used as keys. It should - persist data. - - timeToLiveSeconds=300 -- The length of time content should - live in the cache before an update is attempted. - - userAgent='feedcache' -- User agent string to be used when - fetching feed contents. - - """ - self.storage = storage - self.time_to_live = timeToLiveSeconds - self.user_agent = userAgent - return - - def purge(self, olderThanSeconds): - """Remove cached data from the storage if the data is older than the - date given. If olderThanSeconds is None, the entire cache is purged. - """ - if olderThanSeconds is None: - logger.debug('purging the entire cache') - for key in self.storage.keys(): - del self.storage[key] - else: - now = time.time() - # Iterate over the keys and load each item one at a time - # to avoid having the entire cache loaded into memory - # at one time. - for url in self.storage.keys(): - (cached_time, cached_data) = self.storage[url] - age = now - cached_time - if age >= olderThanSeconds: - logger.debug('removing %s with age %d', url, age) - del self.storage[url] - return - - def fetch(self, url, force_update=False, offline=False, request_headers=None, referrer=None, handlers=[]): - """Return the feed at url. - - url - The URL of the feed. - - force_update=False - When True, update the cache whether the - current contents have - exceeded their time-to-live - or not. - - offline=False - When True, only return data from the local - cache and never access the remote - URL. - - request_headers=None - Add addition request headers to request - - referrer=None - Added a referrer to request - - handlers=None - Urllib2 handlers - - If there is data for that feed in the cache already, check - the expiration date before accessing the server. If the - cached data has not expired, return it without accessing the - server. - - In cases where the server is accessed, check for updates - before deciding what to return. If the server reports a - status of 304, the previously cached content is returned. - - The cache is only updated if the server returns a status of - 200, to avoid holding redirected data in the cache. - """ - logger.debug('url="%s"' % url) - - # Convert the URL to a value we can use - # as a key for the storage backend. - key = url - if isinstance(key, unicode): - key = key.encode('utf-8') - - modified = None - etag = None - now = time.time() - - cached_time, cached_content = self.storage.get(key, (None, None)) - - # Offline mode support (no networked requests) - # so return whatever we found in the storage. - # If there is nothing in the storage, we'll be returning None. - if offline: - logger.debug('offline mode') - return cached_content - - # Does the storage contain a version of the data - # which is older than the time-to-live? - logger.debug('cache modified time: %s' % str(cached_time)) - if cached_time is not None and not force_update: - if self.time_to_live: - age = now - cached_time - if age <= self.time_to_live: - logger.debug('cache contents still valid') - return cached_content - else: - logger.debug('cache contents older than TTL') - else: - logger.debug('no TTL value') - - # The cache is out of date, but we have - # something. Try to use the etag and modified_time - # values from the cached content. - etag = cached_content.get('etag') - modified = cached_content.get('modified') - logger.debug('cached etag=%s' % etag) - logger.debug('cached modified=%s' % str(modified)) - else: - logger.debug('nothing in the cache, or forcing update') - - # We know we need to fetch, so go ahead and do it. - logger.debug('fetching...') - parsed_result = feedparser.parse(url, - agent=self.user_agent, - modified=modified, - etag=etag, - referrer=referrer, - request_headers=request_headers, - handlers = handlers) - - status = parsed_result.get('status', None) - logger.debug('HTTP status=%s' % status) - if status == 304: - # No new data, based on the etag or modified values. - # We need to update the modified time in the - # storage, though, so we know that what we have - # stored is up to date. - self.storage[key] = (now, cached_content) - - # Return the data from the cache, since - # the parsed data will be empty. - parsed_result = cached_content - elif status == 200: - # There is new content, so store it unless there was an error. - error = parsed_result.get('bozo_exception') - if not error: - logger.debug('Updating stored data for %s' % url) - self.storage[key] = (now, parsed_result) - else: - logger.warning('Not storing data with exception: %s', - error) - else: - logger.warning('Not updating cache with HTTP status %s', status) - - return parsed_result diff --git a/lib/feedcache/cachestoragelock.py b/lib/feedcache/cachestoragelock.py deleted file mode 100644 index 05babde64..000000000 --- a/lib/feedcache/cachestoragelock.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -from __future__ import with_statement - -"""Lock wrapper for cache storage which do not permit multi-threaded access. - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -import threading - -# -# Import local modules -# - - -# -# Module -# - -class CacheStorageLock: - """Lock wrapper for cache storage which do not permit multi-threaded access. - """ - - def __init__(self, shelf): - self.lock = threading.Lock() - self.shelf = shelf - return - - def __getitem__(self, key): - with self.lock: - return self.shelf[key] - - def get(self, key, default=None): - with self.lock: - try: - return self.shelf[key] - except KeyError: - return default - - def __setitem__(self, key, value): - with self.lock: - self.shelf[key] = value diff --git a/lib/feedcache/example.py b/lib/feedcache/example.py deleted file mode 100644 index 4df7ab68b..000000000 --- a/lib/feedcache/example.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -"""Example use of feedcache.Cache. - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -import sys -import shelve - -# -# Import local modules -# -import cache - -# -# Module -# - -def main(urls=[]): - print 'Saving feed data to ./.feedcache' - storage = shelve.open('.feedcache') - try: - fc = cache.Cache(storage) - for url in urls: - parsed_data = fc.fetch(url) - print parsed_data.feed.title - for entry in parsed_data.entries: - print '\t', entry.title - finally: - storage.close() - return - -if __name__ == '__main__': - main(sys.argv[1:]) - diff --git a/lib/feedcache/example_threads.py b/lib/feedcache/example_threads.py deleted file mode 100644 index 2eb56d302..000000000 --- a/lib/feedcache/example_threads.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -"""Example use of feedcache.Cache combined with threads. - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -import Queue -import sys -import shove -import threading - -# -# Import local modules -# -import cache - -# -# Module -# - -MAX_THREADS=5 -OUTPUT_DIR='/tmp/feedcache_example' - - -def main(urls=[]): - - if not urls: - print 'Specify the URLs to a few RSS or Atom feeds on the command line.' - return - - # Decide how many threads to start - num_threads = min(len(urls), MAX_THREADS) - - # Add the URLs to a queue - url_queue = Queue.Queue() - for url in urls: - url_queue.put(url) - - # Add poison pills to the url queue to cause - # the worker threads to break out of their loops - for i in range(num_threads): - url_queue.put(None) - - # Track the entries in the feeds being fetched - entry_queue = Queue.Queue() - - print 'Saving feed data to', OUTPUT_DIR - storage = shove.Shove('file://' + OUTPUT_DIR) - try: - - # Start a few worker threads - worker_threads = [] - for i in range(num_threads): - t = threading.Thread(target=fetch_urls, - args=(storage, url_queue, entry_queue,)) - worker_threads.append(t) - t.setDaemon(True) - t.start() - - # Start a thread to print the results - printer_thread = threading.Thread(target=print_entries, args=(entry_queue,)) - printer_thread.setDaemon(True) - printer_thread.start() - - # Wait for all of the URLs to be processed - url_queue.join() - - # Wait for the worker threads to finish - for t in worker_threads: - t.join() - - # Poison the print thread and wait for it to exit - entry_queue.put((None,None)) - entry_queue.join() - printer_thread.join() - - finally: - storage.close() - return - - -def fetch_urls(storage, input_queue, output_queue): - """Thread target for fetching feed data. - """ - c = cache.Cache(storage) - - while True: - next_url = input_queue.get() - if next_url is None: # None causes thread to exit - input_queue.task_done() - break - - feed_data = c.fetch(next_url) - for entry in feed_data.entries: - output_queue.put( (feed_data.feed, entry) ) - input_queue.task_done() - return - - -def print_entries(input_queue): - """Thread target for printing the contents of the feeds. - """ - while True: - feed, entry = input_queue.get() - if feed is None: # None causes thread to exist - input_queue.task_done() - break - - print '%s: %s' % (feed.title, entry.title) - input_queue.task_done() - return - - -if __name__ == '__main__': - main(sys.argv[1:]) - diff --git a/lib/feedcache/test_cache.py b/lib/feedcache/test_cache.py deleted file mode 100644 index 2c1ac0966..000000000 --- a/lib/feedcache/test_cache.py +++ /dev/null @@ -1,323 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -"""Unittests for feedcache.cache - -""" - -__module_id__ = "$Id$" - -import logging -logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s %(levelname)-8s %(name)s %(message)s', - ) -logger = logging.getLogger('feedcache.test_cache') - -# -# Import system modules -# -import copy -import time -import unittest -import UserDict - -# -# Import local modules -# -import cache -from test_server import HTTPTestBase, TestHTTPServer - -# -# Module -# - - -class CacheTestBase(HTTPTestBase): - - CACHE_TTL = 30 - - def setUp(self): - HTTPTestBase.setUp(self) - - self.storage = self.getStorage() - self.cache = cache.Cache(self.storage, - timeToLiveSeconds=self.CACHE_TTL, - userAgent='feedcache.test', - ) - return - - def getStorage(self): - "Return a cache storage for the test." - return {} - - -class CacheTest(CacheTestBase): - - CACHE_TTL = 30 - - def getServer(self): - "These tests do not want to use the ETag or If-Modified-Since headers" - return TestHTTPServer(applyModifiedHeaders=False) - - def testRetrieveNotInCache(self): - # Retrieve data not already in the cache. - feed_data = self.cache.fetch(self.TEST_URL) - self.failUnless(feed_data) - self.failUnlessEqual(feed_data.feed.title, 'CacheTest test data') - return - - def testRetrieveIsInCache(self): - # Retrieve data which is alread in the cache, - # and verify that the second copy is identitical - # to the first. - - # First fetch - feed_data = self.cache.fetch(self.TEST_URL) - - # Second fetch - feed_data2 = self.cache.fetch(self.TEST_URL) - - # Since it is the in-memory storage, we should have the - # exact same object. - self.failUnless(feed_data is feed_data2) - return - - def testExpireDataInCache(self): - # Retrieve data which is in the cache but which - # has expired and verify that the second copy - # is different from the first. - - # First fetch - feed_data = self.cache.fetch(self.TEST_URL) - - # Change the timeout and sleep to move the clock - self.cache.time_to_live = 0 - time.sleep(1) - - # Second fetch - feed_data2 = self.cache.fetch(self.TEST_URL) - - # Since we reparsed, the cache response should be different. - self.failIf(feed_data is feed_data2) - return - - def testForceUpdate(self): - # Force cache to retrieve data which is alread in the cache, - # and verify that the new data is different. - - # Pre-populate the storage with bad data - self.cache.storage[self.TEST_URL] = (time.time() + 100, self.id()) - - # Fetch the data - feed_data = self.cache.fetch(self.TEST_URL, force_update=True) - - self.failIfEqual(feed_data, self.id()) - return - - def testOfflineMode(self): - # Retrieve data which is alread in the cache, - # whether it is expired or not. - - # Pre-populate the storage with data - self.cache.storage[self.TEST_URL] = (0, self.id()) - - # Fetch it - feed_data = self.cache.fetch(self.TEST_URL, offline=True) - - self.failUnlessEqual(feed_data, self.id()) - return - - def testUnicodeURL(self): - # Pass in a URL which is unicode - - url = unicode(self.TEST_URL) - feed_data = self.cache.fetch(url) - - storage = self.cache.storage - key = unicode(self.TEST_URL).encode('UTF-8') - - # Verify that the storage has a key - self.failUnless(key in storage) - - # Now pull the data from the storage directly - storage_timeout, storage_data = self.cache.storage.get(key) - self.failUnlessEqual(feed_data, storage_data) - return - - -class SingleWriteMemoryStorage(UserDict.UserDict): - """Cache storage which only allows the cache value - for a URL to be updated one time. - """ - - def __setitem__(self, url, data): - if url in self.keys(): - modified, existing = self[url] - # Allow the modified time to change, - # but not the feed content. - if data[1] != existing: - raise AssertionError('Trying to update cache for %s to %s' \ - % (url, data)) - UserDict.UserDict.__setitem__(self, url, data) - return - - -class CacheConditionalGETTest(CacheTestBase): - - CACHE_TTL = 0 - - def getStorage(self): - return SingleWriteMemoryStorage() - - def testFetchOnceForEtag(self): - # Fetch data which has a valid ETag value, and verify - # that while we hit the server twice the response - # codes cause us to use the same data. - - # First fetch populates the cache - response1 = self.cache.fetch(self.TEST_URL) - self.failUnlessEqual(response1.feed.title, 'CacheTest test data') - - # Remove the modified setting from the cache so we know - # the next time we check the etag will be used - # to check for updates. Since we are using an in-memory - # cache, modifying response1 updates the cache storage - # directly. - response1['modified'] = None - - # This should result in a 304 status, and no data from - # the server. That means the cache won't try to - # update the storage, so our SingleWriteMemoryStorage - # should not raise and we should have the same - # response object. - response2 = self.cache.fetch(self.TEST_URL) - self.failUnless(response1 is response2) - - # Should have hit the server twice - self.failUnlessEqual(self.server.getNumRequests(), 2) - return - - def testFetchOnceForModifiedTime(self): - # Fetch data which has a valid Last-Modified value, and verify - # that while we hit the server twice the response - # codes cause us to use the same data. - - # First fetch populates the cache - response1 = self.cache.fetch(self.TEST_URL) - self.failUnlessEqual(response1.feed.title, 'CacheTest test data') - - # Remove the etag setting from the cache so we know - # the next time we check the modified time will be used - # to check for updates. Since we are using an in-memory - # cache, modifying response1 updates the cache storage - # directly. - response1['etag'] = None - - # This should result in a 304 status, and no data from - # the server. That means the cache won't try to - # update the storage, so our SingleWriteMemoryStorage - # should not raise and we should have the same - # response object. - response2 = self.cache.fetch(self.TEST_URL) - self.failUnless(response1 is response2) - - # Should have hit the server twice - self.failUnlessEqual(self.server.getNumRequests(), 2) - return - - -class CacheRedirectHandlingTest(CacheTestBase): - - def _test(self, response): - # Set up the server to redirect requests, - # then verify that the cache is not updated - # for the original or new URL and that the - # redirect status is fed back to us with - # the fetched data. - - self.server.setResponse(response, '/redirected') - - response1 = self.cache.fetch(self.TEST_URL) - - # The response should include the status code we set - self.failUnlessEqual(response1.get('status'), response) - - # The response should include the new URL, too - self.failUnlessEqual(response1.href, self.TEST_URL + 'redirected') - - # The response should not have been cached under either URL - self.failIf(self.TEST_URL in self.storage) - self.failIf(self.TEST_URL + 'redirected' in self.storage) - return - - def test301(self): - self._test(301) - - def test302(self): - self._test(302) - - def test303(self): - self._test(303) - - def test307(self): - self._test(307) - - -class CachePurgeTest(CacheTestBase): - - def testPurgeAll(self): - # Remove everything from the cache - - self.cache.fetch(self.TEST_URL) - self.failUnless(self.storage.keys(), - 'Have no data in the cache storage') - - self.cache.purge(None) - - self.failIf(self.storage.keys(), - 'Still have data in the cache storage') - return - - def testPurgeByAge(self): - # Remove old content from the cache - - self.cache.fetch(self.TEST_URL) - self.failUnless(self.storage.keys(), - 'have no data in the cache storage') - - time.sleep(1) - - remains = (time.time(), copy.deepcopy(self.storage[self.TEST_URL][1])) - self.storage['http://this.should.remain/'] = remains - - self.cache.purge(1) - - self.failUnlessEqual(self.storage.keys(), - ['http://this.should.remain/']) - return - - -if __name__ == '__main__': - unittest.main() diff --git a/lib/feedcache/test_cachestoragelock.py b/lib/feedcache/test_cachestoragelock.py deleted file mode 100644 index 741a39abe..000000000 --- a/lib/feedcache/test_cachestoragelock.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -"""Tests for shelflock. - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -import os -import shelve -import tempfile -import threading -import unittest - -# -# Import local modules -# -from cache import Cache -from cachestoragelock import CacheStorageLock -from test_server import HTTPTestBase - -# -# Module -# - -class CacheShelveTest(HTTPTestBase): - - def setUp(self): - HTTPTestBase.setUp(self) - handle, self.shelve_filename = tempfile.mkstemp('.shelve') - os.close(handle) # we just want the file name, so close the open handle - os.unlink(self.shelve_filename) # remove the empty file - return - - def tearDown(self): - try: - os.unlink(self.shelve_filename) - except AttributeError: - pass - HTTPTestBase.tearDown(self) - return - - def test(self): - storage = shelve.open(self.shelve_filename) - locking_storage = CacheStorageLock(storage) - try: - fc = Cache(locking_storage) - - # First fetch the data through the cache - parsed_data = fc.fetch(self.TEST_URL) - self.failUnlessEqual(parsed_data.feed.title, 'CacheTest test data') - - # Now retrieve the same data directly from the shelf - modified, shelved_data = storage[self.TEST_URL] - - # The data should be the same - self.failUnlessEqual(parsed_data, shelved_data) - finally: - storage.close() - return - - -if __name__ == '__main__': - unittest.main() diff --git a/lib/feedcache/test_server.py b/lib/feedcache/test_server.py deleted file mode 100644 index f48be105b..000000000 --- a/lib/feedcache/test_server.py +++ /dev/null @@ -1,241 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -"""Simple HTTP server for testing the feed cache. - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -import BaseHTTPServer -import logging -import md5 -import threading -import time -import unittest -import urllib - -# -# Import local modules -# - - -# -# Module -# -logger = logging.getLogger('feedcache.test_server') - - -def make_etag(data): - """Given a string containing data to be returned to the client, - compute an ETag value for the data. - """ - _md5 = md5.new() - _md5.update(data) - return _md5.hexdigest() - - -class TestHTTPHandler(BaseHTTPServer.BaseHTTPRequestHandler): - "HTTP request handler which serves the same feed data every time." - - FEED_DATA = """<?xml version="1.0" encoding="utf-8"?> - -<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us"> - <title>CacheTest test data</title> - <link href="http://localhost/feedcache/" rel="alternate"></link> - <link href="http://localhost/feedcache/atom/" rel="self"></link> - <id>http://localhost/feedcache/</id> - <updated>2006-10-14T11:00:36Z</updated> - <entry> - <title>single test entry</title> - <link href="http://www.example.com/" rel="alternate"></link> - <updated>2006-10-14T11:00:36Z</updated> - <author> - <name>author goes here</name> - <email>authoremail@example.com</email> - </author> - <id>http://www.example.com/</id> - <summary type="html">description goes here</summary> - <link length="100" href="http://www.example.com/enclosure" type="text/html" rel="enclosure"> - </link> - </entry> -</feed>""" - - # The data does not change, so save the ETag and modified times - # as class attributes. - ETAG = make_etag(FEED_DATA) - # Calculated using email.utils.formatdate(usegmt=True) - MODIFIED_TIME = 'Sun, 08 Apr 2012 20:16:48 GMT' - - def do_GET(self): - "Handle GET requests." - logger.debug('GET %s', self.path) - - if self.path == '/shutdown': - # Shortcut to handle stopping the server - logger.debug('Stopping server') - self.server.stop() - self.send_response(200) - - else: - # Record the request for tests that count them - self.server.requests.append(self.path) - # Process the request - logger.debug('pre-defined response code: %d', self.server.response) - handler_method_name = 'do_GET_%d' % self.server.response - handler_method = getattr(self, handler_method_name) - handler_method() - return - - def do_GET_3xx(self): - "Handle redirects" - if self.path.endswith('/redirected'): - logger.debug('already redirected') - # We have already redirected, so return the data. - return self.do_GET_200() - new_path = self.server.new_path - logger.debug('redirecting to %s', new_path) - self.send_response(self.server.response) - self.send_header('Location', new_path) - return - - do_GET_301 = do_GET_3xx - do_GET_302 = do_GET_3xx - do_GET_303 = do_GET_3xx - do_GET_307 = do_GET_3xx - - def do_GET_200(self): - logger.debug('Etag: %s' % self.ETAG) - logger.debug('Last-Modified: %s' % self.MODIFIED_TIME) - - incoming_etag = self.headers.get('If-None-Match', None) - logger.debug('Incoming ETag: "%s"' % incoming_etag) - - incoming_modified = self.headers.get('If-Modified-Since', None) - logger.debug('Incoming If-Modified-Since: %s' % incoming_modified) - - send_data = True - - # Does the client have the same version of the data we have? - if self.server.apply_modified_headers: - if incoming_etag == self.ETAG: - logger.debug('Response 304, etag') - self.send_response(304) - send_data = False - - elif incoming_modified == self.MODIFIED_TIME: - logger.debug('Response 304, modified time') - self.send_response(304) - send_data = False - - # Now optionally send the data, if the client needs it - if send_data: - logger.debug('Response 200') - self.send_response(200) - - self.send_header('Content-Type', 'application/atom+xml') - - logger.debug('Outgoing Etag: %s' % self.ETAG) - self.send_header('ETag', self.ETAG) - - logger.debug('Outgoing modified time: %s' % self.MODIFIED_TIME) - self.send_header('Last-Modified', self.MODIFIED_TIME) - - self.end_headers() - - logger.debug('Sending data') - self.wfile.write(self.FEED_DATA) - return - - -class TestHTTPServer(BaseHTTPServer.HTTPServer): - """HTTP Server which counts the number of requests made - and can stop based on client instructions. - """ - - def __init__(self, applyModifiedHeaders=True, handler=TestHTTPHandler): - self.apply_modified_headers = applyModifiedHeaders - self.keep_serving = True - self.requests = [] - self.setResponse(200) - BaseHTTPServer.HTTPServer.__init__(self, ('', 9999), handler) - return - - def setResponse(self, newResponse, newPath=None): - """Sets the response code to use for future requests, and a new - path to be used as a redirect target, if necessary. - """ - self.response = newResponse - self.new_path = newPath - return - - def getNumRequests(self): - "Return the number of requests which have been made on the server." - return len(self.requests) - - def stop(self): - "Stop serving requests, after the next request." - self.keep_serving = False - return - - def serve_forever(self): - "Main loop for server" - while self.keep_serving: - self.handle_request() - logger.debug('exiting') - return - - -class HTTPTestBase(unittest.TestCase): - "Base class for tests that use a TestHTTPServer" - - TEST_URL = 'http://localhost:9999/' - - CACHE_TTL = 0 - - def setUp(self): - self.server = self.getServer() - self.server_thread = threading.Thread(target=self.server.serve_forever) - # set daemon flag so the tests don't hang if cleanup fails - self.server_thread.setDaemon(True) - self.server_thread.start() - return - - def getServer(self): - "Return a web server for the test." - s = TestHTTPServer() - s.setResponse(200) - return s - - def tearDown(self): - # Stop the server thread - urllib.urlretrieve(self.TEST_URL + 'shutdown') - time.sleep(1) - self.server.server_close() - self.server_thread.join() - return diff --git a/lib/feedcache/test_shovefilesystem.py b/lib/feedcache/test_shovefilesystem.py deleted file mode 100644 index 1a48deada..000000000 --- a/lib/feedcache/test_shovefilesystem.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2007 Doug Hellmann. -# -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and -# its documentation for any purpose and without fee is hereby -# granted, provided that the above copyright notice appear in all -# copies and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of Doug -# Hellmann not be used in advertising or publicity pertaining to -# distribution of the software without specific, written prior -# permission. -# -# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN -# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -"""Tests with shove filesystem storage. - -""" - -__module_id__ = "$Id$" - -# -# Import system modules -# -import os -import shove -import tempfile -import threading -import unittest - -# -# Import local modules -# -from cache import Cache -from test_server import HTTPTestBase - -# -# Module -# - -class CacheShoveTest(HTTPTestBase): - - def setUp(self): - HTTPTestBase.setUp(self) - self.shove_dirname = tempfile.mkdtemp('shove') - return - - def tearDown(self): - try: - os.system('rm -rf %s' % self.storage_dirname) - except AttributeError: - pass - HTTPTestBase.tearDown(self) - return - - def test(self): - # First fetch the data through the cache - storage = shove.Shove('file://' + self.shove_dirname) - try: - fc = Cache(storage) - parsed_data = fc.fetch(self.TEST_URL) - self.failUnlessEqual(parsed_data.feed.title, 'CacheTest test data') - finally: - storage.close() - - # Now retrieve the same data directly from the shelf - storage = shove.Shove('file://' + self.shove_dirname) - try: - modified, shelved_data = storage[self.TEST_URL] - finally: - storage.close() - - # The data should be the same - self.failUnlessEqual(parsed_data, shelved_data) - return - - -if __name__ == '__main__': - unittest.main() diff --git a/lib/feedparser/__init__.py b/lib/feedparser/__init__.py index e69de29bb..a52b39a2b 100644 --- a/lib/feedparser/__init__.py +++ b/lib/feedparser/__init__.py @@ -0,0 +1,44 @@ +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is part of feedparser. +# +# 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.""" + +from __future__ import absolute_import, unicode_literals + +__author__ = 'Kurt McKee <contactme@kurtmckee.org>' +__license__ = 'BSD 2-clause' +__version__ = '5.2.1' + +# 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 = "feedparser/%s +https://github.com/kurtmckee/feedparser/" % __version__ + +from . import api +from .api import parse +from .datetimes import registerDateHandler +from .exceptions import * + +api.USER_AGENT = USER_AGENT diff --git a/lib/feedparser/api.py b/lib/feedparser/api.py new file mode 100644 index 000000000..812880c38 --- /dev/null +++ b/lib/feedparser/api.py @@ -0,0 +1,247 @@ +# The public API for feedparser +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +import xml.sax + +try: + from io import BytesIO as _StringIO +except ImportError: + try: + from cStringIO import StringIO as _StringIO + except ImportError: + from StringIO import StringIO as _StringIO + +try: + import urllib.parse +except ImportError: + from urlparse import urlparse + + class urllib(object): + class parse(object): + urlparse = staticmethod(urlparse) + +from .datetimes import registerDateHandler, _parse_date +from .encodings import convert_to_utf8 +from .exceptions import * +from .html import _BaseHTMLProcessor +from . import http +from . import mixin +from .mixin import _FeedParserMixin +from .parsers.loose import _LooseFeedParser +from .parsers.strict import _StrictFeedParser +from .sanitizer import replace_doctype +from .sgml import * +from .urls import _convert_to_idn, _makeSafeAbsoluteURI +from .util import FeedParserDict + +bytes_ = type(b'') +unicode_ = type('') +try: + unichr + basestring +except NameError: + unichr = chr + basestring = str + +# 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 + +_XML_AVAILABLE = True +mixin.RESOLVE_RELATIVE_URIS = RESOLVE_RELATIVE_URIS +mixin.SANITIZE_HTML = SANITIZE_HTML + +SUPPORTED_VERSIONS = { + '': 'unknown', + 'rss090': 'RSS 0.90', + 'rss091n': 'RSS 0.91 (Netscape)', + 'rss091u': 'RSS 0.91 (Userland)', + 'rss092': 'RSS 0.92', + 'rss093': 'RSS 0.93', + 'rss094': 'RSS 0.94', + 'rss20': 'RSS 2.0', + 'rss10': 'RSS 1.0', + 'rss': 'RSS (unknown version)', + 'atom01': 'Atom 0.1', + 'atom02': 'Atom 0.2', + 'atom03': 'Atom 0.3', + 'atom10': 'Atom 1.0', + 'atom': 'Atom (unknown version)', + 'cdf': 'CDF', +} + +def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers, result): + """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.read() + + if isinstance(url_file_stream_or_string, basestring) \ + and urllib.parse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp', 'file', 'feed'): + return http.get(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers, result) + + # try to open with native open function (if url_file_stream_or_string is a filename) + try: + with open(url_file_stream_or_string, 'rb') as f: + data = f.read() + 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 + else: + return data + + # treat url_file_stream_or_string as string + if not isinstance(url_file_stream_or_string, bytes_): + return url_file_stream_or_string.encode('utf-8') + return url_file_stream_or_string + +LooseFeedParser = type(str('LooseFeedParser'), ( + _LooseFeedParser, _FeedParserMixin, _BaseHTMLProcessor, object +), {}) +StrictFeedParser = type(str('StrictFeedParser'), ( + _StrictFeedParser, _FeedParserMixin, xml.sax.handler.ContentHandler, object +), {}) + +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 not agent: + agent = USER_AGENT + result = FeedParserDict( + bozo = False, + entries = [], + feed = FeedParserDict(), + headers = {}, + ) + + data = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers, result) + + if not data: + return result + + # overwrite existing headers using response_headers + result['headers'].update(response_headers or {}) + + data = convert_to_utf8(result['headers'], data, result) + use_strict_parser = result['encoding'] and True or False + + result['version'], data, entities = replace_doctype(data) + + # Ensure that baseuri is an absolute URI using an acceptable URI scheme. + contentloc = result['headers'].get('content-location', '') + href = result.get('href', '') + baseuri = _makeSafeAbsoluteURI(href, contentloc) or _makeSafeAbsoluteURI(contentloc) or href + + baselang = result['headers'].get('content-language', None) + if isinstance(baselang, bytes_) 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 as 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 diff --git a/lib/feedparser/datetimes/__init__.py b/lib/feedparser/datetimes/__init__.py new file mode 100644 index 000000000..96b45e9d8 --- /dev/null +++ b/lib/feedparser/datetimes/__init__.py @@ -0,0 +1,41 @@ +from __future__ import absolute_import + +from .asctime import _parse_date_asctime +from .greek import _parse_date_greek +from .hungarian import _parse_date_hungarian +from .iso8601 import _parse_date_iso8601 +from .korean import _parse_date_onblog, _parse_date_nate +from .perforce import _parse_date_perforce +from .rfc822 import _parse_date_rfc822 +from .w3dtf import _parse_date_w3dtf + +_date_handlers = [] +def registerDateHandler(func): + '''Register a date handler function (takes string, returns 9-tuple date in GMT)''' + _date_handlers.insert(0, func) + +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 + +registerDateHandler(_parse_date_onblog) +registerDateHandler(_parse_date_nate) +registerDateHandler(_parse_date_greek) +registerDateHandler(_parse_date_hungarian) +registerDateHandler(_parse_date_perforce) +registerDateHandler(_parse_date_asctime) +registerDateHandler(_parse_date_iso8601) +registerDateHandler(_parse_date_rfc822) +registerDateHandler(_parse_date_w3dtf) diff --git a/lib/feedparser/datetimes/asctime.py b/lib/feedparser/datetimes/asctime.py new file mode 100644 index 000000000..54fc8cbbf --- /dev/null +++ b/lib/feedparser/datetimes/asctime.py @@ -0,0 +1,32 @@ +from __future__ import absolute_import, unicode_literals + +from .rfc822 import _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], + ])) diff --git a/lib/feedparser/datetimes/greek.py b/lib/feedparser/datetimes/greek.py new file mode 100644 index 000000000..e47d92152 --- /dev/null +++ b/lib/feedparser/datetimes/greek.py @@ -0,0 +1,56 @@ +from __future__ import absolute_import, unicode_literals + +import re + +from .rfc822 import _parse_date_rfc822 + +# Unicode strings for Greek date strings +_greek_months = \ + { \ + '\u0399\u03b1\u03bd': 'Jan', # c9e1ed in iso-8859-7 + '\u03a6\u03b5\u03b2': 'Feb', # d6e5e2 in iso-8859-7 + '\u039c\u03ac\u03ce': 'Mar', # ccdcfe in iso-8859-7 + '\u039c\u03b1\u03ce': 'Mar', # cce1fe in iso-8859-7 + '\u0391\u03c0\u03c1': 'Apr', # c1f0f1 in iso-8859-7 + '\u039c\u03ac\u03b9': 'May', # ccdce9 in iso-8859-7 + '\u039c\u03b1\u03ca': 'May', # cce1fa in iso-8859-7 + '\u039c\u03b1\u03b9': 'May', # cce1e9 in iso-8859-7 + '\u0399\u03bf\u03cd\u03bd': 'Jun', # c9effded in iso-8859-7 + '\u0399\u03bf\u03bd': 'Jun', # c9efed in iso-8859-7 + '\u0399\u03bf\u03cd\u03bb': 'Jul', # c9effdeb in iso-8859-7 + '\u0399\u03bf\u03bb': 'Jul', # c9f9eb in iso-8859-7 + '\u0391\u03cd\u03b3': 'Aug', # c1fde3 in iso-8859-7 + '\u0391\u03c5\u03b3': 'Aug', # c1f5e3 in iso-8859-7 + '\u03a3\u03b5\u03c0': 'Sep', # d3e5f0 in iso-8859-7 + '\u039f\u03ba\u03c4': 'Oct', # cfeaf4 in iso-8859-7 + '\u039d\u03bf\u03ad': 'Nov', # cdefdd in iso-8859-7 + '\u039d\u03bf\u03b5': 'Nov', # cdefe5 in iso-8859-7 + '\u0394\u03b5\u03ba': 'Dec', # c4e5ea in iso-8859-7 + } + +_greek_wdays = \ + { \ + '\u039a\u03c5\u03c1': 'Sun', # caf5f1 in iso-8859-7 + '\u0394\u03b5\u03c5': 'Mon', # c4e5f5 in iso-8859-7 + '\u03a4\u03c1\u03b9': 'Tue', # d4f1e9 in iso-8859-7 + '\u03a4\u03b5\u03c4': 'Wed', # d4e5f4 in iso-8859-7 + '\u03a0\u03b5\u03bc': 'Thu', # d0e5ec in iso-8859-7 + '\u03a0\u03b1\u03c1': 'Fri', # d0e1f1 in iso-8859-7 + '\u03a3\u03b1\u03b2': 'Sat', # d3e1e2 in iso-8859-7 + } + +_greek_date_format_re = \ + re.compile('([^,]+),\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) diff --git a/lib/feedparser/datetimes/hungarian.py b/lib/feedparser/datetimes/hungarian.py new file mode 100644 index 000000000..11c56b451 --- /dev/null +++ b/lib/feedparser/datetimes/hungarian.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, unicode_literals + +import re + +from .w3dtf import _parse_date_w3dtf + +# Unicode strings for Hungarian date strings +_hungarian_months = \ + { \ + 'janu\u00e1r': '01', # e1 in iso-8859-2 + 'febru\u00e1ri': '02', # e1 in iso-8859-2 + 'm\u00e1rcius': '03', # e1 in iso-8859-2 + '\u00e1prilis': '04', # e1 in iso-8859-2 + 'm\u00e1ujus': '05', # e1 in iso-8859-2 + 'j\u00fanius': '06', # fa in iso-8859-2 + 'j\u00falius': '07', # fa in iso-8859-2 + 'augusztus': '08', + 'szeptember': '09', + 'okt\u00f3ber': '10', # f3 in iso-8859-2 + 'november': '11', + 'december': '12', + } + +_hungarian_date_format_re = \ + re.compile('(\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) diff --git a/lib/feedparser/datetimes/iso8601.py b/lib/feedparser/datetimes/iso8601.py new file mode 100644 index 000000000..eb36e2db9 --- /dev/null +++ b/lib/feedparser/datetimes/iso8601.py @@ -0,0 +1,120 @@ +from __future__ import absolute_import, unicode_literals + +import re +import time + +# 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))) diff --git a/lib/feedparser/datetimes/korean.py b/lib/feedparser/datetimes/korean.py new file mode 100644 index 000000000..7e6e0910e --- /dev/null +++ b/lib/feedparser/datetimes/korean.py @@ -0,0 +1,47 @@ +from __future__ import absolute_import, unicode_literals + +import re + +from .w3dtf import _parse_date_w3dtf + +# 8-bit date handling routines written by ytrewq1. +_korean_year = '\ub144' # b3e2 in euc-kr +_korean_month = '\uc6d4' # bff9 in euc-kr +_korean_day = '\uc77c' # c0cf in euc-kr +_korean_am = '\uc624\uc804' # bfc0 c0fc in euc-kr +_korean_pm = '\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('(\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) + +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) diff --git a/lib/feedparser/datetimes/perforce.py b/lib/feedparser/datetimes/perforce.py new file mode 100644 index 000000000..f5b7d8cc5 --- /dev/null +++ b/lib/feedparser/datetimes/perforce.py @@ -0,0 +1,25 @@ +from __future__ import absolute_import, unicode_literals + +try: + import rfc822 +except ImportError: + from email import _parseaddr as rfc822 + +import re +import time + +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)) diff --git a/lib/feedparser/datetimes/rfc822.py b/lib/feedparser/datetimes/rfc822.py new file mode 100644 index 000000000..0093bf654 --- /dev/null +++ b/lib/feedparser/datetimes/rfc822.py @@ -0,0 +1,109 @@ +from __future__ import absolute_import, unicode_literals + +import datetime + +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, + 'met': 1, 'mest': 2, +} + +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 diff --git a/lib/feedparser/datetimes/w3dtf.py b/lib/feedparser/datetimes/w3dtf.py new file mode 100644 index 000000000..02bc712e9 --- /dev/null +++ b/lib/feedparser/datetimes/w3dtf.py @@ -0,0 +1,88 @@ +from __future__ import absolute_import, unicode_literals + +import datetime + +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 diff --git a/lib/feedparser/encodings.py b/lib/feedparser/encodings.py new file mode 100644 index 000000000..c4874be68 --- /dev/null +++ b/lib/feedparser/encodings.py @@ -0,0 +1,279 @@ +# Character encoding routines +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +import cgi +import codecs +import collections +import re + +try: + import chardet +except ImportError: + chardet = None + lazy_chardet_encoding = None +else: + def lazy_chardet_encoding(): + chardet_encoding = chardet.detect(data)['encoding'] + if not chardet_encoding: + chardet_encoding = '' + if isinstance(chardet_encoding, bytes_): + chardet_encoding = chardet_encoding.encode('ascii', 'ignore') + return chardet_encoding + +from .exceptions import ( + CharacterEncodingOverride, CharacterEncodingUnknown, NonXMLContentType, +) + +bytes_ = type(b'') +unicode_ = type('') + +# Each marker represents some of the characters of the opening XML +# processing instruction ('<?xm') in the specified encoding. +EBCDIC_MARKER = b'\x4C\x6F\xA7\x94' +UTF16BE_MARKER = b'\x00\x3C\x00\x3F' +UTF16LE_MARKER = b'\x3C\x00\x3F\x00' +UTF32BE_MARKER = b'\x00\x00\x00\x3C' +UTF32LE_MARKER = b'\x3C\x00\x00\x00' + +ZERO_BYTES = '\x00\x00' + +# 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(b'^<\?.*encoding=[\'"](.*?)[\'"].*\?>') + +def convert_to_utf8(http_headers, data, result): + '''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 = '' + xml_encoding = '' + rfc3023_encoding = '' + + # 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 = 'utf-32be' + data = data[4:] + elif data[:4] == codecs.BOM_UTF32_LE: + bom_encoding = 'utf-32le' + data = data[4:] + elif data[:2] == codecs.BOM_UTF16_BE and data[2:4] != ZERO_BYTES: + bom_encoding = 'utf-16be' + data = data[2:] + elif data[:2] == codecs.BOM_UTF16_LE and data[2:4] != ZERO_BYTES: + bom_encoding = 'utf-16le' + data = data[2:] + elif data[:3] == codecs.BOM_UTF8: + bom_encoding = 'utf-8' + data = data[3:] + # Check for the characters '<?xm' in several encodings. + elif data[:4] == EBCDIC_MARKER: + bom_encoding = 'cp037' + elif data[:4] == UTF16BE_MARKER: + bom_encoding = 'utf-16be' + elif data[:4] == UTF16LE_MARKER: + bom_encoding = 'utf-16le' + elif data[:4] == UTF32BE_MARKER: + bom_encoding = 'utf-32be' + elif data[:4] == UTF32LE_MARKER: + bom_encoding = '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 ( + 'u16', 'utf-16', 'utf16', 'utf_16', + 'u32', 'utf-32', 'utf32', 'utf_32', + 'iso-10646-ucs-2', 'iso-10646-ucs-4', + 'csucs4', 'csunicode', 'ucs-2', '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 isinstance(http_encoding, bytes_): + http_encoding = http_encoding.decode('utf-8', 'ignore') + + acceptable_content_type = 0 + application_content_types = ('application/xml', 'application/xml-dtd', + 'application/xml-external-parsed-entity') + text_content_types = ('text/xml', 'text/xml-external-parsed-entity') + if (http_content_type in application_content_types) or \ + (http_content_type.startswith('application/') and + http_content_type.endswith('+xml')): + acceptable_content_type = 1 + rfc3023_encoding = http_encoding or xml_encoding or 'utf-8' + elif (http_content_type in text_content_types) or \ + (http_content_type.startswith('text/') and + http_content_type.endswith('+xml')): + acceptable_content_type = 1 + rfc3023_encoding = http_encoding or 'us-ascii' + elif http_content_type.startswith('text/'): + rfc3023_encoding = http_encoding or 'us-ascii' + elif http_headers and 'content-type' not in http_headers: + rfc3023_encoding = xml_encoding or 'iso-8859-1' + else: + rfc3023_encoding = xml_encoding or 'utf-8' + # gb18030 is a superset of gb2312, so always replace gb2312 + # with gb18030 for greater compatibility. + if rfc3023_encoding.lower() == 'gb2312': + rfc3023_encoding = 'gb18030' + if xml_encoding.lower() == 'gb2312': + xml_encoding = '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 + tried_encodings = [] + # try: HTTP encoding, declared XML encoding, encoding sniffed from BOM + for proposed_encoding in (rfc3023_encoding, xml_encoding, bom_encoding, + lazy_chardet_encoding, 'utf-8', 'windows-1252', 'iso-8859-2'): + if isinstance(proposed_encoding, collections.Callable): + 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 + '\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 = '' + elif proposed_encoding != rfc3023_encoding: + error = CharacterEncodingOverride( + 'document declared as %s, but parsed as %s' % + (rfc3023_encoding, proposed_encoding)) + rfc3023_encoding = proposed_encoding + + result['encoding'] = rfc3023_encoding + if error: + result['bozo'] = True + result['bozo_exception'] = error + return data diff --git a/lib/feedparser/exceptions.py b/lib/feedparser/exceptions.py new file mode 100644 index 000000000..9e57775de --- /dev/null +++ b/lib/feedparser/exceptions.py @@ -0,0 +1,52 @@ +# Exceptions used throughout feedparser +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +__all__ = [ + 'ThingsNobodyCaresAboutButMe', + 'CharacterEncodingOverride', + 'CharacterEncodingUnknown', + 'NonXMLContentType', + 'UndeclaredNamespace', +] + +class ThingsNobodyCaresAboutButMe(Exception): + pass + +class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): + pass + +class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): + pass + +class NonXMLContentType(ThingsNobodyCaresAboutButMe): + pass + +class UndeclaredNamespace(Exception): + pass diff --git a/lib/feedparser/feedparser.py b/lib/feedparser/feedparser.py deleted file mode 100644 index ef4377fe9..000000000 --- a/lib/feedparser/feedparser.py +++ /dev/null @@ -1,3820 +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.1.3" -__license__ = """ -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.""" -__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('&', '&') - data = data.replace('>', '>') - data = data.replace('<', '<') - 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): - 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): - 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('&', '&') - 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 as e: - # 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 ' ', 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 '©', 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],{'"':'"'})) 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 - if element == 'category': - 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 = 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('%s_detail' % key) - 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'<>', 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, FeedParserDict()) - if author: - context['%s_detail' % key]['name'] = author - if email: - context['%s_detail' % key]['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') or self._getAttribute(attrsD, 'id') - 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_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_category(self, attrsD): - context = self._getContext() - categories = context.setdefault('categories', []) - id = attrsD.get('id') - name = attrsD.get('name') - if id and name: - value = FeedParserDict({'id': id, 'name': name}) - if value not in categories: - categories.append(value) - - 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_subcat(self, attrsD): - context = self._getContext() - subcats = context['categories'][-1].setdefault('subcats', []) - id = attrsD.get('id') - name = attrsD.get('name') - if id and name: - value = FeedParserDict({'id': id, 'name': name}) - if value not in subcats: - subcats.append(value) - self.push('category', 1) - - 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 _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 - _end_subcat = _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_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'] = restriction - - 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'<!\1', data) - data = re.sub(r'<([^<>\s]+?)\s*/>', self._shorttag_replace, data) - data = data.replace(''', "'") - data = data.replace('"', '"') - 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('>','>').replace('<','<').replace('"','"') - value = self.bare_ampersand.sub("&", 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 ' ', 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 '©', 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('&%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('<') - 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('<', '<') - data = data.replace('<', '<') - data = data.replace('<', '<') - data = data.replace('>', '>') - data = data.replace('>', '>') - data = data.replace('>', '>') - data = data.replace('&', '&') - data = data.replace('&', '&') - data = data.replace('"', '"') - data = data.replace('"', '"') - data = data.replace(''', ''') - data = data.replace(''', ''') - if not self.contentparams.get('type', u'xml').endswith(u'xml'): - data = data.replace('<', '<') - data = data.replace('>', '>') - data = data.replace('&', '&') - data = data.replace('"', '"') - data = data.replace(''', "'") - return data - - def strattrs(self, attrs): - return ''.join([' %s="%s"' % (n,v.replace('"','"')) for n,v in attrs]) - -class _RelativeURIResolver(_BaseHTMLProcessor): - relative_uris = set([('a', 'href'), - ('applet', 'codebase'), - ('area', 'href'), - ('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'), - ('video', 'poster')]) - - 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', 'math', - 'merror', 'mfenced', 'mfrac', 'mi', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', - 'mphantom', 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', - 'msub', 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', - 'munderover', 'none', 'semantics']) - - mathml_attributes = set(['actiontype', 'align', 'columnalign', 'columnalign', - 'columnalign', 'close', 'columnlines', 'columnspacing', 'columnspan', 'depth', - 'display', 'displaystyle', 'encoding', 'equalcolumns', 'equalrows', - 'fence', 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', - 'lspace', 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', - 'maxsize', 'minsize', 'open', 'other', 'rowalign', 'rowalign', 'rowalign', - 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection', - 'separator', 'separators', 'stretchy', 'width', '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[', '<![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. - """ - - 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""" - dayname, month, day, remainder = dt.split(None, 3) - # Convert month and day into zero-padded integers - month = '%02i ' % (_months.index(month.lower()) + 1) - day = '%02i ' % (int(day),) - dt = month + day + remainder - return time.strptime(dt, '%m %d %H:%M:%S %Y')[:-1] + (0, ) -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 - chardet_encoding = None - tried_encodings = [] - if chardet: - 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') - # try: HTTP encoding, declared XML encoding, encoding sniffed from BOM - for proposed_encoding in (rfc3023_encoding, xml_encoding, bom_encoding, - chardet_encoding, u'utf-8', u'windows-1252', u'iso-8859-2'): - 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 "³" -# 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. - ''' - - 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: - attempts = 0 - while(len(data) > 1 and data[0] == '\x1f' and data[1] == '\x8b' and attempts < 3): - attempts += 1 - 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 ] diff --git a/lib/feedparser/feedparsertest.py b/lib/feedparser/feedparsertest.py deleted file mode 100644 index e1df914f8..000000000 --- a/lib/feedparser/feedparsertest.py +++ /dev/null @@ -1,871 +0,0 @@ -#!/usr/bin/env python - -__author__ = "Mark Pilgrim <http://diveintomark.org/>" -__license__ = """ -Copyright (c) 2010-2013 Kurt McKee <contactme@kurtmckee.org> -Copyright (c) 2004-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.""" - -import codecs -import datetime -import glob -import operator -import os -import posixpath -import pprint -import re -import struct -import sys -import threading -import time -import unittest -import urllib -import warnings -import zlib -import BaseHTTPServer -import SimpleHTTPServer - -import feedparser - -if not feedparser._XML_AVAILABLE: - sys.stderr.write('No XML parsers available, unit testing can not proceed\n') - sys.exit(1) - -try: - # the utf_32 codec was introduced in Python 2.6; it's necessary to - # check this as long as feedparser supports Python 2.4 and 2.5 - codecs.lookup('utf_32') -except LookupError: - _UTF32_AVAILABLE = False -else: - _UTF32_AVAILABLE = True - -_s2bytes = feedparser._s2bytes -_l2bytes = feedparser._l2bytes - -#---------- custom HTTP server (used to serve test feeds) ---------- - -_PORT = 8097 # not really configurable, must match hardcoded port in tests -_HOST = '127.0.0.1' # also not really configurable - -class FeedParserTestRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): - headers_re = re.compile(_s2bytes(r"^Header:\s+([^:]+):(.+)$"), re.MULTILINE) - - def send_head(self): - """Send custom headers defined in test case - - Example: - <!-- - Header: Content-type: application/atom+xml - Header: X-Foo: bar - --> - """ - # Short-circuit the HTTP status test `test_redirect_to_304()` - if self.path == '/-/return-304.xml': - self.send_response(304) - self.send_header('Content-type', 'text/xml') - self.end_headers() - return feedparser._StringIO(u''.encode('utf-8')) - path = self.translate_path(self.path) - # the compression tests' filenames determine the header sent - if self.path.startswith('/tests/compression'): - if self.path.endswith('gz'): - headers = {'Content-Encoding': 'gzip'} - else: - headers = {'Content-Encoding': 'deflate'} - headers['Content-type'] = 'application/xml' - else: - headers = dict([(k.decode('utf-8'), v.decode('utf-8').strip()) for k, v in self.headers_re.findall(open(path, 'rb').read())]) - f = open(path, 'rb') - if (self.headers.get('if-modified-since') == headers.get('Last-Modified', 'nom')) \ - or (self.headers.get('if-none-match') == headers.get('ETag', 'nomatch')): - status = 304 - else: - status = 200 - headers.setdefault('Status', status) - self.send_response(int(headers['Status'])) - headers.setdefault('Content-type', self.guess_type(path)) - self.send_header("Content-type", headers['Content-type']) - self.send_header("Content-Length", str(os.stat(f.name)[6])) - for k, v in headers.items(): - if k not in ('Status', 'Content-type'): - self.send_header(k, v) - self.end_headers() - return f - - def log_request(self, *args): - pass - -class FeedParserTestServer(threading.Thread): - """HTTP Server that runs in a thread and handles a predetermined number of requests""" - - def __init__(self, requests): - threading.Thread.__init__(self) - self.requests = requests - self.ready = threading.Event() - - def run(self): - self.httpd = BaseHTTPServer.HTTPServer((_HOST, _PORT), FeedParserTestRequestHandler) - self.ready.set() - while self.requests: - self.httpd.handle_request() - self.requests -= 1 - self.ready.clear() - -#---------- dummy test case class (test methods are added dynamically) ---------- -unicode1_re = re.compile(_s2bytes(" u'")) -unicode2_re = re.compile(_s2bytes(' u"')) - -# _bytes is only used in everythingIsUnicode(). -# In Python 2 it's str, and in Python 3 it's bytes. -_bytes = type(_s2bytes('')) - -def everythingIsUnicode(d): - """Takes a dictionary, recursively verifies that every value is unicode""" - for k, v in d.iteritems(): - if isinstance(v, dict) and k != 'headers': - if not everythingIsUnicode(v): - return False - elif isinstance(v, list): - for i in v: - if isinstance(i, dict) and not everythingIsUnicode(i): - return False - elif isinstance(i, _bytes): - return False - elif isinstance(v, _bytes): - return False - return True - -def failUnlessEval(self, xmlfile, evalString, msg=None): - """Fail unless eval(evalString, env)""" - env = feedparser.parse(xmlfile) - try: - if not eval(evalString, globals(), env): - failure=(msg or 'not eval(%s) \nWITH env(%s)' % (evalString, pprint.pformat(env))) - raise self.failureException, failure - if not everythingIsUnicode(env): - raise self.failureException, "not everything is unicode \nWITH env(%s)" % (pprint.pformat(env), ) - except SyntaxError: - # Python 3 doesn't have the `u""` syntax, so evalString needs to be modified, - # which will require the failure message to be updated - evalString = re.sub(unicode1_re, _s2bytes(" '"), evalString) - evalString = re.sub(unicode2_re, _s2bytes(' "'), evalString) - if not eval(evalString, globals(), env): - failure=(msg or 'not eval(%s) \nWITH env(%s)' % (evalString, pprint.pformat(env))) - raise self.failureException, failure - -class BaseTestCase(unittest.TestCase): - failUnlessEval = failUnlessEval - -class TestCase(BaseTestCase): - pass - -class TestTemporaryFallbackBehavior(unittest.TestCase): - "These tests are temporarily here because of issues 310 and 328" - def test_issue_328_fallback_behavior(self): - warnings.filterwarnings('error') - - d = feedparser.FeedParserDict() - d['published'] = u'pub string' - d['published_parsed'] = u'pub tuple' - d['updated'] = u'upd string' - d['updated_parsed'] = u'upd tuple' - # Ensure that `updated` doesn't map to `published` when it exists - self.assertTrue('published' in d) - self.assertTrue('published_parsed' in d) - self.assertTrue('updated' in d) - self.assertTrue('updated_parsed' in d) - self.assertEqual(d['published'], 'pub string') - self.assertEqual(d['published_parsed'], 'pub tuple') - self.assertEqual(d['updated'], 'upd string') - self.assertEqual(d['updated_parsed'], 'upd tuple') - - d = feedparser.FeedParserDict() - d['published'] = u'pub string' - d['published_parsed'] = u'pub tuple' - # Ensure that `updated` doesn't actually exist - self.assertTrue('updated' not in d) - self.assertTrue('updated_parsed' not in d) - # Ensure that accessing `updated` throws a DeprecationWarning - try: - d['updated'] - except DeprecationWarning: - # Expected behavior - pass - else: - # Wrong behavior - self.assertEqual(True, False) - try: - d['updated_parsed'] - except DeprecationWarning: - # Expected behavior - pass - else: - # Wrong behavior - self.assertEqual(True, False) - # Ensure that `updated` maps to `published` - warnings.filterwarnings('ignore') - self.assertEqual(d['updated'], u'pub string') - self.assertEqual(d['updated_parsed'], u'pub tuple') - warnings.resetwarnings() - - -class TestEverythingIsUnicode(unittest.TestCase): - "Ensure that `everythingIsUnicode()` is working appropriately" - def test_everything_is_unicode(self): - self.assertTrue(everythingIsUnicode( - {'a': u'a', 'b': [u'b', {'c': u'c'}], 'd': {'e': u'e'}} - )) - def test_not_everything_is_unicode(self): - self.assertFalse(everythingIsUnicode({'a': _s2bytes('a')})) - self.assertFalse(everythingIsUnicode({'a': [_s2bytes('a')]})) - self.assertFalse(everythingIsUnicode({'a': {'b': _s2bytes('b')}})) - self.assertFalse(everythingIsUnicode({'a': [{'b': _s2bytes('b')}]})) - -class TestLooseParser(BaseTestCase): - "Test the sgmllib-based parser by manipulating feedparser " \ - "into believing no XML parsers are installed" - def __init__(self, arg): - unittest.TestCase.__init__(self, arg) - self._xml_available = feedparser._XML_AVAILABLE - def setUp(self): - feedparser._XML_AVAILABLE = 0 - def tearDown(self): - feedparser._XML_AVAILABLE = self._xml_available - -class TestStrictParser(BaseTestCase): - pass - -class TestMicroformats(BaseTestCase): - pass - -class TestEncodings(BaseTestCase): - def test_doctype_replacement(self): - "Ensure that non-ASCII-compatible encodings don't hide " \ - "disallowed ENTITY declarations" - doc = """<?xml version="1.0" encoding="utf-16be"?> - <!DOCTYPE feed [ - <!ENTITY exponential1 "bogus "> - <!ENTITY exponential2 "&exponential1;&exponential1;"> - <!ENTITY exponential3 "&exponential2;&exponential2;"> - ]> - <feed><title type="html">&exponential3;</title></feed>""" - doc = codecs.BOM_UTF16_BE + doc.encode('utf-16be') - result = feedparser.parse(doc) - self.assertEqual(result['feed']['title'], u'&exponential3') - def test_gb2312_converted_to_gb18030_in_xml_encoding(self): - # \u55de was chosen because it exists in gb18030 but not gb2312 - feed = u'''<?xml version="1.0" encoding="gb2312"?> - <feed><title>\u55de</title></feed>''' - result = feedparser.parse(feed.encode('gb18030'), response_headers={ - 'Content-Type': 'text/xml' - }) - self.assertEqual(result.encoding, 'gb18030') - -class TestFeedParserDict(unittest.TestCase): - "Ensure that FeedParserDict returns values as expected and won't crash" - def setUp(self): - self.d = feedparser.FeedParserDict() - def _check_key(self, k): - self.assertTrue(k in self.d) - self.assertTrue(hasattr(self.d, k)) - self.assertEqual(self.d[k], 1) - self.assertEqual(getattr(self.d, k), 1) - def _check_no_key(self, k): - self.assertTrue(k not in self.d) - self.assertTrue(not hasattr(self.d, k)) - def test_empty(self): - keys = ( - 'a','entries', 'id', 'guid', 'summary', 'subtitle', 'description', - 'category', 'enclosures', 'license', 'categories', - ) - for k in keys: - self._check_no_key(k) - self.assertTrue('items' not in self.d) - self.assertTrue(hasattr(self.d, 'items')) # dict.items() exists - def test_neutral(self): - self.d['a'] = 1 - self._check_key('a') - def test_single_mapping_target_1(self): - self.d['id'] = 1 - self._check_key('id') - self._check_key('guid') - def test_single_mapping_target_2(self): - self.d['guid'] = 1 - self._check_key('id') - self._check_key('guid') - def test_multiple_mapping_target_1(self): - self.d['summary'] = 1 - self._check_key('summary') - self._check_key('description') - def test_multiple_mapping_target_2(self): - self.d['subtitle'] = 1 - self._check_key('subtitle') - self._check_key('description') - def test_multiple_mapping_mapped_key(self): - self.d['description'] = 1 - self._check_key('summary') - self._check_key('description') - def test_license(self): - self.d['links'] = [] - try: - self.d['license'] - self.assertTrue(False) - except KeyError: - pass - self.d['links'].append({'rel': 'license'}) - try: - self.d['license'] - self.assertTrue(False) - except KeyError: - pass - self.d['links'].append({'rel': 'license', 'href': 'http://dom.test/'}) - self.assertEqual(self.d['license'], 'http://dom.test/') - def test_category(self): - self.d['tags'] = [] - try: - self.d['category'] - self.assertTrue(False) - except KeyError: - pass - self.d['tags'] = [{}] - try: - self.d['category'] - self.assertTrue(False) - except KeyError: - pass - self.d['tags'] = [{'term': 'cat'}] - self.assertEqual(self.d['category'], 'cat') - self.d['tags'].append({'term': 'dog'}) - self.assertEqual(self.d['category'], 'cat') - -class TestOpenResource(unittest.TestCase): - "Ensure that `_open_resource()` interprets its arguments as URIs, " \ - "file-like objects, or in-memory feeds as expected" - def test_fileobj(self): - r = feedparser._open_resource(sys.stdin, '', '', '', '', [], {}) - self.assertTrue(r is sys.stdin) - def test_feed(self): - f = feedparser.parse(u'feed://localhost:8097/tests/http/target.xml') - self.assertEqual(f.href, u'http://localhost:8097/tests/http/target.xml') - def test_feed_http(self): - f = feedparser.parse(u'feed:http://localhost:8097/tests/http/target.xml') - self.assertEqual(f.href, u'http://localhost:8097/tests/http/target.xml') - def test_bytes(self): - s = '<feed><item><title>text</title></item></feed>'.encode('utf-8') - r = feedparser._open_resource(s, '', '', '', '', [], {}) - self.assertEqual(s, r.read()) - def test_string(self): - s = '<feed><item><title>text</title></item></feed>' - r = feedparser._open_resource(s, '', '', '', '', [], {}) - self.assertEqual(s.encode('utf-8'), r.read()) - def test_unicode_1(self): - s = u'<feed><item><title>text</title></item></feed>' - r = feedparser._open_resource(s, '', '', '', '', [], {}) - self.assertEqual(s.encode('utf-8'), r.read()) - def test_unicode_2(self): - s = u'<feed><item><title>t\u00e9xt</title></item></feed>' - r = feedparser._open_resource(s, '', '', '', '', [], {}) - self.assertEqual(s.encode('utf-8'), r.read()) - -class TestMakeSafeAbsoluteURI(unittest.TestCase): - "Exercise the URI joining and sanitization code" - base = u'http://d.test/d/f.ext' - def _mktest(rel, expect, doc): - def fn(self): - value = feedparser._makeSafeAbsoluteURI(self.base, rel) - self.assertEqual(value, expect) - fn.__doc__ = doc - return fn - - # make the test cases; the call signature is: - # (relative_url, expected_return_value, test_doc_string) - test_abs = _mktest(u'https://s.test/', u'https://s.test/', 'absolute uri') - test_rel = _mktest(u'/new', u'http://d.test/new', 'relative uri') - test_bad = _mktest(u'x://bad.test/', u'', 'unacceptable uri protocol') - test_mag = _mktest(u'magnet:?xt=a', u'magnet:?xt=a', 'magnet uri') - - def test_catch_ValueError(self): - 'catch ValueError in Python 2.7 and up' - uri = u'http://bad]test/' - value1 = feedparser._makeSafeAbsoluteURI(uri) - value2 = feedparser._makeSafeAbsoluteURI(self.base, uri) - swap = feedparser.ACCEPTABLE_URI_SCHEMES - feedparser.ACCEPTABLE_URI_SCHEMES = () - value3 = feedparser._makeSafeAbsoluteURI(self.base, uri) - feedparser.ACCEPTABLE_URI_SCHEMES = swap - # Only Python 2.7 and up throw a ValueError, otherwise uri is returned - self.assertTrue(value1 in (uri, u'')) - self.assertTrue(value2 in (uri, u'')) - self.assertTrue(value3 in (uri, u'')) - -class TestConvertToIdn(unittest.TestCase): - "Test IDN support (unavailable in Jython as of Jython 2.5.2)" - # this is the greek test domain - hostname = u'\u03c0\u03b1\u03c1\u03ac\u03b4\u03b5\u03b9\u03b3\u03bc\u03b1' - hostname += u'.\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae' - def test_control(self): - r = feedparser._convert_to_idn(u'http://example.test/') - self.assertEqual(r, u'http://example.test/') - def test_idn(self): - r = feedparser._convert_to_idn(u'http://%s/' % (self.hostname,)) - self.assertEqual(r, u'http://xn--hxajbheg2az3al.xn--jxalpdlp/') - def test_port(self): - r = feedparser._convert_to_idn(u'http://%s:8080/' % (self.hostname,)) - self.assertEqual(r, u'http://xn--hxajbheg2az3al.xn--jxalpdlp:8080/') - -class TestCompression(unittest.TestCase): - "Test the gzip and deflate support in the HTTP code" - def test_gzip_good(self): - f = feedparser.parse('http://localhost:8097/tests/compression/gzip.gz') - self.assertEqual(f.version, 'atom10') - def test_gzip_not_compressed(self): - f = feedparser.parse('http://localhost:8097/tests/compression/gzip-not-compressed.gz') - self.assertEqual(f.bozo, 1) - self.assertTrue(isinstance(f.bozo_exception, IOError)) - self.assertEqual(f['feed']['title'], 'gzip') - def test_gzip_struct_error(self): - f = feedparser.parse('http://localhost:8097/tests/compression/gzip-struct-error.gz') - self.assertEqual(f.bozo, 1) - self.assertTrue(isinstance(f.bozo_exception, struct.error)) - def test_zlib_good(self): - f = feedparser.parse('http://localhost:8097/tests/compression/deflate.z') - self.assertEqual(f.version, 'atom10') - def test_zlib_no_headers(self): - f = feedparser.parse('http://localhost:8097/tests/compression/deflate-no-headers.z') - self.assertEqual(f.version, 'atom10') - def test_zlib_not_compressed(self): - f = feedparser.parse('http://localhost:8097/tests/compression/deflate-not-compressed.z') - self.assertEqual(f.bozo, 1) - self.assertTrue(isinstance(f.bozo_exception, zlib.error)) - self.assertEqual(f['feed']['title'], 'deflate') - -class TestHTTPStatus(unittest.TestCase): - "Test HTTP redirection and other status codes" - def test_301(self): - f = feedparser.parse('http://localhost:8097/tests/http/http_status_301.xml') - self.assertEqual(f.status, 301) - self.assertEqual(f.href, 'http://localhost:8097/tests/http/target.xml') - self.assertEqual(f.entries[0].title, 'target') - def test_302(self): - f = feedparser.parse('http://localhost:8097/tests/http/http_status_302.xml') - self.assertEqual(f.status, 302) - self.assertEqual(f.href, 'http://localhost:8097/tests/http/target.xml') - self.assertEqual(f.entries[0].title, 'target') - def test_303(self): - f = feedparser.parse('http://localhost:8097/tests/http/http_status_303.xml') - self.assertEqual(f.status, 303) - self.assertEqual(f.href, 'http://localhost:8097/tests/http/target.xml') - self.assertEqual(f.entries[0].title, 'target') - def test_307(self): - f = feedparser.parse('http://localhost:8097/tests/http/http_status_307.xml') - self.assertEqual(f.status, 307) - self.assertEqual(f.href, 'http://localhost:8097/tests/http/target.xml') - self.assertEqual(f.entries[0].title, 'target') - def test_304(self): - # first retrieve the url - u = 'http://localhost:8097/tests/http/http_status_304.xml' - f = feedparser.parse(u) - self.assertEqual(f.status, 200) - self.assertEqual(f.entries[0].title, 'title 304') - # extract the etag and last-modified headers - e = [v for k, v in f.headers.items() if k.lower() == 'etag'][0] - mh = [v for k, v in f.headers.items() if k.lower() == 'last-modified'][0] - ms = f.updated - mt = f.updated_parsed - md = datetime.datetime(*mt[0:7]) - self.assertTrue(isinstance(mh, basestring)) - self.assertTrue(isinstance(ms, basestring)) - self.assertTrue(isinstance(mt, time.struct_time)) - self.assertTrue(isinstance(md, datetime.datetime)) - # test that sending back the etag results in a 304 - f = feedparser.parse(u, etag=e) - self.assertEqual(f.status, 304) - # test that sending back last-modified (string) results in a 304 - f = feedparser.parse(u, modified=ms) - self.assertEqual(f.status, 304) - # test that sending back last-modified (9-tuple) results in a 304 - f = feedparser.parse(u, modified=mt) - self.assertEqual(f.status, 304) - # test that sending back last-modified (datetime) results in a 304 - f = feedparser.parse(u, modified=md) - self.assertEqual(f.status, 304) - def test_404(self): - f = feedparser.parse('http://localhost:8097/tests/http/http_status_404.xml') - self.assertEqual(f.status, 404) - def test_redirect_to_304(self): - # ensure that an http redirect to an http 304 doesn't - # trigger a bozo_exception - u = 'http://localhost:8097/tests/http/http_redirect_to_304.xml' - f = feedparser.parse(u) - self.assertTrue(f.bozo == 0) - self.assertTrue(f.status == 302) - -class TestDateParsers(unittest.TestCase): - "Test the various date parsers; most of the test cases are constructed " \ - "dynamically based on the contents of the `date_tests` dict, below" - def test_None(self): - self.assertTrue(feedparser._parse_date(None) is None) - def _check_date(self, func, dtstring, expected_value): - try: - parsed_value = func(dtstring) - except (OverflowError, ValueError): - parsed_value = None - self.assertEqual(parsed_value, expected_value) - # self.assertEqual(parsed_value, feedparser._parse_date(dtstring)) - def test_year_10000_date(self): - # On some systems this date string will trigger an OverflowError. - # On Jython and x64 systems, however, it's interpreted just fine. - try: - date = feedparser._parse_date_rfc822(u'Sun, 31 Dec 9999 23:59:59 -9999') - except OverflowError: - date = None - self.assertTrue(date in (None, (10000, 1, 5, 4, 38, 59, 2, 5, 0))) - -date_tests = { - feedparser._parse_date_greek: ( - (u'', None), # empty string - (u'\u039a\u03c5\u03c1, 11 \u0399\u03bf\u03cd\u03bb 2004 12:00:00 EST', (2004, 7, 11, 17, 0, 0, 6, 193, 0)), - ), - feedparser._parse_date_hungarian: ( - (u'', None), # empty string - (u'2004-j\u00falius-13T9:15-05:00', (2004, 7, 13, 14, 15, 0, 1, 195, 0)), - ), - feedparser._parse_date_iso8601: ( - (u'', None), # empty string - (u'-0312', (2003, 12, 1, 0, 0, 0, 0, 335, 0)), # 2-digit year/month only variant - (u'031231', (2003, 12, 31, 0, 0, 0, 2, 365, 0)), # 2-digit year/month/day only, no hyphens - (u'03-12-31', (2003, 12, 31, 0, 0, 0, 2, 365, 0)), # 2-digit year/month/day only - (u'-03-12', (2003, 12, 1, 0, 0, 0, 0, 335, 0)), # 2-digit year/month only - (u'03335', (2003, 12, 1, 0, 0, 0, 0, 335, 0)), # 2-digit year/ordinal, no hyphens - (u'2003-12-31T10:14:55.1234Z', (2003, 12, 31, 10, 14, 55, 2, 365, 0)), # fractional seconds - # Special case for Google's extra zero in the month - (u'2003-012-31T10:14:55+00:00', (2003, 12, 31, 10, 14, 55, 2, 365, 0)), - ), - feedparser._parse_date_nate: ( - (u'', None), # empty string - (u'2004-05-25 \uc624\ud6c4 11:23:17', (2004, 5, 25, 14, 23, 17, 1, 146, 0)), - ), - feedparser._parse_date_onblog: ( - (u'', None), # empty string - (u'2004\ub144 05\uc6d4 28\uc77c 01:31:15', (2004, 5, 27, 16, 31, 15, 3, 148, 0)), - ), - feedparser._parse_date_perforce: ( - (u'', None), # empty string - (u'Fri, 2006/09/15 08:19:53 EDT', (2006, 9, 15, 12, 19, 53, 4, 258, 0)), - ), - feedparser._parse_date_rfc822: ( - (u'', None), # empty string - (u'Thu, 01 Jan 0100 00:00:01 +0100', (99, 12, 31, 23, 0, 1, 3, 365, 0)), # ancient date - (u'Thu, 01 Jan 04 19:48:21 GMT', (2004, 1, 1, 19, 48, 21, 3, 1, 0)), # 2-digit year - (u'Thu, 01 Jan 2004 19:48:21 GMT', (2004, 1, 1, 19, 48, 21, 3, 1, 0)), # 4-digit year - (u'Thu, 5 Apr 2012 10:00:00 GMT', (2012, 4, 5, 10, 0, 0, 3, 96, 0)), # 1-digit day - (u'Wed, 19 Aug 2009 18:28:00 Etc/GMT', (2009, 8, 19, 18, 28, 0, 2, 231, 0)), # etc/gmt timezone - (u'Wed, 19 Feb 2012 22:40:00 GMT-01:01', (2012, 2, 19, 23, 41, 0, 6, 50, 0)), # gmt+hh:mm timezone - (u'Mon, 13 Feb, 2012 06:28:00 UTC', (2012, 2, 13, 6, 28, 0, 0, 44, 0)), # extraneous comma - (u'Thu, 01 Jan 2004 00:00 GMT', (2004, 1, 1, 0, 0, 0, 3, 1, 0)), # no seconds - (u'Thu, 01 Jan 2004', (2004, 1, 1, 0, 0, 0, 3, 1, 0)), # no time - # Additional tests to handle Disney's long month names and invalid timezones - (u'Mon, 26 January 2004 16:31:00 AT', (2004, 1, 26, 20, 31, 0, 0, 26, 0)), - (u'Mon, 26 January 2004 16:31:00 ET', (2004, 1, 26, 21, 31, 0, 0, 26, 0)), - (u'Mon, 26 January 2004 16:31:00 CT', (2004, 1, 26, 22, 31, 0, 0, 26, 0)), - (u'Mon, 26 January 2004 16:31:00 MT', (2004, 1, 26, 23, 31, 0, 0, 26, 0)), - (u'Mon, 26 January 2004 16:31:00 PT', (2004, 1, 27, 0, 31, 0, 1, 27, 0)), - # Swapped month and day - (u'Thu Aug 30 2012 17:26:16 +0200', (2012, 8, 30, 15, 26, 16, 3, 243, 0)), - (u'Sun, 16 Dec 2012 1:2:3:4 GMT', None), # invalid time - (u'Sun, 16 zzz 2012 11:47:32 GMT', None), # invalid month - (u'Sun, Dec x 2012 11:47:32 GMT', None), # invalid day (swapped day/month) - ('Sun, 16 Dec zz 11:47:32 GMT', None), # invalid year - ('Sun, 16 Dec 2012 11:47:32 +zz:00', None), # invalid timezone hour - ('Sun, 16 Dec 2012 11:47:32 +00:zz', None), # invalid timezone minute - ('Sun, 99 Jun 2009 12:00:00 GMT', None), # out-of-range day - ), - feedparser._parse_date_asctime: ( - (u'Sun Jan 4 16:29:06 2004', (2004, 1, 4, 16, 29, 6, 6, 4, 0)), - ), - feedparser._parse_date_w3dtf: ( - (u'', None), # empty string - (u'2003-12-31T10:14:55Z', (2003, 12, 31, 10, 14, 55, 2, 365, 0)), # UTC - (u'2003-12-31T10:14:55-08:00', (2003, 12, 31, 18, 14, 55, 2, 365, 0)), # San Francisco timezone - (u'2003-12-31T18:14:55+08:00', (2003, 12, 31, 10, 14, 55, 2, 365, 0)), # Tokyo timezone - (u'2007-04-23T23:25:47.538+10:00', (2007, 4, 23, 13, 25, 47, 0, 113, 0)), # fractional seconds - (u'2003-12-31', (2003, 12, 31, 0, 0, 0, 2, 365, 0)), # year/month/day only - (u'2003-12', (2003, 12, 1, 0, 0, 0, 0, 335, 0)), # year/month only - (u'2003', (2003, 1, 1, 0, 0, 0, 2, 1, 0)), # year only - # Special cases for rollovers in leap years - (u'2004-02-28T18:14:55-08:00', (2004, 2, 29, 2, 14, 55, 6, 60, 0)), # feb 28 in leap year - (u'2003-02-28T18:14:55-08:00', (2003, 3, 1, 2, 14, 55, 5, 60, 0)), # feb 28 in non-leap year - (u'2000-02-28T18:14:55-08:00', (2000, 2, 29, 2, 14, 55, 1, 60, 0)), # feb 28 in leap year on century divisible by 400 - # Out-of-range times - (u'9999-12-31T23:59:59-99:99', None), # Date is out-of-range - (u'2003-12-31T25:14:55Z', None), # invalid (25 hours) - (u'2003-12-31T10:61:55Z', None), # invalid (61 minutes) - (u'2003-12-31T10:14:61Z', None), # invalid (61 seconds) - # Invalid formats - (u'22013', None), # Year is too long - (u'013', None), # Year is too short - (u'2013-01-27-01', None), # Date has to many parts - (u'2013-01-28T11:30:00-06:00Textra', None), # Too many 't's - # Non-integer values - (u'2013-xx-27', None), # Date - (u'2013-01-28T09:xx:00Z', None), # Time - (u'2013-01-28T09:00:00+00:xx', None), # Timezone - # MSSQL-style dates - (u'2004-07-08 23:56:58 -00:20', (2004, 7, 9, 0, 16, 58, 4, 191, 0)), # with timezone - (u'2004-07-08 23:56:58', (2004, 7, 8, 23, 56, 58, 3, 190, 0)), # without timezone - (u'2004-07-08 23:56:58.0', (2004, 7, 8, 23, 56, 58, 3, 190, 0)), # with fractional second - ) -} - -def make_date_test(f, s, t): - return lambda self: self._check_date(f, s, t) - -for func, items in date_tests.iteritems(): - for i, (dtstring, dttuple) in enumerate(items): - uniqfunc = make_date_test(func, dtstring, dttuple) - setattr(TestDateParsers, 'test_%s_%02i' % (func.__name__, i), uniqfunc) - - -class TestHTMLGuessing(unittest.TestCase): - "Exercise the HTML sniffing code" - def _mktest(text, expect, doc): - def fn(self): - value = bool(feedparser._FeedParserMixin.lookslikehtml(text)) - self.assertEqual(value, expect) - fn.__doc__ = doc - return fn - - test_text_1 = _mktest(u'plain text', False, u'plain text') - test_text_2 = _mktest(u'2 < 3', False, u'plain text with angle bracket') - test_html_1 = _mktest(u'<a href="">a</a>', True, u'anchor tag') - test_html_2 = _mktest(u'<i>i</i>', True, u'italics tag') - test_html_3 = _mktest(u'<b>b</b>', True, u'bold tag') - test_html_4 = _mktest(u'<code>', False, u'allowed tag, no end tag') - test_html_5 = _mktest(u'<rss> .. </rss>', False, u'disallowed tag') - test_entity_1 = _mktest(u'AT&T', False, u'corporation name') - test_entity_2 = _mktest(u'©', True, u'named entity reference') - test_entity_3 = _mktest(u'©', True, u'numeric entity reference') - test_entity_4 = _mktest(u'©', True, u'hex numeric entity reference') - -#---------- additional api unit tests, not backed by files - -class TestBuildRequest(unittest.TestCase): - "Test that HTTP request objects are created as expected" - def test_extra_headers(self): - """You can pass in extra headers and they go into the request object.""" - - request = feedparser._build_urllib2_request( - 'http://example.com/feed', - 'agent-name', - None, None, None, None, - {'Cache-Control': 'max-age=0'}) - # nb, urllib2 folds the case of the headers - self.assertEqual( - request.get_header('Cache-control'), 'max-age=0') - - -class TestLxmlBug(unittest.TestCase): - def test_lxml_etree_bug(self): - try: - import lxml.etree - except ImportError: - pass - else: - doc = u"<feed>&illformed_charref</feed>".encode('utf8') - # Importing lxml.etree currently causes libxml2 to - # throw SAXException instead of SAXParseException. - feedparser.parse(feedparser._StringIO(doc)) - self.assertTrue(True) - -#---------- parse test files and create test methods ---------- -def convert_to_utf8(data): - "Identify data's encoding using its byte order mark" \ - "and convert it to its utf-8 equivalent" - if data[:4] == _l2bytes([0x4c, 0x6f, 0xa7, 0x94]): - return data.decode('cp037').encode('utf-8') - elif data[:4] == _l2bytes([0x00, 0x00, 0xfe, 0xff]): - if not _UTF32_AVAILABLE: - return None - return data.decode('utf-32be').encode('utf-8') - elif data[:4] == _l2bytes([0xff, 0xfe, 0x00, 0x00]): - if not _UTF32_AVAILABLE: - return None - return data.decode('utf-32le').encode('utf-8') - elif data[:4] == _l2bytes([0x00, 0x00, 0x00, 0x3c]): - if not _UTF32_AVAILABLE: - return None - return data.decode('utf-32be').encode('utf-8') - elif data[:4] == _l2bytes([0x3c, 0x00, 0x00, 0x00]): - if not _UTF32_AVAILABLE: - return None - return data.decode('utf-32le').encode('utf-8') - elif data[:4] == _l2bytes([0x00, 0x3c, 0x00, 0x3f]): - return data.decode('utf-16be').encode('utf-8') - elif data[:4] == _l2bytes([0x3c, 0x00, 0x3f, 0x00]): - return data.decode('utf-16le').encode('utf-8') - elif (data[:2] == _l2bytes([0xfe, 0xff])) and (data[2:4] != _l2bytes([0x00, 0x00])): - return data[2:].decode('utf-16be').encode('utf-8') - elif (data[:2] == _l2bytes([0xff, 0xfe])) and (data[2:4] != _l2bytes([0x00, 0x00])): - return data[2:].decode('utf-16le').encode('utf-8') - elif data[:3] == _l2bytes([0xef, 0xbb, 0xbf]): - return data[3:] - # no byte order mark was found - return data - -skip_re = re.compile(_s2bytes("SkipUnless:\s*(.*?)\n")) -desc_re = re.compile(_s2bytes("Description:\s*(.*?)\s*Expect:\s*(.*)\s*-->")) -def getDescription(xmlfile, data): - """Extract test data - - Each test case is an XML file which contains not only a test feed - but also the description of the test and the condition that we - would expect the parser to create when it parses the feed. Example: - <!-- - Description: feed title - Expect: feed['title'] == u'Example feed' - --> - """ - skip_results = skip_re.search(data) - if skip_results: - skipUnless = skip_results.group(1).strip() - else: - skipUnless = '1' - search_results = desc_re.search(data) - if not search_results: - raise RuntimeError, "can't parse %s" % xmlfile - description, evalString = map(lambda s: s.strip(), list(search_results.groups())) - description = xmlfile + ": " + unicode(description, 'utf8') - return description, evalString, skipUnless - -def buildTestCase(xmlfile, description, evalString): - func = lambda self, xmlfile=xmlfile, evalString=evalString: \ - self.failUnlessEval(xmlfile, evalString) - func.__doc__ = description - return func - -def runtests(): - "Read the files in the tests/ directory, dynamically add tests to the " \ - "TestCases above, spawn the HTTP server, and run the test suite" - if sys.argv[1:]: - allfiles = filter(lambda s: s.endswith('.xml'), reduce(operator.add, map(glob.glob, sys.argv[1:]), [])) - wellformedfiles = illformedfiles = encodingfiles = entitiesfiles = microformatfiles = [] - sys.argv = [sys.argv[0]] #+ sys.argv[2:] - else: - allfiles = glob.glob(os.path.join('.', 'tests', '**', '**', '*.xml')) - wellformedfiles = glob.glob(os.path.join('.', 'tests', 'wellformed', '**', '*.xml')) - illformedfiles = glob.glob(os.path.join('.', 'tests', 'illformed', '*.xml')) - encodingfiles = glob.glob(os.path.join('.', 'tests', 'encoding', '*.xml')) - entitiesfiles = glob.glob(os.path.join('.', 'tests', 'entities', '*.xml')) - microformatfiles = glob.glob(os.path.join('.', 'tests', 'microformats', '**', '*.xml')) - httpd = None - # there are several compression test cases that must be accounted for - # as well as a number of http status tests that redirect to a target - # and a few `_open_resource`-related tests - httpcount = 6 + 16 + 2 - httpcount += len([f for f in allfiles if 'http' in f]) - httpcount += len([f for f in wellformedfiles if 'http' in f]) - httpcount += len([f for f in illformedfiles if 'http' in f]) - httpcount += len([f for f in encodingfiles if 'http' in f]) - try: - for c, xmlfile in enumerate(allfiles + encodingfiles + illformedfiles + entitiesfiles): - addTo = TestCase - if xmlfile in encodingfiles: - addTo = TestEncodings - elif xmlfile in entitiesfiles: - addTo = (TestStrictParser, TestLooseParser) - elif xmlfile in microformatfiles: - addTo = TestMicroformats - elif xmlfile in wellformedfiles: - addTo = (TestStrictParser, TestLooseParser) - f = open(xmlfile, 'rb') - data = f.read() - f.close() - if 'encoding' in xmlfile: - data = convert_to_utf8(data) - if data is None: - # convert_to_utf8 found a byte order mark for utf_32 - # but it's not supported in this installation of Python - if 'http' in xmlfile: - httpcount -= 1 + (xmlfile in wellformedfiles) - continue - description, evalString, skipUnless = getDescription(xmlfile, data) - testName = 'test_%06d' % c - ishttp = 'http' in xmlfile - try: - if not eval(skipUnless): raise NotImplementedError - except (ImportError, LookupError, NotImplementedError, AttributeError): - if ishttp: - httpcount -= 1 + (xmlfile in wellformedfiles) - continue - if ishttp: - xmlfile = 'http://%s:%s/%s' % (_HOST, _PORT, posixpath.normpath(xmlfile.replace('\\', '/'))) - testFunc = buildTestCase(xmlfile, description, evalString) - if isinstance(addTo, tuple): - setattr(addTo[0], testName, testFunc) - setattr(addTo[1], testName, testFunc) - else: - setattr(addTo, testName, testFunc) - if httpcount: - httpd = FeedParserTestServer(httpcount) - httpd.daemon = True - httpd.start() - httpd.ready.wait() - testsuite = unittest.TestSuite() - testloader = unittest.TestLoader() - testsuite.addTest(testloader.loadTestsFromTestCase(TestCase)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestStrictParser)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestLooseParser)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestEncodings)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestDateParsers)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestHTMLGuessing)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestHTTPStatus)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestCompression)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestConvertToIdn)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestMicroformats)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestOpenResource)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestFeedParserDict)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestMakeSafeAbsoluteURI)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestEverythingIsUnicode)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestTemporaryFallbackBehavior)) - testsuite.addTest(testloader.loadTestsFromTestCase(TestLxmlBug)) - testresults = unittest.TextTestRunner(verbosity=1).run(testsuite) - - # Return 0 if successful, 1 if there was a failure - sys.exit(not testresults.wasSuccessful()) - finally: - if httpd: - if httpd.requests: - # Should never get here unless something went horribly wrong, like the - # user hitting Ctrl-C. Tell our HTTP server that it's done, then do - # one more request to flush it. This rarely works; the combination of - # threading, self-terminating HTTP servers, and unittest is really - # quite flaky. Just what you want in a testing framework, no? - httpd.requests = 0 - if httpd.ready: - urllib.urlopen('http://127.0.0.1:8097/tests/wellformed/rss/aaa_wellformed.xml').read() - httpd.join(0) - -if __name__ == "__main__": - runtests() diff --git a/lib/feedparser/html.py b/lib/feedparser/html.py new file mode 100644 index 000000000..18f5e8da9 --- /dev/null +++ b/lib/feedparser/html.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, unicode_literals + +import re + +try: + from html.entities import name2codepoint +except ImportError: + from htmlentitydefs import name2codepoint + +from .sgml import * + +_cp1252 = { + 128: '\u20ac', # euro sign + 130: '\u201a', # single low-9 quotation mark + 131: '\u0192', # latin small letter f with hook + 132: '\u201e', # double low-9 quotation mark + 133: '\u2026', # horizontal ellipsis + 134: '\u2020', # dagger + 135: '\u2021', # double dagger + 136: '\u02c6', # modifier letter circumflex accent + 137: '\u2030', # per mille sign + 138: '\u0160', # latin capital letter s with caron + 139: '\u2039', # single left-pointing angle quotation mark + 140: '\u0152', # latin capital ligature oe + 142: '\u017d', # latin capital letter z with caron + 145: '\u2018', # left single quotation mark + 146: '\u2019', # right single quotation mark + 147: '\u201c', # left double quotation mark + 148: '\u201d', # right double quotation mark + 149: '\u2022', # bullet + 150: '\u2013', # en dash + 151: '\u2014', # em dash + 152: '\u02dc', # small tilde + 153: '\u2122', # trade mark sign + 154: '\u0161', # latin small letter s with caron + 155: '\u203a', # single right-pointing angle quotation mark + 156: '\u0153', # latin small ligature oe + 158: '\u017e', # latin small letter z with caron + 159: '\u0178', # latin capital letter y with diaeresis +} + +class _BaseHTMLProcessor(sgmllib.SGMLParser, object): + 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=None, _type='application/xhtml+xml'): + if encoding: + self.encoding = encoding + self._type = _type + super(_BaseHTMLProcessor, self).__init__() + + 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 + try: + goahead.__code__ = sgmllib.SGMLParser.goahead.__code__ + except AttributeError: + goahead.func_code = sgmllib.SGMLParser.goahead.func_code + + def __parse_starttag(self, i): + pass + try: + __parse_starttag.__code__ = sgmllib.SGMLParser.parse_starttag.__code__ + except AttributeError: + __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'<!\1', data) + data = re.sub(r'<([^<>\s]+?)\s*/>', self._shorttag_replace, data) + data = data.replace(''', "'") + data = data.replace('"', '"') + 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('>','>').replace('<','<').replace('"','"') + value = self.bare_ampersand.sub("&", value) + uattrs.append((key, value)) + strattrs = ''.join([' %s="%s"' % (key, value) for key, value in uattrs]) + 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 ' ', 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 '©', 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('&%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(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('<') + return i+1 diff --git a/lib/feedparser/http.py b/lib/feedparser/http.py new file mode 100644 index 000000000..980dd2c56 --- /dev/null +++ b/lib/feedparser/http.py @@ -0,0 +1,231 @@ +from __future__ import absolute_import, unicode_literals, with_statement + +import datetime +import gzip +import re +import struct +import zlib + +try: + import urllib.parse + import urllib.request +except ImportError: + from urllib import splithost, splittype, splituser + from urllib2 import build_opener, HTTPDigestAuthHandler, HTTPRedirectHandler, HTTPDefaultErrorHandler, Request + from urlparse import urlparse + + class urllib(object): + class parse(object): + splithost = staticmethod(splithost) + splittype = staticmethod(splittype) + splituser = staticmethod(splituser) + urlparse = staticmethod(urlparse) + class request(object): + build_opener = staticmethod(build_opener) + HTTPDigestAuthHandler = HTTPDigestAuthHandler + HTTPRedirectHandler = HTTPRedirectHandler + HTTPDefaultErrorHandler = HTTPDefaultErrorHandler + Request = Request + +try: + from io import BytesIO as _StringIO +except ImportError: + try: + from cStringIO import StringIO as _StringIO + except ImportError: + from StringIO import StringIO as _StringIO + +try: + import base64, binascii +except ImportError: + base64 = binascii = None +else: + # Python 3.1 deprecated decodestring in favor of decodebytes + _base64decode = getattr(base64, 'decodebytes', base64.decodestring) + +from .datetimes import _parse_date +from .urls import _convert_to_idn + +try: + basestring +except NameError: + basestring = str + +bytes_ = type(b'') + +# 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" + +class _FeedURLHandler(urllib.request.HTTPDigestAuthHandler, urllib.request.HTTPRedirectHandler, urllib.request.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 = urllib.request.HTTPRedirectHandler.http_error_301(self, req, fp, + code, msg, hdrs) + result.status = code + result.newurl = result.geturl() + return result + # The default implementations in urllib.request.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 = urllib.parse.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 _build_urllib2_request(url, agent, accept_header, etag, modified, referrer, auth, request_headers): + request = urllib.request.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 get(url, etag=None, modified=None, agent=None, referrer=None, handlers=None, request_headers=None, result=None): + if handlers is None: + handlers = [] + elif not isinstance(handlers, list): + handlers = [handlers] + if request_headers is None: + request_headers = {} + + # Deal with the feed URI scheme + if url.startswith('feed:http'): + url = url[5:] + elif url.startswith('feed:'): + url = 'http:' + url[5:] + if not agent: + agent = USER_AGENT + # Test for inline user:password credentials for HTTP basic auth + auth = None + if base64 and not url.startswith('ftp:'): + urltype, rest = urllib.parse.splittype(url) + realhost, rest = urllib.parse.splithost(rest) + if realhost: + user_passwd, realhost = urllib.parse.splituser(realhost) + if user_passwd: + url = '%s://%s%s' % (urltype, realhost, rest) + auth = base64.standard_b64encode(user_passwd).strip() + + # iri support + if not isinstance(url, bytes_): + url = _convert_to_idn(url) + + # try to open with urllib2 (to use optional headers) + request = _build_urllib2_request(url, agent, ACCEPT_HEADER, etag, modified, referrer, auth, request_headers) + opener = urllib.request.build_opener(*tuple(handlers + [_FeedURLHandler()])) + opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent + f = opener.open(request) + data = f.read() + f.close() + + # lowercase all of the HTTP headers for comparisons per RFC 2616 + result['headers'] = dict((k.lower(), v) for k, v in f.headers.items()) + + # if feed is gzip-compressed, decompress it + if data and 'gzip' in result['headers'].get('content-encoding', ''): + try: + data = gzip.GzipFile(fileobj=_StringIO(data)).read() + except (EOFError, IOError, struct.error) as e: + # IOError can occur if the gzip header is bad. + # struct.error can occur if the data is damaged. + result['bozo'] = True + 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 data and 'deflate' in result['headers'].get('content-encoding', ''): + try: + data = zlib.decompress(data) + except zlib.error as e: + try: + # The data may have no headers and no checksum. + data = zlib.decompress(data, -15) + except zlib.error as e: + result['bozo'] = True + result['bozo_exception'] = e + + # save HTTP headers + if 'etag' in result['headers']: + etag = result['headers'].get('etag', '') + if isinstance(etag, bytes_): + etag = etag.decode('utf-8', 'ignore') + if etag: + result['etag'] = etag + if 'last-modified' in result['headers']: + modified = result['headers'].get('last-modified', '') + if modified: + result['modified'] = modified + result['modified_parsed'] = _parse_date(modified) + if isinstance(f.url, bytes_): + result['href'] = f.url.decode('utf-8', 'ignore') + else: + result['href'] = f.url + result['status'] = getattr(f, 'status', 200) + + # Stop processing if the server sent HTTP 304 Not Modified. + if getattr(f, 'code', 0) == 304: + result['version'] = '' + 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 data diff --git a/lib/feedparser/mixin.py b/lib/feedparser/mixin.py new file mode 100644 index 000000000..be73f4e2f --- /dev/null +++ b/lib/feedparser/mixin.py @@ -0,0 +1,754 @@ +# Shared code that is common to the strict and loose feed parsers +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +import copy +import re + +from xml.sax.saxutils import escape as _xmlescape + +# 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) + +try: + from html.entities import name2codepoint, entitydefs +except ImportError: + from htmlentitydefs import name2codepoint, entitydefs + +from .html import _cp1252 +from .namespaces import _base, cc, dc, georss, itunes, mediarss, psc +from .sanitizer import _sanitizeHTML, _HTMLSanitizer +from .util import FeedParserDict +from .urls import _urljoin, _makeSafeAbsoluteURI, _resolveRelativeURIs + +bytes_ = type(b'') +try: + chr = unichr +except NameError: + pass + +class _FeedParserMixin( + _base.Namespace, + cc.Namespace, + dc.Namespace, + georss.Namespace, + itunes.Namespace, + mediarss.Namespace, + psc.Namespace, +): + 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://creativecommons.org/ns#license': 'cc', + 'http://web.resource.org/cc/': 'cc', + 'http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html': 'creativeCommons', + '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 = ['text/html', 'application/xhtml+xml'] + + def __init__(self): + if not self._matchnamespaces: + for k, v in self.namespaces.items(): + self._matchnamespaces[k.lower()] = v + self.feeddata = FeedParserDict() # feed-level data + self.entries = [] # list of entry-level data + self.version = '' # 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 + + self.sourcedata = FeedParserDict() + self.contentparams = FeedParserDict() + self._summaryKey = None + self.namespacemap = {} + self.elementstack = [] + self.basestack = [] + self.langstack = [] + self.svgOK = 0 + self.title_depth = -1 + self.depth = 0 + if self.lang: + self.feeddata['language'] = self.lang.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 = {} + super(_FeedParserMixin, self).__init__() + + def unknown_starttag(self, tag, attrs): + # increment depth counter + self.depth += 1 + + # normalize attrs + attrs = [self._normalize_attributes(attr) for attr in attrs] + + # track xml:base and xml:lang + attrsD = dict(attrs) + baseuri = attrsD.get('xml:base', attrsD.get('base')) or self.baseuri + if isinstance(baseuri, bytes_): + 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', 'xml').endswith('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'] = 'application/xhtml+xml' + if self.incontent and self.contentparams.get('type') == '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', 'xml').endswith('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'] = 'application/xhtml+xml' + if self.incontent and self.contentparams.get('type') == '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 ' ', 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 = chr(c).encode('utf-8') + self.elementstack[-1][2].append(text) + + def handle_entityref(self, ref): + # called for each entity reference, e.g. for '©', 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 = chr(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') == '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 = 'text/plain' + elif contentType == 'html': + contentType = 'text/html' + elif contentType == 'xhtml': + contentType = '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 = 'rss090' + elif loweruri == 'http://purl.org/rss/1.0/': + self.version = 'rss10' + elif loweruri == 'http://www.w3.org/2005/atom': + self.version = 'atom10' + if loweruri.find('backend.userland.com/rss') != -1: + # match any backend.userland.com namespace + uri = '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 '', uri) + + def decodeEntities(self, element, data): + return data + + def strattrs(self, attrs): + return ''.join([' %s="%s"' % (t[0],_xmlescape(t[1],{'"':'"'})) 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 == 'atom10' and self.contentparams.get('type', 'text') == '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 isinstance(v, bytes_): + pieces[i] = v.decode('utf-8') + + output = ''.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('atom') and self.contentparams.get('type') == 'text/plain': + if self.lookslikehtml(output): + self.contentparams['type'] = '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', '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', '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', 'text/html')) + + if self.encoding and isinstance(output, bytes_): + 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 ('utf-8', 'utf-8_INVALID_PYTHON_3') and not isinstance(output, bytes_): + try: + output = output.encode('iso-8859-1').decode('utf-8') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + + # map win-1252 extensions to the proper code points + if not isinstance(output, bytes_): + 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('&', '&') + 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(r'&#?\w+;', s)): + return + + # all tags must be in a restricted subset of valid HTML tags + if any((t for t in re.findall(r'</?(\w+)', s) if t.lower() not in _HTMLSanitizer.acceptable_elements)): + return + + # all entities must have been defined as valid HTML entities + if any((e for e in re.findall(r'&(\w+);', s) if e not in entitydefs)): + 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('text/'): + return 0 + if self.contentparams['type'].endswith('+xml'): + return 0 + if self.contentparams['type'].endswith('/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 _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] = '%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(r'''(([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, '') + author = author.replace('()', '') + author = author.replace('<>', '') + author = author.replace('<>', '') + author = author.strip() + if author and (author[0] == '('): + author = author[1:] + if author and (author[-1] == ')'): + 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 _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) diff --git a/lib/feedparser/namespaces/__init__.py b/lib/feedparser/namespaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/feedparser/namespaces/_base.py b/lib/feedparser/namespaces/_base.py new file mode 100644 index 000000000..f25edb625 --- /dev/null +++ b/lib/feedparser/namespaces/_base.py @@ -0,0 +1,499 @@ +# Support for the Atom, RSS, RDF, and CDF feed formats +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +import copy + +from ..datetimes import registerDateHandler, _parse_date +from ..urls import _makeSafeAbsoluteURI +from ..util import FeedParserDict + +class Namespace(object): + """Support for the Atom, RSS, RDF, and CDF feed formats. + + The feed formats all share common elements, some of which have conflicting + interpretations. For simplicity, all of the base feed format support is + collected here. + """ + + supported_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#': '', + } + + def _start_rss(self, attrsD): + versionmap = {'0.91': 'rss091u', + '0.92': 'rss092', + '0.93': 'rss093', + '0.94': '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('rss'): + attr_version = attrsD.get('version', '') + version = versionmap.get(attr_version) + if version: + self.version = version + elif attr_version.startswith('2.'): + self.version = 'rss20' + else: + self.version = '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': 'atom01', + '0.2': 'atom02', + '0.3': 'atom03'} + if not self.version: + attr_version = attrsD.get('version') + version = versionmap.get(attr_version) + if version: + self.version = version + else: + self.version = '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 + + def _end_author(self): + self.pop('author') + self.inauthor = 0 + self._sync_author_detail() + _end_managingeditor = _end_author + + 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_name(self, attrsD): + self.push('name', 0) + + 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 + + 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) + + 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) + + def _start_subtitle(self, attrsD): + self.pushContent('subtitle', attrsD, 'text/plain', 1) + _start_tagline = _start_subtitle + + def _end_subtitle(self): + self.popContent('subtitle') + _end_tagline = _end_subtitle + + def _start_rights(self, attrsD): + self.pushContent('rights', attrsD, 'text/plain', 1) + _start_copyright = _start_rights + + def _end_rights(self): + self.popContent('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 + 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_language(self, attrsD): + self.push('language', 1) + + def _end_language(self): + self.lang = self.pop('language') + + def _start_webmaster(self, attrsD): + self.push('publisher', 1) + + def _end_webmaster(self): + self.pop('publisher') + self._sync_author_detail('publisher') + + def _start_published(self, attrsD): + self.push('published', 1) + _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_issued = _end_published + _end_pubdate = _end_published + + def _start_updated(self, attrsD): + self.push('updated', 1) + _start_modified = _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_lastbuilddate = _end_updated + + def _start_created(self, attrsD): + self.push('created', 1) + + def _end_created(self): + value = self.pop('created') + self._save('created_parsed', _parse_date(value), overwrite=True) + + def _start_expirationdate(self, attrsD): + self.push('expired', 1) + + def _end_expirationdate(self): + self._save('expired_parsed', _parse_date(self.pop('expired')), overwrite=True) + + 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_keywords = _start_category + + 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_keywords = _end_category + + def _start_cloud(self, attrsD): + self._getContext()['cloud'] = FeedParserDict(attrsD) + + def _start_link(self, attrsD): + attrsD.setdefault('rel', 'alternate') + if attrsD['rel'] == 'self': + attrsD.setdefault('type', 'application/atom+xml') + else: + attrsD.setdefault('type', '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') == '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', list(attrsD.items())) + self.pushContent('title', attrsD, 'text/plain', self.infeed or self.inentry or self.insource) + + def _end_title(self): + if self.svgOK: + return + value = self.popContent('title') + if not value: + return + self.title_depth = self.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, 'text/html', self.infeed or self.inentry or self.insource) + + def _start_abstract(self, attrsD): + self.pushContent('description', attrsD, '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 + + def _start_info(self, attrsD): + self.pushContent('info', attrsD, '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_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, 'text/plain', 1) + + def _end_summary(self): + if self._summaryKey == 'content': + self._end_content() + else: + self.popContent(self._summaryKey or 'summary') + self._summaryKey = None + + def _start_enclosure(self, attrsD): + attrsD = self._itsAnHrefDamnIt(attrsD) + context = self._getContext() + attrsD['rel'] = '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['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, '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, 'application/xhtml+xml', 1) + _start_xhtml_body = _start_body + + def _start_content_encoded(self, attrsD): + self.pushContent('content', attrsD, 'text/html', 1) + _start_fullitem = _start_content_encoded + + def _end_content(self): + copyToSummary = self.mapContentType(self.contentparams.get('type')) in (['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_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()) diff --git a/lib/feedparser/namespaces/admin.py b/lib/feedparser/namespaces/admin.py new file mode 100644 index 000000000..7c663aef8 --- /dev/null +++ b/lib/feedparser/namespaces/admin.py @@ -0,0 +1,55 @@ +# Support for the administrative elements extension +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..util import FeedParserDict + +class Namespace(object): + # RDF Site Summary 1.0 Modules: Administrative + # http://web.resource.org/rss/1.0/modules/admin/ + + supported_namespaces = { + 'http://webns.net/mvcb/': 'admin', + } + + 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') + diff --git a/lib/feedparser/namespaces/cc.py b/lib/feedparser/namespaces/cc.py new file mode 100644 index 000000000..6d8d3933d --- /dev/null +++ b/lib/feedparser/namespaces/cc.py @@ -0,0 +1,71 @@ +# Support for the Creative Commons licensing extensions +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..util import FeedParserDict + +class Namespace(object): + supported_namespaces = { + # RDF-based namespace + 'http://creativecommons.org/ns#license': 'cc', + + # Old RDF-based namespace + 'http://web.resource.org/cc/': 'cc', + + # RSS-based namespace + 'http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html': 'creativecommons', + + # Old RSS-based namespace + 'http://backend.userland.com/creativeCommonsRssModule': 'creativecommons', + } + + def _start_cc_license(self, attrsD): + context = self._getContext() + value = self._getAttribute(attrsD, 'rdf:resource') + attrsD = FeedParserDict() + attrsD['rel'] = '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'] = 'license' + if value: + attrsD['href'] = value + context.setdefault('links', []).append(attrsD) + del context['license'] + _end_creativeCommons_license = _end_creativecommons_license + diff --git a/lib/feedparser/namespaces/dc.py b/lib/feedparser/namespaces/dc.py new file mode 100644 index 000000000..035bbadd9 --- /dev/null +++ b/lib/feedparser/namespaces/dc.py @@ -0,0 +1,136 @@ +# Support for the Dublin Core metadata extensions +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..util import FeedParserDict +from ..datetimes import _parse_date + +class Namespace(object): + supported_namespaces = { + 'http://purl.org/dc/elements/1.1/': 'dc', + 'http://purl.org/dc/terms/': 'dcterms', + } + + def _end_dc_author(self): + self._end_author() + + def _end_dc_creator(self): + self._end_author() + + def _end_dc_date(self): + self._end_updated() + + def _end_dc_description(self): + self._end_description() + + def _end_dc_language(self): + self._end_language() + + def _end_dc_publisher(self): + self._end_webmaster() + + def _end_dc_rights(self): + self._end_rights() + + def _end_dc_subject(self): + self._end_category() + + def _end_dc_title(self): + self._end_title() + + def _end_dcterms_created(self): + self._end_created() + + def _end_dcterms_issued(self): + self._end_published() + + def _end_dcterms_modified(self): + self._end_updated() + + def _start_dc_author(self, attrsD): + self._start_author(attrsD) + + def _start_dc_creator(self, attrsD): + self._start_author(attrsD) + + def _start_dc_date(self, attrsD): + self._start_updated(attrsD) + + def _start_dc_description(self, attrsD): + self._start_description(attrsD) + + def _start_dc_language(self, attrsD): + self._start_language(attrsD) + + def _start_dc_publisher(self, attrsD): + self._start_webmaster(attrsD) + + def _start_dc_rights(self, attrsD): + self._start_rights(attrsD) + + def _start_dc_subject(self, attrsD): + self._start_category(attrsD) + + def _start_dc_title(self, attrsD): + self._start_title(attrsD) + + def _start_dcterms_created(self, attrsD): + self._start_created(attrsD) + + def _start_dcterms_issued(self, attrsD): + self._start_published(attrsD) + + def _start_dcterms_modified(self, attrsD): + self._start_updated(attrsD) + + 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_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 + diff --git a/lib/feedparser/namespaces/georss.py b/lib/feedparser/namespaces/georss.py new file mode 100644 index 000000000..7bac04a18 --- /dev/null +++ b/lib/feedparser/namespaces/georss.py @@ -0,0 +1,264 @@ +# Support for the GeoRSS format +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..util import FeedParserDict + +class Namespace(object): + supported_namespaces = { + 'http://www.w3.org/2003/01/geo/wgs84_pos#': 'geo', + 'http://www.georss.org/georss': 'georss', + 'http://www.opengis.net/gml': 'gml', + } + + def __init__(self): + self.ingeometry = 0 + super(Namespace, self).__init__() + + 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 + + +# 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': '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 = (float(ll) for ll in value.replace(',', ' ').split()) + while True: + t = [next(latlons), next(latlons)][::swap and -1 or 1] + if dims == 3: + t.append(next(latlons)) + 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 {'type': 'Point', '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 {'type': 'LineString', '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 {'type': 'Polygon', '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 {'type': 'Box', 'coordinates': tuple(coords)} + except (IndexError, ValueError): + return None + +# 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 ] diff --git a/lib/feedparser/namespaces/itunes.py b/lib/feedparser/namespaces/itunes.py new file mode 100644 index 000000000..37faa7e46 --- /dev/null +++ b/lib/feedparser/namespaces/itunes.py @@ -0,0 +1,111 @@ +# Support for the iTunes format +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..util import FeedParserDict + +class Namespace(object): + supported_namespaces = { + # Canonical namespace + 'http://www.itunes.com/DTDs/PodCast-1.0.dtd': 'itunes', + + # Extra namespace + 'http://example.com/DTDs/PodCast-1.0.dtd': 'itunes', + } + + def _start_itunes_author(self, attrsD): + self._start_author(attrsD) + + def _end_itunes_author(self): + self._end_author() + + def _end_itunes_category(self): + self._end_category() + + def _start_itunes_name(self, attrsD): + self._start_name(attrsD) + + def _end_itunes_name(self): + self._end_name() + + def _start_itunes_email(self, attrsD): + self._start_email(attrsD) + + def _end_itunes_email(self): + self._end_email() + + def _start_itunes_subtitle(self, attrsD): + self._start_subtitle(attrsD) + + def _end_itunes_subtitle(self): + self._end_subtitle() + + def _start_itunes_summary(self, attrsD): + self._start_summary(attrsD) + + def _end_itunes_summary(self): + self._end_summary() + + 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 _end_itunes_keywords(self): + for term in self.pop('itunes_keywords').split(','): + if term.strip(): + self._addTag(term.strip(), 'http://www.itunes.com/', None) + + def _start_itunes_category(self, attrsD): + self._addTag(attrsD.get('text'), 'http://www.itunes.com/', None) + self.push('category', 1) + + 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] + diff --git a/lib/feedparser/namespaces/mediarss.py b/lib/feedparser/namespaces/mediarss.py new file mode 100644 index 000000000..878ed7c8e --- /dev/null +++ b/lib/feedparser/namespaces/mediarss.py @@ -0,0 +1,142 @@ +# Support for the Media RSS format +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..util import FeedParserDict + +class Namespace(object): + supported_namespaces = { + # Canonical namespace + 'http://search.yahoo.com/mrss/': 'media', + + # Old namespace (no trailing slash) + 'http://search.yahoo.com/mrss': 'media', + } + + def _start_media_category(self, attrsD): + attrsD.setdefault('scheme', 'http://search.yahoo.com/mrss/category_schema') + self._start_category(attrsD) + + def _end_media_category(self): + self._end_category() + + def _end_media_keywords(self): + for term in self.pop('media_keywords').split(','): + if term.strip(): + self._addTag(term.strip(), None, None) + + def _start_media_title(self, attrsD): + self._start_title(attrsD) + + def _end_media_title(self): + title_depth = self.title_depth + self._end_title() + self.title_depth = title_depth + + 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_description(self, attrsD): + self._start_description(attrsD) + + def _end_media_description(self): + self._end_description() + + 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 diff --git a/lib/feedparser/namespaces/psc.py b/lib/feedparser/namespaces/psc.py new file mode 100644 index 000000000..c7dc843e2 --- /dev/null +++ b/lib/feedparser/namespaces/psc.py @@ -0,0 +1,72 @@ +# Support for the Podlove Simple Chapters format +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +import datetime +import re + +from .. import util +class Namespace(object): + supported_namespaces = { + 'http://podlove.org/simple-chapters': 'psc', + } + + def __init__(self): + # chapters will only be captured while psc_chapters_flag is True. + self.psc_chapters_flag = False + super(Namespace, self).__init__() + + def _start_psc_chapters(self, attrsD): + context = self._getContext() + if 'psc_chapters' not in context: + self.psc_chapters_flag = True + attrsD['chapters'] = [] + context['psc_chapters'] = util.FeedParserDict(attrsD) + + def _end_psc_chapters(self): + 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(util.FeedParserDict(attrsD)) + +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) diff --git a/lib/feedparser/parsers/__init__.py b/lib/feedparser/parsers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/feedparser/parsers/loose.py b/lib/feedparser/parsers/loose.py new file mode 100644 index 000000000..597ce8b7a --- /dev/null +++ b/lib/feedparser/parsers/loose.py @@ -0,0 +1,72 @@ +# The loose feed parser that interfaces with an SGML parsing library +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +class _LooseFeedParser(object): + def __init__(self, baseuri=None, baselang=None, encoding=None, entities=None): + self.baseuri = baseuri or '' + self.lang = baselang or None + self.encoding = encoding or 'utf-8' # character encoding + self.entities = entities or {} + super(_LooseFeedParser, self).__init__() + + 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 + v = v.replace('&', '&') + return (k, v) + + def decodeEntities(self, element, data): + data = data.replace('<', '<') + data = data.replace('<', '<') + data = data.replace('<', '<') + data = data.replace('>', '>') + data = data.replace('>', '>') + data = data.replace('>', '>') + data = data.replace('&', '&') + data = data.replace('&', '&') + data = data.replace('"', '"') + data = data.replace('"', '"') + data = data.replace(''', ''') + data = data.replace(''', ''') + if not self.contentparams.get('type', 'xml').endswith('xml'): + data = data.replace('<', '<') + data = data.replace('>', '>') + data = data.replace('&', '&') + data = data.replace('"', '"') + data = data.replace(''', "'") + data = data.replace('/', '/') + data = data.replace('/', '/') + return data + + def strattrs(self, attrs): + return ''.join([' %s="%s"' % (n,v.replace('"','"')) for n,v in attrs]) diff --git a/lib/feedparser/parsers/strict.py b/lib/feedparser/parsers/strict.py new file mode 100644 index 000000000..29ad2be36 --- /dev/null +++ b/lib/feedparser/parsers/strict.py @@ -0,0 +1,135 @@ +# The strict feed parser that interfaces with an XML parsing library +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +from ..exceptions import UndeclaredNamespace + +class _StrictFeedParser(object): + def __init__(self, baseuri, baselang, encoding): + self.bozo = 0 + self.exc = None + self.decls = {} + self.baseuri = baseuri or '' + self.lang = baselang + self.encoding = encoding + super(_StrictFeedParser, self).__init__() + + def _normalize_attributes(self, kv): + k = kv[0].lower() + v = k in ('rel', 'type') and kv[1].lower() or kv[1] + return (k, v) + + 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('backend.userland.com/rss') != -1: + # match any backend.userland.com namespace + namespace = '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, list(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 diff --git a/lib/feedparser/sanitizer.py b/lib/feedparser/sanitizer.py new file mode 100644 index 000000000..04096b3ac --- /dev/null +++ b/lib/feedparser/sanitizer.py @@ -0,0 +1,466 @@ +from __future__ import absolute_import, unicode_literals + +import re + +from .html import _BaseHTMLProcessor +from .sgml import _SGML_AVAILABLE +from .urls import _makeSafeAbsoluteURI + +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 any((a for a in attrs if a[0].startswith('xlink:'))): + 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 == '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[', '<![CDATA[') + p.feed(htmlSource) + data = p.output() + data = data.strip().replace('\r\n', '\n') + return data + +# Match XML entity declarations. +# Example: <!ENTITY copyright "(C)"> +RE_ENTITY_PATTERN = re.compile(br'^\s*<!ENTITY([^>]*?)>', re.MULTILINE) + +# Match XML DOCTYPE declarations. +# Example: <!DOCTYPE feed [ ]> +RE_DOCTYPE_PATTERN = re.compile(br'^\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 "³" +# Example: copyright "(C)" +# Forbidden: explode1 "&explode2;&explode2;" +RE_SAFE_ENTITY_PATTERN = re.compile(b'\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(b'<\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(b'', 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 b'' + if b'netscape' in doctype.lower(): + version = 'rss091n' + else: + version = None + + # Re-insert the safe ENTITY declarations if a DOCTYPE was found. + replacement = b'' + if len(doctype_results) == 1 and entity_results: + match_safe_entities = lambda e: RE_SAFE_ENTITY_PATTERN.match(e) + safe_entities = [e for e in entity_results if match_safe_entities(e)] + if safe_entities: + replacement = b'<!DOCTYPE feed [\n<!ENTITY' \ + + b'>\n<!ENTITY '.join(safe_entities) \ + + b'>\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 diff --git a/lib/feedparser/sgml.py b/lib/feedparser/sgml.py new file mode 100644 index 000000000..2cfcd8634 --- /dev/null +++ b/lib/feedparser/sgml.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +import re + +__all__ = [ + '_SGML_AVAILABLE', + 'sgmllib', + 'charref', + 'tagfind', + 'attrfind', + 'entityref', + 'incomplete', + 'interesting', + 'shorttag', + 'shorttagopen', + 'starttagopen', + 'endbracket', +] + +# 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() diff --git a/lib/feedparser/sgmllib.py b/lib/feedparser/sgmllib.py deleted file mode 100644 index 899a35f0d..000000000 --- a/lib/feedparser/sgmllib.py +++ /dev/null @@ -1,547 +0,0 @@ -"""A parser for SGML, using the derived class as a static DTD.""" - -# XXX This only supports those SGML features used by HTML. - -# XXX There should be a way to distinguish between PCDATA (parsed -# character data -- the normal case), RCDATA (replaceable character -# data -- only char and entity references and end tags are special) -# and CDATA (character data -- only end tags are special). RCDATA is -# not supported at all. - -import _markupbase -import re - -__all__ = ["SGMLParser", "SGMLParseError"] - -# Regular expressions used for parsing - -interesting = re.compile('[&<]') -incomplete = re.compile('&([a-zA-Z][a-zA-Z0-9]*|#[0-9]*)?|' - '<([a-zA-Z][^<>]*|' - '/([a-zA-Z][^<>]*)?|' - '![^<>]*)?') - -entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') -charref = re.compile('&#([0-9]+)[^0-9]') - -starttagopen = re.compile('<[>a-zA-Z]') -shorttagopen = re.compile('<[a-zA-Z][-.a-zA-Z0-9]*/') -shorttag = re.compile('<([a-zA-Z][-.a-zA-Z0-9]*)/([^/]*)/') -piclose = re.compile('>') -endbracket = re.compile('[<>]') -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./,:;+*%?!&$\(\)_#=~\'"@]*))?') - - -class SGMLParseError(RuntimeError): - """Exception raised for all parse errors.""" - pass - - -# SGML parser base class -- find tags and call handler functions. -# Usage: p = SGMLParser(); p.feed(data); ...; p.close(). -# The dtd is defined by deriving a class which defines methods -# with special names to handle tags: start_foo and end_foo to handle -# <foo> and </foo>, respectively, or do_foo to handle <foo> by itself. -# (Tags are converted to lower case for this purpose.) The data -# between tags is passed to the parser by calling self.handle_data() -# with some data as argument (the data may be split up in arbitrary -# chunks). Entity references are passed by calling -# self.handle_entityref() with the entity reference as argument. - -class SGMLParser(_markupbase.ParserBase): - # Definition of entities -- derived classes may override - entity_or_charref = re.compile('&(?:' - '([a-zA-Z][-.a-zA-Z0-9]*)|#([0-9]+)' - ')(;?)') - - def __init__(self, verbose=0): - """Initialize and reset this instance.""" - self.verbose = verbose - self.reset() - - def reset(self): - """Reset this instance. Loses all unprocessed data.""" - self.__starttag_text = None - self.rawdata = '' - self.stack = [] - self.lasttag = '???' - self.nomoretags = 0 - self.literal = 0 - _markupbase.ParserBase.reset(self) - - def setnomoretags(self): - """Enter literal mode (CDATA) till EOF. - - Intended for derived classes only. - """ - self.nomoretags = self.literal = 1 - - def setliteral(self, *args): - """Enter literal mode (CDATA). - - Intended for derived classes only. - """ - self.literal = 1 - - def feed(self, data): - """Feed some data to the parser. - - Call this as often as you want, with as little or as much text - as you want (may include '\n'). (This just saves the text, - all the processing is done by goahead().) - """ - - self.rawdata = self.rawdata + data - self.goahead(0) - - def close(self): - """Handle the remaining data.""" - self.goahead(1) - - def error(self, message): - raise SGMLParseError(message) - - # Internal -- handle data as far as reasonable. May leave state - # and data to be processed by a subsequent call. If 'end' is - # true, force handling all data as if followed by EOF marker. - def goahead(self, end): - rawdata = self.rawdata - i = 0 - n = len(rawdata) - while i < n: - if self.nomoretags: - self.handle_data(rawdata[i:n]) - i = n - break - match = interesting.search(rawdata, i) - if match: j = match.start() - else: j = n - if i < j: - self.handle_data(rawdata[i:j]) - i = j - if i == n: break - if rawdata[i] == '<': - if starttagopen.match(rawdata, i): - if self.literal: - self.handle_data(rawdata[i]) - i = i+1 - continue - k = self.parse_starttag(i) - if k < 0: break - i = k - continue - if rawdata.startswith("</", i): - k = self.parse_endtag(i) - if k < 0: break - i = k - self.literal = 0 - continue - if self.literal: - if n > (i + 1): - self.handle_data("<") - i = i+1 - else: - # incomplete - break - continue - if rawdata.startswith("<!--", i): - # Strictly speaking, a comment is --.*-- - # within a declaration tag <!...>. - # This should be removed, - # and comments handled only in parse_declaration. - k = self.parse_comment(i) - if k < 0: break - i = k - continue - if rawdata.startswith("<?", i): - k = self.parse_pi(i) - if k < 0: break - i = i+k - continue - if rawdata.startswith("<!", i): - # This is some sort of declaration; in "HTML as - # deployed," this should only be the document type - # declaration ("<!DOCTYPE html...>"). - k = self.parse_declaration(i) - if k < 0: break - i = k - continue - elif rawdata[i] == '&': - if self.literal: - self.handle_data(rawdata[i]) - i = i+1 - continue - match = charref.match(rawdata, i) - if match: - name = match.group(1) - self.handle_charref(name) - i = match.end(0) - if rawdata[i-1] != ';': i = i-1 - continue - match = entityref.match(rawdata, i) - if match: - name = match.group(1) - self.handle_entityref(name) - i = match.end(0) - if rawdata[i-1] != ';': i = i-1 - continue - else: - self.error('neither < nor & ??') - # We get here only if incomplete matches but - # nothing else - match = incomplete.match(rawdata, i) - if not match: - self.handle_data(rawdata[i]) - i = i+1 - continue - j = match.end(0) - if j == n: - break # Really incomplete - self.handle_data(rawdata[i:j]) - i = j - # end while - if end and i < n: - self.handle_data(rawdata[i:n]) - i = n - self.rawdata = rawdata[i:] - # XXX if end: check for empty stack - - # Extensions for the DOCTYPE scanner: - _decl_otherchars = '=' - - # Internal -- parse processing instr, return length or -1 if not terminated - def parse_pi(self, i): - rawdata = self.rawdata - if rawdata[i:i+2] != '<?': - self.error('unexpected call to parse_pi()') - match = piclose.search(rawdata, i+2) - if not match: - return -1 - j = match.start(0) - self.handle_pi(rawdata[i+2: j]) - j = match.end(0) - return j-i - - def get_starttag_text(self): - return self.__starttag_text - - # Internal -- handle starttag, return length or -1 if not terminated - def parse_starttag(self, i): - self.__starttag_text = None - start_pos = i - rawdata = self.rawdata - if shorttagopen.match(rawdata, i): - # SGML shorthand: <tag/data/ == <tag>data</tag> - # XXX Can data contain &... (entity or char refs)? - # XXX Can data contain < or > (tag characters)? - # XXX Can there be whitespace before the first /? - match = shorttag.match(rawdata, i) - if not match: - return -1 - tag, data = match.group(1, 2) - self.__starttag_text = '<%s/' % tag - tag = tag.lower() - k = match.end(0) - self.finish_shorttag(tag, data) - self.__starttag_text = rawdata[start_pos:match.end(1) + 1] - return k - # XXX The following should skip matching quotes (' or ") - # As a shortcut way to exit, this isn't so bad, but shouldn't - # be used to locate the actual end of the start tag since the - # < or > characters may be embedded in an attribute value. - match = endbracket.search(rawdata, i+1) - if not match: - return -1 - j = match.start(0) - # Now parse the data between i+1 and j into a tag and attrs - attrs = [] - if rawdata[i:i+2] == '<>': - # SGML shorthand: <> == <last open tag seen> - k = j - tag = self.lasttag - else: - match = tagfind.match(rawdata, i+1) - if not match: - self.error('unexpected call to parse_starttag') - k = match.end(0) - tag = rawdata[i+1:k].lower() - self.lasttag = tag - while k < j: - match = attrfind.match(rawdata, k) - if not match: break - attrname, rest, attrvalue = match.group(1, 2, 3) - if not rest: - attrvalue = attrname - else: - if (attrvalue[:1] == "'" == attrvalue[-1:] or - attrvalue[:1] == '"' == attrvalue[-1:]): - # strip quotes - attrvalue = attrvalue[1:-1] - attrvalue = self.entity_or_charref.sub( - self._convert_ref, attrvalue) - attrs.append((attrname.lower(), attrvalue)) - k = match.end(0) - if rawdata[j] == '>': - j = j+1 - self.__starttag_text = rawdata[start_pos:j] - self.finish_starttag(tag, attrs) - return j - - # Internal -- convert entity or character reference - def _convert_ref(self, match): - if match.group(2): - return self.convert_charref(match.group(2)) or \ - '&#%s%s' % match.groups()[1:] - elif match.group(3): - return self.convert_entityref(match.group(1)) or \ - '&%s;' % match.group(1) - else: - return '&%s' % match.group(1) - - # Internal -- parse endtag - def parse_endtag(self, i): - rawdata = self.rawdata - match = endbracket.search(rawdata, i+1) - if not match: - return -1 - j = match.start(0) - tag = rawdata[i+2:j].strip().lower() - if rawdata[j] == '>': - j = j+1 - self.finish_endtag(tag) - return j - - # Internal -- finish parsing of <tag/data/ (same as <tag>data</tag>) - def finish_shorttag(self, tag, data): - self.finish_starttag(tag, []) - self.handle_data(data) - self.finish_endtag(tag) - - # Internal -- finish processing of start tag - # Return -1 for unknown tag, 0 for open-only tag, 1 for balanced tag - def finish_starttag(self, tag, attrs): - try: - method = getattr(self, 'start_' + tag) - except AttributeError: - try: - method = getattr(self, 'do_' + tag) - except AttributeError: - self.unknown_starttag(tag, attrs) - return -1 - else: - self.handle_starttag(tag, method, attrs) - return 0 - else: - self.stack.append(tag) - self.handle_starttag(tag, method, attrs) - return 1 - - # Internal -- finish processing of end tag - def finish_endtag(self, tag): - if not tag: - found = len(self.stack) - 1 - if found < 0: - self.unknown_endtag(tag) - return - else: - if tag not in self.stack: - try: - method = getattr(self, 'end_' + tag) - except AttributeError: - self.unknown_endtag(tag) - else: - self.report_unbalanced(tag) - return - found = len(self.stack) - for i in range(found): - if self.stack[i] == tag: found = i - while len(self.stack) > found: - tag = self.stack[-1] - try: - method = getattr(self, 'end_' + tag) - except AttributeError: - method = None - if method: - self.handle_endtag(tag, method) - else: - self.unknown_endtag(tag) - del self.stack[-1] - - # Overridable -- handle start tag - def handle_starttag(self, tag, method, attrs): - method(attrs) - - # Overridable -- handle end tag - def handle_endtag(self, tag, method): - method() - - # Example -- report an unbalanced </...> tag. - def report_unbalanced(self, tag): - if self.verbose: - print('*** Unbalanced </' + tag + '>') - print('*** Stack:', self.stack) - - def convert_charref(self, name): - """Convert character reference, may be overridden.""" - try: - n = int(name) - except ValueError: - return - if not 0 <= n <= 127: - return - return self.convert_codepoint(n) - - def convert_codepoint(self, codepoint): - return chr(codepoint) - - def handle_charref(self, name): - """Handle character reference, no need to override.""" - replacement = self.convert_charref(name) - if replacement is None: - self.unknown_charref(name) - else: - self.handle_data(replacement) - - # Definition of entities -- derived classes may override - entitydefs = \ - {'lt': '<', 'gt': '>', 'amp': '&', 'quot': '"', 'apos': '\''} - - def convert_entityref(self, name): - """Convert entity references. - - As an alternative to overriding this method; one can tailor the - results by setting up the self.entitydefs mapping appropriately. - """ - table = self.entitydefs - if name in table: - return table[name] - else: - return - - def handle_entityref(self, name): - """Handle entity references, no need to override.""" - replacement = self.convert_entityref(name) - if replacement is None: - self.unknown_entityref(name) - else: - self.handle_data(replacement) - - # Example -- handle data, should be overridden - def handle_data(self, data): - pass - - # Example -- handle comment, could be overridden - def handle_comment(self, data): - pass - - # Example -- handle declaration, could be overridden - def handle_decl(self, decl): - pass - - # Example -- handle processing instruction, could be overridden - def handle_pi(self, data): - pass - - # To be overridden -- handlers for unknown objects - def unknown_starttag(self, tag, attrs): pass - def unknown_endtag(self, tag): pass - def unknown_charref(self, ref): pass - def unknown_entityref(self, ref): pass - - -class TestSGMLParser(SGMLParser): - - def __init__(self, verbose=0): - self.testdata = "" - SGMLParser.__init__(self, verbose) - - def handle_data(self, data): - self.testdata = self.testdata + data - if len(repr(self.testdata)) >= 70: - self.flush() - - def flush(self): - data = self.testdata - if data: - self.testdata = "" - print('data:', repr(data)) - - def handle_comment(self, data): - self.flush() - r = repr(data) - if len(r) > 68: - r = r[:32] + '...' + r[-32:] - print('comment:', r) - - def unknown_starttag(self, tag, attrs): - self.flush() - if not attrs: - print('start tag: <' + tag + '>') - else: - print('start tag: <' + tag) - for name, value in attrs: - print(name + '=' + '"' + value + '"') - print('>') - - def unknown_endtag(self, tag): - self.flush() - print('end tag: </' + tag + '>') - - def unknown_entityref(self, ref): - self.flush() - print('*** unknown entity ref: &' + ref + ';') - - def unknown_charref(self, ref): - self.flush() - print('*** unknown char ref: &#' + ref + ';') - - def unknown_decl(self, data): - self.flush() - print('*** unknown decl: [' + data + ']') - - def close(self): - SGMLParser.close(self) - self.flush() - - -def test(args = None): - import sys - - if args is None: - args = sys.argv[1:] - - if args and args[0] == '-s': - args = args[1:] - klass = SGMLParser - else: - klass = TestSGMLParser - - if args: - file = args[0] - else: - file = 'test.html' - - if file == '-': - f = sys.stdin - else: - try: - f = open(file, 'r') - except IOError as msg: - print(file, ":", msg) - sys.exit(1) - - data = f.read() - if f is not sys.stdin: - f.close() - - x = klass() - for c in data: - x.feed(c) - x.close() - - -if __name__ == '__main__': - test() diff --git a/lib/feedparser/tests/compression/deflate-no-headers.z b/lib/feedparser/tests/compression/deflate-no-headers.z deleted file mode 100644 index 04b5c303cf7091b3e83da88ebe49e93ef4fb58e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50 zcmdn&>Fw(qxZ=dwliJ%tPibgsZn$(^Utj;aw)wTw`d-(~jSLK~mg}56AG&GtMRv`t HkC_+%Q~nn5 diff --git a/lib/feedparser/tests/compression/deflate-not-compressed.z b/lib/feedparser/tests/compression/deflate-not-compressed.z deleted file mode 100644 index ddd282214..000000000 --- a/lib/feedparser/tests/compression/deflate-not-compressed.z +++ /dev/null @@ -1 +0,0 @@ -<feed><title>deflate</title></feed> diff --git a/lib/feedparser/tests/compression/deflate.z b/lib/feedparser/tests/compression/deflate.z deleted file mode 100644 index e68e620e667c073322b750851e86ad64df8d17e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 zcmb=pwb|3#*Eev*iL)oQw}qb4(A3;;>AJqY{&j8hYp3<SuA3Vf7+fvaIe9*G)8>op Onp+<;F|0Yy{|W&9{~EUd diff --git a/lib/feedparser/tests/compression/gzip-not-compressed.gz b/lib/feedparser/tests/compression/gzip-not-compressed.gz deleted file mode 100644 index f74317830c1606bd655fd0af5558793704351d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32 fcmcCXOHEC&vnk0e$w{?KugWa2(TA{Y^uaO!zak55 diff --git a/lib/feedparser/tests/compression/gzip-struct-error.gz b/lib/feedparser/tests/compression/gzip-struct-error.gz deleted file mode 100644 index d4c59941f375babaeada61fadabb84832a7a8407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 zcmb2|=HS@WQsm3TT%4F&kdvxck(<M?+0)zCH*m#?vnRE;g`U#T)ZB3Cy1u^tb#3!& lr}e$An;RJzTrJl*c|LU0=8No_TmS!OU~tY|ZN$L9008V=AWQ%N diff --git a/lib/feedparser/tests/compression/gzip.gz b/lib/feedparser/tests/compression/gzip.gz deleted file mode 100644 index 52a063f73f07f80e394190fd5b51d7fe29f57075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 zcmb2|=HS@WQsm3TT%4F&kdvxck(<M?+0)zCH*m#?vnRE;g`U#T)ZB3Cy1u^tb#3!& lr}e$An;RJzTrJl*c|LU0=8No_TOTtqTyxG{ZN$L9008IrAPE2f diff --git a/lib/feedparser/tests/compression/sample.xml b/lib/feedparser/tests/compression/sample.xml deleted file mode 100644 index d6e8416dc..000000000 --- a/lib/feedparser/tests/compression/sample.xml +++ /dev/null @@ -1 +0,0 @@ -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/encoding/big5.xml b/lib/feedparser/tests/encoding/big5.xml deleted file mode 100644 index 823966bbf..000000000 --- a/lib/feedparser/tests/encoding/big5.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="big5"?> -<!-- -SkipUnless: __import__('codecs').lookup('big5') -Description: big5 -Expect: not bozo and encoding == 'big5' ---> -<rss> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/bozo_bogus_encoding.xml b/lib/feedparser/tests/encoding/bozo_bogus_encoding.xml deleted file mode 100644 index 89638b7bd..000000000 --- a/lib/feedparser/tests/encoding/bozo_bogus_encoding.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="bogus"?> -<!-- -Description: bogus encoding -Expect: bozo ---> -<rss> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/bozo_double-encoded-html.xml b/lib/feedparser/tests/encoding/bozo_double-encoded-html.xml deleted file mode 100644 index b268d6a96..000000000 --- a/lib/feedparser/tests/encoding/bozo_double-encoded-html.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: utf-8 interpreted as iso-8859-1 and re-encoded as utf-8 -Expect: bozo and ord(entries[0]['description']) == 8230 ---> -<rss version="2.0"> -<channel> - <item> - <description>…</description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/bozo_encoding_mismatch_crash.xml b/lib/feedparser/tests/encoding/bozo_encoding_mismatch_crash.xml deleted file mode 100644 index 315980b94..000000000 --- a/lib/feedparser/tests/encoding/bozo_encoding_mismatch_crash.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -SkipUnless: __import__('sys').version.split()[0] >= '2.2.0' -Description: crashes -Expect: 1 ---> -<rss> -<item> -<description><![CDATA[<a href="http://www.example.com/">�</a><a href="&"></a>]]></description> -</item> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/bozo_http_i18n.xml b/lib/feedparser/tests/encoding/bozo_http_i18n.xml deleted file mode 100644 index 5dae79730..000000000 --- a/lib/feedparser/tests/encoding/bozo_http_i18n.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Note: text/xml defaults to us-ascii, in conflict with the XML declaration of utf-8 -Header: Content-type: text/xml -Description: Content-type with no charset (text/xml defaults to us-ascii) -Expect: bozo and isinstance(bozo_exception, feedparser.CharacterEncodingOverride) ---> - -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Iñtërnâtiônàlizætiøn</title> -</feed> diff --git a/lib/feedparser/tests/encoding/bozo_http_text_plain.xml b/lib/feedparser/tests/encoding/bozo_http_text_plain.xml deleted file mode 100644 index 7e0adfe82..000000000 --- a/lib/feedparser/tests/encoding/bozo_http_text_plain.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/plain -Description: text/plain + no encoding -Expect: bozo ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/bozo_http_text_plain_charset.xml b/lib/feedparser/tests/encoding/bozo_http_text_plain_charset.xml deleted file mode 100644 index 89c36e87b..000000000 --- a/lib/feedparser/tests/encoding/bozo_http_text_plain_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/plain; charset=utf-8 -Description: text/plain + charset -Expect: bozo and encoding == 'utf-8' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/bozo_invalid-bytes-with-bom.xml b/lib/feedparser/tests/encoding/bozo_invalid-bytes-with-bom.xml deleted file mode 100644 index 4c1b349fb..000000000 --- a/lib/feedparser/tests/encoding/bozo_invalid-bytes-with-bom.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: Ensure when there are invalid bytes in encoding specified by BOM, feedparser doesn't crash -Expect: bozo ---> -<rss version="2.0"> -<channel> -<title>Valid UTF8: ѨInvalid UTF8: Espa�a</title> -<description><pre class="screen"></pre></description> -</channel> -</rss diff --git a/lib/feedparser/tests/encoding/bozo_linenoise.xml b/lib/feedparser/tests/encoding/bozo_linenoise.xml deleted file mode 100644 index 60903fce0..000000000 --- a/lib/feedparser/tests/encoding/bozo_linenoise.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: unguessable characters -Expect: bozo and entries[0].summary == u'\xe2\u20ac\u2122\xe2\u20ac\x9d\u0160' ---> - -<rss version="2.0"> -<channel> -<item> -<description><![CDATA[ ’<>”� ]]></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/encoding/csucs4.xml b/lib/feedparser/tests/encoding/csucs4.xml deleted file mode 100644 index 6a5e88ae368e4cfde37461ae57cd2c3f799781f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmZQzV6b6eV6bOkV5neVV8~@)V8~%$U{GLSU?^i?U`S<PU?^f>U?^r_V8~=(V8~}+ zV8~-&V6bIiU{GRUU@&B0V9;Y=U@(C4LHa;?Kx&eq>QkV4L1O7hdO`9ab4wW*7+`D@ zs5v0_*fB6La6#Rt$iTp$3&kL@U<L+;Y^b>f3=9mRP<Mgc4zeF)E(lve{Q`0q2*)!p zFn}<~FCf2y^n&~Z@?!~94kWL^z`&pmbr(n;<Oh(sFn5CFG@*V6*$Gku!XP(+`~xx< z*$j|dK;kg{Ab-Nl0QtuS8rC3nAT=QOfZPZ&2jngg8)QBx43Yf=QVY_9ZZ^nFS7@Aq z%z(KaWEQf1P?(@&kR2eqKx#p9Nziz#g3=(dL}++}!Ue<!nGezjat}x^NF3y5kQgY= zL25v0282Oukl#UW2HBAYjaOp^1_mPr1_qFQAoD<KK>mQmJ92seg%8NzAdD=okCa}) Fasc&#IvxN3 diff --git a/lib/feedparser/tests/encoding/csunicode.xml b/lib/feedparser/tests/encoding/csunicode.xml deleted file mode 100644 index aac9a437e38e387498afad922a99dc82a6236f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fCNmT>lrrQoWI|<98I&088SEIi7;G368FU$R8MqjN8L}BN844Ie8S)r% z7*ZLE8HyRK7!<%To*|wglOdO(fFYluh@pf5#MfX@hnog6U!6gdL60GaA)g_iA)BF; zp@0FR0^MeiIxYqmunox!MPNHipgw`v2Qm%SwOkCY3>6Fo45<vs3?*<^LENUmkjIeE zP{N?Vki?MBP{okXpumvGkjIdMB`g#eY#D4B6d2SQN*PKR(in6Z3>nNAk{D7M)ET(I U;Q$E}P}mkj!$%(+(!~sR00Rv^SO5S3 diff --git a/lib/feedparser/tests/encoding/demoronize-1.xml b/lib/feedparser/tests/encoding/demoronize-1.xml deleted file mode 100644 index 8b2345f62..000000000 --- a/lib/feedparser/tests/encoding/demoronize-1.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: using win-1252 character points instead of unicode -Expect: not bozo and entries[0]['description'] == u'don\u2019t' ---> -<rss version="2.0"> -<channel> - <item> - <description>dont</description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/demoronize-2.xml b/lib/feedparser/tests/encoding/demoronize-2.xml deleted file mode 100644 index f96d4549f..000000000 --- a/lib/feedparser/tests/encoding/demoronize-2.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: using win-1252 character points instead of unicode -Expect: not bozo and entries[0]['description'] == u'don\u2019t' ---> -<rss version="2.0"> -<channel> - <item> - <description>don’t</description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/demoronize-3.xml b/lib/feedparser/tests/encoding/demoronize-3.xml deleted file mode 100644 index c54ef84a3..000000000 --- a/lib/feedparser/tests/encoding/demoronize-3.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: using win-1252 character points instead of unicode -Expect: not bozo and entries[0]['description'] == u'don’t' ---> -<rss version="2.0"> -<channel> - <item> - <description>don&#146;t</description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/double-encoded-html.xml b/lib/feedparser/tests/encoding/double-encoded-html.xml deleted file mode 100644 index f98916c9a..000000000 --- a/lib/feedparser/tests/encoding/double-encoded-html.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: utf-8 interpreted as iso-8859-1 and re-encoded as utf-8 -Expect: not bozo and ord(entries[0]['description']) == 8230 ---> -<rss version="2.0"> -<channel> - <item> - <description>…</description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/encoding_attribute_crash.xml b/lib/feedparser/tests/encoding/encoding_attribute_crash.xml deleted file mode 100644 index b270005a2..000000000 --- a/lib/feedparser/tests/encoding/encoding_attribute_crash.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: crashes -Expect: 1 ---> -<rss> -<item> -<description><![CDATA[<img alt="©" />]]></description> -</item> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/encoding_attribute_crash_2.xml b/lib/feedparser/tests/encoding/encoding_attribute_crash_2.xml deleted file mode 100644 index a000acc98..000000000 --- a/lib/feedparser/tests/encoding/encoding_attribute_crash_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: crashes -Expect: 1 ---> -<rss> -<item> -<description><a href="http://example.com"><img src="http://example.com/logo.gif" alt="The image &acirc;&#128;&#156;http://example.com/logo.gif&acirc;&#128;&#65533; cannot be displayed, because it contains errors."></a><br></description> -</item> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/euc-kr-attribute.xml b/lib/feedparser/tests/encoding/euc-kr-attribute.xml deleted file mode 100644 index 0dd608823..000000000 --- a/lib/feedparser/tests/encoding/euc-kr-attribute.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="euc-kr"?> -<!-- -SkipUnless: __import__('codecs').lookup('euc-kr') -Description: euc-kr character in attribute of embedded HTML -Expect: not bozo and entries[0]['description'] == u'<img alt="\ub144" />' ---> -<rss version="2.0"> -<channel> - <item> - <description><img alt="��" /></description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/euc-kr-item.xml b/lib/feedparser/tests/encoding/euc-kr-item.xml deleted file mode 100644 index 29a316da5..000000000 --- a/lib/feedparser/tests/encoding/euc-kr-item.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="euc-kr"?> -<!-- -SkipUnless: __import__('codecs').lookup('euc-kr') -Description: euc-kr encoding in item description -Expect: not bozo and entries[0]['description'] == u'\ub144' ---> -<rss version="2.0"> -<channel> - <item> - <description>��</description> - </item> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/euc-kr.xml b/lib/feedparser/tests/encoding/euc-kr.xml deleted file mode 100644 index 96e110f56..000000000 --- a/lib/feedparser/tests/encoding/euc-kr.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="euc-kr"?> -<!-- -SkipUnless: __import__('codecs').lookup('euc-kr') -Description: euc-kr encoding -Expect: not bozo and feed['title'] == u'\ub144' ---> -<rss version="2.0"> -<channel> - <title>��</title> -</channel> -</rss> - diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_charset.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_charset.xml deleted file mode 100644 index a945704e0..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/atom+xml;charset='us-ascii' -Description: application/atom+xml + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_charset_overrides_encoding.xml deleted file mode 100644 index f587bcc52..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/atom+xml; charset='us-ascii' -Description: application/atom+xml + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_default.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_default.xml deleted file mode 100644 index 6ef0efece..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/atom+xml -Description: application/atom+xml + no encoding -Expect: not bozo and encoding == 'utf-8' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_encoding.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_encoding.xml deleted file mode 100644 index 4b46cab74..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/atom+xml -Description: application/atom+xml + explicit encoding -Expect: not bozo and encoding == 'iso-8859-1' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset.xml deleted file mode 100644 index 5a31ff019..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0"?> -<!-- -SkipUnless: __import__('codecs').lookup('gb2312') -Header: Content-type: application/atom+xml;charset='gb2312' -Description: application/atom+xml + explicit charset -Expect: not bozo and encoding == 'gb18030' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset_overrides_encoding.xml deleted file mode 100644 index bb3c3fcdb..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_charset_overrides_encoding.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -SkipUnless: __import__('codecs').lookup('gb2312') -Header: Content-type: application/atom+xml; charset='gb2312' -Description: application/atom+xml + charset overrides encoding -Expect: not bozo and encoding == 'gb18030' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_encoding.xml b/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_encoding.xml deleted file mode 100644 index ab91a82d4..000000000 --- a/lib/feedparser/tests/encoding/http_application_atom_xml_gb2312_encoding.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="gb2312"?> -<!-- -SkipUnless: __import__('codecs').lookup('gb2312') -Header: Content-type: application/atom+xml -Description: application/atom+xml + explicit encoding -Expect: not bozo and encoding == 'gb18030' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_rss_xml_charset.xml b/lib/feedparser/tests/encoding/http_application_rss_xml_charset.xml deleted file mode 100644 index 8ca929b14..000000000 --- a/lib/feedparser/tests/encoding/http_application_rss_xml_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/rss+xml;charset= 'us-ascii' -Description: application/rss+xml + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> diff --git a/lib/feedparser/tests/encoding/http_application_rss_xml_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_application_rss_xml_charset_overrides_encoding.xml deleted file mode 100644 index 80c214f15..000000000 --- a/lib/feedparser/tests/encoding/http_application_rss_xml_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/rss+xml;charset= "us-ascii" -Description: application/rss+xml + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> diff --git a/lib/feedparser/tests/encoding/http_application_rss_xml_default.xml b/lib/feedparser/tests/encoding/http_application_rss_xml_default.xml deleted file mode 100644 index 781e703e0..000000000 --- a/lib/feedparser/tests/encoding/http_application_rss_xml_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/rss+xml -Description: application/rss+xml + no encoding -Expect: not bozo and encoding == 'utf-8' ---> -<rss version="2.0"> -</rss> diff --git a/lib/feedparser/tests/encoding/http_application_rss_xml_encoding.xml b/lib/feedparser/tests/encoding/http_application_rss_xml_encoding.xml deleted file mode 100644 index 53ee7ff15..000000000 --- a/lib/feedparser/tests/encoding/http_application_rss_xml_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/rss+xml -Description: application/rss+xml + explicit encoding -Expect: not bozo and encoding == 'iso-8859-1' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_application_xml_charset.xml b/lib/feedparser/tests/encoding/http_application_xml_charset.xml deleted file mode 100644 index 2ea8437e2..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/xml;charset= "us-ascii" -Description: application/xml + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_application_xml_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_application_xml_charset_overrides_encoding.xml deleted file mode 100644 index cd314dd04..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/xml;charset = us-ascii -Description: application/xml + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_application_xml_default.xml b/lib/feedparser/tests/encoding/http_application_xml_default.xml deleted file mode 100644 index 309496c66..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/xml -Description: application/xml + no encoding -Expect: not bozo and encoding == 'utf-8' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_application_xml_dtd_charset.xml b/lib/feedparser/tests/encoding/http_application_xml_dtd_charset.xml deleted file mode 100644 index 99bfcba96..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_dtd_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/xml-dtd; charset="us-ascii" -Description: application/xml-dtd + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_dtd_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_application_xml_dtd_charset_overrides_encoding.xml deleted file mode 100644 index fa01fef0b..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_dtd_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/xml-dtd; charset="us-ascii" -Description: application/xml-dtd + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_dtd_default.xml b/lib/feedparser/tests/encoding/http_application_xml_dtd_default.xml deleted file mode 100644 index 390e70e4e..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_dtd_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/xml-dtd -Description: application/xml-dtd + no encoding -Expect: not bozo and encoding == 'utf-8' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_dtd_encoding.xml b/lib/feedparser/tests/encoding/http_application_xml_dtd_encoding.xml deleted file mode 100644 index ae67ce1d6..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_dtd_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/xml-dtd -Description: application/xml-dtd + explicit encoding -Expect: not bozo and encoding == 'iso-8859-1' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_encoding.xml b/lib/feedparser/tests/encoding/http_application_xml_encoding.xml deleted file mode 100644 index 771663f96..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/xml -Description: application/xml + explicit encoding -Expect: not bozo and encoding == 'iso-8859-1' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_application_xml_epe_charset.xml b/lib/feedparser/tests/encoding/http_application_xml_epe_charset.xml deleted file mode 100644 index 52ef00245..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_epe_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/xml-external-parsed-entity; charset="us-ascii" -Description: application/xml-external-parsed-entity + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_epe_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_application_xml_epe_charset_overrides_encoding.xml deleted file mode 100644 index ce10433eb..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_epe_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/xml-external-parsed-entity;charset=us-ascii -Description: application/xml-external-parsed-entity + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_epe_default.xml b/lib/feedparser/tests/encoding/http_application_xml_epe_default.xml deleted file mode 100644 index 85af85963..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_epe_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: application/xml-external-parsed-entity -Description: application/xml-external-parsed-entity + no encoding -Expect: not bozo and encoding == 'utf-8' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_application_xml_epe_encoding.xml b/lib/feedparser/tests/encoding/http_application_xml_epe_encoding.xml deleted file mode 100644 index 4085fa286..000000000 --- a/lib/feedparser/tests/encoding/http_application_xml_epe_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: application/xml-external-parsed-entity -Description: application/xml-parsed-entity + explicit encoding -Expect: not bozo and encoding == 'iso-8859-1' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_encoding_attribute_crash.xml b/lib/feedparser/tests/encoding/http_encoding_attribute_crash.xml deleted file mode 100644 index 19c9dd636..000000000 --- a/lib/feedparser/tests/encoding/http_encoding_attribute_crash.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- -Header: Content-type: application/atom+xml -Description: crashes while resolving relative URIs when content contains attributes which contain (valid) non-ASCII characters -Expect: not bozo ---> -<feed xmlns='http://www.w3.org/2005/Atom'> -<entry> -<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'> -<img alt="Browser market shares at ‘ongoing’" /> -</div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/encoding/http_i18n.xml b/lib/feedparser/tests/encoding/http_i18n.xml deleted file mode 100644 index e61ad6ae4..000000000 --- a/lib/feedparser/tests/encoding/http_i18n.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Header: Content-type: application/xml -Description: application/xml with no charset (control for tests/illformed/encoding/http_i18n.xml) -Expect: not bozo ---> - -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Iñtërnâtiônàlizætiøn</title> - <link rel='alternate' type='text/html' href='http://example.com/'/> - <modified>2004-06-02T19:07:55-04:00</modified> - <tagline>If your parser thinks this is well-formed, it's right.</tagline> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_atom_xml_charset.xml b/lib/feedparser/tests/encoding/http_text_atom_xml_charset.xml deleted file mode 100644 index bffafae6b..000000000 --- a/lib/feedparser/tests/encoding/http_text_atom_xml_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/atom+xml;charset='us-ascii' -Description: text/atom+xml + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_atom_xml_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_text_atom_xml_charset_overrides_encoding.xml deleted file mode 100644 index be4fbf9ee..000000000 --- a/lib/feedparser/tests/encoding/http_text_atom_xml_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/atom+xml; charset='us-ascii' -Description: text/atom+xml + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_atom_xml_default.xml b/lib/feedparser/tests/encoding/http_text_atom_xml_default.xml deleted file mode 100644 index 2d3088f73..000000000 --- a/lib/feedparser/tests/encoding/http_text_atom_xml_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/atom+xml -Description: text/atom+xml + no encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_atom_xml_encoding.xml b/lib/feedparser/tests/encoding/http_text_atom_xml_encoding.xml deleted file mode 100644 index f3a25faa5..000000000 --- a/lib/feedparser/tests/encoding/http_text_atom_xml_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/atom+xml -Description: text/atom+xml + explicit encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_rss_xml_charset.xml b/lib/feedparser/tests/encoding/http_text_rss_xml_charset.xml deleted file mode 100644 index 88aa41761..000000000 --- a/lib/feedparser/tests/encoding/http_text_rss_xml_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/rss+xml;charset= 'us-ascii' -Description: text/rss+xml + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> diff --git a/lib/feedparser/tests/encoding/http_text_rss_xml_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_text_rss_xml_charset_overrides_encoding.xml deleted file mode 100644 index 84436b53c..000000000 --- a/lib/feedparser/tests/encoding/http_text_rss_xml_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/rss+xml;charset= "us-ascii" -Description: text/rss+xml + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> diff --git a/lib/feedparser/tests/encoding/http_text_rss_xml_default.xml b/lib/feedparser/tests/encoding/http_text_rss_xml_default.xml deleted file mode 100644 index d7a90255c..000000000 --- a/lib/feedparser/tests/encoding/http_text_rss_xml_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/rss+xml -Description: text/rss+xml + no encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> diff --git a/lib/feedparser/tests/encoding/http_text_rss_xml_encoding.xml b/lib/feedparser/tests/encoding/http_text_rss_xml_encoding.xml deleted file mode 100644 index a786e7eb6..000000000 --- a/lib/feedparser/tests/encoding/http_text_rss_xml_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/rss+xml -Description: text/rss+xml + explicit encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_text_xml_bogus_charset.xml b/lib/feedparser/tests/encoding/http_text_xml_bogus_charset.xml deleted file mode 100644 index 09997938a..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_bogus_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml; -Description: text/xml + bogus charset -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_text_xml_bogus_param.xml b/lib/feedparser/tests/encoding/http_text_xml_bogus_param.xml deleted file mode 100644 index b76cc1f5f..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_bogus_param.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml; charset:iso-8859-1 -Description: text/xml + bogus parameter -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_text_xml_charset.xml b/lib/feedparser/tests/encoding/http_text_xml_charset.xml deleted file mode 100644 index 3917214ed..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml;charset= "us-ascii" -Description: text/xml + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_text_xml_charset_2.xml b/lib/feedparser/tests/encoding/http_text_xml_charset_2.xml deleted file mode 100644 index aac1bec9a..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_charset_2.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -SkipUnless: __import__('codecs').lookup('windows-1252') -Header: Content-type: text/xml; charset=windows-1252 -Description: text/xml + explicit charset (this one is harder than the others) -Expect: not bozo and entries[0]['description'] == u'This is a \xa3\u201ctest.\u201d' ---> - -<rss version="2.0"> -<channel> -<item> -<title>Foo</title> -<link>http://purl.org/rss/2.0/?item</link> -<description>This is a ��test.�</description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding.xml deleted file mode 100644 index 5b05f6b31..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/xml;charset = us-ascii -Description: text/xml + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding_2.xml b/lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding_2.xml deleted file mode 100644 index 0a0eed406..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_charset_overrides_encoding_2.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version='1.0' encoding='iso-8859-1'?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1252') -Header: Content-type: text/xml; charset=windows-1252 -Description: text/xml + charset overrides encoding (this one is harder than the others) -Expect: not bozo and entries[0]['description'] == u'This is a \xa3\u201ctest.\u201d' ---> - -<rss version="2.0"> -<channel> -<item> -<title>Foo</title> -<link>http://purl.org/rss/2.0/?item</link> -<description>This is a ��test.�</description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/encoding/http_text_xml_default.xml b/lib/feedparser/tests/encoding/http_text_xml_default.xml deleted file mode 100644 index eb7236f50..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml -Description: text/xml + no encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/http_text_xml_epe_charset.xml b/lib/feedparser/tests/encoding/http_text_xml_epe_charset.xml deleted file mode 100644 index 2552bedf8..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_epe_charset.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml-external-parsed-entity; charset="us-ascii" -Description: text/xml-external-parsed-entity + explicit charset -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_xml_epe_charset_overrides_encoding.xml b/lib/feedparser/tests/encoding/http_text_xml_epe_charset_overrides_encoding.xml deleted file mode 100644 index 353429e10..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_epe_charset_overrides_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/xml-external-parsed-entity;charset=us-ascii -Description: text/xml-external-parsed-entity + charset overrides encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_xml_epe_default.xml b/lib/feedparser/tests/encoding/http_text_xml_epe_default.xml deleted file mode 100644 index 7f5c0ee5f..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_epe_default.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml-external-parsed-entity -Description: text/xml-external-parsed-entity + no encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_xml_epe_encoding.xml b/lib/feedparser/tests/encoding/http_text_xml_epe_encoding.xml deleted file mode 100644 index b85e3bca1..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_epe_encoding.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Header: Content-type: text/xml-external-parsed-entity -Description: text/xml-parsed-entity + explicit encoding -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/http_text_xml_qs.xml b/lib/feedparser/tests/encoding/http_text_xml_qs.xml deleted file mode 100644 index fa5f346bc..000000000 --- a/lib/feedparser/tests/encoding/http_text_xml_qs.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0"?> -<!-- -Header: Content-type: text/xml; qs=0.9 -Description: text/xml + qs value -Expect: not bozo and encoding == 'us-ascii' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/iso-10646-ucs-2.xml b/lib/feedparser/tests/encoding/iso-10646-ucs-2.xml deleted file mode 100644 index e2d2e93ab55e9eb184caec1f2ce33a5f164dcb03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fW-=5r<TL0p7%~_zm@$|zm@()wlrkhU6f@{D7%?a@*fZEMa5300C^G0W z=rV9I1T$naWHJ;mgfiqY<S?W%6f+bvSTQJoVLU@TLncEmLjglRLlHv>1BkD|pboV& z6>O?HgC>I>Lk>eeLq0<`Ln%W614spaSAg_zF}Q$jOJ*nn+g}3pA;fO{`necf87deG z7(gy4fx8ysW(9^khJ1z+1_g#BhJ1!9hI|GEhD3%uh7>H}rNCgzV9TJupw3XrP{NP~ g4mC4|B!*N5bp|eQ_&~x66#m7~aMK6JMlpjO0F%o=5dZ)H diff --git a/lib/feedparser/tests/encoding/iso-10646-ucs-4.xml b/lib/feedparser/tests/encoding/iso-10646-ucs-4.xml deleted file mode 100644 index c111659647cb9a3f18b2330ded1df7cb82f0e77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 zcmZQzV6b6eV6bOkV5neVV8~@)V8~%$U{GLSU?^i?U`S<PU?^f>U?^r_V8~=(V8~}+ zV8~-&V6bIiU{GRUU@&B0V9;Y=U@(C4LHa;?Kx&eq>QkV4L1O7hdO_xa%mtaL3pER5 zju`_3g9!rz1BeERmohLgfXo7^1@S?0AiF_swqsym;DY)=k%55$BoD$Mv0w%UhHR+a z1q=)fp-{Jj{0DL)$UG3Xg8CQab`XwdU|;}Yko!R40n!U{BPbk7pmHF24F(1Vb*S4w z@*sbL%!RoXB&P`tACR3OH6RRf6Ua{>b75wH>;kz3BoA^wC|rpR3z$71Kf6HV3}hC_ z9UwP@%mayy6(vI7(s$o>Y2gY<ypNVOkiuPZeDfb4;V0mwdNJ3wKJjzR7K*$Gk$ zl1qZ7nJOp^5=(@}8z_81e31DdeIWmV^n%1e?gxp1(icb#D1Cx3hz$xKP<VsvNQ0&k pV+IBWBL)TrkbNNYKx#n#0Qnt+k<%3@3_)Q7!pP$KNO=P+2LSO>KotN0 diff --git a/lib/feedparser/tests/encoding/no_content_type_default.xml b/lib/feedparser/tests/encoding/no_content_type_default.xml deleted file mode 100644 index cab1544e2..000000000 --- a/lib/feedparser/tests/encoding/no_content_type_default.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: no content-type and no encoding -Expect: not bozo and encoding == 'utf-8' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/no_content_type_encoding.xml b/lib/feedparser/tests/encoding/no_content_type_encoding.xml deleted file mode 100644 index 6ad16c691..000000000 --- a/lib/feedparser/tests/encoding/no_content_type_encoding.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- -Description: no content-type + explicit encoding -Expect: not bozo and encoding == 'iso-8859-1' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/encoding/u16.xml b/lib/feedparser/tests/encoding/u16.xml deleted file mode 100644 index 3110f17a894a86dd2590c8ef61f8ce83bd186df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fmNFPJm@z0Z*fZEMa5300C^G0W=rV9I1T$naWHJ;mgfiqY<S?W%6f+bv zSTQJoVLU@TLncEmLjglRLlHv>1BkD|pbj-Vl_8m-m_eOElR=LmhasOKpCOx}l%aqD zqyl0aNREra1#D_ELlM}X5~zzIc0kl|F}N~RFcdI=Oe}%h4snA5LmopuLkWWdLlQ$i zLlr|lg91Y$Lmop47Jn)**fQ8MC@`oqlroesq%r7%{hY**%An4`1@<q*@1SrihK7Sa JI24N+>;O(THMIZ$ diff --git a/lib/feedparser/tests/encoding/ucs-2.xml b/lib/feedparser/tests/encoding/ucs-2.xml deleted file mode 100644 index d4e3defb7cdb42eed79930cc8d3e00fdf7568950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fmNFzW6f@{D7%?a@*fZEMa5300C^G0W=rV9I1T$naWHJ;mgfiqY<S?W% z6f+bvSTQJoVLU@TLncEmLjglRLlHv>1BkD|pbj-Z6>O?HgC>I>Lk>eeLq0<`Ln%W6 z14sqJMvy!ggA3T?WQHQJT_sSLL+nAQ<zjGUs9-2y0GV6@cLl^P3JiG+`3xlt3JggM z`3zMI`3wpSi41uRDOmihz+lT@%b>uZ&QQuw!jQ(G%V5Z0#*oC2%An4`1@<>23_xL6 O3=I!`aEKN&*Z}}wNH`w= diff --git a/lib/feedparser/tests/encoding/ucs-4.xml b/lib/feedparser/tests/encoding/ucs-4.xml deleted file mode 100644 index 143fdcad223d42c8df449097004357c1ab9a95e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 724 zcmZQzV6b6eV6bOkV5neVV8~@)V8~%$U{GLSU?^i?U`S<PU?^f>U?^r_V8~=(V8~}+ zV8~-&V6bIiU{GRUU@&B0V9;Y=U@(C4LHa;?Kx&eq>QkV4L1O7hdP^A?7(i-3X6rIA zFqlBi0J+7Efq{Vw>NZ6N1_qEk2!q6e85kI{p=K5^FffEd-2`$s$Zn8%AZ!Ko2gpqz z9M8bO0Ky=Dfcy#43-S-he<e^kkh}&11A{u$Z6JA&`$6Wy+zOJ@g!&s~CrAwlgWLr2 z6Ubbc86ZAPAISY6Kf?5b{Ne%)V~~46>OgJ*xesIp$W0(N$ZSy9A^QiLxghggq45aP z4|6lf9Av$qut3Kk^Fj82)Pm%apmA3Pr9one&~OHY2Z#?cAEXcDZjfG(ILN&qF;F~% z)PT|n2!q%le}mi&vLg)|r^XBn3`PtL3?TbJ=7H3J`~eCp5JpZ1ps)dj69^-V>m#L6 Gup9u9PB<d~ diff --git a/lib/feedparser/tests/encoding/utf-16be-autodetect.xml b/lib/feedparser/tests/encoding/utf-16be-autodetect.xml deleted file mode 100644 index 08976b7a5b5813987b2cde40db9010b1991f1edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fmNJwuq%r6+7&4eKC^6VG*fDT1*f1zE=rZUsa4`fkWHV$k6flG`<T2zh zq%ssU6f;;cD1c!+Lp(z!LoP!BLq0<hLkR<jufd=WwIP)unW30Lok5d9k0FO4pCO+i zo1v7UfB~ce+0G<}RIn;81{bjT$qYqc8%v-*fY=t!kjjw5ki(D$wkww*l_7;efgzM3 zguxB!b_E6vhC~LC$sqrwGL$fYTmT|LDiaxs859_t7%~~s859^?8S=nkkjRk7pvl0+ z;L1?JPykgAu@B-y5Sho2&rrgkz>vg{&rrpX&!E5n(giXTJv0><Y#D4B6d2UOu7HIp Y#D84i@PvddD0YgW;j9mit6~N_0M-phV*mgE diff --git a/lib/feedparser/tests/encoding/utf-16be-bom.xml b/lib/feedparser/tests/encoding/utf-16be-bom.xml deleted file mode 100644 index 1f629657d1e9a220e9c86141a881b482d10df6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmezOpTUN~o}q#vmm!BifuW2cm7$2Cm?4uPpCOOImO+WZkU@{ZfI*2tfgzP4k0F^M zpCN@IlOc~G9V}bQP{NSLpvz#$V8)=tV9#L3z{Oz0pva)hpv%C;5X_LxkjYTM5Xz9p zki(G5P|Q%wV8x&ShVcyX44DkM3<V7N3`Gnj3?RM+gF4iPREA`RVg_{vO$I%N9EN;` ze1>d>QicKskP2iwlNeILs<;?jz~(126oG9lf%*VqTR1~1Lk>d@LmJqwT!vJJ6b1!` zP=*i&H>lec7|Izk8A=#37!(+s7%CY`7*ZJ&82lNE7*fC?qQKzGkjPNPkj<dLpuyn8 zkjaqFpuphDkOvNpM20*DO$IIoSB46P0tS%VOW^*5_*Q`-k0GC-gh7EJi6Nh%iXopt rfdQlo<PP+3Rba4Xuw_tSP-npODHk|oA)yS4r($S`>w{yhn86MJ8|_M{ diff --git a/lib/feedparser/tests/encoding/utf-16be.xml b/lib/feedparser/tests/encoding/utf-16be.xml deleted file mode 100644 index c9a0f145d5762cb728e8301dd9de11a542b7fb25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 448 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fmNJwuq%r6+7&4eKBr&8iC^6VG*fDT1*f1zE=rZUsa4`fkWHV$k6flG` z<T2zhq%ssU6f;;cD1c!+Lp(z!LoP!BLq0<hLkR<jufd=WwI!7ynW30Lok5d9k0FO4 zpCO+io1v7UfB~ce-CmF?E(RB{`N<4LU>i%IzJS;k&XCHG!;r&}2DU4gA(bJ8L4hHZ zA%wvV>V5?V4Tcm3kgYiki3~+h6^RVR3<?ZR44Dk+3<?ac40&MxCo<$QXfkjyxH42Q z6oB=Vz<mYrn*u`~Lq0<Zg91YmLq0<lLq3B714tLhR`ifmV6bJdWl&&HXTbCq7dRXt SVG4?wVrcm4gX5`~!43eCB1U5X diff --git a/lib/feedparser/tests/encoding/utf-16le-autodetect.xml b/lib/feedparser/tests/encoding/utf-16le-autodetect.xml deleted file mode 100644 index 60938826761b28a2527dd4cabff921a2eb935730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmcCvuxF@X$Ysc3P+%xyNM$HuC}zlH$Y;o7uw_tUFl5kUFknz(P+&-9$YV%m$Y)4l z$YjW4NC(T7GL$f+G3YWFGMF(aG1xQMF>o>1FeozUGUzgJF$6PYGh{LpFoZJXG2}3$ zG88iuGgvVwfMGmCJVPc!E<*uBK0^^h2?L0)!JrPcA(bJSp_oCPL6bp`A%`KKA)g_e zp_HM30i*)iPLQb}Ra^`%VDpn1ioiCOKz#tQEu0~hA%`J{Aq{L-E<-9q3WEYeC_@N? z8`SLz3>plH3?P$1{!3*jVF0-RM1oW%G88i?F!(TJGL$fsfPJFC;L4B(4v9pDJO)h$ zE(TYI3WfrxE{LrVe}c$7hJ1z+1_g#BhJ1!9hI|GE29Pe0$>?FKz+lT@%b>uZ4t5JH YWFfxf0*5Ljgh6ps3=M64aEyU?03v2c(*OVf diff --git a/lib/feedparser/tests/encoding/utf-16le-bom.xml b/lib/feedparser/tests/encoding/utf-16le-bom.xml deleted file mode 100644 index 89cb4f776ad403ac77e10c847c7efa18d4a18dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmezW&xXOCp@JcoA%{VMp^PDwp@^ZFA(J7WA&<e9L5abTL65<JL5V?uA(bJIA(<hc zA%!86A&(&)EL+M@!jQ(G%V5Z0#-PMt&tS*E#bCpr$e_!h%fQ7D%#h8H$xy%$%8<v9 z!;s2Q%uvi=#h?I&@eJ_{nGCrM1q}HNMGPejAif5JI@E?#hGd3f26YBa20exxhJ1#6 zhHQpXh5`nV3S>J$rh-&)F}Q%uPi80r+gJki0mQa&hE#?eh8%`8uwA(fsSGI$3JjqP zAq;L%w<|D|Gh{N9Fk~<&FgP((GL$f+GAJ<kGZZnTfI~!q!IvSCp@<=yL4iSo!3V6i z1negT23LkWaF`@A<S}S6a51<tR4^1UfP7E__btTF3JiG+`3xlt3JggM`3zMI`3wpS oAYCBWpogvkgDrzCg93v(1Eznuz~KuCYfx+zL&IGk9Csid0DXc?7ytkO diff --git a/lib/feedparser/tests/encoding/utf-16le.xml b/lib/feedparser/tests/encoding/utf-16le.xml deleted file mode 100644 index ec8effdc8838c2a5d7470ccb102c4b61ccd01c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmcCvuxF@X$Ysc3P+%xyNM$HuC}zlH$Y;o7uw_tUFl5kUFknz(P+&-9$YV%m$Y)4l z$YjW4NC(T7GL$f+G3YWFGMF*sFr+dlG1xQMF>o>1FeozUGUzgJF$6PYGh{LpFoZJX zfmIYU6f;;cD1c!+Lp(z!LoP!BLq0<hLkR<jufd=WwI!7ynW30Lok5d9k0FO4pCO+i zo1v7UfB~ce-CmF?E(RBdREA=PWQHQJjU`ZDKx_+VNM*=j$YDqW+m*|Z%8<gKz!1t1 z!r%sVzXF2>Lka`P)*OaJh9annM22Dp1qL66OokGM60i>x7+e|hz@d=HkjJ3Oz{TLo zP{B|D)>#7g8^nhS40#Os3?&Q-3`q?63{?#I3<?Y&T_C&B!&8C5mcf=mfkB-C(|26p T(1e66D1M5ep{x&%Ef5a?<p@XJ diff --git a/lib/feedparser/tests/encoding/utf-32be-autodetect.xml b/lib/feedparser/tests/encoding/utf-32be-autodetect.xml deleted file mode 100644 index deabb603eee30b20ad973937db10f69f51f2a7d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 904 zcmZQzV6b6eV6bOkV5neVV8~@)V8~%$U{GLSU?^i?U`S<PU?^f>U?^r_V8~=(V8~}+ zV8~-&V6bIiU{GRUU@&B0V9;Y=U@(C4LHa;?Kx&eq>QkV4L1O7hdP^A?7)lrz7}6LR z7<3sJ7>pSh7>uCifZSupz`(!-b)O<s4M-hGESQ0TAscFL0Rsa=DAZjbw}b2lxfg`3 zpnd_l3xwkt7#Khp<QI@%L3%-c0{Ic-7LXhWYcMb{s53AyAo~GiE{G2@7bK?%^*hK; zkQpEhaudj3Aah}6fcPM@(fyeO4PTg9Ab+_)#Xxp|>;kz9<W`V*ATvO0kUgNVMD|-a zR3FGKAPlk#qz<GX<WG>>LGb_z15j9nFfcH<LBkXl?jSjkn-dur7+`J&nE}!V(hss9 zM1$M~V}s;C`apU>ZU(WPpz#8VYY^WR8aE)dAoqjRg4_=ZKaih6@}RT_@*}eO$o>PF zgN{LFfZPXi3rG$Wo*;e|G~I#3V0MA*2Ju1WgY<#?08$GQ2e}C(26HbcZG$jKJt%Hq pVF3zLQ2K*~7sx)4c_1|)e}Lpb7&+a7!XFeaAdD=okCd;#asXE^M_T{@ diff --git a/lib/feedparser/tests/encoding/utf-32be-bom.xml b/lib/feedparser/tests/encoding/utf-32be-bom.xml deleted file mode 100644 index f09e8aefd67aeda483feb59d39100d59dcfb420e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmZQz`1hZIfx(7>fx(`EfuVwdfgzWHfgy*1fkA<RfuW3nfgzQFfuV?jfuWdzfgzKD zfgzuPfgz89fx(u6fkBCZfx(c0fkBUffx!UE2k8Up0jWubs!xIH1&O62=`CeoU?^c= zU`S(NV9;e?U@&H2U@(H319FcY0|NsW)P0IjH6V2$v0w%UhHR+01q=)fp-^{$+zzrI z<X#ZAg8BvIE)b4qU|;}YkY7N41?dI(3FJqRTR?Iktiiy*pw7U+fb0j5xgb8sT#%e5 z)bAiWL1ut3$W0)Bfy{-O0pf$qM)zkDG<;!Zf&AqH6$9A;vJ2!ckXu3Kfy@B0LH2;c z64`IzP<<e`fH24|kUEflkUv3g2gL&@3_xKO!oa}b1`ShKxP#=%p<xQLD+3yKP7DkT zmC(2XnFCVi4^0;!GeKe?dqCp83=9m3P&rUofW$!I05SvQc2N9-#9X2A1=0@^2k8O% z2^6NFZ~)1J(j&;<AoD?C0df<vpF!rJV~`mje}mM5<UnBz;#Wb_B1jBo7szf9A7nmA zAIJ`nT97!%O&~FtdqL?PghA>-@kLCWg8TtWuON(^mO)_!ieC^$7T1S{8%P|4?Eu~u BN}vD$ diff --git a/lib/feedparser/tests/encoding/utf-32be.xml b/lib/feedparser/tests/encoding/utf-32be.xml deleted file mode 100644 index f912031039b3b7700391b9a1531c7d04fb354a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmZQzV6b6eV6bOkV5neVV8~@)V8~%$U{GLSU?^i?U`S<PU?^f>U?^r_V8~=(V8~}+ zV8~-&V6bIiU{GRUU@&B0V9;Y=U@(C4LHa;?Kx&eq>QkV4L1O7hdP^A?7)lrz7}6LR z7<3sJ7>pSh7>pPg7?Pm&g3JfG%Z`D8feY$RMW|YkdXQK!0|P@g)cgVl28K|m`#^pG zxdY^G5VnH)3FJNyj%Q$C0AY}yKz;`41^Er+SCE@Pav-e1z`&r+z`%g)7m&FiKFC~< zoF+63Kz4%60AY}uK>h=n3o`@62bqn_zc8~v{&Ina0mu%JT_AUX+zK)eWCn;0vIi8V z$bJil>I1n2gh6(J)PeMa{0VY9C_X@801B%R1_lN<XqdvnA0!8IGe{jsJ;;8LS&7iJ z01^Yqfz*M-KyC!FouKgmienJp6&e>HwIKI`)Pmd#3NMf!LGqw92l5lhOprYwzajev zWDYt8nE~<>NG(VXlwLsmDrkBGiNWjw*$v`@%m?WM*#S}u5(l{nBnERYC{2SfNIfVn gh>0(dKR{^_gpt!JD7-=80>a4R`p_^0iG#2m0M435TL1t6 diff --git a/lib/feedparser/tests/encoding/utf-32le-autodetect.xml b/lib/feedparser/tests/encoding/utf-32le-autodetect.xml deleted file mode 100644 index 37fd72a64934d76635c9d70c729326812a20b243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmcCvU|_IkU|^_VU|`5)U|`5$U|>*SU|=X?U|>jPU|=X>U|=X_U|`5(U|`5+U|`5& zU|_IiU|>*UU|=w0U|`T=U|=wS@<IAQdO&KDq3TnhdO>38NP0^d7#K<z7#PwR7#MUJ z7#NHh7#NJ8=78K|$H2hA#lXM-a-Skp4M-hGESQ0TAscFL0Rsa=DAZjbw}b2lxfg`3 zpnd_l3xwkt7#Khp<QI@%L3%-c0{Ic-7LXhWYcMb{s53AyAo~GiE{G2@7bK?%^*hK; zkQpEhaudj3Aah}6fcPM@(ftY12Qm|87RX;N&@czt0kR9^E|6P6=7G!ru|f8L!V=kU z;ZS`bGeH<+7f2mQKggdTdqD933IkABg)lHMxIx1d7VaQ9ked@37#Lt~2AKiU2htC+ zA4G%P1!IHcK>9#>KyC)HeW39IQUk&u_ki?)<XoZg1kwlc3rHWxFQBjl`5z<?N{1l- zg7m=bLiQ`j9CQpa1LRhaeIU6cXxgiS(jYOIT_C$be31DdeIPqPdO_kKH-W@J=@g^} wl+HmI#0JF^EL=e03rdTyu!H##qz2><kQ@jjr(sZBfWiobk;V0q@)%4G05;S}%K!iX diff --git a/lib/feedparser/tests/encoding/utf-32le-bom.xml b/lib/feedparser/tests/encoding/utf-32le-bom.xml deleted file mode 100644 index c62cae4039b2659b45eaeb949896ddad88563ffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmezWkAcC4fq}uEfq|idfq@~Hfq@~1fq_ARfq|infq@~Ffq|ijfq|izfq@~Dfq@~P zfq@~9fq}u6fq_AZfq}u0fq_Affq}sQ$_MEK=>e%phN@42>II3VBk3(=U|=X=U|>jN zU|`T?U|=w2U|=wUngeo=9RmXc7X!q7icmEmbs(`|1_p*~sJR6U3=E-AcY)jvvLEDL z5VnH)1>`Oej%Q$C0AY|{Kz;@31^Ef&N03`Uav-e1z`&r+z`%g)2avfSKFC~<oF>%o zAUi>3fH25SAb)|(g_!~3gUm+vCrBU2Oqf|9f4M-z9ApQ`E|9xGZUvbKG6Td0*#ino zWWR+&^?}R;VUS%Qbs+s9e}e1*#RDh|Kw%Zaz`)=J4O3XSgXGGgVG6P<0~&Tt3=9mF z(6|Db15)P?O&1_DL1G|#K;pg(3=D}-IZ#-D#6aQTgJdqqY>*p4`atro(6|Gc1@a$A zKgfTe@CAhlNFJ0nL16&W0}2<A8OZ(znS+i&W`M!~q!uKX1Wk`sP#Po#vkPQ5hz~L! zqz_~VNH0hn<R*|9DD8sOfYLq)gV><BBPM=9{s5(25Jpbdpl}1lH3%b%>qEm3Bo4wL FIRNdFOb`G7 diff --git a/lib/feedparser/tests/encoding/utf-32le.xml b/lib/feedparser/tests/encoding/utf-32le.xml deleted file mode 100644 index 4b83b240f5350c646ef41222282d5e7f84000698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908 zcmcCvU|_IkU|^_VU|`5)U|`5$U|>*SU|=X?U|>jPU|=X>U|=X_U|`5(U|`5+U|`5& zU|_IiU|>*UU|=w0U|`T=U|=wS@<IAQdO&KDq3TnhdO>38NP0^d7#K<z7#PwR7#MUJ z7#NHh7#NJ8_Jhm-nGbT89RmXc7Xt$W$eoH%wIKB%v0w%UhHR+$1q=)fp-}gM`~Wfo z<ZckQg8B*MJ`j#)U|;}Yke@()2I&R)4dhpln?Q0Ptiiy*pw7U+fb18Lxgb8sT#%e5 zGz>s?g3JJ6kefjM1DOjm1H=cJjmy6<vq1iGfrdTE4v<|ScY)jrG7n@1hz+s_6sE|2 z3y10hxdntlc7fD^^n?5fayuwKKw$t1s}KeT1~+J!!onXU2XZq=9Y{UMevny-(6j&& z1IdBZfy6*=1hIXf@c?ok2!r&1)Pm$(q45IJ2XZ?|AIR;XumkxQBo9h|Ape2%fb0aB zf$TSsIp`Q<2FQOPwII19Xqu~n(jYOIT_C$be31DdeIPqPdO_kKH-W@J=@X;|l)gb2 l#0JF+F>wd-2Pj>FFmjp&g*_;YKp0tE9~zz@aS#T{0RX&rN7VoT diff --git a/lib/feedparser/tests/encoding/utf-8-bom.xml b/lib/feedparser/tests/encoding/utf-8-bom.xml deleted file mode 100644 index 079031567..000000000 --- a/lib/feedparser/tests/encoding/utf-8-bom.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -SkipUnless: __import__('codecs').lookup('utf-8') -Description: Wellformed UTF-8 with Byte Order Mark -Expect: not bozo and encoding == 'utf-8' ---> -<rss> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/utf16.xml b/lib/feedparser/tests/encoding/utf16.xml deleted file mode 100644 index 053b03e347ca6a3d4a6d8140979ba3b5acf4735d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fmNJwuq%jyWm@z0Z*fZEMa5300C^G0W=rV9I1T$naWHJ;mgfiqY<S?W% z6f+bvSTQJoVLU@TLncEmLjglRLlHv>1BkD|pbj-Zl_8m-m_eOElR=LmhasOKpCOx} zl%aqDqyk|hNS=$q1#EIMLlM}n5~#}|_8`=9F}N~RFcdI=OfG@D0^$}0hCGIRh7tw^ zh9ri3hAM`91_g#hhCGH8EPhsCuw}4iP+(AJfS9cd_InaTDuX%$7uesBFaU*NF*H2% K!691AU<UwwYB)mx diff --git a/lib/feedparser/tests/encoding/utf_16.xml b/lib/feedparser/tests/encoding/utf_16.xml deleted file mode 100644 index 63dd6a69268571f28b86daed795de7b18af25010..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmZRuVX$YYV8~_2VNhTwV@PEvVkl<FWXNa8W3XjVVlZUTV=!P)Vo+d6WyoVlX2@qq zVaR02V@L<fmNJwuq%p)Z7&4eKC^6VG*fDT1*f1zE=rZUsa4`fkWHV$k6flG`<T2zh zq%ssU6f;;cD1c!+Lp(z!LoP!BLq0<hLkR<jufd=WwIP)unW30Lok5d9k0FO4pCO+i zo1v7UfB~ce*-nrOE(RB{*~tt=VB1Qdu7}u!teT6#m7#*6fB|HB3EU+R_b4#rG2}Cp zFeor2G2}B;G2}BSFeEbMF{EJexdMYNgDrysgE|AmbX~CjlNeGN)ET(IeusnuC?t!a MVWJNX*J1`c0RA{RU;qFB diff --git a/lib/feedparser/tests/encoding/utf_32.xml b/lib/feedparser/tests/encoding/utf_32.xml deleted file mode 100644 index 7489048375233332b0547314e1fe96840a2454c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmZQzV6b6eV6bOkV5neVV8~@)V8~%$U{GLSU?^i?U`S<PU?^f>U?^r_V8~=(V8~}+ zV8~-&V6bIiU{GRUU@&B0V9;Y=U@(C4LHa;?Kx&eq>QkV4L1O7hdP^A?7)lrz7}6LR z7~&Zi7>pSh7>uCifZSupz`(!-b)O;w1A{IUgT#Uv7#Oml<`yt8FoZ(g1#&ycevo@X z*b3?wkh?$_WDf{~`~vbTNH54wAU}fK0+It^4F(1Vbp{3oWIuq+1@S@Vg5)%zeh1kJ zG6RG`ZUXrWWG>7M5FcbVx<6rNfc)bE4Qr6uAUi<r0l5)m4oEME4Kg1ThRA-xWj4r6 zS7@Aq%z(KaWEQf1P?(@&kR2eqKx#p9Nziz#g3=(dL}++};ugdQnGezjayv*bNF3y5 zkQgY=L25v0282Oukl&Hr4vJe?{DbTRnFmq>@&`x`gptz&D11O+1;WVU`bg;&EC&F& C5II-? diff --git a/lib/feedparser/tests/encoding/x80_437.xml b/lib/feedparser/tests/encoding/x80_437.xml deleted file mode 100644 index 747bffe65..000000000 --- a/lib/feedparser/tests/encoding/x80_437.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="437"?> -<!-- -SkipUnless: __import__('codecs').lookup('437') -Description: \x80 character in 437 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_850.xml b/lib/feedparser/tests/encoding/x80_850.xml deleted file mode 100644 index 89b51ddf0..000000000 --- a/lib/feedparser/tests/encoding/x80_850.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="850"?> -<!-- -SkipUnless: __import__('codecs').lookup('850') -Description: \x80 character in 850 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_852.xml b/lib/feedparser/tests/encoding/x80_852.xml deleted file mode 100644 index 1fb1898e0..000000000 --- a/lib/feedparser/tests/encoding/x80_852.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="852"?> -<!-- -SkipUnless: __import__('codecs').lookup('852') -Description: \x80 character in 852 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_855.xml b/lib/feedparser/tests/encoding/x80_855.xml deleted file mode 100644 index fbd5240f4..000000000 --- a/lib/feedparser/tests/encoding/x80_855.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="855"?> -<!-- -SkipUnless: __import__('codecs').lookup('855') -Description: \x80 character in 855 encoding -Expect: not bozo and feed['title'] == u'\u0452' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_857.xml b/lib/feedparser/tests/encoding/x80_857.xml deleted file mode 100644 index 2ebe08477..000000000 --- a/lib/feedparser/tests/encoding/x80_857.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="857"?> -<!-- -SkipUnless: __import__('codecs').lookup('857') -Description: \x80 character in 857 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_860.xml b/lib/feedparser/tests/encoding/x80_860.xml deleted file mode 100644 index dbe53c9cc..000000000 --- a/lib/feedparser/tests/encoding/x80_860.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="860"?> -<!-- -SkipUnless: __import__('codecs').lookup('860') -Description: \x80 character in 860 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_861.xml b/lib/feedparser/tests/encoding/x80_861.xml deleted file mode 100644 index a2a69ddfb..000000000 --- a/lib/feedparser/tests/encoding/x80_861.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="861"?> -<!-- -SkipUnless: __import__('codecs').lookup('861') -Description: \x80 character in 861 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_862.xml b/lib/feedparser/tests/encoding/x80_862.xml deleted file mode 100644 index 70947b414..000000000 --- a/lib/feedparser/tests/encoding/x80_862.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="862"?> -<!-- -SkipUnless: __import__('codecs').lookup('862') -Description: \x80 character in 862 encoding -Expect: not bozo and feed['title'] == u'\u05d0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_863.xml b/lib/feedparser/tests/encoding/x80_863.xml deleted file mode 100644 index dce7c3600..000000000 --- a/lib/feedparser/tests/encoding/x80_863.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="863"?> -<!-- -SkipUnless: __import__('codecs').lookup('863') -Description: \x80 character in 863 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_865.xml b/lib/feedparser/tests/encoding/x80_865.xml deleted file mode 100644 index bfe7e3a62..000000000 --- a/lib/feedparser/tests/encoding/x80_865.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="865"?> -<!-- -SkipUnless: __import__('codecs').lookup('865') -Description: \x80 character in 865 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_866.xml b/lib/feedparser/tests/encoding/x80_866.xml deleted file mode 100644 index d83badab3..000000000 --- a/lib/feedparser/tests/encoding/x80_866.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="866"?> -<!-- -SkipUnless: __import__('codecs').lookup('866') -Description: \x80 character in 866 encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp037.xml b/lib/feedparser/tests/encoding/x80_cp037.xml deleted file mode 100644 index bf80bdeb9..000000000 --- a/lib/feedparser/tests/encoding/x80_cp037.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~�����on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}�����}]%ą���������z@���@���������@��@�����@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1125.xml b/lib/feedparser/tests/encoding/x80_cp1125.xml deleted file mode 100644 index ab540d1ee..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1125.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1125"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1125') -Description: \x80 character in cp1125 encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1250.xml b/lib/feedparser/tests/encoding/x80_cp1250.xml deleted file mode 100644 index c32c6abe1..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1250.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1250"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1250') -Description: \x80 character in cp1250 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1251.xml b/lib/feedparser/tests/encoding/x80_cp1251.xml deleted file mode 100644 index 5892eb393..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1251.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1251"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1251') -Description: \x80 character in cp1251 encoding -Expect: not bozo and feed['title'] == u'\u0402' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1252.xml b/lib/feedparser/tests/encoding/x80_cp1252.xml deleted file mode 100644 index 960f8dfc3..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1252.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1252"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1252') -Description: \x80 character in cp1252 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1253.xml b/lib/feedparser/tests/encoding/x80_cp1253.xml deleted file mode 100644 index 0f3fae968..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1253.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1253"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1253') -Description: \x80 character in cp1253 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1254.xml b/lib/feedparser/tests/encoding/x80_cp1254.xml deleted file mode 100644 index 5a5160f56..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1254.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1254"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1254') -Description: \x80 character in cp1254 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1255.xml b/lib/feedparser/tests/encoding/x80_cp1255.xml deleted file mode 100644 index 64fa7b6a0..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1255.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1255"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1255') -Description: \x80 character in cp1255 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1256.xml b/lib/feedparser/tests/encoding/x80_cp1256.xml deleted file mode 100644 index 87ad5178e..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1256.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1256"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1256') -Description: \x80 character in cp1256 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1257.xml b/lib/feedparser/tests/encoding/x80_cp1257.xml deleted file mode 100644 index 9496f0b56..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1257.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1257"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1257') -Description: \x80 character in cp1257 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp1258.xml b/lib/feedparser/tests/encoding/x80_cp1258.xml deleted file mode 100644 index 4fc927e72..000000000 --- a/lib/feedparser/tests/encoding/x80_cp1258.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp1258"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp1258') -Description: \x80 character in cp1258 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp437.xml b/lib/feedparser/tests/encoding/x80_cp437.xml deleted file mode 100644 index d6fb55caf..000000000 --- a/lib/feedparser/tests/encoding/x80_cp437.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp437"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp437') -Description: \x80 character in cp437 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp500.xml b/lib/feedparser/tests/encoding/x80_cp500.xml deleted file mode 100644 index bc7abbdcd..000000000 --- a/lib/feedparser/tests/encoding/x80_cp500.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~�����on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}�����}]%ą���������z@���@���������@��@�����@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp737.xml b/lib/feedparser/tests/encoding/x80_cp737.xml deleted file mode 100644 index 6798237df..000000000 --- a/lib/feedparser/tests/encoding/x80_cp737.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp737"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp737') -Description: \x80 character in cp737 encoding -Expect: not bozo and feed['title'] == u'\u0391' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp775.xml b/lib/feedparser/tests/encoding/x80_cp775.xml deleted file mode 100644 index d04ed5f83..000000000 --- a/lib/feedparser/tests/encoding/x80_cp775.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp775"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp775') -Description: \x80 character in cp775 encoding -Expect: not bozo and feed['title'] == u'\u0106' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp850.xml b/lib/feedparser/tests/encoding/x80_cp850.xml deleted file mode 100644 index b510c43fc..000000000 --- a/lib/feedparser/tests/encoding/x80_cp850.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp850"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp850') -Description: \x80 character in cp850 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp852.xml b/lib/feedparser/tests/encoding/x80_cp852.xml deleted file mode 100644 index 1c7d3e952..000000000 --- a/lib/feedparser/tests/encoding/x80_cp852.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp852"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp852') -Description: \x80 character in cp852 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp855.xml b/lib/feedparser/tests/encoding/x80_cp855.xml deleted file mode 100644 index 069b05952..000000000 --- a/lib/feedparser/tests/encoding/x80_cp855.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp855"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp855') -Description: \x80 character in cp855 encoding -Expect: not bozo and feed['title'] == u'\u0452' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp856.xml b/lib/feedparser/tests/encoding/x80_cp856.xml deleted file mode 100644 index d4d940ab1..000000000 --- a/lib/feedparser/tests/encoding/x80_cp856.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp856"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp856') -Description: \x80 character in cp856 encoding -Expect: not bozo and feed['title'] == u'\u05d0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp857.xml b/lib/feedparser/tests/encoding/x80_cp857.xml deleted file mode 100644 index 5682d7fa2..000000000 --- a/lib/feedparser/tests/encoding/x80_cp857.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp857"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp857') -Description: \x80 character in cp857 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp860.xml b/lib/feedparser/tests/encoding/x80_cp860.xml deleted file mode 100644 index a572284a0..000000000 --- a/lib/feedparser/tests/encoding/x80_cp860.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp860"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp860') -Description: \x80 character in cp860 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp861.xml b/lib/feedparser/tests/encoding/x80_cp861.xml deleted file mode 100644 index fb1a529d6..000000000 --- a/lib/feedparser/tests/encoding/x80_cp861.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp861"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp861') -Description: \x80 character in cp861 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp862.xml b/lib/feedparser/tests/encoding/x80_cp862.xml deleted file mode 100644 index e9121d0f7..000000000 --- a/lib/feedparser/tests/encoding/x80_cp862.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp862"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp862') -Description: \x80 character in cp862 encoding -Expect: not bozo and feed['title'] == u'\u05d0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp863.xml b/lib/feedparser/tests/encoding/x80_cp863.xml deleted file mode 100644 index 3a2de4f2c..000000000 --- a/lib/feedparser/tests/encoding/x80_cp863.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp863"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp863') -Description: \x80 character in cp863 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp864.xml b/lib/feedparser/tests/encoding/x80_cp864.xml deleted file mode 100644 index fa501d7ab..000000000 --- a/lib/feedparser/tests/encoding/x80_cp864.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp864"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp864') -Description: \x80 character in cp864 encoding -Expect: not bozo and feed['title'] == u'\xb0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp865.xml b/lib/feedparser/tests/encoding/x80_cp865.xml deleted file mode 100644 index 1a59191f6..000000000 --- a/lib/feedparser/tests/encoding/x80_cp865.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp865"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp865') -Description: \x80 character in cp865 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp866.xml b/lib/feedparser/tests/encoding/x80_cp866.xml deleted file mode 100644 index 62c9e9582..000000000 --- a/lib/feedparser/tests/encoding/x80_cp866.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp866"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp866') -Description: \x80 character in cp866 encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp874.xml b/lib/feedparser/tests/encoding/x80_cp874.xml deleted file mode 100644 index 80dd0ffd5..000000000 --- a/lib/feedparser/tests/encoding/x80_cp874.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp874"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp874') -Description: \x80 character in cp874 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp875.xml b/lib/feedparser/tests/encoding/x80_cp875.xml deleted file mode 100644 index b8b0d245a..000000000 --- a/lib/feedparser/tests/encoding/x80_cp875.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~�����on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}�����}]%ą���������z@���@���������@��@�����@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}�����}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cp_is.xml b/lib/feedparser/tests/encoding/x80_cp_is.xml deleted file mode 100644 index 231ac77bf..000000000 --- a/lib/feedparser/tests/encoding/x80_cp_is.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cp_is"?> -<!-- -SkipUnless: __import__('codecs').lookup('cp_is') -Description: \x80 character in cp_is encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm037.xml b/lib/feedparser/tests/encoding/x80_csibm037.xml deleted file mode 100644 index de1073be6..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm037.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~��������on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}��������}]%ą���������z@���@���������@��@��������@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm500.xml b/lib/feedparser/tests/encoding/x80_csibm500.xml deleted file mode 100644 index 2a499828e..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm500.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~��������on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}��������}]%ą���������z@���@���������@��@��������@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm855.xml b/lib/feedparser/tests/encoding/x80_csibm855.xml deleted file mode 100644 index cf078a747..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm855.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm855"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm855') -Description: \x80 character in csibm855 encoding -Expect: not bozo and feed['title'] == u'\u0452' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm857.xml b/lib/feedparser/tests/encoding/x80_csibm857.xml deleted file mode 100644 index b2df46272..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm857.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm857"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm857') -Description: \x80 character in csibm857 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm860.xml b/lib/feedparser/tests/encoding/x80_csibm860.xml deleted file mode 100644 index 28269f79b..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm860.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm860"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm860') -Description: \x80 character in csibm860 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm861.xml b/lib/feedparser/tests/encoding/x80_csibm861.xml deleted file mode 100644 index 2300d2d96..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm861.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm861"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm861') -Description: \x80 character in csibm861 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm863.xml b/lib/feedparser/tests/encoding/x80_csibm863.xml deleted file mode 100644 index af23c2bdf..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm863.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm863"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm863') -Description: \x80 character in csibm863 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm864.xml b/lib/feedparser/tests/encoding/x80_csibm864.xml deleted file mode 100644 index 6d820bec1..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm864.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm864"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm864') -Description: \x80 character in csibm864 encoding -Expect: not bozo and feed['title'] == u'\xb0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm865.xml b/lib/feedparser/tests/encoding/x80_csibm865.xml deleted file mode 100644 index 5ca7a89ab..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm865.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm865"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm865') -Description: \x80 character in csibm865 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csibm866.xml b/lib/feedparser/tests/encoding/x80_csibm866.xml deleted file mode 100644 index 0c962ed57..000000000 --- a/lib/feedparser/tests/encoding/x80_csibm866.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csibm866"?> -<!-- -SkipUnless: __import__('codecs').lookup('csibm866') -Description: \x80 character in csibm866 encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cskoi8r.xml b/lib/feedparser/tests/encoding/x80_cskoi8r.xml deleted file mode 100644 index 2a41be100..000000000 --- a/lib/feedparser/tests/encoding/x80_cskoi8r.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cskoi8r"?> -<!-- -SkipUnless: __import__('codecs').lookup('cskoi8r') -Description: \x80 character in cskoi8r encoding -Expect: not bozo and feed['title'] == u'\u2500' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_csmacintosh.xml b/lib/feedparser/tests/encoding/x80_csmacintosh.xml deleted file mode 100644 index 3d387895c..000000000 --- a/lib/feedparser/tests/encoding/x80_csmacintosh.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="csmacintosh"?> -<!-- -SkipUnless: __import__('codecs').lookup('csmacintosh') -Description: \x80 character in csmacintosh encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cspc775baltic.xml b/lib/feedparser/tests/encoding/x80_cspc775baltic.xml deleted file mode 100644 index e5b9993f3..000000000 --- a/lib/feedparser/tests/encoding/x80_cspc775baltic.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cspc775baltic"?> -<!-- -SkipUnless: __import__('codecs').lookup('cspc775baltic') -Description: \x80 character in cspc775baltic encoding -Expect: not bozo and feed['title'] == u'\u0106' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cspc850multilingual.xml b/lib/feedparser/tests/encoding/x80_cspc850multilingual.xml deleted file mode 100644 index 21f5f7dc3..000000000 --- a/lib/feedparser/tests/encoding/x80_cspc850multilingual.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cspc850multilingual"?> -<!-- -SkipUnless: __import__('codecs').lookup('cspc850multilingual') -Description: \x80 character in cspc850multilingual encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cspc862latinhebrew.xml b/lib/feedparser/tests/encoding/x80_cspc862latinhebrew.xml deleted file mode 100644 index b282482a6..000000000 --- a/lib/feedparser/tests/encoding/x80_cspc862latinhebrew.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cspc862latinhebrew"?> -<!-- -SkipUnless: __import__('codecs').lookup('cspc862latinhebrew') -Description: \x80 character in cspc862latinhebrew encoding -Expect: not bozo and feed['title'] == u'\u05d0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cspc8codepage437.xml b/lib/feedparser/tests/encoding/x80_cspc8codepage437.xml deleted file mode 100644 index 74dffe055..000000000 --- a/lib/feedparser/tests/encoding/x80_cspc8codepage437.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cspc8codepage437"?> -<!-- -SkipUnless: __import__('codecs').lookup('cspc8codepage437') -Description: \x80 character in cspc8codepage437 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_cspcp852.xml b/lib/feedparser/tests/encoding/x80_cspcp852.xml deleted file mode 100644 index bb0b3f2f1..000000000 --- a/lib/feedparser/tests/encoding/x80_cspcp852.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="cspcp852"?> -<!-- -SkipUnless: __import__('codecs').lookup('cspcp852') -Description: \x80 character in cspcp852 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_dbcs.xml b/lib/feedparser/tests/encoding/x80_dbcs.xml deleted file mode 100644 index 6d7ff4157..000000000 --- a/lib/feedparser/tests/encoding/x80_dbcs.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="dbcs"?> -<!-- -SkipUnless: __import__('codecs').lookup('dbcs') -Description: \x80 character in dbcs encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic-cp-be.xml b/lib/feedparser/tests/encoding/x80_ebcdic-cp-be.xml deleted file mode 100644 index 605593c4d..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic-cp-be.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������`��`��on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}������`��`��}]%ą���������z@���@���������@��@������`��`��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic-cp-ca.xml b/lib/feedparser/tests/encoding/x80_ebcdic-cp-ca.xml deleted file mode 100644 index 346fa178a..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic-cp-ca.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������`��`��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������`��`��}]%ą���������z@���@���������@��@������`��`��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic-cp-ch.xml b/lib/feedparser/tests/encoding/x80_ebcdic-cp-ch.xml deleted file mode 100644 index 1ed34d98e..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic-cp-ch.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������`��`��on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}������`��`��}]%ą���������z@���@���������@��@������`��`��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic-cp-nl.xml b/lib/feedparser/tests/encoding/x80_ebcdic-cp-nl.xml deleted file mode 100644 index 158a9b889..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic-cp-nl.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������`��`��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������`��`��}]%ą���������z@���@���������@��@������`��`��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic-cp-us.xml b/lib/feedparser/tests/encoding/x80_ebcdic-cp-us.xml deleted file mode 100644 index 9bc45ffac..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic-cp-us.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������`��`��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������`��`��}]%ą���������z@���@���������@��@������`��`��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic-cp-wt.xml b/lib/feedparser/tests/encoding/x80_ebcdic-cp-wt.xml deleted file mode 100644 index 692714356..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic-cp-wt.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������`��`��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������`��`��}]%ą���������z@���@���������@��@������`��`��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic_cp_be.xml b/lib/feedparser/tests/encoding/x80_ebcdic_cp_be.xml deleted file mode 100644 index fe4d13b63..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic_cp_be.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������m��m��on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}������m��m��}]%ą���������z@���@���������@��@������m��m��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic_cp_ca.xml b/lib/feedparser/tests/encoding/x80_ebcdic_cp_ca.xml deleted file mode 100644 index 1999ff5f2..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic_cp_ca.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������m��m��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������m��m��}]%ą���������z@���@���������@��@������m��m��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic_cp_ch.xml b/lib/feedparser/tests/encoding/x80_ebcdic_cp_ch.xml deleted file mode 100644 index 8a7d36df9..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic_cp_ch.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������m��m��on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}������m��m��}]%ą���������z@���@���������@��@������m��m��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic_cp_nl.xml b/lib/feedparser/tests/encoding/x80_ebcdic_cp_nl.xml deleted file mode 100644 index 2917b9543..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic_cp_nl.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������m��m��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������m��m��}]%ą���������z@���@���������@��@������m��m��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic_cp_us.xml b/lib/feedparser/tests/encoding/x80_ebcdic_cp_us.xml deleted file mode 100644 index 8d3d7612d..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic_cp_us.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������m��m��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������m��m��}]%ą���������z@���@���������@��@������m��m��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ebcdic_cp_wt.xml b/lib/feedparser/tests/encoding/x80_ebcdic_cp_wt.xml deleted file mode 100644 index b110ada1d..000000000 --- a/lib/feedparser/tests/encoding/x80_ebcdic_cp_wt.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������m��m��on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������m��m��}]%ą���������z@���@���������@��@������m��m��@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm037.xml b/lib/feedparser/tests/encoding/x80_ibm037.xml deleted file mode 100644 index e3ab6ec5c..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm037.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������}]%ą���������z@���@���������@��@������@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm039.xml b/lib/feedparser/tests/encoding/x80_ibm039.xml deleted file mode 100644 index 211553d9f..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm039.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}������}]%ą���������z@���@���������@��@������@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm1140.xml b/lib/feedparser/tests/encoding/x80_ibm1140.xml deleted file mode 100644 index c1cde5f98..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm1140.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~�������on%LZ``%⒉�䕓���z@@mm������mmM}������}]K������M}�������}]%ą���������z@���@���������@��@�������@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm437.xml b/lib/feedparser/tests/encoding/x80_ibm437.xml deleted file mode 100644 index c9689dc72..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm437.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm437"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm437') -Description: \x80 character in ibm437 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm500.xml b/lib/feedparser/tests/encoding/x80_ibm500.xml deleted file mode 100644 index 1c32c8867..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm500.xml +++ /dev/null @@ -1 +0,0 @@ -Lo���@�������~�K�@��������~������on%LO``%⒉�䕓���z@@mm������mmM}������}]K������M}������}]%ą���������z@���@���������@��@������@��������%ŧ����z@@@@@@���@����@���@����K�����@~~@�}ৄ�}%``n%L����@�������~�K�@�����~����zaa����K���a����a��{n%L�����n�La�����n%La����n \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm775.xml b/lib/feedparser/tests/encoding/x80_ibm775.xml deleted file mode 100644 index a6ac0bf00..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm775.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm775"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm775') -Description: \x80 character in ibm775 encoding -Expect: not bozo and feed['title'] == u'\u0106' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm850.xml b/lib/feedparser/tests/encoding/x80_ibm850.xml deleted file mode 100644 index e3385b769..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm850.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm850"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm850') -Description: \x80 character in ibm850 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm852.xml b/lib/feedparser/tests/encoding/x80_ibm852.xml deleted file mode 100644 index ed4831087..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm852.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm852"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm852') -Description: \x80 character in ibm852 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm855.xml b/lib/feedparser/tests/encoding/x80_ibm855.xml deleted file mode 100644 index 7574077aa..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm855.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm855"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm855') -Description: \x80 character in ibm855 encoding -Expect: not bozo and feed['title'] == u'\u0452' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm857.xml b/lib/feedparser/tests/encoding/x80_ibm857.xml deleted file mode 100644 index 41f684896..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm857.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm857"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm857') -Description: \x80 character in ibm857 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm860.xml b/lib/feedparser/tests/encoding/x80_ibm860.xml deleted file mode 100644 index 68c3f5ef6..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm860.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm860"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm860') -Description: \x80 character in ibm860 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm861.xml b/lib/feedparser/tests/encoding/x80_ibm861.xml deleted file mode 100644 index b9c19d768..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm861.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm861"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm861') -Description: \x80 character in ibm861 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm862.xml b/lib/feedparser/tests/encoding/x80_ibm862.xml deleted file mode 100644 index 15a957b93..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm862.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm862"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm862') -Description: \x80 character in ibm862 encoding -Expect: not bozo and feed['title'] == u'\u05d0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm863.xml b/lib/feedparser/tests/encoding/x80_ibm863.xml deleted file mode 100644 index 884ca842a..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm863.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm863"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm863') -Description: \x80 character in ibm863 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm864.xml b/lib/feedparser/tests/encoding/x80_ibm864.xml deleted file mode 100644 index cc5522f49..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm864.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm864"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm864') -Description: \x80 character in ibm864 encoding -Expect: not bozo and feed['title'] == u'\xb0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm865.xml b/lib/feedparser/tests/encoding/x80_ibm865.xml deleted file mode 100644 index 4419a8b3b..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm865.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm865"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm865') -Description: \x80 character in ibm865 encoding -Expect: not bozo and feed['title'] == u'\xc7' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ibm866.xml b/lib/feedparser/tests/encoding/x80_ibm866.xml deleted file mode 100644 index cf2478793..000000000 --- a/lib/feedparser/tests/encoding/x80_ibm866.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ibm866"?> -<!-- -SkipUnless: __import__('codecs').lookup('ibm866') -Description: \x80 character in ibm866 encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_koi8-r.xml b/lib/feedparser/tests/encoding/x80_koi8-r.xml deleted file mode 100644 index 9e6c9a6b8..000000000 --- a/lib/feedparser/tests/encoding/x80_koi8-r.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="koi8-r"?> -<!-- -SkipUnless: __import__('codecs').lookup('koi8-r') -Description: \x80 character in koi8-r encoding -Expect: not bozo and feed['title'] == u'\u2500' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_koi8-t.xml b/lib/feedparser/tests/encoding/x80_koi8-t.xml deleted file mode 100644 index 502735cfc..000000000 --- a/lib/feedparser/tests/encoding/x80_koi8-t.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="koi8-t"?> -<!-- -SkipUnless: __import__('codecs').lookup('koi8-t') -Description: \x80 character in koi8-t encoding -Expect: not bozo and feed['title'] == u'\u049b' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_koi8-u.xml b/lib/feedparser/tests/encoding/x80_koi8-u.xml deleted file mode 100644 index f8ea0abbb..000000000 --- a/lib/feedparser/tests/encoding/x80_koi8-u.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="koi8-u"?> -<!-- -SkipUnless: __import__('codecs').lookup('koi8-u') -Description: \x80 character in koi8-u encoding -Expect: not bozo and feed['title'] == u'\u2500' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_mac-cyrillic.xml b/lib/feedparser/tests/encoding/x80_mac-cyrillic.xml deleted file mode 100644 index 7a49eb05e..000000000 --- a/lib/feedparser/tests/encoding/x80_mac-cyrillic.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="mac-cyrillic"?> -<!-- -SkipUnless: __import__('codecs').lookup('mac-cyrillic') -Description: \x80 character in mac-cyrillic encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_mac.xml b/lib/feedparser/tests/encoding/x80_mac.xml deleted file mode 100644 index b53614820..000000000 --- a/lib/feedparser/tests/encoding/x80_mac.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="mac"?> -<!-- -SkipUnless: __import__('codecs').lookup('mac') -Description: \x80 character in mac encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_maccentraleurope.xml b/lib/feedparser/tests/encoding/x80_maccentraleurope.xml deleted file mode 100644 index abcedfd30..000000000 --- a/lib/feedparser/tests/encoding/x80_maccentraleurope.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="maccentraleurope"?> -<!-- -SkipUnless: __import__('codecs').lookup('maccentraleurope') -Description: \x80 character in maccentraleurope encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_maccyrillic.xml b/lib/feedparser/tests/encoding/x80_maccyrillic.xml deleted file mode 100644 index 89ae2309b..000000000 --- a/lib/feedparser/tests/encoding/x80_maccyrillic.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="maccyrillic"?> -<!-- -SkipUnless: __import__('codecs').lookup('maccyrillic') -Description: \x80 character in maccyrillic encoding -Expect: not bozo and feed['title'] == u'\u0410' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_macgreek.xml b/lib/feedparser/tests/encoding/x80_macgreek.xml deleted file mode 100644 index ac91a79d3..000000000 --- a/lib/feedparser/tests/encoding/x80_macgreek.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="macgreek"?> -<!-- -SkipUnless: __import__('codecs').lookup('macgreek') -Description: \x80 character in macgreek encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_maciceland.xml b/lib/feedparser/tests/encoding/x80_maciceland.xml deleted file mode 100644 index d93cfa563..000000000 --- a/lib/feedparser/tests/encoding/x80_maciceland.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="maciceland"?> -<!-- -SkipUnless: __import__('codecs').lookup('maciceland') -Description: \x80 character in maciceland encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_macintosh.xml b/lib/feedparser/tests/encoding/x80_macintosh.xml deleted file mode 100644 index e01a0e316..000000000 --- a/lib/feedparser/tests/encoding/x80_macintosh.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="macintosh"?> -<!-- -SkipUnless: __import__('codecs').lookup('macintosh') -Description: \x80 character in macintosh encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_maclatin2.xml b/lib/feedparser/tests/encoding/x80_maclatin2.xml deleted file mode 100644 index fe1d5c43b..000000000 --- a/lib/feedparser/tests/encoding/x80_maclatin2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="maclatin2"?> -<!-- -SkipUnless: __import__('codecs').lookup('maclatin2') -Description: \x80 character in maclatin2 encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_macroman.xml b/lib/feedparser/tests/encoding/x80_macroman.xml deleted file mode 100644 index 0700f3af0..000000000 --- a/lib/feedparser/tests/encoding/x80_macroman.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="macroman"?> -<!-- -SkipUnless: __import__('codecs').lookup('macroman') -Description: \x80 character in macroman encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_macturkish.xml b/lib/feedparser/tests/encoding/x80_macturkish.xml deleted file mode 100644 index fa4ec82fd..000000000 --- a/lib/feedparser/tests/encoding/x80_macturkish.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="macturkish"?> -<!-- -SkipUnless: __import__('codecs').lookup('macturkish') -Description: \x80 character in macturkish encoding -Expect: not bozo and feed['title'] == u'\xc4' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-ansi.xml b/lib/feedparser/tests/encoding/x80_ms-ansi.xml deleted file mode 100644 index b3312ec6f..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-ansi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-ansi"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-ansi') -Description: \x80 character in ms-ansi encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-arab.xml b/lib/feedparser/tests/encoding/x80_ms-arab.xml deleted file mode 100644 index b67bee601..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-arab.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-arab"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-arab') -Description: \x80 character in ms-arab encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-cyrl.xml b/lib/feedparser/tests/encoding/x80_ms-cyrl.xml deleted file mode 100644 index 57bfc929b..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-cyrl.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-cyrl"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-cyrl') -Description: \x80 character in ms-cyrl encoding -Expect: not bozo and feed['title'] == u'\u0402' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-ee.xml b/lib/feedparser/tests/encoding/x80_ms-ee.xml deleted file mode 100644 index eb034d0bf..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-ee.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-ee"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-ee') -Description: \x80 character in ms-ee encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-greek.xml b/lib/feedparser/tests/encoding/x80_ms-greek.xml deleted file mode 100644 index b8bfc78a8..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-greek.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-greek"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-greek') -Description: \x80 character in ms-greek encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-hebr.xml b/lib/feedparser/tests/encoding/x80_ms-hebr.xml deleted file mode 100644 index d170a9c67..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-hebr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-hebr"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-hebr') -Description: \x80 character in ms-hebr encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_ms-turk.xml b/lib/feedparser/tests/encoding/x80_ms-turk.xml deleted file mode 100644 index dad6cbe97..000000000 --- a/lib/feedparser/tests/encoding/x80_ms-turk.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="ms-turk"?> -<!-- -SkipUnless: __import__('codecs').lookup('ms-turk') -Description: \x80 character in ms-turk encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_tcvn-5712.xml b/lib/feedparser/tests/encoding/x80_tcvn-5712.xml deleted file mode 100644 index 684c52f4e..000000000 --- a/lib/feedparser/tests/encoding/x80_tcvn-5712.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="tcvn-5712"?> -<!-- -SkipUnless: __import__('codecs').lookup('tcvn-5712') -Description: \x80 character in tcvn-5712 encoding -Expect: not bozo and feed['title'] == u'\xc0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_tcvn.xml b/lib/feedparser/tests/encoding/x80_tcvn.xml deleted file mode 100644 index 5b17c9d72..000000000 --- a/lib/feedparser/tests/encoding/x80_tcvn.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="tcvn"?> -<!-- -SkipUnless: __import__('codecs').lookup('tcvn') -Description: \x80 character in tcvn encoding -Expect: not bozo and feed['title'] == u'\xc0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_tcvn5712-1.xml b/lib/feedparser/tests/encoding/x80_tcvn5712-1.xml deleted file mode 100644 index f6e92eefb..000000000 --- a/lib/feedparser/tests/encoding/x80_tcvn5712-1.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="tcvn5712-1"?> -<!-- -SkipUnless: __import__('codecs').lookup('tcvn5712-1') -Description: \x80 character in tcvn5712-1 encoding -Expect: not bozo and feed['title'] == u'\xc0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_viscii.xml b/lib/feedparser/tests/encoding/x80_viscii.xml deleted file mode 100644 index b872c5b33..000000000 --- a/lib/feedparser/tests/encoding/x80_viscii.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="viscii"?> -<!-- -SkipUnless: __import__('codecs').lookup('viscii') -Description: \x80 character in viscii encoding -Expect: not bozo and feed['title'] == u'\u1ea0' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_winbaltrim.xml b/lib/feedparser/tests/encoding/x80_winbaltrim.xml deleted file mode 100644 index a109e279f..000000000 --- a/lib/feedparser/tests/encoding/x80_winbaltrim.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="winbaltrim"?> -<!-- -SkipUnless: __import__('codecs').lookup('winbaltrim') -Description: \x80 character in winbaltrim encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1250.xml b/lib/feedparser/tests/encoding/x80_windows-1250.xml deleted file mode 100644 index 7449843e2..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1250.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1250"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1250') -Description: \x80 character in windows-1250 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1251.xml b/lib/feedparser/tests/encoding/x80_windows-1251.xml deleted file mode 100644 index 15f51c58f..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1251.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1251"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1251') -Description: \x80 character in windows-1251 encoding -Expect: not bozo and feed['title'] == u'\u0402' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1252.xml b/lib/feedparser/tests/encoding/x80_windows-1252.xml deleted file mode 100644 index 742278a0e..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1252.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1252"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1252') -Description: \x80 character in windows-1252 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1253.xml b/lib/feedparser/tests/encoding/x80_windows-1253.xml deleted file mode 100644 index 001199908..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1253.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1253"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1253') -Description: \x80 character in windows-1253 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1254.xml b/lib/feedparser/tests/encoding/x80_windows-1254.xml deleted file mode 100644 index 7e9078947..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1254.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1254"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1254') -Description: \x80 character in windows-1254 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1255.xml b/lib/feedparser/tests/encoding/x80_windows-1255.xml deleted file mode 100644 index 53cfc1914..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1255.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1255"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1255') -Description: \x80 character in windows-1255 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1256.xml b/lib/feedparser/tests/encoding/x80_windows-1256.xml deleted file mode 100644 index 4b2b6303a..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1256.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1256"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1256') -Description: \x80 character in windows-1256 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1257.xml b/lib/feedparser/tests/encoding/x80_windows-1257.xml deleted file mode 100644 index 00e807fad..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1257.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1257"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1257') -Description: \x80 character in windows-1257 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows-1258.xml b/lib/feedparser/tests/encoding/x80_windows-1258.xml deleted file mode 100644 index 7a6d4105f..000000000 --- a/lib/feedparser/tests/encoding/x80_windows-1258.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows-1258"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows-1258') -Description: \x80 character in windows-1258 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1250.xml b/lib/feedparser/tests/encoding/x80_windows_1250.xml deleted file mode 100644 index 6728513e3..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1250.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1250"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1250') -Description: \x80 character in windows_1250 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1251.xml b/lib/feedparser/tests/encoding/x80_windows_1251.xml deleted file mode 100644 index 9ea04a6ab..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1251.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1251"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1251') -Description: \x80 character in windows_1251 encoding -Expect: not bozo and feed['title'] == u'\u0402' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1252.xml b/lib/feedparser/tests/encoding/x80_windows_1252.xml deleted file mode 100644 index 7adeea4b2..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1252.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1252"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1252') -Description: \x80 character in windows_1252 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1253.xml b/lib/feedparser/tests/encoding/x80_windows_1253.xml deleted file mode 100644 index ab21d9ef7..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1253.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1253"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1253') -Description: \x80 character in windows_1253 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1254.xml b/lib/feedparser/tests/encoding/x80_windows_1254.xml deleted file mode 100644 index a35a78b82..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1254.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1254"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1254') -Description: \x80 character in windows_1254 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1255.xml b/lib/feedparser/tests/encoding/x80_windows_1255.xml deleted file mode 100644 index e71a73671..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1255.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1255"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1255') -Description: \x80 character in windows_1255 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1256.xml b/lib/feedparser/tests/encoding/x80_windows_1256.xml deleted file mode 100644 index 6f9f98d3d..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1256.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1256"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1256') -Description: \x80 character in windows_1256 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1257.xml b/lib/feedparser/tests/encoding/x80_windows_1257.xml deleted file mode 100644 index 42649b742..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1257.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1257"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1257') -Description: \x80 character in windows_1257 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/encoding/x80_windows_1258.xml b/lib/feedparser/tests/encoding/x80_windows_1258.xml deleted file mode 100644 index c8bc701e4..000000000 --- a/lib/feedparser/tests/encoding/x80_windows_1258.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="windows_1258"?> -<!-- -SkipUnless: __import__('codecs').lookup('windows_1258') -Description: \x80 character in windows_1258 encoding -Expect: not bozo and feed['title'] == u'\u20ac' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title>�</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/160.xml b/lib/feedparser/tests/entities/160.xml deleted file mode 100644 index a6d0c7fa4..000000000 --- a/lib/feedparser/tests/entities/160.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 160 -Expect: feed['title'] == u'testing \xa0 entity' ---> -<rss> -<channel> -<title>testing   entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/732.xml b/lib/feedparser/tests/entities/732.xml deleted file mode 100644 index 89edc330b..000000000 --- a/lib/feedparser/tests/entities/732.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 732 -Expect: feed['title'] == u'testing \u02dc entity' ---> -<rss> -<channel> -<title>testing ˜ entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/8216.xml b/lib/feedparser/tests/entities/8216.xml deleted file mode 100644 index cb45c0fdc..000000000 --- a/lib/feedparser/tests/entities/8216.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 8216 -Expect: feed['title'] == u'testing \u2018 entity' ---> -<rss> -<channel> -<title>testing ‘ entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/8217.xml b/lib/feedparser/tests/entities/8217.xml deleted file mode 100644 index bb2ebc1d7..000000000 --- a/lib/feedparser/tests/entities/8217.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 8217 -Expect: feed['title'] == u'testing \u2019 entity' ---> -<rss> -<channel> -<title>testing ’ entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/8220.xml b/lib/feedparser/tests/entities/8220.xml deleted file mode 100644 index 1c666fd30..000000000 --- a/lib/feedparser/tests/entities/8220.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 8220 -Expect: feed['title'] == u'testing \u201c entity' ---> -<rss> -<channel> -<title>testing “ entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/8221.xml b/lib/feedparser/tests/entities/8221.xml deleted file mode 100644 index d433bd006..000000000 --- a/lib/feedparser/tests/entities/8221.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 8221 -Expect: feed['title'] == u'testing \u201d entity' ---> -<rss> -<channel> -<title>testing ” entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/9830.xml b/lib/feedparser/tests/entities/9830.xml deleted file mode 100644 index bac2b7666..000000000 --- a/lib/feedparser/tests/entities/9830.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: 9830 -Expect: feed['title'] == u'testing \u2666 entity' ---> -<rss> -<channel> -<title>testing ♦ entity</title> -</channel> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/entities/aacute.xml b/lib/feedparser/tests/entities/aacute.xml deleted file mode 100644 index cbe788e59..000000000 --- a/lib/feedparser/tests/entities/aacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: aacute -Expect: feed['title'] == u'testing \xe1 entity' ---> -<rss> -<channel> -<title>testing á entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/acirc.xml b/lib/feedparser/tests/entities/acirc.xml deleted file mode 100644 index 88be77914..000000000 --- a/lib/feedparser/tests/entities/acirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: acirc -Expect: feed['title'] == u'testing \xe2 entity' ---> -<rss> -<channel> -<title>testing â entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/acute.xml b/lib/feedparser/tests/entities/acute.xml deleted file mode 100644 index bea2c4959..000000000 --- a/lib/feedparser/tests/entities/acute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: acute -Expect: feed['title'] == u'testing \xb4 entity' ---> -<rss> -<channel> -<title>testing ´ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/aelig.xml b/lib/feedparser/tests/entities/aelig.xml deleted file mode 100644 index a616a1b65..000000000 --- a/lib/feedparser/tests/entities/aelig.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: aelig -Expect: feed['title'] == u'testing \xe6 entity' ---> -<rss> -<channel> -<title>testing æ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/agrave.xml b/lib/feedparser/tests/entities/agrave.xml deleted file mode 100644 index c9f4d73fc..000000000 --- a/lib/feedparser/tests/entities/agrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: agrave -Expect: feed['title'] == u'testing \xe0 entity' ---> -<rss> -<channel> -<title>testing à entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/alefsym.xml b/lib/feedparser/tests/entities/alefsym.xml deleted file mode 100644 index c3d383d92..000000000 --- a/lib/feedparser/tests/entities/alefsym.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: alefsym -Expect: feed['title'] == u'testing \u2135 entity' ---> -<rss> -<channel> -<title>testing ℵ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/alpha.xml b/lib/feedparser/tests/entities/alpha.xml deleted file mode 100644 index b4c3aa9a3..000000000 --- a/lib/feedparser/tests/entities/alpha.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: alpha -Expect: feed['title'] == u'testing \u03b1 entity' ---> -<rss> -<channel> -<title>testing α entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/and.xml b/lib/feedparser/tests/entities/and.xml deleted file mode 100644 index 4af0849e9..000000000 --- a/lib/feedparser/tests/entities/and.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: and -Expect: feed['title'] == u'testing \u2227 entity' ---> -<rss> -<channel> -<title>testing ∧ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ang.xml b/lib/feedparser/tests/entities/ang.xml deleted file mode 100644 index cff7694d7..000000000 --- a/lib/feedparser/tests/entities/ang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ang -Expect: feed['title'] == u'testing \u2220 entity' ---> -<rss> -<channel> -<title>testing ∠ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/aring.xml b/lib/feedparser/tests/entities/aring.xml deleted file mode 100644 index d279eea21..000000000 --- a/lib/feedparser/tests/entities/aring.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: aring -Expect: feed['title'] == u'testing \xe5 entity' ---> -<rss> -<channel> -<title>testing å entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/asymp.xml b/lib/feedparser/tests/entities/asymp.xml deleted file mode 100644 index 37c5eb2d4..000000000 --- a/lib/feedparser/tests/entities/asymp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: asymp -Expect: feed['title'] == u'testing \u2248 entity' ---> -<rss> -<channel> -<title>testing ≈ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/atilde.xml b/lib/feedparser/tests/entities/atilde.xml deleted file mode 100644 index 2f31e87df..000000000 --- a/lib/feedparser/tests/entities/atilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: atilde -Expect: feed['title'] == u'testing \xe3 entity' ---> -<rss> -<channel> -<title>testing ã entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/attr_amp.xml b/lib/feedparser/tests/entities/attr_amp.xml deleted file mode 100644 index 64b523feb..000000000 --- a/lib/feedparser/tests/entities/attr_amp.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Resolve & in attributes -Expect: feed.link == u"http://domain/?a=1&b=2" ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" href="http://domain/?a=1&b=2" /> -</feed diff --git a/lib/feedparser/tests/entities/auml.xml b/lib/feedparser/tests/entities/auml.xml deleted file mode 100644 index 051c2aded..000000000 --- a/lib/feedparser/tests/entities/auml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: auml -Expect: feed['title'] == u'testing \xe4 entity' ---> -<rss> -<channel> -<title>testing ä entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/bdquo.xml b/lib/feedparser/tests/entities/bdquo.xml deleted file mode 100644 index e126e2522..000000000 --- a/lib/feedparser/tests/entities/bdquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: bdquo -Expect: feed['title'] == u'testing \u201e entity' ---> -<rss> -<channel> -<title>testing „ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/beta.xml b/lib/feedparser/tests/entities/beta.xml deleted file mode 100644 index 588ba2d61..000000000 --- a/lib/feedparser/tests/entities/beta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: beta -Expect: feed['title'] == u'testing \u03b2 entity' ---> -<rss> -<channel> -<title>testing β entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/brvbar.xml b/lib/feedparser/tests/entities/brvbar.xml deleted file mode 100644 index 9a940e430..000000000 --- a/lib/feedparser/tests/entities/brvbar.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: brvbar -Expect: feed['title'] == u'testing \xa6 entity' ---> -<rss> -<channel> -<title>testing ¦ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/bull.xml b/lib/feedparser/tests/entities/bull.xml deleted file mode 100644 index d2d396da0..000000000 --- a/lib/feedparser/tests/entities/bull.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: bull -Expect: feed['title'] == u'testing \u2022 entity' ---> -<rss> -<channel> -<title>testing • entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/cap.xml b/lib/feedparser/tests/entities/cap.xml deleted file mode 100644 index f8898e38c..000000000 --- a/lib/feedparser/tests/entities/cap.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cap -Expect: feed['title'] == u'testing \u2229 entity' ---> -<rss> -<channel> -<title>testing ∩ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ccedil.xml b/lib/feedparser/tests/entities/ccedil.xml deleted file mode 100644 index 9a35ab0c8..000000000 --- a/lib/feedparser/tests/entities/ccedil.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ccedil -Expect: feed['title'] == u'testing \xe7 entity' ---> -<rss> -<channel> -<title>testing ç entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/cedil.xml b/lib/feedparser/tests/entities/cedil.xml deleted file mode 100644 index 9b93fb818..000000000 --- a/lib/feedparser/tests/entities/cedil.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cedil -Expect: feed['title'] == u'testing \xb8 entity' ---> -<rss> -<channel> -<title>testing ¸ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/cent.xml b/lib/feedparser/tests/entities/cent.xml deleted file mode 100644 index 431017305..000000000 --- a/lib/feedparser/tests/entities/cent.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cent -Expect: feed['title'] == u'testing \xa2 entity' ---> -<rss> -<channel> -<title>testing ¢ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/chi.xml b/lib/feedparser/tests/entities/chi.xml deleted file mode 100644 index c63d3e556..000000000 --- a/lib/feedparser/tests/entities/chi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: chi -Expect: feed['title'] == u'testing \u03c7 entity' ---> -<rss> -<channel> -<title>testing χ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/circ.xml b/lib/feedparser/tests/entities/circ.xml deleted file mode 100644 index 76b6762b3..000000000 --- a/lib/feedparser/tests/entities/circ.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: circ -Expect: feed['title'] == u'testing \u02c6 entity' ---> -<rss> -<channel> -<title>testing ˆ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/clubs.xml b/lib/feedparser/tests/entities/clubs.xml deleted file mode 100644 index efe1ea34b..000000000 --- a/lib/feedparser/tests/entities/clubs.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: clubs -Expect: feed['title'] == u'testing \u2663 entity' ---> -<rss> -<channel> -<title>testing ♣ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/cong.xml b/lib/feedparser/tests/entities/cong.xml deleted file mode 100644 index e6dd55c99..000000000 --- a/lib/feedparser/tests/entities/cong.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cong -Expect: feed['title'] == u'testing \u2245 entity' ---> -<rss> -<channel> -<title>testing ≅ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/copy.xml b/lib/feedparser/tests/entities/copy.xml deleted file mode 100644 index 7ec6367f6..000000000 --- a/lib/feedparser/tests/entities/copy.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: copy -Expect: feed['title'] == u'testing \xa9 entity' ---> -<rss> -<channel> -<title>testing © entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/crarr.xml b/lib/feedparser/tests/entities/crarr.xml deleted file mode 100644 index d1ced14d3..000000000 --- a/lib/feedparser/tests/entities/crarr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: crarr -Expect: feed['title'] == u'testing \u21b5 entity' ---> -<rss> -<channel> -<title>testing ↵ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/cup.xml b/lib/feedparser/tests/entities/cup.xml deleted file mode 100644 index d81b582d0..000000000 --- a/lib/feedparser/tests/entities/cup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cup -Expect: feed['title'] == u'testing \u222a entity' ---> -<rss> -<channel> -<title>testing ∪ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/curren.xml b/lib/feedparser/tests/entities/curren.xml deleted file mode 100644 index 3aa6b8719..000000000 --- a/lib/feedparser/tests/entities/curren.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: curren -Expect: feed['title'] == u'testing \xa4 entity' ---> -<rss> -<channel> -<title>testing ¤ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/dagger.xml b/lib/feedparser/tests/entities/dagger.xml deleted file mode 100644 index c8360b8db..000000000 --- a/lib/feedparser/tests/entities/dagger.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: dagger -Expect: feed['title'] == u'testing \u2020 entity' ---> -<rss> -<channel> -<title>testing † entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/darr.xml b/lib/feedparser/tests/entities/darr.xml deleted file mode 100644 index d6ccf87fc..000000000 --- a/lib/feedparser/tests/entities/darr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: dArr -Expect: feed['title'] == u'testing \u21d3 entity' ---> -<rss> -<channel> -<title>testing ⇓ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/deg.xml b/lib/feedparser/tests/entities/deg.xml deleted file mode 100644 index c09fb8589..000000000 --- a/lib/feedparser/tests/entities/deg.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: deg -Expect: feed['title'] == u'testing \xb0 entity' ---> -<rss> -<channel> -<title>testing ° entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/delta.xml b/lib/feedparser/tests/entities/delta.xml deleted file mode 100644 index a68be93dc..000000000 --- a/lib/feedparser/tests/entities/delta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: delta -Expect: feed['title'] == u'testing \u03b4 entity' ---> -<rss> -<channel> -<title>testing δ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/diams.xml b/lib/feedparser/tests/entities/diams.xml deleted file mode 100644 index f41b8b16d..000000000 --- a/lib/feedparser/tests/entities/diams.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: diams -Expect: feed['title'] == u'testing \u2666 entity' ---> -<rss> -<channel> -<title>testing ♦ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/divide.xml b/lib/feedparser/tests/entities/divide.xml deleted file mode 100644 index 6d9262373..000000000 --- a/lib/feedparser/tests/entities/divide.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: divide -Expect: feed['title'] == u'testing \xf7 entity' ---> -<rss> -<channel> -<title>testing ÷ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/doesnotexist.xml b/lib/feedparser/tests/entities/doesnotexist.xml deleted file mode 100644 index 871250510..000000000 --- a/lib/feedparser/tests/entities/doesnotexist.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: doesnotexist -Expect: feed['title'] == u'testing &doesnotexist; entity' ---> -<rss> -<channel> -<title>testing &doesnotexist; entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/eacute.xml b/lib/feedparser/tests/entities/eacute.xml deleted file mode 100644 index ae8f8ece8..000000000 --- a/lib/feedparser/tests/entities/eacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: eacute -Expect: feed['title'] == u'testing \xe9 entity' ---> -<rss> -<channel> -<title>testing é entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ecirc.xml b/lib/feedparser/tests/entities/ecirc.xml deleted file mode 100644 index b03136f7d..000000000 --- a/lib/feedparser/tests/entities/ecirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ecirc -Expect: feed['title'] == u'testing \xea entity' ---> -<rss> -<channel> -<title>testing ê entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/egrave.xml b/lib/feedparser/tests/entities/egrave.xml deleted file mode 100644 index 38bbe1548..000000000 --- a/lib/feedparser/tests/entities/egrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: egrave -Expect: feed['title'] == u'testing \xe8 entity' ---> -<rss> -<channel> -<title>testing è entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/empty.xml b/lib/feedparser/tests/entities/empty.xml deleted file mode 100644 index e59e94de6..000000000 --- a/lib/feedparser/tests/entities/empty.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: empty -Expect: feed['title'] == u'testing \u2205 entity' ---> -<rss> -<channel> -<title>testing ∅ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/emsp.xml b/lib/feedparser/tests/entities/emsp.xml deleted file mode 100644 index 29fe31f57..000000000 --- a/lib/feedparser/tests/entities/emsp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: emsp -Expect: feed['title'] == u'testing \u2003 entity' ---> -<rss> -<channel> -<title>testing   entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ensp.xml b/lib/feedparser/tests/entities/ensp.xml deleted file mode 100644 index dcaddd14f..000000000 --- a/lib/feedparser/tests/entities/ensp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ensp -Expect: feed['title'] == u'testing \u2002 entity' ---> -<rss> -<channel> -<title>testing   entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/epsilon.xml b/lib/feedparser/tests/entities/epsilon.xml deleted file mode 100644 index b053ec5c9..000000000 --- a/lib/feedparser/tests/entities/epsilon.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: epsilon -Expect: feed['title'] == u'testing \u03b5 entity' ---> -<rss> -<channel> -<title>testing ε entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/equiv.xml b/lib/feedparser/tests/entities/equiv.xml deleted file mode 100644 index c63fe40cb..000000000 --- a/lib/feedparser/tests/entities/equiv.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: equiv -Expect: feed['title'] == u'testing \u2261 entity' ---> -<rss> -<channel> -<title>testing ≡ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/eta.xml b/lib/feedparser/tests/entities/eta.xml deleted file mode 100644 index e2692d50a..000000000 --- a/lib/feedparser/tests/entities/eta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: eta -Expect: feed['title'] == u'testing \u03b7 entity' ---> -<rss> -<channel> -<title>testing η entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/eth.xml b/lib/feedparser/tests/entities/eth.xml deleted file mode 100644 index 056d4c0c9..000000000 --- a/lib/feedparser/tests/entities/eth.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: eth -Expect: feed['title'] == u'testing \xf0 entity' ---> -<rss> -<channel> -<title>testing ð entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/euml.xml b/lib/feedparser/tests/entities/euml.xml deleted file mode 100644 index e3f564072..000000000 --- a/lib/feedparser/tests/entities/euml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: euml -Expect: feed['title'] == u'testing \xeb entity' ---> -<rss> -<channel> -<title>testing ë entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/euro.xml b/lib/feedparser/tests/entities/euro.xml deleted file mode 100644 index 77a782da9..000000000 --- a/lib/feedparser/tests/entities/euro.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: euro -Expect: feed['title'] == u'testing \u20ac entity' ---> -<rss> -<channel> -<title>testing € entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/exist.xml b/lib/feedparser/tests/entities/exist.xml deleted file mode 100644 index 7332cdd45..000000000 --- a/lib/feedparser/tests/entities/exist.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: exist -Expect: feed['title'] == u'testing \u2203 entity' ---> -<rss> -<channel> -<title>testing ∃ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/fnof.xml b/lib/feedparser/tests/entities/fnof.xml deleted file mode 100644 index c50f39242..000000000 --- a/lib/feedparser/tests/entities/fnof.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: fnof -Expect: feed['title'] == u'testing \u0192 entity' ---> -<rss> -<channel> -<title>testing ƒ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/forall.xml b/lib/feedparser/tests/entities/forall.xml deleted file mode 100644 index e939eca16..000000000 --- a/lib/feedparser/tests/entities/forall.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: forall -Expect: feed['title'] == u'testing \u2200 entity' ---> -<rss> -<channel> -<title>testing ∀ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/frac12.xml b/lib/feedparser/tests/entities/frac12.xml deleted file mode 100644 index 1d567cb92..000000000 --- a/lib/feedparser/tests/entities/frac12.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: frac12 -Expect: feed['title'] == u'testing \xbd entity' ---> -<rss> -<channel> -<title>testing ½ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/frac14.xml b/lib/feedparser/tests/entities/frac14.xml deleted file mode 100644 index 7d99994ec..000000000 --- a/lib/feedparser/tests/entities/frac14.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: frac14 -Expect: feed['title'] == u'testing \xbc entity' ---> -<rss> -<channel> -<title>testing ¼ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/frac34.xml b/lib/feedparser/tests/entities/frac34.xml deleted file mode 100644 index c106acc98..000000000 --- a/lib/feedparser/tests/entities/frac34.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: frac34 -Expect: feed['title'] == u'testing \xbe entity' ---> -<rss> -<channel> -<title>testing ¾ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/frasl.xml b/lib/feedparser/tests/entities/frasl.xml deleted file mode 100644 index e0af9ea50..000000000 --- a/lib/feedparser/tests/entities/frasl.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: frasl -Expect: feed['title'] == u'testing \u2044 entity' ---> -<rss> -<channel> -<title>testing ⁄ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/gamma.xml b/lib/feedparser/tests/entities/gamma.xml deleted file mode 100644 index f75e253a5..000000000 --- a/lib/feedparser/tests/entities/gamma.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: gamma -Expect: feed['title'] == u'testing \u03b3 entity' ---> -<rss> -<channel> -<title>testing γ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ge.xml b/lib/feedparser/tests/entities/ge.xml deleted file mode 100644 index 662d99db4..000000000 --- a/lib/feedparser/tests/entities/ge.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ge -Expect: feed['title'] == u'testing \u2265 entity' ---> -<rss> -<channel> -<title>testing ≥ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/hArr.xml b/lib/feedparser/tests/entities/hArr.xml deleted file mode 100644 index 0d600f34a..000000000 --- a/lib/feedparser/tests/entities/hArr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: harr -Expect: feed['title'] == u'testing \u2194 entity' ---> -<rss> -<channel> -<title>testing ↔ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/hearts.xml b/lib/feedparser/tests/entities/hearts.xml deleted file mode 100644 index b46f1920d..000000000 --- a/lib/feedparser/tests/entities/hearts.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: hearts -Expect: feed['title'] == u'testing \u2665 entity' ---> -<rss> -<channel> -<title>testing ♥ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/hellip.xml b/lib/feedparser/tests/entities/hellip.xml deleted file mode 100644 index 0cc416e9c..000000000 --- a/lib/feedparser/tests/entities/hellip.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: hellip -Expect: feed['title'] == u'testing \u2026 entity' ---> -<rss> -<channel> -<title>testing … entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/hex_entity_x_lowercase.xml b/lib/feedparser/tests/entities/hex_entity_x_lowercase.xml deleted file mode 100644 index 181157393..000000000 --- a/lib/feedparser/tests/entities/hex_entity_x_lowercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: test that lowercase x in A translates to 'A' -Expect: entries[0]['title'] == u'A' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml">A</title> -</entry> -</feed diff --git a/lib/feedparser/tests/entities/hex_entity_x_uppercase.xml b/lib/feedparser/tests/entities/hex_entity_x_uppercase.xml deleted file mode 100644 index c25fda59b..000000000 --- a/lib/feedparser/tests/entities/hex_entity_x_uppercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: test that lowercase x in A translates to 'A' -Expect: entries[0]['title'] == u'A' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml">A</title> -</entry> -</feed diff --git a/lib/feedparser/tests/entities/iacute.xml b/lib/feedparser/tests/entities/iacute.xml deleted file mode 100644 index 4150b7db1..000000000 --- a/lib/feedparser/tests/entities/iacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iacute -Expect: feed['title'] == u'testing \xed entity' ---> -<rss> -<channel> -<title>testing í entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/icirc.xml b/lib/feedparser/tests/entities/icirc.xml deleted file mode 100644 index 42de099af..000000000 --- a/lib/feedparser/tests/entities/icirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: icirc -Expect: feed['title'] == u'testing \xee entity' ---> -<rss> -<channel> -<title>testing î entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/iexcl.xml b/lib/feedparser/tests/entities/iexcl.xml deleted file mode 100644 index e8eb65637..000000000 --- a/lib/feedparser/tests/entities/iexcl.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iexcl -Expect: feed['title'] == u'testing \xa1 entity' ---> -<rss> -<channel> -<title>testing ¡ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/igrave.xml b/lib/feedparser/tests/entities/igrave.xml deleted file mode 100644 index 788cf5a8f..000000000 --- a/lib/feedparser/tests/entities/igrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: igrave -Expect: feed['title'] == u'testing \xec entity' ---> -<rss> -<channel> -<title>testing ì entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/image.xml b/lib/feedparser/tests/entities/image.xml deleted file mode 100644 index a49bb6ec7..000000000 --- a/lib/feedparser/tests/entities/image.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: image -Expect: feed['title'] == u'testing \u2111 entity' ---> -<rss> -<channel> -<title>testing ℑ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/infin.xml b/lib/feedparser/tests/entities/infin.xml deleted file mode 100644 index 37e2cce3c..000000000 --- a/lib/feedparser/tests/entities/infin.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: infin -Expect: feed['title'] == u'testing \u221e entity' ---> -<rss> -<channel> -<title>testing ∞ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/int.xml b/lib/feedparser/tests/entities/int.xml deleted file mode 100644 index f84f9645a..000000000 --- a/lib/feedparser/tests/entities/int.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: int -Expect: feed['title'] == u'testing \u222b entity' ---> -<rss> -<channel> -<title>testing ∫ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/iota.xml b/lib/feedparser/tests/entities/iota.xml deleted file mode 100644 index 38e239668..000000000 --- a/lib/feedparser/tests/entities/iota.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iota -Expect: feed['title'] == u'testing \u03b9 entity' ---> -<rss> -<channel> -<title>testing ι entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/iquest.xml b/lib/feedparser/tests/entities/iquest.xml deleted file mode 100644 index f73b3f735..000000000 --- a/lib/feedparser/tests/entities/iquest.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iquest -Expect: feed['title'] == u'testing \xbf entity' ---> -<rss> -<channel> -<title>testing ¿ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/isin.xml b/lib/feedparser/tests/entities/isin.xml deleted file mode 100644 index 2ef0469b7..000000000 --- a/lib/feedparser/tests/entities/isin.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: isin -Expect: feed['title'] == u'testing \u2208 entity' ---> -<rss> -<channel> -<title>testing ∈ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/iuml.xml b/lib/feedparser/tests/entities/iuml.xml deleted file mode 100644 index ca69817c6..000000000 --- a/lib/feedparser/tests/entities/iuml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iuml -Expect: feed['title'] == u'testing \xef entity' ---> -<rss> -<channel> -<title>testing ï entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/kappa.xml b/lib/feedparser/tests/entities/kappa.xml deleted file mode 100644 index 2ab0736b2..000000000 --- a/lib/feedparser/tests/entities/kappa.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: kappa -Expect: feed['title'] == u'testing \u03ba entity' ---> -<rss> -<channel> -<title>testing κ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lArr.xml b/lib/feedparser/tests/entities/lArr.xml deleted file mode 100644 index 156f8e91b..000000000 --- a/lib/feedparser/tests/entities/lArr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: larr -Expect: feed['title'] == u'testing \u2190 entity' ---> -<rss> -<channel> -<title>testing ← entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lambda.xml b/lib/feedparser/tests/entities/lambda.xml deleted file mode 100644 index 8910ed305..000000000 --- a/lib/feedparser/tests/entities/lambda.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lambda -Expect: feed['title'] == u'testing \u03bb entity' ---> -<rss> -<channel> -<title>testing λ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lang.xml b/lib/feedparser/tests/entities/lang.xml deleted file mode 100644 index db4e4e9f2..000000000 --- a/lib/feedparser/tests/entities/lang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lang -Expect: feed['title'] == u'testing \u2329 entity' ---> -<rss> -<channel> -<title>testing ⟨ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/laquo.xml b/lib/feedparser/tests/entities/laquo.xml deleted file mode 100644 index 79537ca0c..000000000 --- a/lib/feedparser/tests/entities/laquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: laquo -Expect: feed['title'] == u'testing \xab entity' ---> -<rss> -<channel> -<title>testing « entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lceil.xml b/lib/feedparser/tests/entities/lceil.xml deleted file mode 100644 index eef0da641..000000000 --- a/lib/feedparser/tests/entities/lceil.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lceil -Expect: feed['title'] == u'testing \u2308 entity' ---> -<rss> -<channel> -<title>testing ⌈ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ldquo.xml b/lib/feedparser/tests/entities/ldquo.xml deleted file mode 100644 index 791e48919..000000000 --- a/lib/feedparser/tests/entities/ldquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ldquo -Expect: feed['title'] == u'testing \u201c entity' ---> -<rss> -<channel> -<title>testing “ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/le.xml b/lib/feedparser/tests/entities/le.xml deleted file mode 100644 index f25859512..000000000 --- a/lib/feedparser/tests/entities/le.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: le -Expect: feed['title'] == u'testing \u2264 entity' ---> -<rss> -<channel> -<title>testing ≤ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lfloor.xml b/lib/feedparser/tests/entities/lfloor.xml deleted file mode 100644 index 50d5a226a..000000000 --- a/lib/feedparser/tests/entities/lfloor.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lfloor -Expect: feed['title'] == u'testing \u230a entity' ---> -<rss> -<channel> -<title>testing ⌊ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lowast.xml b/lib/feedparser/tests/entities/lowast.xml deleted file mode 100644 index 008218044..000000000 --- a/lib/feedparser/tests/entities/lowast.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lowast -Expect: feed['title'] == u'testing \u2217 entity' ---> -<rss> -<channel> -<title>testing ∗ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/loz.xml b/lib/feedparser/tests/entities/loz.xml deleted file mode 100644 index 29ffb0690..000000000 --- a/lib/feedparser/tests/entities/loz.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: loz -Expect: feed['title'] == u'testing \u25ca entity' ---> -<rss> -<channel> -<title>testing ◊ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lrm.xml b/lib/feedparser/tests/entities/lrm.xml deleted file mode 100644 index d672bc314..000000000 --- a/lib/feedparser/tests/entities/lrm.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lrm -Expect: feed['title'] == u'testing \u200e entity' ---> -<rss> -<channel> -<title>testing ‎ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lsaquo.xml b/lib/feedparser/tests/entities/lsaquo.xml deleted file mode 100644 index 2faa2ed59..000000000 --- a/lib/feedparser/tests/entities/lsaquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lsaquo -Expect: feed['title'] == u'testing \u2039 entity' ---> -<rss> -<channel> -<title>testing ‹ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/lsquo.xml b/lib/feedparser/tests/entities/lsquo.xml deleted file mode 100644 index 2297817bf..000000000 --- a/lib/feedparser/tests/entities/lsquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: lsquo -Expect: feed['title'] == u'testing \u2018 entity' ---> -<rss> -<channel> -<title>testing ‘ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/macr.xml b/lib/feedparser/tests/entities/macr.xml deleted file mode 100644 index 4699e32dc..000000000 --- a/lib/feedparser/tests/entities/macr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: macr -Expect: feed['title'] == u'testing \xaf entity' ---> -<rss> -<channel> -<title>testing ¯ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/mdash.xml b/lib/feedparser/tests/entities/mdash.xml deleted file mode 100644 index e2f8503af..000000000 --- a/lib/feedparser/tests/entities/mdash.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: mdash -Expect: feed['title'] == u'testing \u2014 entity' ---> -<rss> -<channel> -<title>testing — entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/micro.xml b/lib/feedparser/tests/entities/micro.xml deleted file mode 100644 index 5feecd069..000000000 --- a/lib/feedparser/tests/entities/micro.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: micro -Expect: feed['title'] == u'testing \xb5 entity' ---> -<rss> -<channel> -<title>testing µ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/middot.xml b/lib/feedparser/tests/entities/middot.xml deleted file mode 100644 index c436115f9..000000000 --- a/lib/feedparser/tests/entities/middot.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: middot -Expect: feed['title'] == u'testing \xb7 entity' ---> -<rss> -<channel> -<title>testing · entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/minus.xml b/lib/feedparser/tests/entities/minus.xml deleted file mode 100644 index 08baeac43..000000000 --- a/lib/feedparser/tests/entities/minus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: minus -Expect: feed['title'] == u'testing \u2212 entity' ---> -<rss> -<channel> -<title>testing − entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/mu.xml b/lib/feedparser/tests/entities/mu.xml deleted file mode 100644 index 81eb6fa89..000000000 --- a/lib/feedparser/tests/entities/mu.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: mu -Expect: feed['title'] == u'testing \u03bc entity' ---> -<rss> -<channel> -<title>testing μ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/nabla.xml b/lib/feedparser/tests/entities/nabla.xml deleted file mode 100644 index 770ce74a7..000000000 --- a/lib/feedparser/tests/entities/nabla.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: nabla -Expect: feed['title'] == u'testing \u2207 entity' ---> -<rss> -<channel> -<title>testing ∇ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/nbsp.xml b/lib/feedparser/tests/entities/nbsp.xml deleted file mode 100644 index e61d94f51..000000000 --- a/lib/feedparser/tests/entities/nbsp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: nbsp -Expect: feed['title'] == u'testing \xa0 entity' ---> -<rss> -<channel> -<title>testing entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ndash.xml b/lib/feedparser/tests/entities/ndash.xml deleted file mode 100644 index 801b4e7e4..000000000 --- a/lib/feedparser/tests/entities/ndash.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ndash -Expect: feed['title'] == u'testing \u2013 entity' ---> -<rss> -<channel> -<title>testing – entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ne.xml b/lib/feedparser/tests/entities/ne.xml deleted file mode 100644 index 911a7f165..000000000 --- a/lib/feedparser/tests/entities/ne.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ne -Expect: feed['title'] == u'testing \u2260 entity' ---> -<rss> -<channel> -<title>testing ≠ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ni.xml b/lib/feedparser/tests/entities/ni.xml deleted file mode 100644 index 5022ec68a..000000000 --- a/lib/feedparser/tests/entities/ni.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ni -Expect: feed['title'] == u'testing \u220b entity' ---> -<rss> -<channel> -<title>testing ∋ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/not.xml b/lib/feedparser/tests/entities/not.xml deleted file mode 100644 index 0179bb8cf..000000000 --- a/lib/feedparser/tests/entities/not.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: not -Expect: feed['title'] == u'testing \xac entity' ---> -<rss> -<channel> -<title>testing ¬ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/notin.xml b/lib/feedparser/tests/entities/notin.xml deleted file mode 100644 index 3c8f1f483..000000000 --- a/lib/feedparser/tests/entities/notin.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: notin -Expect: feed['title'] == u'testing \u2209 entity' ---> -<rss> -<channel> -<title>testing ∉ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/nsub.xml b/lib/feedparser/tests/entities/nsub.xml deleted file mode 100644 index a9f4aca5e..000000000 --- a/lib/feedparser/tests/entities/nsub.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: nsub -Expect: feed['title'] == u'testing \u2284 entity' ---> -<rss> -<channel> -<title>testing ⊄ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ntilde.xml b/lib/feedparser/tests/entities/ntilde.xml deleted file mode 100644 index 0160c98e7..000000000 --- a/lib/feedparser/tests/entities/ntilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ntilde -Expect: feed['title'] == u'testing \xf1 entity' ---> -<rss> -<channel> -<title>testing ñ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/nu.xml b/lib/feedparser/tests/entities/nu.xml deleted file mode 100644 index e9b99ef65..000000000 --- a/lib/feedparser/tests/entities/nu.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: nu -Expect: feed['title'] == u'testing \u03bd entity' ---> -<rss> -<channel> -<title>testing ν entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/oacute.xml b/lib/feedparser/tests/entities/oacute.xml deleted file mode 100644 index 7e7ad9592..000000000 --- a/lib/feedparser/tests/entities/oacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: oacute -Expect: feed['title'] == u'testing \xf3 entity' ---> -<rss> -<channel> -<title>testing ó entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ocirc.xml b/lib/feedparser/tests/entities/ocirc.xml deleted file mode 100644 index 561279cee..000000000 --- a/lib/feedparser/tests/entities/ocirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ocirc -Expect: feed['title'] == u'testing \xf4 entity' ---> -<rss> -<channel> -<title>testing ô entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/oelig.xml b/lib/feedparser/tests/entities/oelig.xml deleted file mode 100644 index 54322396a..000000000 --- a/lib/feedparser/tests/entities/oelig.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: oelig -Expect: feed['title'] == u'testing \u0153 entity' ---> -<rss> -<channel> -<title>testing œ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ograve.xml b/lib/feedparser/tests/entities/ograve.xml deleted file mode 100644 index 44dbaf5b6..000000000 --- a/lib/feedparser/tests/entities/ograve.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ograve -Expect: feed['title'] == u'testing \xf2 entity' ---> -<rss> -<channel> -<title>testing ò entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/oline.xml b/lib/feedparser/tests/entities/oline.xml deleted file mode 100644 index 193b139ec..000000000 --- a/lib/feedparser/tests/entities/oline.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: oline -Expect: feed['title'] == u'testing \u203e entity' ---> -<rss> -<channel> -<title>testing ‾ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/omega.xml b/lib/feedparser/tests/entities/omega.xml deleted file mode 100644 index 614ad7e79..000000000 --- a/lib/feedparser/tests/entities/omega.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: omega -Expect: feed['title'] == u'testing \u03c9 entity' ---> -<rss> -<channel> -<title>testing ω entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/omicron.xml b/lib/feedparser/tests/entities/omicron.xml deleted file mode 100644 index 5c23feb59..000000000 --- a/lib/feedparser/tests/entities/omicron.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: omicron -Expect: feed['title'] == u'testing \u03bf entity' ---> -<rss> -<channel> -<title>testing ο entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/oplus.xml b/lib/feedparser/tests/entities/oplus.xml deleted file mode 100644 index 374d1596c..000000000 --- a/lib/feedparser/tests/entities/oplus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: oplus -Expect: feed['title'] == u'testing \u2295 entity' ---> -<rss> -<channel> -<title>testing ⊕ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/or.xml b/lib/feedparser/tests/entities/or.xml deleted file mode 100644 index 8499a33af..000000000 --- a/lib/feedparser/tests/entities/or.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: or -Expect: feed['title'] == u'testing \u2228 entity' ---> -<rss> -<channel> -<title>testing ∨ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ordf.xml b/lib/feedparser/tests/entities/ordf.xml deleted file mode 100644 index 13faf67b9..000000000 --- a/lib/feedparser/tests/entities/ordf.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ordf -Expect: feed['title'] == u'testing \xaa entity' ---> -<rss> -<channel> -<title>testing ª entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ordm.xml b/lib/feedparser/tests/entities/ordm.xml deleted file mode 100644 index da47c1e4a..000000000 --- a/lib/feedparser/tests/entities/ordm.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ordm -Expect: feed['title'] == u'testing \xba entity' ---> -<rss> -<channel> -<title>testing º entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/oslash.xml b/lib/feedparser/tests/entities/oslash.xml deleted file mode 100644 index 50e6c86b7..000000000 --- a/lib/feedparser/tests/entities/oslash.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: oslash -Expect: feed['title'] == u'testing \xf8 entity' ---> -<rss> -<channel> -<title>testing ø entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/otilde.xml b/lib/feedparser/tests/entities/otilde.xml deleted file mode 100644 index e5636bfef..000000000 --- a/lib/feedparser/tests/entities/otilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: otilde -Expect: feed['title'] == u'testing \xf5 entity' ---> -<rss> -<channel> -<title>testing õ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/otimes.xml b/lib/feedparser/tests/entities/otimes.xml deleted file mode 100644 index 4f89df3ab..000000000 --- a/lib/feedparser/tests/entities/otimes.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: otimes -Expect: feed['title'] == u'testing \u2297 entity' ---> -<rss> -<channel> -<title>testing ⊗ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ouml.xml b/lib/feedparser/tests/entities/ouml.xml deleted file mode 100644 index cc6f868de..000000000 --- a/lib/feedparser/tests/entities/ouml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ouml -Expect: feed['title'] == u'testing \xf6 entity' ---> -<rss> -<channel> -<title>testing ö entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/para.xml b/lib/feedparser/tests/entities/para.xml deleted file mode 100644 index 6d86c990f..000000000 --- a/lib/feedparser/tests/entities/para.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: para -Expect: feed['title'] == u'testing \xb6 entity' ---> -<rss> -<channel> -<title>testing ¶ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/part.xml b/lib/feedparser/tests/entities/part.xml deleted file mode 100644 index a60559cf5..000000000 --- a/lib/feedparser/tests/entities/part.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: part -Expect: feed['title'] == u'testing \u2202 entity' ---> -<rss> -<channel> -<title>testing ∂ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/permil.xml b/lib/feedparser/tests/entities/permil.xml deleted file mode 100644 index 9d1422157..000000000 --- a/lib/feedparser/tests/entities/permil.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: permil -Expect: feed['title'] == u'testing \u2030 entity' ---> -<rss> -<channel> -<title>testing ‰ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/perp.xml b/lib/feedparser/tests/entities/perp.xml deleted file mode 100644 index a2a28141f..000000000 --- a/lib/feedparser/tests/entities/perp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: perp -Expect: feed['title'] == u'testing \u22a5 entity' ---> -<rss> -<channel> -<title>testing ⊥ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/phi.xml b/lib/feedparser/tests/entities/phi.xml deleted file mode 100644 index 815a262d2..000000000 --- a/lib/feedparser/tests/entities/phi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: phi -Expect: feed['title'] == u'testing \u03c6 entity' ---> -<rss> -<channel> -<title>testing φ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/pi.xml b/lib/feedparser/tests/entities/pi.xml deleted file mode 100644 index c20d3ed25..000000000 --- a/lib/feedparser/tests/entities/pi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: pi -Expect: feed['title'] == u'testing \u03c0 entity' ---> -<rss> -<channel> -<title>testing π entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/piv.xml b/lib/feedparser/tests/entities/piv.xml deleted file mode 100644 index 31560b543..000000000 --- a/lib/feedparser/tests/entities/piv.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: piv -Expect: feed['title'] == u'testing \u03d6 entity' ---> -<rss> -<channel> -<title>testing ϖ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/plusmn.xml b/lib/feedparser/tests/entities/plusmn.xml deleted file mode 100644 index 77f181ae7..000000000 --- a/lib/feedparser/tests/entities/plusmn.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: plusmn -Expect: feed['title'] == u'testing \xb1 entity' ---> -<rss> -<channel> -<title>testing ± entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/pound.xml b/lib/feedparser/tests/entities/pound.xml deleted file mode 100644 index 8f58936fa..000000000 --- a/lib/feedparser/tests/entities/pound.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: pound -Expect: feed['title'] == u'testing \xa3 entity' ---> -<rss> -<channel> -<title>testing £ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/prime.xml b/lib/feedparser/tests/entities/prime.xml deleted file mode 100644 index 56f95ee34..000000000 --- a/lib/feedparser/tests/entities/prime.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: prime -Expect: feed['title'] == u'testing \u2032 entity' ---> -<rss> -<channel> -<title>testing ′ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/prod.xml b/lib/feedparser/tests/entities/prod.xml deleted file mode 100644 index 540e9350a..000000000 --- a/lib/feedparser/tests/entities/prod.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: prod -Expect: feed['title'] == u'testing \u220f entity' ---> -<rss> -<channel> -<title>testing ∏ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/prop.xml b/lib/feedparser/tests/entities/prop.xml deleted file mode 100644 index 3996b3425..000000000 --- a/lib/feedparser/tests/entities/prop.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: prop -Expect: feed['title'] == u'testing \u221d entity' ---> -<rss> -<channel> -<title>testing ∝ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/psi.xml b/lib/feedparser/tests/entities/psi.xml deleted file mode 100644 index 104d58515..000000000 --- a/lib/feedparser/tests/entities/psi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: psi -Expect: feed['title'] == u'testing \u03c8 entity' ---> -<rss> -<channel> -<title>testing ψ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/query_variable_entry.xml b/lib/feedparser/tests/entities/query_variable_entry.xml deleted file mode 100644 index 565c3d905..000000000 --- a/lib/feedparser/tests/entities/query_variable_entry.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: unescaped ampersand in URL query variable doesn't affect entry URL -Expect: entries[0].link == u'http://example/?a=1&b=2&c' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://example/?a=1&b=2&c</link> -</item> -</channel> -</rss diff --git a/lib/feedparser/tests/entities/query_variable_feed.xml b/lib/feedparser/tests/entities/query_variable_feed.xml deleted file mode 100644 index 014f070b7..000000000 --- a/lib/feedparser/tests/entities/query_variable_feed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: unescaped ampersand in URL query variable doesn't affect feed URL -Expect: feed.link == u'http://example/?a=1&b=2&c' ---> -<rss version="2.0"> -<channel> -<link>http://example/?a=1&b=2&c</link> -</channel> -</rss diff --git a/lib/feedparser/tests/entities/radic.xml b/lib/feedparser/tests/entities/radic.xml deleted file mode 100644 index e9da90e06..000000000 --- a/lib/feedparser/tests/entities/radic.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: radic -Expect: feed['title'] == u'testing \u221a entity' ---> -<rss> -<channel> -<title>testing √ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rang.xml b/lib/feedparser/tests/entities/rang.xml deleted file mode 100644 index 19be10430..000000000 --- a/lib/feedparser/tests/entities/rang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rang -Expect: feed['title'] == u'testing \u232a entity' ---> -<rss> -<channel> -<title>testing ⟩ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/raquo.xml b/lib/feedparser/tests/entities/raquo.xml deleted file mode 100644 index 60dec82dd..000000000 --- a/lib/feedparser/tests/entities/raquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: raquo -Expect: feed['title'] == u'testing \xbb entity' ---> -<rss> -<channel> -<title>testing » entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rarr.xml b/lib/feedparser/tests/entities/rarr.xml deleted file mode 100644 index 95c8403bd..000000000 --- a/lib/feedparser/tests/entities/rarr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rArr -Expect: feed['title'] == u'testing \u21d2 entity' ---> -<rss> -<channel> -<title>testing ⇒ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rceil.xml b/lib/feedparser/tests/entities/rceil.xml deleted file mode 100644 index 6059028b6..000000000 --- a/lib/feedparser/tests/entities/rceil.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rceil -Expect: feed['title'] == u'testing \u2309 entity' ---> -<rss> -<channel> -<title>testing ⌉ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rdquo.xml b/lib/feedparser/tests/entities/rdquo.xml deleted file mode 100644 index 05c2b2dd4..000000000 --- a/lib/feedparser/tests/entities/rdquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rdquo -Expect: feed['title'] == u'testing \u201d entity' ---> -<rss> -<channel> -<title>testing ” entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/real.xml b/lib/feedparser/tests/entities/real.xml deleted file mode 100644 index da61fb9b4..000000000 --- a/lib/feedparser/tests/entities/real.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: real -Expect: feed['title'] == u'testing \u211c entity' ---> -<rss> -<channel> -<title>testing ℜ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/reg.xml b/lib/feedparser/tests/entities/reg.xml deleted file mode 100644 index 5c4ab1d81..000000000 --- a/lib/feedparser/tests/entities/reg.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: reg -Expect: feed['title'] == u'testing \xae entity' ---> -<rss> -<channel> -<title>testing ® entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rfloor.xml b/lib/feedparser/tests/entities/rfloor.xml deleted file mode 100644 index 2cbfe724e..000000000 --- a/lib/feedparser/tests/entities/rfloor.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rfloor -Expect: feed['title'] == u'testing \u230b entity' ---> -<rss> -<channel> -<title>testing ⌋ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rho.xml b/lib/feedparser/tests/entities/rho.xml deleted file mode 100644 index 9593cf3d6..000000000 --- a/lib/feedparser/tests/entities/rho.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rho -Expect: feed['title'] == u'testing \u03c1 entity' ---> -<rss> -<channel> -<title>testing ρ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rlm.xml b/lib/feedparser/tests/entities/rlm.xml deleted file mode 100644 index 39607338f..000000000 --- a/lib/feedparser/tests/entities/rlm.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rlm -Expect: feed['title'] == u'testing \u200f entity' ---> -<rss> -<channel> -<title>testing ‏ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rsaquo.xml b/lib/feedparser/tests/entities/rsaquo.xml deleted file mode 100644 index da3fe7644..000000000 --- a/lib/feedparser/tests/entities/rsaquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rsaquo -Expect: feed['title'] == u'testing \u203a entity' ---> -<rss> -<channel> -<title>testing › entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/rsquo.xml b/lib/feedparser/tests/entities/rsquo.xml deleted file mode 100644 index a24bc0b37..000000000 --- a/lib/feedparser/tests/entities/rsquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rsquo -Expect: feed['title'] == u'testing \u2019 entity' ---> -<rss> -<channel> -<title>testing ’ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sbquo.xml b/lib/feedparser/tests/entities/sbquo.xml deleted file mode 100644 index 65d011c9c..000000000 --- a/lib/feedparser/tests/entities/sbquo.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sbquo -Expect: feed['title'] == u'testing \u201a entity' ---> -<rss> -<channel> -<title>testing ‚ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/scaron.xml b/lib/feedparser/tests/entities/scaron.xml deleted file mode 100644 index 5b0a075ea..000000000 --- a/lib/feedparser/tests/entities/scaron.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: scaron -Expect: feed['title'] == u'testing \u0161 entity' ---> -<rss> -<channel> -<title>testing š entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sdot.xml b/lib/feedparser/tests/entities/sdot.xml deleted file mode 100644 index 580263b5a..000000000 --- a/lib/feedparser/tests/entities/sdot.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sdot -Expect: feed['title'] == u'testing \u22c5 entity' ---> -<rss> -<channel> -<title>testing ⋅ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sect.xml b/lib/feedparser/tests/entities/sect.xml deleted file mode 100644 index 90d72799c..000000000 --- a/lib/feedparser/tests/entities/sect.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sect -Expect: feed['title'] == u'testing \xa7 entity' ---> -<rss> -<channel> -<title>testing § entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/shy.xml b/lib/feedparser/tests/entities/shy.xml deleted file mode 100644 index e0257093e..000000000 --- a/lib/feedparser/tests/entities/shy.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: shy -Expect: feed['title'] == u'testing \xad entity' ---> -<rss> -<channel> -<title>testing ­ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sigma.xml b/lib/feedparser/tests/entities/sigma.xml deleted file mode 100644 index 3d080ba12..000000000 --- a/lib/feedparser/tests/entities/sigma.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sigma -Expect: feed['title'] == u'testing \u03c3 entity' ---> -<rss> -<channel> -<title>testing σ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sigmaf.xml b/lib/feedparser/tests/entities/sigmaf.xml deleted file mode 100644 index 3dbf8a011..000000000 --- a/lib/feedparser/tests/entities/sigmaf.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sigmaf -Expect: feed['title'] == u'testing \u03c2 entity' ---> -<rss> -<channel> -<title>testing ς entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sim.xml b/lib/feedparser/tests/entities/sim.xml deleted file mode 100644 index 7b1eadd6d..000000000 --- a/lib/feedparser/tests/entities/sim.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sim -Expect: feed['title'] == u'testing \u223c entity' ---> -<rss> -<channel> -<title>testing ∼ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/spades.xml b/lib/feedparser/tests/entities/spades.xml deleted file mode 100644 index 806acfe09..000000000 --- a/lib/feedparser/tests/entities/spades.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: spades -Expect: feed['title'] == u'testing \u2660 entity' ---> -<rss> -<channel> -<title>testing ♠ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sub.xml b/lib/feedparser/tests/entities/sub.xml deleted file mode 100644 index e52b46ea3..000000000 --- a/lib/feedparser/tests/entities/sub.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sub -Expect: feed['title'] == u'testing \u2282 entity' ---> -<rss> -<channel> -<title>testing ⊂ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sube.xml b/lib/feedparser/tests/entities/sube.xml deleted file mode 100644 index 163e2e6bc..000000000 --- a/lib/feedparser/tests/entities/sube.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sube -Expect: feed['title'] == u'testing \u2286 entity' ---> -<rss> -<channel> -<title>testing ⊆ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sum.xml b/lib/feedparser/tests/entities/sum.xml deleted file mode 100644 index 415dcc319..000000000 --- a/lib/feedparser/tests/entities/sum.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sum -Expect: feed['title'] == u'testing \u2211 entity' ---> -<rss> -<channel> -<title>testing ∑ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sup.xml b/lib/feedparser/tests/entities/sup.xml deleted file mode 100644 index 19d6c56ef..000000000 --- a/lib/feedparser/tests/entities/sup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sup -Expect: feed['title'] == u'testing \u2283 entity' ---> -<rss> -<channel> -<title>testing ⊃ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sup1.xml b/lib/feedparser/tests/entities/sup1.xml deleted file mode 100644 index 37b4adb8f..000000000 --- a/lib/feedparser/tests/entities/sup1.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sup1 -Expect: feed['title'] == u'testing \xb9 entity' ---> -<rss> -<channel> -<title>testing ¹ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sup2.xml b/lib/feedparser/tests/entities/sup2.xml deleted file mode 100644 index e4793553a..000000000 --- a/lib/feedparser/tests/entities/sup2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sup2 -Expect: feed['title'] == u'testing \xb2 entity' ---> -<rss> -<channel> -<title>testing ² entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/sup3.xml b/lib/feedparser/tests/entities/sup3.xml deleted file mode 100644 index dd47f583f..000000000 --- a/lib/feedparser/tests/entities/sup3.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: sup3 -Expect: feed['title'] == u'testing \xb3 entity' ---> -<rss> -<channel> -<title>testing ³ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/supe.xml b/lib/feedparser/tests/entities/supe.xml deleted file mode 100644 index 4091ca785..000000000 --- a/lib/feedparser/tests/entities/supe.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: supe -Expect: feed['title'] == u'testing \u2287 entity' ---> -<rss> -<channel> -<title>testing ⊇ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/szlig.xml b/lib/feedparser/tests/entities/szlig.xml deleted file mode 100644 index b7698fde4..000000000 --- a/lib/feedparser/tests/entities/szlig.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: szlig -Expect: feed['title'] == u'testing \xdf entity' ---> -<rss> -<channel> -<title>testing ß entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/tau.xml b/lib/feedparser/tests/entities/tau.xml deleted file mode 100644 index 9a367ddd8..000000000 --- a/lib/feedparser/tests/entities/tau.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: tau -Expect: feed['title'] == u'testing \u03c4 entity' ---> -<rss> -<channel> -<title>testing τ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/there4.xml b/lib/feedparser/tests/entities/there4.xml deleted file mode 100644 index 14b9c375b..000000000 --- a/lib/feedparser/tests/entities/there4.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: there4 -Expect: feed['title'] == u'testing \u2234 entity' ---> -<rss> -<channel> -<title>testing ∴ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/theta.xml b/lib/feedparser/tests/entities/theta.xml deleted file mode 100644 index eb85cdf2a..000000000 --- a/lib/feedparser/tests/entities/theta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: theta -Expect: feed['title'] == u'testing \u03b8 entity' ---> -<rss> -<channel> -<title>testing θ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/thetasym.xml b/lib/feedparser/tests/entities/thetasym.xml deleted file mode 100644 index 8244ba1af..000000000 --- a/lib/feedparser/tests/entities/thetasym.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: thetasym -Expect: feed['title'] == u'testing \u03d1 entity' ---> -<rss> -<channel> -<title>testing ϑ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/thinsp.xml b/lib/feedparser/tests/entities/thinsp.xml deleted file mode 100644 index 580abadb0..000000000 --- a/lib/feedparser/tests/entities/thinsp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: thinsp -Expect: feed['title'] == u'testing \u2009 entity' ---> -<rss> -<channel> -<title>testing   entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/thorn.xml b/lib/feedparser/tests/entities/thorn.xml deleted file mode 100644 index a8694f089..000000000 --- a/lib/feedparser/tests/entities/thorn.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: thorn -Expect: feed['title'] == u'testing \xfe entity' ---> -<rss> -<channel> -<title>testing þ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/tilde.xml b/lib/feedparser/tests/entities/tilde.xml deleted file mode 100644 index a12b983c5..000000000 --- a/lib/feedparser/tests/entities/tilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: tilde -Expect: feed['title'] == u'testing \u02dc entity' ---> -<rss> -<channel> -<title>testing ˜ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/times.xml b/lib/feedparser/tests/entities/times.xml deleted file mode 100644 index 6c40e69e2..000000000 --- a/lib/feedparser/tests/entities/times.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: times -Expect: feed['title'] == u'testing \xd7 entity' ---> -<rss> -<channel> -<title>testing × entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/trade.xml b/lib/feedparser/tests/entities/trade.xml deleted file mode 100644 index e93bd4827..000000000 --- a/lib/feedparser/tests/entities/trade.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: trade -Expect: feed['title'] == u'testing \u2122 entity' ---> -<rss> -<channel> -<title>testing ™ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/uacute.xml b/lib/feedparser/tests/entities/uacute.xml deleted file mode 100644 index 4d9cff3be..000000000 --- a/lib/feedparser/tests/entities/uacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: uacute -Expect: feed['title'] == u'testing \xfa entity' ---> -<rss> -<channel> -<title>testing ú entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/uarr.xml b/lib/feedparser/tests/entities/uarr.xml deleted file mode 100644 index ca3ae5d24..000000000 --- a/lib/feedparser/tests/entities/uarr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: uArr -Expect: feed['title'] == u'testing \u21d1 entity' ---> -<rss> -<channel> -<title>testing ⇑ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ucirc.xml b/lib/feedparser/tests/entities/ucirc.xml deleted file mode 100644 index 5da01a03e..000000000 --- a/lib/feedparser/tests/entities/ucirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ucirc -Expect: feed['title'] == u'testing \xfb entity' ---> -<rss> -<channel> -<title>testing û entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/ugrave.xml b/lib/feedparser/tests/entities/ugrave.xml deleted file mode 100644 index e949fa11b..000000000 --- a/lib/feedparser/tests/entities/ugrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ugrave -Expect: feed['title'] == u'testing \xf9 entity' ---> -<rss> -<channel> -<title>testing ù entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/uml.xml b/lib/feedparser/tests/entities/uml.xml deleted file mode 100644 index 5245577f4..000000000 --- a/lib/feedparser/tests/entities/uml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: uml -Expect: feed['title'] == u'testing \xa8 entity' ---> -<rss> -<channel> -<title>testing ¨ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_AElig.xml b/lib/feedparser/tests/entities/upper_AElig.xml deleted file mode 100644 index d18840743..000000000 --- a/lib/feedparser/tests/entities/upper_AElig.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: AElig -Expect: feed['title'] == u'testing \xc6 entity' ---> -<rss> -<channel> -<title>testing Æ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Aacute.xml b/lib/feedparser/tests/entities/upper_Aacute.xml deleted file mode 100644 index d33622b92..000000000 --- a/lib/feedparser/tests/entities/upper_Aacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Aacute -Expect: feed['title'] == u'testing \xc1 entity' ---> -<rss> -<channel> -<title>testing Á entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Acirc.xml b/lib/feedparser/tests/entities/upper_Acirc.xml deleted file mode 100644 index be9093cf7..000000000 --- a/lib/feedparser/tests/entities/upper_Acirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Acirc -Expect: feed['title'] == u'testing \xc2 entity' ---> -<rss> -<channel> -<title>testing  entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Agrave.xml b/lib/feedparser/tests/entities/upper_Agrave.xml deleted file mode 100644 index 5635d5b0f..000000000 --- a/lib/feedparser/tests/entities/upper_Agrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Agrave -Expect: feed['title'] == u'testing \xc0 entity' ---> -<rss> -<channel> -<title>testing À entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Alpha.xml b/lib/feedparser/tests/entities/upper_Alpha.xml deleted file mode 100644 index d78bd94e5..000000000 --- a/lib/feedparser/tests/entities/upper_Alpha.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Alpha -Expect: feed['title'] == u'testing \u0391 entity' ---> -<rss> -<channel> -<title>testing Α entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Aring.xml b/lib/feedparser/tests/entities/upper_Aring.xml deleted file mode 100644 index ce140cba4..000000000 --- a/lib/feedparser/tests/entities/upper_Aring.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Aring -Expect: feed['title'] == u'testing \xc5 entity' ---> -<rss> -<channel> -<title>testing Å entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Atilde.xml b/lib/feedparser/tests/entities/upper_Atilde.xml deleted file mode 100644 index cf4bc6fa6..000000000 --- a/lib/feedparser/tests/entities/upper_Atilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Atilde -Expect: feed['title'] == u'testing \xc3 entity' ---> -<rss> -<channel> -<title>testing à entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Auml.xml b/lib/feedparser/tests/entities/upper_Auml.xml deleted file mode 100644 index 7e85269aa..000000000 --- a/lib/feedparser/tests/entities/upper_Auml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Auml -Expect: feed['title'] == u'testing \xc4 entity' ---> -<rss> -<channel> -<title>testing Ä entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Beta.xml b/lib/feedparser/tests/entities/upper_Beta.xml deleted file mode 100644 index 871a11b6d..000000000 --- a/lib/feedparser/tests/entities/upper_Beta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Beta -Expect: feed['title'] == u'testing \u0392 entity' ---> -<rss> -<channel> -<title>testing Β entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ccedil.xml b/lib/feedparser/tests/entities/upper_Ccedil.xml deleted file mode 100644 index 38a830b84..000000000 --- a/lib/feedparser/tests/entities/upper_Ccedil.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ccedil -Expect: feed['title'] == u'testing \xc7 entity' ---> -<rss> -<channel> -<title>testing Ç entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Chi.xml b/lib/feedparser/tests/entities/upper_Chi.xml deleted file mode 100644 index ea02cd634..000000000 --- a/lib/feedparser/tests/entities/upper_Chi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Chi -Expect: feed['title'] == u'testing \u03a7 entity' ---> -<rss> -<channel> -<title>testing Χ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Dagger.xml b/lib/feedparser/tests/entities/upper_Dagger.xml deleted file mode 100644 index 2a6c75aa7..000000000 --- a/lib/feedparser/tests/entities/upper_Dagger.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Dagger -Expect: feed['title'] == u'testing \u2021 entity' ---> -<rss> -<channel> -<title>testing ‡ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Delta.xml b/lib/feedparser/tests/entities/upper_Delta.xml deleted file mode 100644 index 71d3cdd49..000000000 --- a/lib/feedparser/tests/entities/upper_Delta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Delta -Expect: feed['title'] == u'testing \u0394 entity' ---> -<rss> -<channel> -<title>testing Δ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_ETH.xml b/lib/feedparser/tests/entities/upper_ETH.xml deleted file mode 100644 index 32d860632..000000000 --- a/lib/feedparser/tests/entities/upper_ETH.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ETH -Expect: feed['title'] == u'testing \xd0 entity' ---> -<rss> -<channel> -<title>testing Ð entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Eacute.xml b/lib/feedparser/tests/entities/upper_Eacute.xml deleted file mode 100644 index 9ced3e1fb..000000000 --- a/lib/feedparser/tests/entities/upper_Eacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Eacute -Expect: feed['title'] == u'testing \xc9 entity' ---> -<rss> -<channel> -<title>testing É entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ecirc.xml b/lib/feedparser/tests/entities/upper_Ecirc.xml deleted file mode 100644 index 2e22adab9..000000000 --- a/lib/feedparser/tests/entities/upper_Ecirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ecirc -Expect: feed['title'] == u'testing \xca entity' ---> -<rss> -<channel> -<title>testing Ê entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Egrave.xml b/lib/feedparser/tests/entities/upper_Egrave.xml deleted file mode 100644 index 11323db2d..000000000 --- a/lib/feedparser/tests/entities/upper_Egrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Egrave -Expect: feed['title'] == u'testing \xc8 entity' ---> -<rss> -<channel> -<title>testing È entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Epsilon.xml b/lib/feedparser/tests/entities/upper_Epsilon.xml deleted file mode 100644 index a4bfd6517..000000000 --- a/lib/feedparser/tests/entities/upper_Epsilon.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Epsilon -Expect: feed['title'] == u'testing \u0395 entity' ---> -<rss> -<channel> -<title>testing Ε entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Eta.xml b/lib/feedparser/tests/entities/upper_Eta.xml deleted file mode 100644 index 0ba2a8928..000000000 --- a/lib/feedparser/tests/entities/upper_Eta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Eta -Expect: feed['title'] == u'testing \u0397 entity' ---> -<rss> -<channel> -<title>testing Η entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Euml.xml b/lib/feedparser/tests/entities/upper_Euml.xml deleted file mode 100644 index 9a7ea4a90..000000000 --- a/lib/feedparser/tests/entities/upper_Euml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Euml -Expect: feed['title'] == u'testing \xcb entity' ---> -<rss> -<channel> -<title>testing Ë entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Gamma.xml b/lib/feedparser/tests/entities/upper_Gamma.xml deleted file mode 100644 index d0d85bb5a..000000000 --- a/lib/feedparser/tests/entities/upper_Gamma.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Gamma -Expect: feed['title'] == u'testing \u0393 entity' ---> -<rss> -<channel> -<title>testing Γ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Iacute.xml b/lib/feedparser/tests/entities/upper_Iacute.xml deleted file mode 100644 index e7ebad95e..000000000 --- a/lib/feedparser/tests/entities/upper_Iacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Iacute -Expect: feed['title'] == u'testing \xcd entity' ---> -<rss> -<channel> -<title>testing Í entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Icirc.xml b/lib/feedparser/tests/entities/upper_Icirc.xml deleted file mode 100644 index 03d7e45bd..000000000 --- a/lib/feedparser/tests/entities/upper_Icirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Icirc -Expect: feed['title'] == u'testing \xce entity' ---> -<rss> -<channel> -<title>testing Î entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Igrave.xml b/lib/feedparser/tests/entities/upper_Igrave.xml deleted file mode 100644 index 97a112b15..000000000 --- a/lib/feedparser/tests/entities/upper_Igrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Igrave -Expect: feed['title'] == u'testing \xcc entity' ---> -<rss> -<channel> -<title>testing Ì entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Iota.xml b/lib/feedparser/tests/entities/upper_Iota.xml deleted file mode 100644 index 08153102f..000000000 --- a/lib/feedparser/tests/entities/upper_Iota.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Iota -Expect: feed['title'] == u'testing \u0399 entity' ---> -<rss> -<channel> -<title>testing Ι entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Iuml.xml b/lib/feedparser/tests/entities/upper_Iuml.xml deleted file mode 100644 index 6403c3635..000000000 --- a/lib/feedparser/tests/entities/upper_Iuml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Iuml -Expect: feed['title'] == u'testing \xcf entity' ---> -<rss> -<channel> -<title>testing Ï entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Kappa.xml b/lib/feedparser/tests/entities/upper_Kappa.xml deleted file mode 100644 index 347d70daa..000000000 --- a/lib/feedparser/tests/entities/upper_Kappa.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Kappa -Expect: feed['title'] == u'testing \u039a entity' ---> -<rss> -<channel> -<title>testing Κ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Lambda.xml b/lib/feedparser/tests/entities/upper_Lambda.xml deleted file mode 100644 index e67223cb0..000000000 --- a/lib/feedparser/tests/entities/upper_Lambda.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Lambda -Expect: feed['title'] == u'testing \u039b entity' ---> -<rss> -<channel> -<title>testing Λ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Mu.xml b/lib/feedparser/tests/entities/upper_Mu.xml deleted file mode 100644 index bfa0379a1..000000000 --- a/lib/feedparser/tests/entities/upper_Mu.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Mu -Expect: feed['title'] == u'testing \u039c entity' ---> -<rss> -<channel> -<title>testing Μ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ntilde.xml b/lib/feedparser/tests/entities/upper_Ntilde.xml deleted file mode 100644 index bfbd3bd40..000000000 --- a/lib/feedparser/tests/entities/upper_Ntilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ntilde -Expect: feed['title'] == u'testing \xd1 entity' ---> -<rss> -<channel> -<title>testing Ñ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Nu.xml b/lib/feedparser/tests/entities/upper_Nu.xml deleted file mode 100644 index 25779bf80..000000000 --- a/lib/feedparser/tests/entities/upper_Nu.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Nu -Expect: feed['title'] == u'testing \u039d entity' ---> -<rss> -<channel> -<title>testing Ν entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_OElig.xml b/lib/feedparser/tests/entities/upper_OElig.xml deleted file mode 100644 index 7d4863447..000000000 --- a/lib/feedparser/tests/entities/upper_OElig.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: OElig -Expect: feed['title'] == u'testing \u0152 entity' ---> -<rss> -<channel> -<title>testing Œ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Oacute.xml b/lib/feedparser/tests/entities/upper_Oacute.xml deleted file mode 100644 index eb3822583..000000000 --- a/lib/feedparser/tests/entities/upper_Oacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Oacute -Expect: feed['title'] == u'testing \xd3 entity' ---> -<rss> -<channel> -<title>testing Ó entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ocirc.xml b/lib/feedparser/tests/entities/upper_Ocirc.xml deleted file mode 100644 index 54e180732..000000000 --- a/lib/feedparser/tests/entities/upper_Ocirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ocirc -Expect: feed['title'] == u'testing \xd4 entity' ---> -<rss> -<channel> -<title>testing Ô entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ograve.xml b/lib/feedparser/tests/entities/upper_Ograve.xml deleted file mode 100644 index 895032731..000000000 --- a/lib/feedparser/tests/entities/upper_Ograve.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ograve -Expect: feed['title'] == u'testing \xd2 entity' ---> -<rss> -<channel> -<title>testing Ò entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Omega.xml b/lib/feedparser/tests/entities/upper_Omega.xml deleted file mode 100644 index 429ce59cb..000000000 --- a/lib/feedparser/tests/entities/upper_Omega.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Omega -Expect: feed['title'] == u'testing \u03a9 entity' ---> -<rss> -<channel> -<title>testing Ω entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Omicron.xml b/lib/feedparser/tests/entities/upper_Omicron.xml deleted file mode 100644 index c74bec184..000000000 --- a/lib/feedparser/tests/entities/upper_Omicron.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Omicron -Expect: feed['title'] == u'testing \u039f entity' ---> -<rss> -<channel> -<title>testing Ο entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Oslash.xml b/lib/feedparser/tests/entities/upper_Oslash.xml deleted file mode 100644 index 0f9e35335..000000000 --- a/lib/feedparser/tests/entities/upper_Oslash.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Oslash -Expect: feed['title'] == u'testing \xd8 entity' ---> -<rss> -<channel> -<title>testing Ø entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Otilde.xml b/lib/feedparser/tests/entities/upper_Otilde.xml deleted file mode 100644 index d34003056..000000000 --- a/lib/feedparser/tests/entities/upper_Otilde.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Otilde -Expect: feed['title'] == u'testing \xd5 entity' ---> -<rss> -<channel> -<title>testing Õ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ouml.xml b/lib/feedparser/tests/entities/upper_Ouml.xml deleted file mode 100644 index e32d9644b..000000000 --- a/lib/feedparser/tests/entities/upper_Ouml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ouml -Expect: feed['title'] == u'testing \xd6 entity' ---> -<rss> -<channel> -<title>testing Ö entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Phi.xml b/lib/feedparser/tests/entities/upper_Phi.xml deleted file mode 100644 index 8f93027d3..000000000 --- a/lib/feedparser/tests/entities/upper_Phi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Phi -Expect: feed['title'] == u'testing \u03a6 entity' ---> -<rss> -<channel> -<title>testing Φ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Pi.xml b/lib/feedparser/tests/entities/upper_Pi.xml deleted file mode 100644 index 2b8951f92..000000000 --- a/lib/feedparser/tests/entities/upper_Pi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Pi -Expect: feed['title'] == u'testing \u03a0 entity' ---> -<rss> -<channel> -<title>testing Π entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Prime.xml b/lib/feedparser/tests/entities/upper_Prime.xml deleted file mode 100644 index b29dc9ff6..000000000 --- a/lib/feedparser/tests/entities/upper_Prime.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Prime -Expect: feed['title'] == u'testing \u2033 entity' ---> -<rss> -<channel> -<title>testing ″ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Psi.xml b/lib/feedparser/tests/entities/upper_Psi.xml deleted file mode 100644 index 9d337bd47..000000000 --- a/lib/feedparser/tests/entities/upper_Psi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Psi -Expect: feed['title'] == u'testing \u03a8 entity' ---> -<rss> -<channel> -<title>testing Ψ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Rho.xml b/lib/feedparser/tests/entities/upper_Rho.xml deleted file mode 100644 index 0e1879736..000000000 --- a/lib/feedparser/tests/entities/upper_Rho.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Rho -Expect: feed['title'] == u'testing \u03a1 entity' ---> -<rss> -<channel> -<title>testing Ρ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Scaron.xml b/lib/feedparser/tests/entities/upper_Scaron.xml deleted file mode 100644 index 784c67e1f..000000000 --- a/lib/feedparser/tests/entities/upper_Scaron.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Scaron -Expect: feed['title'] == u'testing \u0160 entity' ---> -<rss> -<channel> -<title>testing Š entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Sigma.xml b/lib/feedparser/tests/entities/upper_Sigma.xml deleted file mode 100644 index a72285096..000000000 --- a/lib/feedparser/tests/entities/upper_Sigma.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Sigma -Expect: feed['title'] == u'testing \u03a3 entity' ---> -<rss> -<channel> -<title>testing Σ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_THORN.xml b/lib/feedparser/tests/entities/upper_THORN.xml deleted file mode 100644 index 499d0b28c..000000000 --- a/lib/feedparser/tests/entities/upper_THORN.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: THORN -Expect: feed['title'] == u'testing \xde entity' ---> -<rss> -<channel> -<title>testing Þ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Tau.xml b/lib/feedparser/tests/entities/upper_Tau.xml deleted file mode 100644 index 3ff9f6979..000000000 --- a/lib/feedparser/tests/entities/upper_Tau.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Tau -Expect: feed['title'] == u'testing \u03a4 entity' ---> -<rss> -<channel> -<title>testing Τ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Theta.xml b/lib/feedparser/tests/entities/upper_Theta.xml deleted file mode 100644 index 85c43231d..000000000 --- a/lib/feedparser/tests/entities/upper_Theta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Theta -Expect: feed['title'] == u'testing \u0398 entity' ---> -<rss> -<channel> -<title>testing Θ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Uacute.xml b/lib/feedparser/tests/entities/upper_Uacute.xml deleted file mode 100644 index e714b33c5..000000000 --- a/lib/feedparser/tests/entities/upper_Uacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Uacute -Expect: feed['title'] == u'testing \xda entity' ---> -<rss> -<channel> -<title>testing Ú entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ucirc.xml b/lib/feedparser/tests/entities/upper_Ucirc.xml deleted file mode 100644 index 2d6ddeb08..000000000 --- a/lib/feedparser/tests/entities/upper_Ucirc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ucirc -Expect: feed['title'] == u'testing \xdb entity' ---> -<rss> -<channel> -<title>testing Û entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Ugrave.xml b/lib/feedparser/tests/entities/upper_Ugrave.xml deleted file mode 100644 index 5d859b8eb..000000000 --- a/lib/feedparser/tests/entities/upper_Ugrave.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Ugrave -Expect: feed['title'] == u'testing \xd9 entity' ---> -<rss> -<channel> -<title>testing Ù entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Upsilon.xml b/lib/feedparser/tests/entities/upper_Upsilon.xml deleted file mode 100644 index 3a8ba5377..000000000 --- a/lib/feedparser/tests/entities/upper_Upsilon.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Upsilon -Expect: feed['title'] == u'testing \u03a5 entity' ---> -<rss> -<channel> -<title>testing Υ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Uuml.xml b/lib/feedparser/tests/entities/upper_Uuml.xml deleted file mode 100644 index 0d0c4b2ab..000000000 --- a/lib/feedparser/tests/entities/upper_Uuml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Uuml -Expect: feed['title'] == u'testing \xdc entity' ---> -<rss> -<channel> -<title>testing Ü entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Xi.xml b/lib/feedparser/tests/entities/upper_Xi.xml deleted file mode 100644 index 6d0411d3b..000000000 --- a/lib/feedparser/tests/entities/upper_Xi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Xi -Expect: feed['title'] == u'testing \u039e entity' ---> -<rss> -<channel> -<title>testing Ξ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Yacute.xml b/lib/feedparser/tests/entities/upper_Yacute.xml deleted file mode 100644 index 96157bfb1..000000000 --- a/lib/feedparser/tests/entities/upper_Yacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Yacute -Expect: feed['title'] == u'testing \xdd entity' ---> -<rss> -<channel> -<title>testing Ý entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Yuml.xml b/lib/feedparser/tests/entities/upper_Yuml.xml deleted file mode 100644 index ee49cf3a0..000000000 --- a/lib/feedparser/tests/entities/upper_Yuml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Yuml -Expect: feed['title'] == u'testing \u0178 entity' ---> -<rss> -<channel> -<title>testing Ÿ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upper_Zeta.xml b/lib/feedparser/tests/entities/upper_Zeta.xml deleted file mode 100644 index 4bcf39272..000000000 --- a/lib/feedparser/tests/entities/upper_Zeta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Zeta -Expect: feed['title'] == u'testing \u0396 entity' ---> -<rss> -<channel> -<title>testing Ζ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upsih.xml b/lib/feedparser/tests/entities/upsih.xml deleted file mode 100644 index 9248acdc1..000000000 --- a/lib/feedparser/tests/entities/upsih.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: upsih -Expect: feed['title'] == u'testing \u03d2 entity' ---> -<rss> -<channel> -<title>testing ϒ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/upsilon.xml b/lib/feedparser/tests/entities/upsilon.xml deleted file mode 100644 index 1f916c5db..000000000 --- a/lib/feedparser/tests/entities/upsilon.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: upsilon -Expect: feed['title'] == u'testing \u03c5 entity' ---> -<rss> -<channel> -<title>testing υ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/uuml.xml b/lib/feedparser/tests/entities/uuml.xml deleted file mode 100644 index 4c147b2a3..000000000 --- a/lib/feedparser/tests/entities/uuml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: uuml -Expect: feed['title'] == u'testing \xfc entity' ---> -<rss> -<channel> -<title>testing ü entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/weierp.xml b/lib/feedparser/tests/entities/weierp.xml deleted file mode 100644 index 63bd70c3a..000000000 --- a/lib/feedparser/tests/entities/weierp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: weierp -Expect: feed['title'] == u'testing \u2118 entity' ---> -<rss> -<channel> -<title>testing ℘ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/xi.xml b/lib/feedparser/tests/entities/xi.xml deleted file mode 100644 index d9b280b94..000000000 --- a/lib/feedparser/tests/entities/xi.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: xi -Expect: feed['title'] == u'testing \u03be entity' ---> -<rss> -<channel> -<title>testing ξ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/yacute.xml b/lib/feedparser/tests/entities/yacute.xml deleted file mode 100644 index c8b331501..000000000 --- a/lib/feedparser/tests/entities/yacute.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: yacute -Expect: feed['title'] == u'testing \xfd entity' ---> -<rss> -<channel> -<title>testing ý entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/yen.xml b/lib/feedparser/tests/entities/yen.xml deleted file mode 100644 index af9f596c9..000000000 --- a/lib/feedparser/tests/entities/yen.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: yen -Expect: feed['title'] == u'testing \xa5 entity' ---> -<rss> -<channel> -<title>testing ¥ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/yuml.xml b/lib/feedparser/tests/entities/yuml.xml deleted file mode 100644 index 253b60bc3..000000000 --- a/lib/feedparser/tests/entities/yuml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: yuml -Expect: feed['title'] == u'testing \xff entity' ---> -<rss> -<channel> -<title>testing ÿ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/zeta.xml b/lib/feedparser/tests/entities/zeta.xml deleted file mode 100644 index af665ecd1..000000000 --- a/lib/feedparser/tests/entities/zeta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: zeta -Expect: feed['title'] == u'testing \u03b6 entity' ---> -<rss> -<channel> -<title>testing ζ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/zwj.xml b/lib/feedparser/tests/entities/zwj.xml deleted file mode 100644 index 881246064..000000000 --- a/lib/feedparser/tests/entities/zwj.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: zwj -Expect: feed['title'] == u'testing \u200d entity' ---> -<rss> -<channel> -<title>testing ‍ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/entities/zwnj.xml b/lib/feedparser/tests/entities/zwnj.xml deleted file mode 100644 index 3bcd5d4a7..000000000 --- a/lib/feedparser/tests/entities/zwnj.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: zwnj -Expect: feed['title'] == u'testing \u200c entity' ---> -<rss> -<channel> -<title>testing ‌ entity</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/http/http_redirect_to_304.xml b/lib/feedparser/tests/http/http_redirect_to_304.xml deleted file mode 100644 index a14cb0d35..000000000 --- a/lib/feedparser/tests/http/http_redirect_to_304.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Status: 302 -Header: Location: http://localhost:8097/-/return-304.xml -Description: ensure an http 302 redirect to an http 304 doesn't cause an xml parsing error -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/http_status_301.xml b/lib/feedparser/tests/http/http_status_301.xml deleted file mode 100644 index 12d159ab6..000000000 --- a/lib/feedparser/tests/http/http_status_301.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Status: 301 -Header: Location: http://localhost:8097/tests/http/target.xml -Description: http status 301 (moved permanently) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/http_status_302.xml b/lib/feedparser/tests/http/http_status_302.xml deleted file mode 100644 index 4b15d437d..000000000 --- a/lib/feedparser/tests/http/http_status_302.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Status: 302 -Header: Location: http://localhost:8097/tests/http/target.xml -Description: http status 302 (found) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/http_status_303.xml b/lib/feedparser/tests/http/http_status_303.xml deleted file mode 100644 index 2dd5d2f73..000000000 --- a/lib/feedparser/tests/http/http_status_303.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Status: 303 -Header: Location: http://localhost:8097/tests/http/target.xml -Description: http status 303 (moved permanently) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/http_status_304.xml b/lib/feedparser/tests/http/http_status_304.xml deleted file mode 100644 index a2eb69532..000000000 --- a/lib/feedparser/tests/http/http_status_304.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Header: ETag: "abc123" -Header: Last-Modified: Thu, 21 Apr 2011 19:02:20 GMT -Description: http status 304 (not modified) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <item><title>title 304</title></item> -</feed> diff --git a/lib/feedparser/tests/http/http_status_307.xml b/lib/feedparser/tests/http/http_status_307.xml deleted file mode 100644 index 900741727..000000000 --- a/lib/feedparser/tests/http/http_status_307.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Status: 307 -Header: Location: http://localhost:8097/tests/http/target.xml -Description: http status 307 (moved permanently) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/http_status_404.xml b/lib/feedparser/tests/http/http_status_404.xml deleted file mode 100644 index 02e08089e..000000000 --- a/lib/feedparser/tests/http/http_status_404.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Header: Status: 404 -Description: http status 404 (not found) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/http_status_9001.xml b/lib/feedparser/tests/http/http_status_9001.xml deleted file mode 100644 index b90dce3bf..000000000 --- a/lib/feedparser/tests/http/http_status_9001.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Header: Status: 9001 -Description: http status 9001 (bogus) -Expect: 0 ---> -<feed xmlns="http://www.w3.org/2005/Atom"></feed> diff --git a/lib/feedparser/tests/http/target.xml b/lib/feedparser/tests/http/target.xml deleted file mode 100644 index a81736b10..000000000 --- a/lib/feedparser/tests/http/target.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: target for http status tests; no actual evaluation -Expect: 1 ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <item><title>target</title></item> -</feed> diff --git a/lib/feedparser/tests/illformed/aaa_illformed.xml b/lib/feedparser/tests/illformed/aaa_illformed.xml deleted file mode 100644 index 044edc240..000000000 --- a/lib/feedparser/tests/illformed/aaa_illformed.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: illformed XML -Expect: bozo ---> -<rss version="2.0"> -</rss \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/always_strip_doctype.xml b/lib/feedparser/tests/illformed/always_strip_doctype.xml deleted file mode 100644 index 9fc872454..000000000 --- a/lib/feedparser/tests/illformed/always_strip_doctype.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://site.invalid/"> -<!-- -Description: unstripped invalid doctype -Expect: not bozo and feed['title'] == u'found' ---> -<rss> - <channel> - <title>found</title> - </channel> -</rss> diff --git a/lib/feedparser/tests/illformed/chardet/big5.xml b/lib/feedparser/tests/illformed/chardet/big5.xml deleted file mode 100644 index 91c9ec0f7..000000000 --- a/lib/feedparser/tests/illformed/chardet/big5.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: Big5 with no encoding information -Expect: bozo and encoding == 'Big5' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>�m11�몺�����n</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/chardet/eucjp.xml b/lib/feedparser/tests/illformed/chardet/eucjp.xml deleted file mode 100644 index ba288a5e2..000000000 --- a/lib/feedparser/tests/illformed/chardet/eucjp.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: EUC-JP with no encoding information -Expect: bozo and encoding == 'EUC-JP' ---> -<rss> -<channel> -<item> -<title>������������</title> -<description>��SD�������G�����ͥ졼�����NEO�٤äȥץ쥤���Ƥ��롣 �إ���ȥ�ޥ�٤ϥ��ȥ�⡼�ɤ��ơ��ۤܤ��Ԥ����Ƥ��ޤä��� G������NEO�ϡ���ä����ʤ�ĤĤ��롣 �ʤ�ۤɡ�PS2�äƤ�������������ǽ�Ϥ��ʤ��Ⱥ�����ư���Ƥ��롣 ��ǯ�����٤�ʤ��褦PS3��XBOX360���㤪���ʤ�����������ʳ��ϥ�������ˤʤ��ۤ�˻���������͡ˡ� ����ˤ��Ƥ⡢����äƿ��٤ƤФä���ǥޥ������͡�...</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/chardet/euckr.xml b/lib/feedparser/tests/illformed/chardet/euckr.xml deleted file mode 100644 index 767f3a59e..000000000 --- a/lib/feedparser/tests/illformed/chardet/euckr.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: EUC-KR with no encoding information -Expect: bozo and encoding == 'EUC-KR' ---> -<rss> -<channel> -<item> -<title>EUC-KR ���� TypeKey �ѱ۴г��� ǥ���ϱ�</title> -<description>TypeKey �ý����� UTF-8�� ���ư��µ�, �ű⼭ �ѱ۷� �� �г����� ���� ��쿡, EUC-KR�� �� ������Ÿ�� ���Ͽ��� �����̷�Ʈ�Ǿ� ���۵Ǿ���� �г����� UTF�� �翬�� ������ ��Ÿ����. ���� ���� ��� ����ϴ� �ʸ� ������ �г����� �ѱ۷� ����ϴ� ���� �е鵵 Ÿ��Ű������ �г����� �̷� ���������� �����ڸԱ�� ����� ���� �ִ�....</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/chardet/gb2312.xml b/lib/feedparser/tests/illformed/chardet/gb2312.xml deleted file mode 100644 index b28c10148..000000000 --- a/lib/feedparser/tests/illformed/chardet/gb2312.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: GB2312 with no encoding information -Expect: bozo and encoding == 'GB2312' ---> -<rss> -<channel> -<item> -<title>������������ϵ�У�רҵ����</title> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/illformed/chardet/koi8r.xml b/lib/feedparser/tests/illformed/chardet/koi8r.xml deleted file mode 100644 index 8cdea546f..000000000 --- a/lib/feedparser/tests/illformed/chardet/koi8r.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: KOI8-R with no encoding information -Expect: bozo and encoding == 'KOI8-R' ---> -<rss> -<channel> -<item> -<title>��� �������� ���������� ����</title> -<description> -��������, ������������, �� ��� ������� ����� ������ �������������, ��� ��� � ��, ��� ����� ��� ����������� ��������. �������� �� �� ���! ��� �� ������ ��������� ��������, ��� - ����! � ���� � ����� ������� ��������. �������� ������ � ������ ���� ���-���... � ������ ��������������� "������ �������" � "������ ��������" ������������ ������ ���� �������� ���� ����� �������, ���� ��������� ������. ���� ����������� �������� ��������� ������ �������� ���������, ������� ��������� "�����������" ������ ���������� ������������.</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/chardet/shiftjis.xml b/lib/feedparser/tests/illformed/chardet/shiftjis.xml deleted file mode 100644 index 28285d966..000000000 --- a/lib/feedparser/tests/illformed/chardet/shiftjis.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: SHIFT_JIS with no encoding information -Expect: bozo and encoding == 'SHIFT_JIS' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title>DrecomRSS�ɋL�����e�����f����Ȃ��c</title> - <summary>�F�X���ׂĂ���AMT3.2��RSS1.0���T�|�[�g���Ă��Ȃ����Ƃ������B ���Ƃ�...</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/chardet/tis620.xml b/lib/feedparser/tests/illformed/chardet/tis620.xml deleted file mode 100644 index 5dd109056..000000000 --- a/lib/feedparser/tests/illformed/chardet/tis620.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: TIS-620 with no encoding information -Expect: bozo and encoding == 'TIS-620' ---> -<rss> -<channel> -<item> -<description>�ӹѡ�ҹ��������ص��ˡ����Ϳ��������觪ҵ� ���� SIPA �����Ѻ MamboHub.com �����¹�ԭ�ء��ҹ���ʹ��� Template ���������û�СǴ &#8220;Mambo Template Contest&#8221; ���� Mambo 4.5.X ����Ѻ���ԧ����䫵� thaiopensource.org ���䫵��ٹ����������Ţ�����âͧ�Ϳ������ Open Source ����ͧ�� ������ö�觼ŧҹ��һ�СǴ�� ���㹹���ͧ����ѷ �ؤ�� ���� �����/��� ��駹�������Դ�͡�� ���ʹѺʹع������������ Mambo ����ͧ��������ǹ����㹡���͡Ẻ��оѲ�����䫵� thaiopensource.org �����Ҥ�</description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/illformed/chardet/windows1255.xml b/lib/feedparser/tests/illformed/chardet/windows1255.xml deleted file mode 100644 index 0ab773f50..000000000 --- a/lib/feedparser/tests/illformed/chardet/windows1255.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: __import__('chardet') -Description: windows-1255 with no encoding information -Expect: bozo and encoding == 'windows-1255' ---> -<rss> -<channel> -<item> -<description> -��� ����� ���� �� ��� ������� ����� �� ��� ����� ��� ���� ���� ����� �� ��� ��������? ���� ����� ���, ������� �� ��� ����� ������ ����� ������ ��� ���� ������� ����� �����. ���, �� ��� �� ��. ��� ����� ����� ������. -</description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/illformed/http_high_bit_date.xml b/lib/feedparser/tests/illformed/http_high_bit_date.xml deleted file mode 100644 index 480d3ae0e..000000000 --- a/lib/feedparser/tests/illformed/http_high_bit_date.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="iso-8859-7"?> -<!-- -SkipUnless: __import__('codecs').lookup('iso-8859-7') -Header: Content-type: text/xml -Description: non-ASCII characters in date crashes parser -Expect: 1 ---> -<rss version="2.0"> - <channel> - <pubDate>���, 29 ���� 2004 12:53:00 GMT</pubDate> - </channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/non-ascii-tag.xml b/lib/feedparser/tests/illformed/non-ascii-tag.xml deleted file mode 100644 index e07883ec2..000000000 --- a/lib/feedparser/tests/illformed/non-ascii-tag.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: prevent UnicodeEncodeError in microformat code -Expect: bozo and entries[0]['summary'] == u'Some text' ---> -<rss version="2.0"> -<channel> - <item> - <description>Some text</� </description> - </item> -</channel> -</rss> diff --git a/lib/feedparser/tests/illformed/rdf_channel_empty_textinput.xml b/lib/feedparser/tests/illformed/rdf_channel_empty_textinput.xml deleted file mode 100644 index 7c09096d3..000000000 --- a/lib/feedparser/tests/illformed/rdf_channel_empty_textinput.xml +++ /dev/null @@ -1,26 +0,0 @@ -<!-- -Description: empty textinput element confuses regex parser and crashes on setting item title (thinks we're still in textinput) -Expect: bozo ---> -<?xml version="1.0"?> -<rdf:RDF - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns="http://purl.org/rss/1.0/" -> - <channel rdf:about="http://example.com/"> - <items> - <rdf:Seq> - <rdf:li rdf:resource="http://example.com/1" /> - </rdf:Seq> - </items> - <textinput rdf:resource="http://example.com/" /> - </channel> - - <item rdf:about="http://example.com/1"> - <title>crashes here</title> - </item> - - <textinput rdf:about="http://meerkat.oreillynet.com/"> - </textinput> - -</rdf:RDF \ No newline at end of file diff --git a/lib/feedparser/tests/illformed/rss_empty_document.xml b/lib/feedparser/tests/illformed/rss_empty_document.xml deleted file mode 100644 index 6bddcad63..000000000 --- a/lib/feedparser/tests/illformed/rss_empty_document.xml +++ /dev/null @@ -1,4 +0,0 @@ -<!-- -Description: Empty document should be a bozo -Expect: bozo ---> diff --git a/lib/feedparser/tests/illformed/rss_incomplete_cdata.xml b/lib/feedparser/tests/illformed/rss_incomplete_cdata.xml deleted file mode 100644 index 8fe311b95..000000000 --- a/lib/feedparser/tests/illformed/rss_incomplete_cdata.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: Incomplete CDATA block -Expect: bozo ---> -<?xml version="1.0"?> -<rss version="2.0"> -<channel> -<title>can feedparser read this xml</title> -<link>http://adcdefgh.com</link> -<description>feedparser goes into infinite loop while parsing this file</description> -<language>en-us</language> -<copyright>2005-10-28</copyright> -<item><title><![CD diff --git a/lib/feedparser/tests/illformed/undeclared_namespace.xml b/lib/feedparser/tests/illformed/undeclared_namespace.xml deleted file mode 100644 index cffe6f48e..000000000 --- a/lib/feedparser/tests/illformed/undeclared_namespace.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -SkipUnless: __import__('sys').version.split()[0] >= '2.2.0' -Description: undeclared namespace -Expect: bozo ---> -<rss version="2.0"> -<channel> -<itunes:subtitle>Foo</itunes:subtitle> -</channel> -</rss> diff --git a/lib/feedparser/tests/microformats/hcard/2-4-2-vcard.xml b/lib/feedparser/tests/microformats/hcard/2-4-2-vcard.xml deleted file mode 100644 index 0e77f778a..000000000 --- a/lib/feedparser/tests/microformats/hcard/2-4-2-vcard.xml +++ /dev/null @@ -1,23 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 2.4.2 VCARD -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nAGENT:BEGIN:vCard\\nVERSION:3.0\\nFN:Joe Friday\\nN:Friday\\;Joe\\nTEL\\;TYPE=voi\n ce:+1-919-555-7878\\nEMAIL\\;TYPE=internet:jfriday@host.com\\nTITLE:Area Admi\n nistrator\\, Assistant\\nEND:vCard\\n\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>2.4.2 VCARD</title> -<link rel="alternate" type="text/v-card" href="2-4-2-vcard.vcf" /> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<div class="agent vcard"> - <a class="email fn" href="mailto:jfriday@host.com">Joe Friday</a> - <div class="tel">+1-919-555-7878</div> - <div class="title">Area Administrator, Assistant</div> -</div> -</div> -<p><a rel="next test" href="3-1-1-fn.xhtml">next</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-1-fn-unicode-char.xml b/lib/feedparser/tests/microformats/hcard/3-1-1-fn-unicode-char.xml deleted file mode 100644 index ffbd28530..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-1-fn-unicode-char.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: unicode character in microformat -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nFN:Tantek \xc7elik\nN:\xc7elik;Tantek\nURL:http://tantek.com/\nEND:vCard' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> - <item> - <content:encoded> - <![CDATA[<span class="vcard"><a class="url fn" href="http://tantek.com/">Tantek Çelik</a></span>]]> - </content:encoded> - </item> -</channel> -</rss> diff --git a/lib/feedparser/tests/microformats/hcard/3-1-1-fn.xml b/lib/feedparser/tests/microformats/hcard/3-1-1-fn.xml deleted file mode 100644 index ded9a64ba..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-1-fn.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.1 FN -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nFN:Mr. John Q. Public\\, Esq.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.1 FN</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="fn">Mr. John Q. Public, Esq.</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-2-n-2-plural.xml b/lib/feedparser/tests/microformats/hcard/3-1-2-n-2-plural.xml deleted file mode 100644 index 4ddbbcb53..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-2-n-2-plural.xml +++ /dev/null @@ -1,26 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.2 N (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nN:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.2 N (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="n"> - <span class="honorific-prefix">Dr.</span> - <span class="given-name">John</span> - <span class="additional-name">Philip</span> - <span class="additional-name">Paul</span> - <span class="family-name">Stevenson</span>, - <span class="honorific-suffix">Jr.</span>, - <span class="honorific-suffix">M.D.</span>, - <span class="honorific-suffix">A.C.P.</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-2-n-2-singular.xml b/lib/feedparser/tests/microformats/hcard/3-1-2-n-2-singular.xml deleted file mode 100644 index 07c7ebd05..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-2-n-2-singular.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.2 N (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nN:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.2 N (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="n"> - <span class="honorific-prefixes">Dr.</span> - <span class="given-name">John</span> - <ul class="additional-names"> - <li>Philip</li> - <li>Paul</li> - </ul> - <span class="family-name">Stevenson</span>, - <ul class="honorific-suffixes"> - <li>Jr.</li> - <li>M.D.</li> - <li>A.C.P.</li> - </ul> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-2-n-plural.xml b/lib/feedparser/tests/microformats/hcard/3-1-2-n-plural.xml deleted file mode 100644 index 69efcb182..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-2-n-plural.xml +++ /dev/null @@ -1,23 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.2 N -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nN:Public;John;Quinlan;Mr.;Esq.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.2 N</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="n"> - <span class="honorific-prefixes">Mr.</span> - <span class="given-name">John</span> - <span class="additional-names">Quinlan</span> - <span class="family-name">Public</span>, - <span class="honorific-suffixes">Esq.</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-2-n-singular.xml b/lib/feedparser/tests/microformats/hcard/3-1-2-n-singular.xml deleted file mode 100644 index 5c4087d24..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-2-n-singular.xml +++ /dev/null @@ -1,23 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.2 N -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nN:Public;John;Quinlan;Mr.;Esq.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.2 N</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="n"> - <span class="honorific-prefix">Mr.</span> - <span class="given-name">John</span> - <span class="additional-name">Quinlan</span> - <span class="family-name">Public</span>, - <span class="honorific-suffix">Esq.</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-plural.xml b/lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-plural.xml deleted file mode 100644 index d2423183b..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-plural.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.3 NICKNAME (example 2, plural) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nNICKNAME:Jim,Jimmie\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.3 NICKNAME (example 2, plural)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<ul class="nickname"><li>Jim</li><li>Jimmie</li></ul> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-singular.xml b/lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-singular.xml deleted file mode 100644 index 13cb9890d..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-3-nickname-2-singular.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.3 NICKNAME (example 2, singular) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nNICKNAME:Jim,Jimmie\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.3 NICKNAME (example 2, singular)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="nickname">Jim</span>, -<span class="nickname">Jimmie</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-3-nickname.xml b/lib/feedparser/tests/microformats/hcard/3-1-3-nickname.xml deleted file mode 100644 index 84b7f1b66..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-3-nickname.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.3 NICKNAME -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nNICKNAME:Robbie\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.3 NICKNAME</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="nickname">Robbie</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-4-photo-inline.xml b/lib/feedparser/tests/microformats/hcard/3-1-4-photo-inline.xml deleted file mode 100644 index 25e62beba..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-4-photo-inline.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.4 PHOTO inline -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nPHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzEL\n MAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW\n 9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.4 PHOTO inline</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<img class="photo" src="data:image/jpeg;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0" alt="" /> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-4-photo.xml b/lib/feedparser/tests/microformats/hcard/3-1-4-photo.xml deleted file mode 100644 index 310284f18..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-4-photo.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.4 PHOTO -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nPHOTO;VALUE=uri:http://www.abc.com/pub/photos/jqpublic.gif\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.4 PHOTO</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<img class="photo" src="http://www.abc.com/pub/photos/jqpublic.gif" alt="" /> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-5-bday-2.xml b/lib/feedparser/tests/microformats/hcard/3-1-5-bday-2.xml deleted file mode 100644 index f6b020d65..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-5-bday-2.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.5 BCARD (example 2) -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nBDAY:1993-10-15T23:10:00Z\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.5 BCARD (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<abbr class="bday" title="1993-10-15T23:10:00Z">Oct 15, 1993</abbr> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-5-bday-3.xml b/lib/feedparser/tests/microformats/hcard/3-1-5-bday-3.xml deleted file mode 100644 index 3ff0eb3f1..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-5-bday-3.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.5 BCARD (example 3) -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nBDAY:1987-09-27T14:30:00Z\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.5 BCARD (example 3)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<abbr class="bday" title="1987-09-27T08:30:00-06:00">Sept 9, 1987</abbr> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-1-5-bday.xml b/lib/feedparser/tests/microformats/hcard/3-1-5-bday.xml deleted file mode 100644 index 08a2ff3d9..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-1-5-bday.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.1.5 BCARD -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nBDAY:1996-04-15T00:00:00Z\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.1.5 BCARD</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<abbr class="bday" title="1996-04-15">April 15, 1996</abbr> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-2-1-adr.xml b/lib/feedparser/tests/microformats/hcard/3-2-1-adr.xml deleted file mode 100644 index b9b37a008..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-2-1-adr.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.2.1 ADR -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nADR;TYPE=dom,home,postal,parcel:;;123 Main Street;Any Town;CA;91921-1234\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.2.1 ADR</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<div class="adr"> - <abbr class="type" title="dom">US</abbr> - <span class="type">home</span> address, for - <abbr class="type" title="postal">mail</abbr> and - <abbr class="type" title="parcel">shipments</abbr>: - <div class="street-address">123 Main Street</div> - <span class="locality">Any Town</span>, <span class="region">CA</span>, - <span class="postal-code">91921-1234</span> -</div> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-2-2-label.xml b/lib/feedparser/tests/microformats/hcard/3-2-2-label.xml deleted file mode 100644 index 68624e070..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-2-2-label.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.2.2 LABEL -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nLABEL;TYPE=dom,home,postal,parcel:Mr.John Q. Public, Esq.\nMail Drop: TNE QB\n \n123 Main Street\nAny Town, CA 91921-1234\nU.S.A.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.2.2 LABEL</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -Please use the following address label for -<div class="label"> - <abbr class="type" title="dom">local delivery</abbr> - <abbr class="type" title="home">to my home</abbr> - <abbr class="type" title="postal">of mail</abbr> - <abbr class="type" title="parcel">and packages:</abbr> -<pre> -Mr.John Q. Public, Esq. -Mail Drop: TNE QB -123 Main Street -Any Town, CA 91921-1234 -U.S.A. -</pre> -</div> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-3-1-tel.xml b/lib/feedparser/tests/microformats/hcard/3-3-1-tel.xml deleted file mode 100644 index 0c59d044d..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-3-1-tel.xml +++ /dev/null @@ -1,23 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.3.1 TEL -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nTEL;TYPE=pref,work,voice,msg:+1-213-555-1234\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.3.1 TEL</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="tel"> - <abbr class="type" title="pref">my</abbr> - <span class="type">work</span> - <abbr class="type" title="voice">phone</abbr>, with - <abbr class="type" title="msg">voicemail</abbr>: - <span class="value">+1-213-555-1234</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-3-2-email-2.xml b/lib/feedparser/tests/microformats/hcard/3-3-2-email-2.xml deleted file mode 100644 index 7a2093ec9..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-3-2-email-2.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.3.2 EMAIL (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nEMAIL;TYPE=internet:jdoe@isp.net\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.3.2 EMAIL (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<a class="email" href="mailto:jdoe@isp.net">email jdoe</a> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-3-2-email-3.xml b/lib/feedparser/tests/microformats/hcard/3-3-2-email-3.xml deleted file mode 100644 index 6864e1e37..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-3-2-email-3.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.3.2 EMAIL (example 3) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nEMAIL;TYPE=internet,pref:jane_doe@abc.com\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.3.2 EMAIL (example 3)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<a class="email" href="mailto:jane_doe@abc.com"> - <abbr class="type" title="pref">preferred</abbr> - email for jane_doe -</a> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-3-2-email.xml b/lib/feedparser/tests/microformats/hcard/3-3-2-email.xml deleted file mode 100644 index 6e2715e08..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-3-2-email.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.3.2 EMAIL -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nEMAIL;TYPE=internet:jqpublic@xyz.dom1.com\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.3.2 EMAIL</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<a class="email" href="mailto:jqpublic@xyz.dom1.com">email jqpublic</a> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-3-3-mailer.xml b/lib/feedparser/tests/microformats/hcard/3-3-3-mailer.xml deleted file mode 100644 index 0f71191da..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-3-3-mailer.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.3.3 MAILER -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nMAILER:PigeonMail 2.1\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.3.3 MAILER</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -Jane Doe uses <span class="mailer">PigeonMail 2.1</span> for email. -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-4-1-tz-2.xml b/lib/feedparser/tests/microformats/hcard/3-4-1-tz-2.xml deleted file mode 100644 index 8ac539602..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-4-1-tz-2.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.4.1 TZ (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nTZ:-05:00\\; EST\\; Raleigh/North America\\;This example has a single value\\, \n not a structure text value.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.4.1 TZ (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<abbr class="tz" - title="-05:00; EST; Raleigh/North America;This example has a single value, not a structure text value."> - EST -</abbr> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-4-1-tz.xml b/lib/feedparser/tests/microformats/hcard/3-4-1-tz.xml deleted file mode 100644 index 999a6025f..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-4-1-tz.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.4.1 TZ -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nTZ:-05:00\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.4.1 TZ</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="tz">-05:00</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-4-2-geo.xml b/lib/feedparser/tests/microformats/hcard/3-4-2-geo.xml deleted file mode 100644 index b62cff562..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-4-2-geo.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.4.2 GEO -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nGEO:37.386013;-122.082932\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.4.2 GEO</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="geo"> - <span class="latitude">37.386013</span>, - <span class="longitude">-122.082932</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-1-title.xml b/lib/feedparser/tests/microformats/hcard/3-5-1-title.xml deleted file mode 100644 index 2831831a6..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-1-title.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.1 TITLE -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nTITLE:Director\\, Research and Development\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.1 TITLE</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="title">Director, Research and Development</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-2-role.xml b/lib/feedparser/tests/microformats/hcard/3-5-2-role.xml deleted file mode 100644 index bc11530b0..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-2-role.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.2 ROLE -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nROLE:Programmer\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.2 ROLE</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="role">Programmer</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-3-logo-2.xml b/lib/feedparser/tests/microformats/hcard/3-5-3-logo-2.xml deleted file mode 100644 index 4ad497a8f..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-3-logo-2.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.3 LOGO (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nLOGO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELM\n AkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9\n uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.3 LOGO (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<img class="logo" src="data:image/jpeg;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0" alt="" /> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-3-logo.xml b/lib/feedparser/tests/microformats/hcard/3-5-3-logo.xml deleted file mode 100644 index 6e5f7bd76..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-3-logo.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.3 LOGO -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nLOGO;VALUE=uri:http://www.abc.com/pub/logos/abccorp.jpg\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.3 LOGO</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<img class="logo" src="http://www.abc.com/pub/logos/abccorp.jpg" alt="my logo" /> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-4-agent-2.xml b/lib/feedparser/tests/microformats/hcard/3-5-4-agent-2.xml deleted file mode 100644 index 329eae1c8..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-4-agent-2.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.4 AGENT (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nAGENT:BEGIN:vCard\\nVERSION:3.0\\nFN:Susan Thomas\\nN:\\nTEL\\;TYPE=voice:+1-919\n -555-1234\\nEMAIL\\;TYPE=internet:sthomas@host.com\\nEND:vCard\\n\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.4 AGENT (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="agent vcard"> - <a class="email fn n" href="mailto:sthomas@host.com">Susan Thomas</a>, - <span class="tel">+1-919-555-1234</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-4-agent.xml b/lib/feedparser/tests/microformats/hcard/3-5-4-agent.xml deleted file mode 100644 index 8e53253c4..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-4-agent.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.4 AGENT -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nAGENT;VALUE=uri:cid:JQPUBLIC.part3.960129T083020.xyzMail@host3.com\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.4 AGENT</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<a class="agent" href="cid:JQPUBLIC.part3.960129T083020.xyzMail@host3.com">JQPUBLIC</a> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-5-5-org.xml b/lib/feedparser/tests/microformats/hcard/3-5-5-org.xml deleted file mode 100644 index 8f2d7b82d..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-5-5-org.xml +++ /dev/null @@ -1,21 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.5.5 ORG -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nORG:ABC\\, Inc.;North American Division;Marketing\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.5.5 ORG</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="org"> - <span class="organization-name">ABC, Inc.</span>, - <span class="organization-unit">North American Division</span>, - <span class="organization-unit">Marketing</span>, -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-plural.xml b/lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-plural.xml deleted file mode 100644 index 93908196d..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-plural.xml +++ /dev/null @@ -1,22 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.1 CATEGORIES (example 2, plural) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nCATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.1 CATEGORIES (example 2, plural)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<ul class="categories"> - <li>INTERNET</li> - <li>IETF</li> - <li>INDUSTRY</li> - <li>INFORMATION TECHNOLOGY</li> -</ul> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-singular.xml b/lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-singular.xml deleted file mode 100644 index fa2ac0663..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-1-categories-2-singular.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.1 CATEGORIES (example 2, singular) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nCATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.1 CATEGORIES (example 2, singular)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="category">INTERNET</span>, -<span class="category">IETF</span>, -<span class="category">INDUSTRY</span>, -<span class="category">INFORMATION TECHNOLOGY</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-1-categories.xml b/lib/feedparser/tests/microformats/hcard/3-6-1-categories.xml deleted file mode 100644 index 68382508f..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-1-categories.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.1 CATEGORIES -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nCATEGORIES:TRAVEL AGENT\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.1 CATEGORIES</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="categories">TRAVEL AGENT</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-2-note.xml b/lib/feedparser/tests/microformats/hcard/3-6-2-note.xml deleted file mode 100644 index 1f37e624b..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-2-note.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.2 NOTE -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nNOTE:This fax number is operational 0800 to 1715 EST\\, Mon-Fri.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.2 NOTE</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<p class="note">This fax number is operational 0800 to 1715 EST, Mon-Fri.</p> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-4-rev-2.xml b/lib/feedparser/tests/microformats/hcard/3-6-4-rev-2.xml deleted file mode 100644 index 24fb03970..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-4-rev-2.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.4 REV (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nREV:1997-11-15\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.4 REV (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<abbr class="rev" title="1997-11-15">Updated: November 15</abbr> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-4-rev.xml b/lib/feedparser/tests/microformats/hcard/3-6-4-rev.xml deleted file mode 100644 index bd6daf93b..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-4-rev.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.4 REV -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nREV:1995-10-31T22:27:10Z\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.4 REV</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<abbr class="rev" title="1995-10-31T22:27:10Z">Updated: 10/31 10:27p</abbr> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-2.xml b/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-2.xml deleted file mode 100644 index ca80cd863..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-2.xml +++ /dev/null @@ -1,21 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.5 SORT-STRING (example 2) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nFN:Robert Pau Shou Chang\nN:Pau;Shou Chang;Robert\nSORT-STRING:Pau\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.5 SORT-STRING (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="fn n"> - <span class="additional-names">Robert</span> - <span class="family-name sort-string">Pau</span> - <span class="given-name">Shou Chang</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-3.xml b/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-3.xml deleted file mode 100644 index 72e36ee99..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-3.xml +++ /dev/null @@ -1,19 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.5 SORT-STRING (example 3) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nFN:Osamu Koura\nN:Koura;Osamu\nSORT-STRING:Koura\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.5 SORT-STRING (example 3)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="fn"> - Osamu <span class="sort-string">Koura</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-4.xml b/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-4.xml deleted file mode 100644 index 00857ff74..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-4.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.5 SORT-STRING (example 4) -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nFN:Oscar del Pozo\nN:del Pozo Triscon;Oscar\nSORT-STRING:Pozo\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.5 SORT-STRING (example 4)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="n"> - <span class="fn"> - <span class="given-name">Oscar</span> - del <span class="sort-string">Pozo</span> - </span> - <span class="family-name" style="display:none"> - del Pozo Triscon - </span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-5.xml b/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-5.xml deleted file mode 100644 index 715e4100f..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string-5.xml +++ /dev/null @@ -1,19 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.5 SORT-STRING (example 5) -Expect: not bozo and entries[0].vcard == u"BEGIN:vCard\nVERSION:3.0\nFN:Christine d'Aboville\nN:d'Aboville;Christine\nSORT-STRING:Aboville\nEND:vCard" ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.5 SORT-STRING (example 5)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="fn"> - Christine d'<span class="sort-string">Aboville</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string.xml b/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string.xml deleted file mode 100644 index a5ee5c161..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-5-sort-string.xml +++ /dev/null @@ -1,27 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.5 SORT-STRING -Expect: not bozo and entries[0].vcard == u'BEGIN:vCard\nVERSION:3.0\nFN:Rene van der Harten\nN:van der Harten;Rene;J.;Sir;R.D.O.N.\nSORT-STRING:Harten\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.5 SORT-STRING</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="n"> - <span class="honorific-prefixes">Sir</span> - <span class="fn"> - <span class="given-name">Rene</span> - <span class="family-name"> - van der <span class="sort-string">Harten</span> - </span> - </span> - (<span class="additional-names">J.</span>), - <span class="honorific-suffixes">R.D.O.N.</span> -</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-6-sound-2.xml b/lib/feedparser/tests/microformats/hcard/3-6-6-sound-2.xml deleted file mode 100644 index 29e138de7..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-6-sound-2.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.6 SOUND (example 2) -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nSOUND;ENCODING=b;TYPE=BASIC:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzE\n LMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0a\n W9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.6 SOUND (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<object class="sound" -data="data:audio/basic;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0"> -pronounciation -</object> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-6-sound.xml b/lib/feedparser/tests/microformats/hcard/3-6-6-sound.xml deleted file mode 100644 index 4c130bee8..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-6-sound.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.6 SOUND -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nSOUND;TYPE=BASIC;VALUE=uri:cid:JOHNQPUBLIC.part8.19960229T080000.xyzMail@ho\n st1.com\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.6 SOUND</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<object class="sound" type="audio/basic" - data="cid:JOHNQPUBLIC.part8.19960229T080000.xyzMail@host1.com"> -pronounciation of "JOHN Q PUBLIC" -</object> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-7-uid.xml b/lib/feedparser/tests/microformats/hcard/3-6-7-uid.xml deleted file mode 100644 index da10a9d18..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-7-uid.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.7 UID -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nUID:19950401-080045-40000F192713-0052\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.7 UID</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -Unique id: - <span class="uid">19950401-080045-40000F192713-0052</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-6-8-url.xml b/lib/feedparser/tests/microformats/hcard/3-6-8-url.xml deleted file mode 100644 index dc1a1c6ec..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-6-8-url.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.6.8 URL -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nURL:http://www.swbyps.restaurant.french/~chezchic.html\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.6.8 URL</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<a class="url" href="http://www.swbyps.restaurant.french/~chezchic.html">Chez Chic</a> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-7-1-class-2.xml b/lib/feedparser/tests/microformats/hcard/3-7-1-class-2.xml deleted file mode 100644 index 2ddcfa2d7..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-7-1-class-2.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.7.1 CLASS (example 2) -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nCLASS:PRIVATE\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.7.1 CLASS (example 2)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="class">PRIVATE</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-7-1-class-3.xml b/lib/feedparser/tests/microformats/hcard/3-7-1-class-3.xml deleted file mode 100644 index 3be1a8896..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-7-1-class-3.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.7.1 CLASS (example 3) -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nCLASS:CONFIDENTIAL\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.7.1 CLASS (example 3)</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="class">CONFIDENTIAL</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-7-1-class.xml b/lib/feedparser/tests/microformats/hcard/3-7-1-class.xml deleted file mode 100644 index 795de9786..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-7-1-class.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.7.1 CLASS -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nCLASS:PUBLIC\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.7.1 CLASS</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<span class="class">PUBLIC</span> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/3-7-2-key.xml b/lib/feedparser/tests/microformats/hcard/3-7-2-key.xml deleted file mode 100644 index c0fc56f81..000000000 --- a/lib/feedparser/tests/microformats/hcard/3-7-2-key.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 3.7.2 KEY -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nKEY;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMC\n VVMxLDAqBgNVBAoTI05ldHNjYXBlIENbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQ\n LExNJbmZvcm1hdGlvbiBTeXN0ZW1zMRwwGgYDVQQDExNyb290Y2EubmV0c2NhcGUuY29tMB4XD\n Tk3MDYwNjE5NDc1OVoXDTk3MTIwMzE5NDc1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYDVQQKEx1\n OZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3JwLjEYMBYGA1UEAxMPVGltb3RoeSBBIEhvd2VzM\n SEwHwYJKoZIhvcNAQkBFhJob3dlc0BuZXRzY2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3d\n lczBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyr\n dN2dXcoX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MBEGCWCGSAGG+EI\n BAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau+hUMbsQukjANBgkqhkiG9w0BAQQFA\n AOBgQBexv7o7mi3PLXadkmNP9LcIPmx93HGp0Kgyx1jIVMyNgsemeAwBM+MSlhMfcpbTrONwNj\n ZYW8vJDSoi//yrZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8VUMk1U7jt8LYpo4YULU7UZH\n PYVUaSgVttImOHZIKi4hlPXBOhcUQ==\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>3.7.2 KEY</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<object class="key" - data="data:application/octet-stream;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0ZW1zMRwwGgYDVQQDExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNjE5NDc1OVoXDTk3MTIwMzE5NDc1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYDVQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3JwLjEYMBYGA1UEAxMPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBFhJob3dlc0BuZXRzY2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2dXcoX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MBEGCWCGSAGG+EIBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau+hUMbsQukjANBgkqhkiG9w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIPmx93HGp0Kgyx1jIVMyNgsemeAwBM+MSlhMfcpbTrONwNjZYW8vJDSoi//yrZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8VUMk1U7jt8LYpo4YULU7UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ=="> -Key -</object> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/hcard/7-authors.xml b/lib/feedparser/tests/microformats/hcard/7-authors.xml deleted file mode 100644 index 5c134fe12..000000000 --- a/lib/feedparser/tests/microformats/hcard/7-authors.xml +++ /dev/null @@ -1,64 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: 7. Authors -Expect: not bozo and entries[0].vcard == 'BEGIN:vCard\nVERSION:3.0\nFN:Frank Dawson\nN:Dawson;Frank\nADR;TYPE=work,postal,parcel:;;6544 Battleford Drive;Raleigh;NC;27613-3502;U\n .S.A.\nTEL;TYPE=WORK,VOICE,MSG:+1-919-676-9515\nTEL;TYPE=WORK,FAX:+1-919-676-9564\nEMAIL;TYPE=internet,pref:Frank_Dawson@Lotus.com\nEMAIL;TYPE=internet:fdawson@earthlink.net\nORG:Lotus Development Corporation\nURL:http://home.earthlink.net/~fdawson\nEND:vCard\nBEGIN:vCard\nVERSION:3.0\nFN:Tim Howes\nN:Howes;Tim\nADR;TYPE=work:;;501 E. Middlefield Rd.;Mountain View;CA;94043;U.S.A.\nTEL;TYPE=WORK,VOICE,MSG:+1-415-937-3419\nTEL;TYPE=WORK,FAX:+1-415-528-4164\nEMAIL;TYPE=internet:howes@netscape.com\nORG:Netscape Communications Corp.\nEND:vCard' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title>7. Authors</title> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<div class="vcard"> -<a class="url fn" href="http://home.earthlink.net/~fdawson">Frank Dawson</a> -<div class="org">Lotus Development Corporation</div> -<div class="adr"> - <span class="type">work</span> address -(<abbr class="type" title="postal">mail</abbr> and - <abbr class="type" title="parcel">packages</abbr>): - <div class="street-address">6544 Battleford Drive</div> - <span class="locality">Raleigh</span> - <span class="region">NC</span> - <span class="postal-code">27613-3502</span> - <div class="country-name">U.S.A.</div> -</div> -<div class="tel"> - <span class="value">+1-919-676-9515</span> -(<abbr class="type" title="WORK">w</abbr>, - <abbr class="type" title="VOICE">v</abbr><abbr class="type" title="MSG">m</abbr>) -</div> -<div class="tel"> - <span class="value">+1-919-676-9564</span> -(<abbr class="type" title="WORK">w</abbr><abbr class="type" title="FAX">f</abbr>) -</div> -<a class="email" href="mailto:Frank_Dawson@Lotus.com"> - <span class="type">pref</span>erred email -</a>, -<a class="email" href="mailto:fdawson@earthlink.net"> - alternate email -</a> -</div> -<div class="vcard"> -<a class="email fn" href="mailto:howes@netscape.com">Tim Howes</a> -<div class="org">Netscape Communications Corp.</div> -<div class="adr"> - <span class="type">work</span> address: - <div class="street-address">501 E. Middlefield Rd.</div> - <span class="locality">Mountain View</span>, - <span class="region">CA</span> - <span class="postal-code">94043</span> - <div class="country-name">U.S.A.</div> -</div> -<div class="tel"> - <span class="value">+1-415-937-3419</span> -(<abbr class="type" title="WORK">w</abbr>, - <abbr class="type" title="VOICE">v</abbr><abbr class="type" title="MSG">m</abbr>) -</div> -<div class="tel"> - <span class="value">+1-415-528-4164</span> -(<abbr class="type" title="WORK">w</abbr><abbr class="type" title="FAX">f</abbr>) -</div> -</div> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href.xml deleted file mode 100644 index bc86bacf0..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/movie.mp4' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="enclosure" href="http://example.com/movie.mp4" type="video/mpeg">my movie</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_avi.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_avi.xml deleted file mode 100644 index 02ba14fbb..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_avi.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.avi' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.avi">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bin.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bin.xml deleted file mode 100644 index 069e3abb4..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bin.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.bin' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.bin">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bz2.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bz2.xml deleted file mode 100644 index ad3e8721d..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_bz2.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.bz2' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.bz2">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_deb.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_deb.xml deleted file mode 100644 index 602638eae..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_deb.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.deb' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.deb">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_dmg.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_dmg.xml deleted file mode 100644 index d0e74b20e..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_dmg.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.dmg' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.dmg">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_exe.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_exe.xml deleted file mode 100644 index 73fd39f21..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_exe.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.exe' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.exe">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_gz.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_gz.xml deleted file mode 100644 index 9c95cdb81..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_gz.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.gz' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.gz">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_hqx.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_hqx.xml deleted file mode 100644 index 4047a729d..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_hqx.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.hqx' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.hqx">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_img.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_img.xml deleted file mode 100644 index 322125ea9..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_img.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.img' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.img">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_iso.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_iso.xml deleted file mode 100644 index 683add447..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_iso.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.iso' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.iso">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_jar.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_jar.xml deleted file mode 100644 index e39f8325c..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_jar.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.jar' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.jar">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4a.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4a.xml deleted file mode 100644 index 84fc77825..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4a.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.m4a' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.m4a">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4v.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4v.xml deleted file mode 100644 index b3dcd9091..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_m4v.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.m4v' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.m4v">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp2.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp2.xml deleted file mode 100644 index 3d3c6c70b..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp2.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.mp2' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.mp2">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp3.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp3.xml deleted file mode 100644 index c67a41439..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp3.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.mp3' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.mp3">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp4.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp4.xml deleted file mode 100644 index e10bb622b..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_mp4.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.mp4' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.mp4">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_msi.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_msi.xml deleted file mode 100644 index fcf83d2c3..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_msi.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.msi' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.msi">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_ogg.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_ogg.xml deleted file mode 100644 index 4547dda09..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_ogg.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.ogg' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.ogg">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rar.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rar.xml deleted file mode 100644 index 81a56ee0e..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rar.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.rar' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.rar">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rpm.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rpm.xml deleted file mode 100644 index e635cf246..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_rpm.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.rpm' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.rpm">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sit.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sit.xml deleted file mode 100644 index fb3845a7a..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sit.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.sit' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.sit">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sitx.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sitx.xml deleted file mode 100644 index 5ac2cb294..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_sitx.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.sitx' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.sitx">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tar.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tar.xml deleted file mode 100644 index 1ad3e78e2..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tar.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.tar' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.tar">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tbz2.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tbz2.xml deleted file mode 100644 index c53147bdc..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tbz2.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.tbz2' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.tbz2">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tgz.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tgz.xml deleted file mode 100644 index 676fb48ab..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_tgz.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.tgz' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.tgz">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wma.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wma.xml deleted file mode 100644 index 626d6ba47..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wma.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.wma' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.wma">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wmv.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wmv.xml deleted file mode 100644 index 4f1931b2b..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_wmv.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.wmv' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.wmv">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_z.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_z.xml deleted file mode 100644 index ed2bc37ac..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_z.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.z' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.z">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_zip.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_zip.xml deleted file mode 100644 index ba6759c2f..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_ext_zip.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/enclosure.zip' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/enclosure.zip">click here</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_application_ogg.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_application_ogg.xml deleted file mode 100644 index 1ccbe63a6..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_application_ogg.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/generate-enclosure.php' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/generate-enclosure.php" type="application/ogg">my song</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_audio.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_audio.xml deleted file mode 100644 index 908e90162..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_audio.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/generate-audio.php' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/generate-audio.php" type="audio/aiff">my movie</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_video.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_video.xml deleted file mode 100644 index 6ac974795..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_autodetect_by_type_video.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://example.com/generate-movie.php' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/generate-movie.php" type="video/mpeg">my movie</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_invalid.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_invalid.xml deleted file mode 100644 index 0cf5716f8..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_href_invalid.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: ensure that isProbablyDownloadable() will not throw ValueError on a bad URL -Expect: not bozo ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://bad]test">isProbablyDownloadable crasher</a></p> -</div> -</content> -</entry> -</feed> diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect.xml deleted file mode 100644 index 18a5fd469..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and not entries[0].has_key('enclosures') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/generate-enclosure.php">my song</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect_xml.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect_xml.xml deleted file mode 100644 index b5d2d3a7f..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_no_autodetect_xml.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and not entries[0].has_key('enclosures') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a href="http://example.com/generate-enclosure.php" type="application/atom+xml">my song</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title.xml deleted file mode 100644 index ba812b5ca..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['title'] == u'my movie' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="enclosure" href="http://example.com/movie.mp4" type="video/mpeg" title="my movie"></a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_from_link_text.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_from_link_text.xml deleted file mode 100644 index b69d85e76..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_from_link_text.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['title'] == u'my movie' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="enclosure" href="http://example.com/movie.mp4" type="video/mpeg">my movie</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_overrides_link_text.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_overrides_link_text.xml deleted file mode 100644 index 79c2a7132..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_title_overrides_link_text.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['title'] == u'real title' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="enclosure" href="http://example.com/movie.mp4" type="video/mpeg" title="real title">my movie</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_type.xml b/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_type.xml deleted file mode 100644 index bc6ced7ed..000000000 --- a/lib/feedparser/tests/microformats/rel_enclosure/rel_enclosure_type.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='enclosure' link -Expect: not bozo and entries[0]['enclosures'][0]['type'] == u'video/mpeg' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="enclosure" href="http://example.com/movie.mp4" type="video/mpeg">my movie</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_tag/rel_tag_duplicate.xml b/lib/feedparser/tests/microformats/rel_tag/rel_tag_duplicate.xml deleted file mode 100644 index 62ae4950d..000000000 --- a/lib/feedparser/tests/microformats/rel_tag/rel_tag_duplicate.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains duplicate rel='tag' link -Expect: not bozo and len(entries[0]['tags']) == 1 ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<category term="tech" scheme="http://del.icio.us/tag/" label="Technology"/> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="tag" href="http://del.icio.us/tag/tech">Technology</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_tag/rel_tag_label.xml b/lib/feedparser/tests/microformats/rel_tag/rel_tag_label.xml deleted file mode 100644 index 81aacadb0..000000000 --- a/lib/feedparser/tests/microformats/rel_tag/rel_tag_label.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='tag' link -Expect: not bozo and entries[0]['tags'][0]['label'] == u'Technology' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="tag" href="http://del.icio.us/tag/tech">Technology</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_tag/rel_tag_scheme.xml b/lib/feedparser/tests/microformats/rel_tag/rel_tag_scheme.xml deleted file mode 100644 index 50a115e27..000000000 --- a/lib/feedparser/tests/microformats/rel_tag/rel_tag_scheme.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='tag' link -Expect: not bozo and entries[0]['tags'][0]['scheme'] == u'http://del.icio.us/tag/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="tag" href="http://del.icio.us/tag/tech">Technology</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_tag/rel_tag_term.xml b/lib/feedparser/tests/microformats/rel_tag/rel_tag_term.xml deleted file mode 100644 index c78765303..000000000 --- a/lib/feedparser/tests/microformats/rel_tag/rel_tag_term.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='tag' link -Expect: not bozo and entries[0]['tags'][0]['term'] == u'tech' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="tag" href="http://del.icio.us/tag/tech">Technology</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/rel_tag/rel_tag_term_trailing_slash.xml b/lib/feedparser/tests/microformats/rel_tag/rel_tag_term_trailing_slash.xml deleted file mode 100644 index 56f75e2b2..000000000 --- a/lib/feedparser/tests/microformats/rel_tag/rel_tag_term_trailing_slash.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains rel='tag' link -Expect: not bozo and entries[0]['tags'][0]['term'] == u'tech' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="tag" href="http://del.icio.us/tag/tech/">Technology</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_acquaintance.xml b/lib/feedparser/tests/microformats/xfn/xfn_acquaintance.xml deleted file mode 100644 index aef6e3762..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_acquaintance.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'acquaintance'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="acquaintance" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_brother.xml b/lib/feedparser/tests/microformats/xfn/xfn_brother.xml deleted file mode 100644 index eb201bf0a..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_brother.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'brother'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="brother" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_child.xml b/lib/feedparser/tests/microformats/xfn/xfn_child.xml deleted file mode 100644 index 507d91bb1..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_child.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'child'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="child" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_co-resident.xml b/lib/feedparser/tests/microformats/xfn/xfn_co-resident.xml deleted file mode 100644 index 10267a9a4..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_co-resident.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'co-resident'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="co-resident" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_co-worker.xml b/lib/feedparser/tests/microformats/xfn/xfn_co-worker.xml deleted file mode 100644 index c385aeec1..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_co-worker.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'co-worker'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="co-worker" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_colleague.xml b/lib/feedparser/tests/microformats/xfn/xfn_colleague.xml deleted file mode 100644 index 9a8ca3b1c..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_colleague.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'colleague'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="colleague" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_contact.xml b/lib/feedparser/tests/microformats/xfn/xfn_contact.xml deleted file mode 100644 index 8ba482e62..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_contact.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'contact'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="contact" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_coresident.xml b/lib/feedparser/tests/microformats/xfn/xfn_coresident.xml deleted file mode 100644 index 64ecec5ed..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_coresident.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'coresident'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="coresident" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_coworker.xml b/lib/feedparser/tests/microformats/xfn/xfn_coworker.xml deleted file mode 100644 index 9217d4004..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_coworker.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'coworker'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="coworker" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_crush.xml b/lib/feedparser/tests/microformats/xfn/xfn_crush.xml deleted file mode 100644 index f5675382a..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_crush.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'crush'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="crush" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_date.xml b/lib/feedparser/tests/microformats/xfn/xfn_date.xml deleted file mode 100644 index 104876501..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_date.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'date'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="date" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_friend.xml b/lib/feedparser/tests/microformats/xfn/xfn_friend.xml deleted file mode 100644 index b70aa2a36..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_friend.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'friend'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="friend" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_href.xml b/lib/feedparser/tests/microformats/xfn/xfn_href.xml deleted file mode 100644 index e05a65914..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_href.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['href'] == u'http://example.com/johndoe' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="coworker" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_husband.xml b/lib/feedparser/tests/microformats/xfn/xfn_husband.xml deleted file mode 100644 index e68275bc6..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_husband.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'husband'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="husband" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_kin.xml b/lib/feedparser/tests/microformats/xfn/xfn_kin.xml deleted file mode 100644 index 1d07e0796..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_kin.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'kin'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="kin" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_me.xml b/lib/feedparser/tests/microformats/xfn/xfn_me.xml deleted file mode 100644 index cffd9fded..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_me.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'me'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="me" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_met.xml b/lib/feedparser/tests/microformats/xfn/xfn_met.xml deleted file mode 100644 index f8df859ef..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_met.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'met'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="met" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_multiple.xml b/lib/feedparser/tests/microformats/xfn/xfn_multiple.xml deleted file mode 100644 index 9574495de..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_multiple.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'coworker', u'friend'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="coworker friend" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_muse.xml b/lib/feedparser/tests/microformats/xfn/xfn_muse.xml deleted file mode 100644 index 7832f542b..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_muse.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'muse'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="muse" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_name.xml b/lib/feedparser/tests/microformats/xfn/xfn_name.xml deleted file mode 100644 index cd1e9c377..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_name.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['name'] == u'John Doe' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="coworker" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_neighbor.xml b/lib/feedparser/tests/microformats/xfn/xfn_neighbor.xml deleted file mode 100644 index 6b1b1aae2..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_neighbor.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'neighbor'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="neighbor" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_parent.xml b/lib/feedparser/tests/microformats/xfn/xfn_parent.xml deleted file mode 100644 index 13739d324..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_parent.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'parent'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="parent" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_relative.xml b/lib/feedparser/tests/microformats/xfn/xfn_relative.xml deleted file mode 100644 index 06e5e3714..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_relative.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'relative'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="relative" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_sibling.xml b/lib/feedparser/tests/microformats/xfn/xfn_sibling.xml deleted file mode 100644 index 7c12ed3cd..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_sibling.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'sibling'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="sibling" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_sister.xml b/lib/feedparser/tests/microformats/xfn/xfn_sister.xml deleted file mode 100644 index 411ac9832..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_sister.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'sister'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="sister" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_spouse.xml b/lib/feedparser/tests/microformats/xfn/xfn_spouse.xml deleted file mode 100644 index 157f26a54..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_spouse.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'spouse'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="spouse" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_sweetheart.xml b/lib/feedparser/tests/microformats/xfn/xfn_sweetheart.xml deleted file mode 100644 index 427156123..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_sweetheart.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'sweetheart'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="sweetheart" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/microformats/xfn/xfn_wife.xml b/lib/feedparser/tests/microformats/xfn/xfn_wife.xml deleted file mode 100644 index 529b7af91..000000000 --- a/lib/feedparser/tests/microformats/xfn/xfn_wife.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: content contains XFN link -Expect: not bozo and entries[0]['xfn'][0]['relationships'] == [u'wife'] ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"> -<div xmlns="http://www.w3.org/1999/xhtml"> -<p><a rel="wife" href="http://example.com/johndoe">John Doe</a></p> -</div> -</content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/amp/amp01.xml b/lib/feedparser/tests/wellformed/amp/amp01.xml deleted file mode 100644 index 3ca458353..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp01.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 1 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&#38;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp02.xml b/lib/feedparser/tests/wellformed/amp/amp02.xml deleted file mode 100644 index 86e049f59..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp02.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 2 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&#x26;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp03.xml b/lib/feedparser/tests/wellformed/amp/amp03.xml deleted file mode 100644 index 8fe783013..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp03.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 3 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>&</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp04.xml b/lib/feedparser/tests/wellformed/amp/amp04.xml deleted file mode 100644 index 7df221df0..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp04.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 4 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&amp;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp05.xml b/lib/feedparser/tests/wellformed/amp/amp05.xml deleted file mode 100644 index 4a8a46e32..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp05.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 5 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&#38;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp06.xml b/lib/feedparser/tests/wellformed/amp/amp06.xml deleted file mode 100644 index 5a59cd4dd..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp06.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 6 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&#x26;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp07.xml b/lib/feedparser/tests/wellformed/amp/amp07.xml deleted file mode 100644 index a324d4ba1..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp07.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 7 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>&</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp08.xml b/lib/feedparser/tests/wellformed/amp/amp08.xml deleted file mode 100644 index 42ac2c70c..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp08.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 8 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&amp;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp09.xml b/lib/feedparser/tests/wellformed/amp/amp09.xml deleted file mode 100644 index b634a90fd..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp09.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 9 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&#38;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp10.xml b/lib/feedparser/tests/wellformed/amp/amp10.xml deleted file mode 100644 index 87a050c52..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp10.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 10 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&#x26;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp11.xml b/lib/feedparser/tests/wellformed/amp/amp11.xml deleted file mode 100644 index 2b8d57447..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp11.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 11 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>&</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp12.xml b/lib/feedparser/tests/wellformed/amp/amp12.xml deleted file mode 100644 index ff9622c77..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp12.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 12 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">&amp;</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp13.xml b/lib/feedparser/tests/wellformed/amp/amp13.xml deleted file mode 100644 index 486ce4858..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp13.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 13 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#38;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp14.xml b/lib/feedparser/tests/wellformed/amp/amp14.xml deleted file mode 100644 index fc60ae17d..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp14.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 14 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#x26;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp15.xml b/lib/feedparser/tests/wellformed/amp/amp15.xml deleted file mode 100644 index f2fecbdd4..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp15.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 15 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&amp;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp16.xml b/lib/feedparser/tests/wellformed/amp/amp16.xml deleted file mode 100644 index 92ab7e45b..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp16.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 16 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#38;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp17.xml b/lib/feedparser/tests/wellformed/amp/amp17.xml deleted file mode 100644 index 1a4f2fa01..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp17.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 17 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#x26;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp18.xml b/lib/feedparser/tests/wellformed/amp/amp18.xml deleted file mode 100644 index dda68b05a..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp18.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 18 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&amp;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp19.xml b/lib/feedparser/tests/wellformed/amp/amp19.xml deleted file mode 100644 index 168e7446b..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp19.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 19 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#38;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp20.xml b/lib/feedparser/tests/wellformed/amp/amp20.xml deleted file mode 100644 index d105aba1b..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp20.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 20 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#x26;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp21.xml b/lib/feedparser/tests/wellformed/amp/amp21.xml deleted file mode 100644 index 15b987d8e..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp21.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 21 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&amp;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp22.xml b/lib/feedparser/tests/wellformed/amp/amp22.xml deleted file mode 100644 index a54b0aa6e..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp22.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 22 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#38;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp23.xml b/lib/feedparser/tests/wellformed/amp/amp23.xml deleted file mode 100644 index c4b09b534..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp23.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 23 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#x26;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp24.xml b/lib/feedparser/tests/wellformed/amp/amp24.xml deleted file mode 100644 index 8ff8f50b1..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp24.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 24 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&amp;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp25.xml b/lib/feedparser/tests/wellformed/amp/amp25.xml deleted file mode 100644 index edac63bc1..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp25.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 25 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#38;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp26.xml b/lib/feedparser/tests/wellformed/amp/amp26.xml deleted file mode 100644 index 0b0752faf..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp26.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 26 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#x26;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp27.xml b/lib/feedparser/tests/wellformed/amp/amp27.xml deleted file mode 100644 index 9c9419d1d..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp27.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 27 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&amp;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp28.xml b/lib/feedparser/tests/wellformed/amp/amp28.xml deleted file mode 100644 index 8d6da5301..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp28.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 28 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#38;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp29.xml b/lib/feedparser/tests/wellformed/amp/amp29.xml deleted file mode 100644 index 7baae50b2..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp29.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 29 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&#x26;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp30.xml b/lib/feedparser/tests/wellformed/amp/amp30.xml deleted file mode 100644 index 5f6399c82..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp30.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 30 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><b>&amp;</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp31.xml b/lib/feedparser/tests/wellformed/amp/amp31.xml deleted file mode 100644 index 47b445ed6..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp31.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 31 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#38;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp32.xml b/lib/feedparser/tests/wellformed/amp/amp32.xml deleted file mode 100644 index ac95fffd0..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp32.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 32 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#x26;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp33.xml b/lib/feedparser/tests/wellformed/amp/amp33.xml deleted file mode 100644 index 442c79e0e..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp33.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 33 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&amp;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp34.xml b/lib/feedparser/tests/wellformed/amp/amp34.xml deleted file mode 100644 index fd69c6800..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp34.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 34 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#38;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp35.xml b/lib/feedparser/tests/wellformed/amp/amp35.xml deleted file mode 100644 index d2e6c6049..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp35.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 35 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#x26;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp36.xml b/lib/feedparser/tests/wellformed/amp/amp36.xml deleted file mode 100644 index 545f4ddd3..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp36.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 36 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&amp;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp37.xml b/lib/feedparser/tests/wellformed/amp/amp37.xml deleted file mode 100644 index 5ed3590d0..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp37.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 37 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#38;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp38.xml b/lib/feedparser/tests/wellformed/amp/amp38.xml deleted file mode 100644 index c4710040a..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp38.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 38 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#x26;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp39.xml b/lib/feedparser/tests/wellformed/amp/amp39.xml deleted file mode 100644 index 2d3a3d2b4..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp39.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 39 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&amp;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp40.xml b/lib/feedparser/tests/wellformed/amp/amp40.xml deleted file mode 100644 index ddf24f362..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp40.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 40 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#38;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp41.xml b/lib/feedparser/tests/wellformed/amp/amp41.xml deleted file mode 100644 index 18f570e8c..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp41.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 41 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#x26;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp42.xml b/lib/feedparser/tests/wellformed/amp/amp42.xml deleted file mode 100644 index 3857d6076..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp42.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 42 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&amp;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp43.xml b/lib/feedparser/tests/wellformed/amp/amp43.xml deleted file mode 100644 index e5e35cf76..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp43.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 43 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#38;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp44.xml b/lib/feedparser/tests/wellformed/amp/amp44.xml deleted file mode 100644 index 290c33352..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp44.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 44 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#x26;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp45.xml b/lib/feedparser/tests/wellformed/amp/amp45.xml deleted file mode 100644 index ecba32b02..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp45.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 45 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&amp;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp46.xml b/lib/feedparser/tests/wellformed/amp/amp46.xml deleted file mode 100644 index 32b2f633d..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp46.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 46 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#38;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp47.xml b/lib/feedparser/tests/wellformed/amp/amp47.xml deleted file mode 100644 index 9e81f91f1..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp47.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 47 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&#x26;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp48.xml b/lib/feedparser/tests/wellformed/amp/amp48.xml deleted file mode 100644 index 3c0c26ea3..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp48.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 48 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><strong>&amp;</strong></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp49.xml b/lib/feedparser/tests/wellformed/amp/amp49.xml deleted file mode 100644 index 102f803a3..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp49.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 49 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[&]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp50.xml b/lib/feedparser/tests/wellformed/amp/amp50.xml deleted file mode 100644 index 3f1ae00cb..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp50.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 50 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[&]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp51.xml b/lib/feedparser/tests/wellformed/amp/amp51.xml deleted file mode 100644 index a5644ff18..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp51.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 51 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title><![CDATA[&]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp52.xml b/lib/feedparser/tests/wellformed/amp/amp52.xml deleted file mode 100644 index b6e89c263..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp52.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 52 -Expect: not bozo and entries[0]['title_detail']['value'] == u'&' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[&]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp53.xml b/lib/feedparser/tests/wellformed/amp/amp53.xml deleted file mode 100644 index 0556638d6..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp53.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 53 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[<b>&</b>]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp54.xml b/lib/feedparser/tests/wellformed/amp/amp54.xml deleted file mode 100644 index 69dbde91f..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp54.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 54 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[<b>&</b>]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp55.xml b/lib/feedparser/tests/wellformed/amp/amp55.xml deleted file mode 100644 index 3173c7757..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp55.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 55 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<b>&</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[<b>&</b>]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp56.xml b/lib/feedparser/tests/wellformed/amp/amp56.xml deleted file mode 100644 index c577628ba..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp56.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 56 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[<strong>&</strong>]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp57.xml b/lib/feedparser/tests/wellformed/amp/amp57.xml deleted file mode 100644 index 7abad46b9..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp57.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 57 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[<strong>&</strong>]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp58.xml b/lib/feedparser/tests/wellformed/amp/amp58.xml deleted file mode 100644 index a204980d8..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp58.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 58 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<strong>&</strong>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><![CDATA[<strong>&</strong>]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp59.xml b/lib/feedparser/tests/wellformed/amp/amp59.xml deleted file mode 100644 index 708471ad1..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp59.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 59 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<div><b>&</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><b>&</b></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp60.xml b/lib/feedparser/tests/wellformed/amp/amp60.xml deleted file mode 100644 index baac7d49b..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp60.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 60 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<div><b>&</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><b>&</b></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp61.xml b/lib/feedparser/tests/wellformed/amp/amp61.xml deleted file mode 100644 index c77686f6d..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp61.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 61 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<div><b>&</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><b>&</b></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp62.xml b/lib/feedparser/tests/wellformed/amp/amp62.xml deleted file mode 100644 index 4016635e6..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp62.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 62 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<div><strong>&</strong></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><strong>&</strong></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp63.xml b/lib/feedparser/tests/wellformed/amp/amp63.xml deleted file mode 100644 index 29eb52668..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp63.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 63 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<div><strong>&</strong></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><strong>&</strong></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/amp64.xml b/lib/feedparser/tests/wellformed/amp/amp64.xml deleted file mode 100644 index b26a921e9..000000000 --- a/lib/feedparser/tests/wellformed/amp/amp64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & test 64 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<div><strong>&</strong></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><strong>&</strong></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/amp/attr01.xml b/lib/feedparser/tests/wellformed/amp/attr01.xml deleted file mode 100644 index 1f3cdbc42..000000000 --- a/lib/feedparser/tests/wellformed/amp/attr01.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & attr test 1 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<a title="&">&</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><a title="&#38;">&#38;</a></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/amp/attr02.xml b/lib/feedparser/tests/wellformed/amp/attr02.xml deleted file mode 100644 index 8086e7b0a..000000000 --- a/lib/feedparser/tests/wellformed/amp/attr02.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & attr test 2 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<a title="&">&</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><a title="&amp;">&amp;</a></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/amp/attr03.xml b/lib/feedparser/tests/wellformed/amp/attr03.xml deleted file mode 100644 index 33d79f94d..000000000 --- a/lib/feedparser/tests/wellformed/amp/attr03.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & attr test 3 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<a title="&">&</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped"><a title="&#x26;">&#x26;</a></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/amp/attr04.xml b/lib/feedparser/tests/wellformed/amp/attr04.xml deleted file mode 100644 index a4be12190..000000000 --- a/lib/feedparser/tests/wellformed/amp/attr04.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & attr test 4 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<a title="&">&</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a title="&">&</a></div></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/amp/attr05.xml b/lib/feedparser/tests/wellformed/amp/attr05.xml deleted file mode 100644 index 3457934b6..000000000 --- a/lib/feedparser/tests/wellformed/amp/attr05.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & attr test 5 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<a title="&">&</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a title="&">&</a></div></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/amp/attr06.xml b/lib/feedparser/tests/wellformed/amp/attr06.xml deleted file mode 100644 index b01196e79..000000000 --- a/lib/feedparser/tests/wellformed/amp/attr06.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: & attr test 6 -Expect: not bozo and entries[0]['title_detail']['value'] == u'<a title="&">&</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a title="&">&</a></div></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/atom_namespace_1.xml b/lib/feedparser/tests/wellformed/atom/atom_namespace_1.xml deleted file mode 100644 index 96a90ce69..000000000 --- a/lib/feedparser/tests/wellformed/atom/atom_namespace_1.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Atom namespace (official) -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/atom_namespace_2.xml b/lib/feedparser/tests/wellformed/atom/atom_namespace_2.xml deleted file mode 100644 index 90cc0d3bf..000000000 --- a/lib/feedparser/tests/wellformed/atom/atom_namespace_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Atom namespace (example.com) -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://example.com/newformat#"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/atom_namespace_3.xml b/lib/feedparser/tests/wellformed/atom/atom_namespace_3.xml deleted file mode 100644 index d866205d5..000000000 --- a/lib/feedparser/tests/wellformed/atom/atom_namespace_3.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Atom namespace (necho) -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://example.com/necho"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/atom_namespace_4.xml b/lib/feedparser/tests/wellformed/atom/atom_namespace_4.xml deleted file mode 100644 index a805d9781..000000000 --- a/lib/feedparser/tests/wellformed/atom/atom_namespace_4.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Atom namespace (echo) -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/echo/"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/atom_namespace_5.xml b/lib/feedparser/tests/wellformed/atom/atom_namespace_5.xml deleted file mode 100644 index 0e6fa46ef..000000000 --- a/lib/feedparser/tests/wellformed/atom/atom_namespace_5.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Atom namespace (pie) -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/pie/"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_email.xml b/lib/feedparser/tests/wellformed/atom/entry_author_email.xml deleted file mode 100644 index 8210f4cab..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_email.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author email -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_homepage.xml b/lib/feedparser/tests/wellformed/atom/entry_author_homepage.xml deleted file mode 100644 index 21fdcae76..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_homepage.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author homepage -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <homepage>http://example.com/</homepage> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_map_author.xml b/lib/feedparser/tests/wellformed/atom/entry_author_map_author.xml deleted file mode 100644 index dfb004dc7..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_map_author.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author name + email maps to author -Expect: not bozo and entries[0]['author'] == u'Example author (me@example.com)' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_map_author_2.xml b/lib/feedparser/tests/wellformed/atom/entry_author_map_author_2.xml deleted file mode 100644 index bcd47e778..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_map_author_2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: entry author name maps to author if no email present -Expect: not bozo and entries[0]['author'] == u'Example author' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <url>http://example.com/</url> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_name.xml b/lib/feedparser/tests/wellformed/atom/entry_author_name.xml deleted file mode 100644 index 6b302b01e..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_name.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author name -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example author' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_uri.xml b/lib/feedparser/tests/wellformed/atom/entry_author_uri.xml deleted file mode 100644 index 653980846..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_uri.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author uri -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_author_url.xml b/lib/feedparser/tests/wellformed/atom/entry_author_url.xml deleted file mode 100644 index 7192d04a9..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_author_url.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author url -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/entry_content_mode_base64.xml deleted file mode 100644 index 91818ba7c..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_content_mode_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry content mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/entry_content_mode_escaped.xml deleted file mode 100644 index 67da8383e..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_content_mode_escaped.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content type="text/html" mode="escaped">Example <b>Atom</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_content_type.xml b/lib/feedparser/tests/wellformed/atom/entry_content_type.xml deleted file mode 100644 index fd556e882..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_content_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content content type defaults to 'text/plain' -Expect: not bozo and entries[0]['content'][0]['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content>Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/entry_content_type_text_plain.xml deleted file mode 100644 index 656dbd455..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_content_type_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content type='text/plain' -Expect: not bozo and entries[0]['content'][0]['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content type="text/plain">Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_content_value.xml b/lib/feedparser/tests/wellformed/atom/entry_content_value.xml deleted file mode 100644 index 6da460d0a..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content content value -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content>Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_contributor_email.xml b/lib/feedparser/tests/wellformed/atom/entry_contributor_email.xml deleted file mode 100644 index f51fc17a0..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_contributor_email.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor email -Expect: not bozo and entries[0]['contributors'][0]['email'] == u'me@example.com' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_contributor_homepage.xml b/lib/feedparser/tests/wellformed/atom/entry_contributor_homepage.xml deleted file mode 100644 index f5a398d12..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_contributor_homepage.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor homepage -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <homepage>http://example.com/</homepage> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_contributor_multiple.xml b/lib/feedparser/tests/wellformed/atom/entry_contributor_multiple.xml deleted file mode 100644 index c58cd9165..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_contributor_multiple.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -Description: multiple entry contributors -Expect: not bozo and entries[0]['contributors'][0] == {'name': u'Contributor 1', 'email': u'me@example.com', 'href': u'http://example.com/'} and entries[0]['contributors'][1] == {'name': u'Contributor 2', 'email': u'you@example.com', 'href': u'http://two.example.com/'} ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <contributor> - <name>Contributor 1</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> - <contributor> - <name>Contributor 2</name> - <email>you@example.com</email> - <url>http://two.example.com/</url> - </contributor> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_contributor_name.xml b/lib/feedparser/tests/wellformed/atom/entry_contributor_name.xml deleted file mode 100644 index 1b82beebb..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_contributor_name.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor name -Expect: not bozo and entries[0]['contributors'][0]['name'] == u'Example contributor' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_contributor_uri.xml b/lib/feedparser/tests/wellformed/atom/entry_contributor_uri.xml deleted file mode 100644 index a37f5773d..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_contributor_uri.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor uri -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_contributor_url.xml b/lib/feedparser/tests/wellformed/atom/entry_contributor_url.xml deleted file mode 100644 index 618511902..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_contributor_url.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor url -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_created.xml b/lib/feedparser/tests/wellformed/atom/entry_created.xml deleted file mode 100644 index 3175de027..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_created.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry created -Expect: not bozo and entries[0]['created'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<created>Thu, 01 Jan 2004 19:48:21 GMT</created> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_created_multiple_values.xml b/lib/feedparser/tests/wellformed/atom/entry_created_multiple_values.xml deleted file mode 100644 index 95688edd3..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_created_multiple_values.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry parsed created, multiple values, ensure overwrite -Expect: not bozo and entries[0]['created_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<created>2010-12-01T10:14:55Z</created> -<created>2003-12-31T10:14:55Z</created> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_created_parsed.xml b/lib/feedparser/tests/wellformed/atom/entry_created_parsed.xml deleted file mode 100644 index e7f9e9c38..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_created_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry created parsed -Expect: not bozo and entries[0]['created_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<created>2003-12-31T10:14:55Z</created> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_id.xml b/lib/feedparser/tests/wellformed/atom/entry_id.xml deleted file mode 100644 index 827ca3792..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_id.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id -Expect: not bozo and entries[0]['id'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <id>http://example.com/</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_id_map_guid.xml b/lib/feedparser/tests/wellformed/atom/entry_id_map_guid.xml deleted file mode 100644 index bc2dfb10d..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_id_map_guid.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id maps to guid -Expect: not bozo and entries[0]['guid'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <id>http://example.com/</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_issued.xml b/lib/feedparser/tests/wellformed/atom/entry_issued.xml deleted file mode 100644 index fdc508141..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_issued.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry issued -Expect: not bozo and entries[0]['published'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<issued>Thu, 01 Jan 2004 19:48:21 GMT</issued> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_issued_parsed.xml b/lib/feedparser/tests/wellformed/atom/entry_issued_parsed.xml deleted file mode 100644 index 5cf272985..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_issued_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry issued parsed -Expect: not bozo and entries[0]['published_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<issued>2003-12-31T10:14:55Z</issued> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link.xml b/lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link.xml deleted file mode 100644 index d618df928..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href maps to link if rel="alternate" and type="text/html" -Expect: not bozo and entries[0]['link'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link_2.xml b/lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link_2.xml deleted file mode 100644 index 11e03b46f..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_alternate_map_link_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href maps to link if rel="alternate" and type="application/xhtml+xml" -Expect: not bozo and entries[0]['link'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_href.xml b/lib/feedparser/tests/wellformed/atom/entry_link_href.xml deleted file mode 100644 index 2be6dc7fa..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_href.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href -Expect: not bozo and entries[0]['links'][0]['href'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_multiple.xml b/lib/feedparser/tests/wellformed/atom/entry_link_multiple.xml deleted file mode 100644 index 9d7228cef..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_multiple.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry multiple links -Expect: not bozo and entries[0]['links'][0] == {'rel': u'alternate', 'type': u'application/xhtml+xml', 'href': u'http://www.example.com/'} and entries[0]['links'][1] == {'rel': u'service.post', 'type': u'application/atom+xml', 'href': u'http://www.example.com/post'} ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> - <link rel="service.post" type="application/atom+xml" href="http://www.example.com/post"/> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_rel.xml b/lib/feedparser/tests/wellformed/atom/entry_link_rel.xml deleted file mode 100644 index db5d78a2a..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_rel.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel -Expect: not bozo and entries[0]['links'][0]['rel'] == u'alternate' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_title.xml b/lib/feedparser/tests/wellformed/atom/entry_link_title.xml deleted file mode 100644 index 4d71c0574..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link title -Expect: not bozo and entries[0]['links'][0]['title'] == u'Example title' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_link_type.xml b/lib/feedparser/tests/wellformed/atom/entry_link_type.xml deleted file mode 100644 index 8dbe49555..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_link_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link type -Expect: not bozo and entries[0]['links'][0]['type'] == u'text/html' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_modified.xml b/lib/feedparser/tests/wellformed/atom/entry_modified.xml deleted file mode 100644 index 7bf362ccd..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_modified.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry modified -Expect: not bozo and entries[0]['updated'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<modified>Thu, 01 Jan 2004 19:48:21 GMT</modified> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_modified_map_updated_parsed.xml b/lib/feedparser/tests/wellformed/atom/entry_modified_map_updated_parsed.xml deleted file mode 100644 index 0eaa5c101..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_modified_map_updated_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry modified parsed and mapped to updated_parsed -Expect: not bozo and entries[0]['updated_parsed'] == (2004, 1, 1, 19, 48, 21, 3, 1, 0) ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<modified>Thu, 01 Jan 2004 19:48:21 GMT</modified> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_published_parsed.xml b/lib/feedparser/tests/wellformed/atom/entry_published_parsed.xml deleted file mode 100644 index 6c0c05058..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_published_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry published parsed -Expect: not bozo and entries[0]['published_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<published>2003-12-31T10:14:55Z</published> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_published_parsed_date_overwriting.xml b/lib/feedparser/tests/wellformed/atom/entry_published_parsed_date_overwriting.xml deleted file mode 100644 index bd30e91ac..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_published_parsed_date_overwriting.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry conflicting published/issued values overwrite parsed values -Expect: not bozo and entries[0]['published_parsed'] == (2010, 1, 1, 19, 48, 21, 4, 1, 0) ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<issued>Thu, 01 Jan 2004 19:48:21 GMT</issued> -<published>Sat, 01 Jan 2010 19:48:21 GMT</published> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_source_updated_parsed.xml b/lib/feedparser/tests/wellformed/atom/entry_source_updated_parsed.xml deleted file mode 100644 index d518d3dfb..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_source_updated_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source updated parsed -Expect: not bozo and entries[0]['source']['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> -<updated>2003-12-31T10:14:55Z</updated> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary.xml b/lib/feedparser/tests/wellformed/atom/entry_summary.xml deleted file mode 100644 index e12454b11..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary -Expect: not bozo and entries[0]['summary'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary>Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_base64.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_base64.xml deleted file mode 100644 index 9c34f5775..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry summary base64-encoded -Expect: not bozo and entries[0]['summary'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_base64_2.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_base64_2.xml deleted file mode 100644 index bfcd18369..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_base64_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry summary base64-encoded -Expect: not bozo and entries[0]['summary'] == u'<p>History of the <blink> tag</p>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary mode="base64"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_base64.xml deleted file mode 100644 index 282cff83b..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry summary mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_escaped.xml deleted file mode 100644 index 1be7ac651..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_content_mode_escaped.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="text/html" mode="escaped">Example <b>Atom</b></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_content_type.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_content_type.xml deleted file mode 100644 index f20078f7d..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_content_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content type defaults to 'text/plain' -Expect: not bozo and entries[0]['summary_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary>Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_content_type_text_plain.xml deleted file mode 100644 index 704d21b60..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_content_type_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary type='text/plain' -Expect: not bozo and entries[0]['summary_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="text/plain">Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_content_value.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_content_value.xml deleted file mode 100644 index bbb74f71e..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content value -Expect: not bozo and entries[0]['summary_detail']['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary>Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_escaped_markup.xml deleted file mode 100644 index fa1cd246e..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary escaped HTML -Expect: not bozo and entries[0]['summary'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="text/html" mode="escaped">Example <b>Atom</b></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup.xml deleted file mode 100644 index be60d2c18..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary inline XHTML -Expect: not bozo and entries[0]['summary'] == u'<div>Example <b>Atom</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup_2.xml deleted file mode 100644 index fbd4dd800..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_inline_markup_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary inline XHTML with escaped markup -Expect: not bozo and entries[0]['summary'] == u'<div>History of the <blink> tag</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_naked_markup.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_naked_markup.xml deleted file mode 100644 index d5926a7b2..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_naked_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary with undeclared unqualified inline markup -Expect: not bozo and entries[0]['summary'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary>Example <b>Atom</b></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_summary_text_plain.xml b/lib/feedparser/tests/wellformed/atom/entry_summary_text_plain.xml deleted file mode 100644 index 3839a854c..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_summary_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary with explicit type='text/plain' -Expect: not bozo and entries[0]['summary'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="text/plain">Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title.xml b/lib/feedparser/tests/wellformed/atom/entry_title.xml deleted file mode 100644 index 1dd56fcdc..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title -Expect: not bozo and entries[0]['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_base64.xml b/lib/feedparser/tests/wellformed/atom/entry_title_base64.xml deleted file mode 100644 index 85ac6caa5..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry title base64-encoded -Expect: not bozo and entries[0]['title'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_base64_2.xml b/lib/feedparser/tests/wellformed/atom/entry_title_base64_2.xml deleted file mode 100644 index 330d38738..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_base64_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry title base64-encoded -Expect: not bozo and entries[0]['title'] == u'<p>History of the <blink> tag</p>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title mode="base64"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/entry_title_content_mode_base64.xml deleted file mode 100644 index fc9893de0..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_content_mode_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry title mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/entry_title_content_mode_escaped.xml deleted file mode 100644 index eb6dd1bf0..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_content_mode_escaped.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">Example <b>Atom</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_content_type.xml b/lib/feedparser/tests/wellformed/atom/entry_title_content_type.xml deleted file mode 100644 index c14ef5a7a..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_content_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content type defaults to 'text/plain' -Expect: not bozo and entries[0]['title_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/entry_title_content_type_text_plain.xml deleted file mode 100644 index bb0a1dcef..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_content_type_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title type='text/plain' -Expect: not bozo and entries[0]['title_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/plain">Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_content_value.xml b/lib/feedparser/tests/wellformed/atom/entry_title_content_value.xml deleted file mode 100644 index 043d0af58..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content value -Expect: not bozo and entries[0]['title_detail']['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom/entry_title_escaped_markup.xml deleted file mode 100644 index ccc24b8a7..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title escaped HTML -Expect: not bozo and entries[0]['title'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/html" mode="escaped">Example <b>Atom</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_inline_markup.xml b/lib/feedparser/tests/wellformed/atom/entry_title_inline_markup.xml deleted file mode 100644 index eb7c9315e..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_inline_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title inline XHTML -Expect: not bozo and entries[0]['title'] == u'<div>Example <b>Atom</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom/entry_title_inline_markup_2.xml deleted file mode 100644 index 71cfc5072..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_inline_markup_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title inline XHTML with escaped markup -Expect: not bozo and entries[0]['title'] == u'<div>History of the <blink> tag</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_naked_markup.xml b/lib/feedparser/tests/wellformed/atom/entry_title_naked_markup.xml deleted file mode 100644 index ffc9aa93f..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_naked_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title with undeclared unqualified inline markup -Expect: not bozo and entries[0]['title'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title>Example <b>Atom</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_text_plain.xml b/lib/feedparser/tests/wellformed/atom/entry_title_text_plain.xml deleted file mode 100644 index f02a6264b..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title with explicit type='text/plain' -Expect: not bozo and entries[0]['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/plain">Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_title_text_plain_brackets.xml b/lib/feedparser/tests/wellformed/atom/entry_title_text_plain_brackets.xml deleted file mode 100644 index cbd327cb1..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_title_text_plain_brackets.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title with explicit type='text/plain' contains brackets that are not markup -Expect: not bozo and entries[0]['title'] == u'History of the <blink> tag' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="text/plain">History of the <blink> tag</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/entry_updated_multiple_values.xml b/lib/feedparser/tests/wellformed/atom/entry_updated_multiple_values.xml deleted file mode 100644 index 386cd0761..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_updated_multiple_values.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry parsed updated, multiple values, ensure overwrite -Expect: not bozo and entries[0]['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<updated>2010-12-01T10:14:55Z</updated> -<updated>2003-12-31T10:14:55Z</updated> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/entry_updated_parsed.xml b/lib/feedparser/tests/wellformed/atom/entry_updated_parsed.xml deleted file mode 100644 index 66a315be9..000000000 --- a/lib/feedparser/tests/wellformed/atom/entry_updated_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry updated parsed -Expect: not bozo and entries[0]['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<updated>2003-12-31T10:14:55Z</updated> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_email.xml b/lib/feedparser/tests/wellformed/atom/feed_author_email.xml deleted file mode 100644 index 3eb3f4a51..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author email -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_homepage.xml b/lib/feedparser/tests/wellformed/atom/feed_author_homepage.xml deleted file mode 100644 index 3d7abf799..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_homepage.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author homepage -Expect: not bozo and feed['author_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <homepage>http://example.com/</homepage> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_map_author.xml b/lib/feedparser/tests/wellformed/atom/feed_author_map_author.xml deleted file mode 100644 index 003a1f4d4..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_map_author.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author name + email maps to author -Expect: not bozo and feed['author'] == u'Example author (me@example.com)' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_map_author_2.xml b/lib/feedparser/tests/wellformed/atom/feed_author_map_author_2.xml deleted file mode 100644 index 977142f86..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_map_author_2.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: feed author name maps to author if no email present -Expect: not bozo and feed['author'] == u'Example author' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <url>http://example.com/</url> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_name.xml b/lib/feedparser/tests/wellformed/atom/feed_author_name.xml deleted file mode 100644 index 8e2e0277f..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author name -Expect: not bozo and feed['author_detail']['name'] == u'Example author' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_uri.xml b/lib/feedparser/tests/wellformed/atom/feed_author_uri.xml deleted file mode 100644 index 3df7ce32b..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_uri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author uri -Expect: not bozo and feed['author_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_author_url.xml b/lib/feedparser/tests/wellformed/atom/feed_author_url.xml deleted file mode 100644 index dd7cb1f90..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_author_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author url -Expect: not bozo and feed['author_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_contributor_email.xml b/lib/feedparser/tests/wellformed/atom/feed_contributor_email.xml deleted file mode 100644 index 664e2a5e6..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_contributor_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor email -Expect: not bozo and feed['contributors'][0]['email'] == u'me@example.com' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_contributor_homepage.xml b/lib/feedparser/tests/wellformed/atom/feed_contributor_homepage.xml deleted file mode 100644 index 14d518e2b..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_contributor_homepage.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor homepage -Expect: not bozo and feed['contributors'][0]['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <homepage>http://example.com/</homepage> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_contributor_multiple.xml b/lib/feedparser/tests/wellformed/atom/feed_contributor_multiple.xml deleted file mode 100644 index 64a1326ec..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_contributor_multiple.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: multiple feed contributors -Expect: not bozo and feed['contributors'][0] == {'name': u'Contributor 1', 'email': u'me@example.com', 'href': u'http://example.com/'} and feed['contributors'][1] == {'name': u'Contributor 2', 'email': u'you@example.com', 'href': u'http://two.example.com/'} ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <contributor> - <name>Contributor 1</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> - <contributor> - <name>Contributor 2</name> - <email>you@example.com</email> - <url>http://two.example.com/</url> - </contributor> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/feed_contributor_name.xml b/lib/feedparser/tests/wellformed/atom/feed_contributor_name.xml deleted file mode 100644 index 56de55938..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_contributor_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor name -Expect: not bozo and feed['contributors'][0]['name'] == u'Example contributor' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_contributor_uri.xml b/lib/feedparser/tests/wellformed/atom/feed_contributor_uri.xml deleted file mode 100644 index c462dcabb..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_contributor_uri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor uri -Expect: not bozo and feed['contributors'][0]['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_contributor_url.xml b/lib/feedparser/tests/wellformed/atom/feed_contributor_url.xml deleted file mode 100644 index f42c4ea9c..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_contributor_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor url -Expect: not bozo and feed['contributors'][0]['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright.xml deleted file mode 100644 index e1a821816..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright -Expect: not bozo and feed['copyright'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright>Example Atom</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_base64.xml deleted file mode 100644 index 7b6599935..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed copyright base64-encoded -Expect: not bozo and feed['copyright'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_base64_2.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_base64_2.xml deleted file mode 100644 index 3cffcff44..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed copyright base64-encoded -Expect: not bozo and feed['copyright'] == u'<p>History of the <blink> tag</p>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright mode="base64"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_base64.xml deleted file mode 100644 index 3c68739ac..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed copyright mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_escaped.xml deleted file mode 100644 index 72132f8e1..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_mode_escaped.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="text/html" mode="escaped">Example <b>Atom</b></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_type.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_content_type.xml deleted file mode 100644 index e77a8ee0c..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright content type defaults to 'text/plain' -Expect: not bozo and feed['copyright_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright>Example Atom</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_content_type_text_plain.xml deleted file mode 100644 index 390313961..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_type_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright type='text/plain' -Expect: not bozo and feed['copyright_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="text/plain">Example Atom</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_value.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_content_value.xml deleted file mode 100644 index 491c10e41..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright content value -Expect: not bozo and feed['copyright_detail']['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright>Example Atom</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_escaped_markup.xml deleted file mode 100644 index 2f97df3e1..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright escaped HTML -Expect: not bozo and feed['copyright'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="text/html" mode="escaped">Example <b>Atom</b></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup.xml deleted file mode 100644 index bf8f211b0..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright inline XHTML -Expect: not bozo and feed['copyright'] == u'<div>Example <b>Atom</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup_2.xml deleted file mode 100644 index d4e4df3a4..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright inline XHTML with escaped markup -Expect: not bozo and feed['copyright'] == u'<div>History of the <blink> tag</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_naked_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_naked_markup.xml deleted file mode 100644 index a04eed41b..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_naked_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright with undeclared unqualified inline markup -Expect: not bozo and feed['copyright'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright>Example <b>Atom</b></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_copyright_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_copyright_text_plain.xml deleted file mode 100644 index 5c71c1b9e..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_copyright_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright with explicit type='text/plain' -Expect: not bozo and feed['copyright'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="text/plain">Example Atom</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_generator.xml b/lib/feedparser/tests/wellformed/atom/feed_generator.xml deleted file mode 100644 index 21bce92b6..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_generator.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator -Expect: not bozo and feed['generator'] == u'Example generator' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <generator url="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_generator_name.xml b/lib/feedparser/tests/wellformed/atom/feed_generator_name.xml deleted file mode 100644 index 349ed2deb..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_generator_name.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator name -Expect: not bozo and feed['generator_detail']['name'] == u'Example generator' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <generator url="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_generator_url.xml b/lib/feedparser/tests/wellformed/atom/feed_generator_url.xml deleted file mode 100644 index 4efaed264..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_generator_url.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator url -Expect: not bozo and feed['generator_detail']['url'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <generator url="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_generator_version.xml b/lib/feedparser/tests/wellformed/atom/feed_generator_version.xml deleted file mode 100644 index c6c088559..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_generator_version.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator version -Expect: not bozo and feed['generator_detail']['version'] == u'2.65' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <generator url="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_id.xml b/lib/feedparser/tests/wellformed/atom/feed_id.xml deleted file mode 100644 index a875baeb9..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_id.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed id -Expect: not bozo and feed['id'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <id>http://example.com/</id> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_id_map_guid.xml b/lib/feedparser/tests/wellformed/atom/feed_id_map_guid.xml deleted file mode 100644 index 9e6392dc7..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_id_map_guid.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed id -Expect: not bozo and feed['guid'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <id>http://example.com/</id> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info.xml b/lib/feedparser/tests/wellformed/atom/feed_info.xml deleted file mode 100644 index a4f98f723..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info -Expect: not bozo and feed['info'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info>Example Atom</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_info_base64.xml deleted file mode 100644 index df6136f36..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed info base64-encoded -Expect: not bozo and feed['info'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_base64_2.xml b/lib/feedparser/tests/wellformed/atom/feed_info_base64_2.xml deleted file mode 100644 index 4f50e30f0..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed info base64-encoded -Expect: not bozo and feed['info'] == u'<p>History of the <blink> tag</p>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info mode="base64"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_info_content_mode_base64.xml deleted file mode 100644 index 0c3de7043..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_content_mode_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed info mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/feed_info_content_mode_escaped.xml deleted file mode 100644 index fdc27e69a..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_content_mode_escaped.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="text/html" mode="escaped">Example <b>Atom</b></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_content_type.xml b/lib/feedparser/tests/wellformed/atom/feed_info_content_type.xml deleted file mode 100644 index 615d4d685..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info content type defaults to 'text/plain' -Expect: not bozo and feed['info_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info>Example Atom</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_info_content_type_text_plain.xml deleted file mode 100644 index c97aef9e0..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_content_type_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info type='text/plain' -Expect: not bozo and feed['info_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="text/plain">Example Atom</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_content_value.xml b/lib/feedparser/tests/wellformed/atom/feed_info_content_value.xml deleted file mode 100644 index d601f03ea..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info content value -Expect: not bozo and feed['info_detail']['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info>Example Atom</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_info_escaped_markup.xml deleted file mode 100644 index 4820f8be6..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info escaped HTML -Expect: not bozo and feed['info'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="text/html" mode="escaped">Example <b>Atom</b></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_inline_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_info_inline_markup.xml deleted file mode 100644 index 76e02eb06..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info inline XHTML -Expect: not bozo and feed['info'] == u'<div>Example <b>Atom</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom/feed_info_inline_markup_2.xml deleted file mode 100644 index a6313b75a..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info inline XHTML with escaped markup -Expect: not bozo and feed['info'] == u'<div>History of the <blink> tag</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_naked_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_info_naked_markup.xml deleted file mode 100644 index 9dab661cc..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_naked_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info with undeclared unqualified inline markup -Expect: not bozo and feed['info'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info>Example <b>Atom</b></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_info_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_info_text_plain.xml deleted file mode 100644 index e61ed050a..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_info_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info with explicit type='text/plain' -Expect: not bozo and feed['info'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="text/plain">Example Atom</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link.xml b/lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link.xml deleted file mode 100644 index 12842ffd7..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href maps to link if rel="alternate" and type="text/html" -Expect: not bozo and feed['link'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link_2.xml b/lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link_2.xml deleted file mode 100644 index e63141c53..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_alternate_map_link_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href maps to link if rel="alternate" and type="application/xhtml+xml" -Expect: not bozo and feed['link'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_href.xml b/lib/feedparser/tests/wellformed/atom/feed_link_href.xml deleted file mode 100644 index 6ab44d88b..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_href.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href -Expect: not bozo and feed['links'][0]['href'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_multiple.xml b/lib/feedparser/tests/wellformed/atom/feed_link_multiple.xml deleted file mode 100644 index 154fbbc33..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_multiple.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed multiple links -Expect: not bozo and feed['links'][0] == {'rel': u'alternate', 'type': u'application/xhtml+xml', 'href': u'http://www.example.com/'} and feed['links'][1] == {'rel': u'service.post', 'type': u'application/atom+xml', 'href': u'http://www.example.com/post'} ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> - <link rel="service.post" type="application/atom+xml" href="http://www.example.com/post"/> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_rel.xml b/lib/feedparser/tests/wellformed/atom/feed_link_rel.xml deleted file mode 100644 index dd2fe64a4..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_rel.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel -Expect: not bozo and feed['links'][0]['rel'] == u'alternate' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_title.xml b/lib/feedparser/tests/wellformed/atom/feed_link_title.xml deleted file mode 100644 index b8339eb3c..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_title.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link title -Expect: not bozo and feed['links'][0]['title'] == u'Example title' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_link_type.xml b/lib/feedparser/tests/wellformed/atom/feed_link_type.xml deleted file mode 100644 index 4fddbfd8f..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_link_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link type -Expect: not bozo and feed['links'][0]['type'] == u'text/html' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_modified.xml b/lib/feedparser/tests/wellformed/atom/feed_modified.xml deleted file mode 100644 index 984f8ab6b..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_modified.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed modified -Expect: not bozo and feed['updated'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - -<modified>Thu, 01 Jan 2004 19:48:21 GMT</modified> - -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/feed_modified_map_updated_parsed.xml b/lib/feedparser/tests/wellformed/atom/feed_modified_map_updated_parsed.xml deleted file mode 100644 index 9099adaf7..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_modified_map_updated_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed modified parsed and mapped to updated_parsed -Expect: not bozo and feed['updated_parsed'] == (2004, 1, 1, 19, 48, 21, 3, 1, 0) ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - -<modified>Thu, 01 Jan 2004 19:48:21 GMT</modified> - -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline.xml deleted file mode 100644 index ce170ef83..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline -Expect: not bozo and feed['tagline'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline>Example Atom</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_base64.xml deleted file mode 100644 index 196e08603..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed tagline base64-encoded -Expect: not bozo and feed['tagline'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_base64_2.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_base64_2.xml deleted file mode 100644 index eb57d1515..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed tagline base64-encoded -Expect: not bozo and feed['tagline'] == u'<p>History of the <blink> tag</p>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline mode="base64"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_base64.xml deleted file mode 100644 index ff55466c0..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed tagline mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_escaped.xml deleted file mode 100644 index 2a28f0b49..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_mode_escaped.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="text/html" mode="escaped">Example <b>Atom</b></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_type.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_content_type.xml deleted file mode 100644 index 8d7c831aa..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline content type defaults to 'text/plain' -Expect: not bozo and feed['tagline_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline>Example Atom</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_content_type_text_plain.xml deleted file mode 100644 index a63a3ca78..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_type_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline type='text/plain' -Expect: not bozo and feed['tagline_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="text/plain">Example Atom</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_value.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_content_value.xml deleted file mode 100644 index 24bc7ae77..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline content value -Expect: not bozo and feed['tagline_detail']['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline>Example Atom</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_escaped_markup.xml deleted file mode 100644 index 4530eabc8..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline escaped HTML -Expect: not bozo and feed['tagline'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="text/html" mode="escaped">Example <b>Atom</b></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup.xml deleted file mode 100644 index 6330c385d..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline inline XHTML -Expect: not bozo and feed['tagline'] == u'<div>Example <b>Atom</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup_2.xml deleted file mode 100644 index afb7ebee6..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline inline XHTML with escaped markup -Expect: not bozo and feed['tagline'] == u'<div>History of the <blink> tag</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_naked_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_naked_markup.xml deleted file mode 100644 index 4e213464d..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_naked_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline with undeclared unqualified inline markup -Expect: not bozo and feed['tagline'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline>Example <b>Atom</b></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_tagline_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_tagline_text_plain.xml deleted file mode 100644 index 96d7d9cd2..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_tagline_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline with explicit type='text/plain' -Expect: not bozo and feed['tagline'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="text/plain">Example Atom</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title.xml b/lib/feedparser/tests/wellformed/atom/feed_title.xml deleted file mode 100644 index b59200cb7..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_title_base64.xml deleted file mode 100644 index f13b3c13c..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed title base64-encoded -Expect: not bozo and feed['title'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_base64_2.xml b/lib/feedparser/tests/wellformed/atom/feed_title_base64_2.xml deleted file mode 100644 index a372b8396..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed title base64-encoded -Expect: not bozo and feed['title'] == u'<p>History of the <blink> tag</p>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title mode="base64"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_content_mode_base64.xml b/lib/feedparser/tests/wellformed/atom/feed_title_content_mode_base64.xml deleted file mode 100644 index ac9ff5942..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_content_mode_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed title mode=base64 -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title mode="base64"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_content_mode_escaped.xml b/lib/feedparser/tests/wellformed/atom/feed_title_content_mode_escaped.xml deleted file mode 100644 index 3ff055a1d..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_content_mode_escaped.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title mode=escaped -Expect: 1 ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="text/html" mode="escaped">Example <b>Atom</b></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_content_type.xml b/lib/feedparser/tests/wellformed/atom/feed_title_content_type.xml deleted file mode 100644 index c20750317..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content type defaults to 'text/plain' -Expect: not bozo and feed['title_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_content_type_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_title_content_type_text_plain.xml deleted file mode 100644 index 8bf0060bd..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_content_type_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title type='text/plain' -Expect: not bozo and feed['title_detail']['type'] == u'text/plain' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="text/plain">Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_content_value.xml b/lib/feedparser/tests/wellformed/atom/feed_title_content_value.xml deleted file mode 100644 index ac5cbdbe8..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content value -Expect: not bozo and feed['title_detail']['value'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_title_escaped_markup.xml deleted file mode 100644 index b2daea2b0..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title escaped HTML -Expect: not bozo and feed['title'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="text/html" mode="escaped">Example <b>Atom</b></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_inline_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_title_inline_markup.xml deleted file mode 100644 index 0b675936b..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title inline XHTML -Expect: not bozo and feed['title'] == u'<div>Example <b>Atom</b></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom/feed_title_inline_markup_2.xml deleted file mode 100644 index e687f4029..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title inline XHTML with escaped markup -Expect: not bozo and feed['title'] == u'<div>History of the <blink> tag</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_naked_markup.xml b/lib/feedparser/tests/wellformed/atom/feed_title_naked_markup.xml deleted file mode 100644 index fa4c30561..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_naked_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title with undeclared unqualified inline markup -Expect: not bozo and feed['title'] == u'Example <b>Atom</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title>Example <b>Atom</b></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_title_text_plain.xml b/lib/feedparser/tests/wellformed/atom/feed_title_text_plain.xml deleted file mode 100644 index 3c94b7eef..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_title_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title with explicit type='text/plain' -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="text/plain">Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/feed_updated_parsed.xml b/lib/feedparser/tests/wellformed/atom/feed_updated_parsed.xml deleted file mode 100644 index a5ddfec1a..000000000 --- a/lib/feedparser/tests/wellformed/atom/feed_updated_parsed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed updated parsed -Expect: not bozo and feed['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<updated>2003-12-31T10:14:55Z</updated> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/media_player1.xml b/lib/feedparser/tests/wellformed/atom/media_player1.xml deleted file mode 100644 index c95a7b2c6..000000000 --- a/lib/feedparser/tests/wellformed/atom/media_player1.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: media player content -Expect: not bozo and entries[0]['media_player']['url'] == u'http://www.example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <media:player xmlns:media="http://search.yahoo.com/mrss/" url="http://www.example.com/" /> - <title>Example Atom</title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/media_thumbnail.xml b/lib/feedparser/tests/wellformed/atom/media_thumbnail.xml deleted file mode 100644 index 6288bfa57..000000000 --- a/lib/feedparser/tests/wellformed/atom/media_thumbnail.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: media_thumbnail -Expect: entries[0]['media_thumbnail'][0]['url'] == u'http://example.com/thumbnail.jpg' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" - url="http://example.com/thumbnail.jpg" height="72" width="72" /> - <title>Example Atom</title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom/relative_uri.xml b/lib/feedparser/tests/wellformed/atom/relative_uri.xml deleted file mode 100644 index 0de466ddc..000000000 --- a/lib/feedparser/tests/wellformed/atom/relative_uri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains relative URI resolved relative to xml:base -Expect: not bozo and feed['title_detail']['value'] == u'<div>Example <a href="http://example.com/test/test.html">test</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/relative_uri_inherit.xml b/lib/feedparser/tests/wellformed/atom/relative_uri_inherit.xml deleted file mode 100644 index a2195de9c..000000000 --- a/lib/feedparser/tests/wellformed/atom/relative_uri_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains relative URI resolved relative to xml:base inherited from parent element -Expect: not bozo and feed['title_detail']['value'] == u'<div>Example <a href="http://example.com/test/test.html">test</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom/relative_uri_inherit_2.xml b/lib/feedparser/tests/wellformed/atom/relative_uri_inherit_2.xml deleted file mode 100644 index 8ce7778a6..000000000 --- a/lib/feedparser/tests/wellformed/atom/relative_uri_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains relative URI resolved relative to xml:base overriding parent xml:base -Expect: not bozo and feed['title_detail']['value'] == u'<div>Example <a href="http://example.com/test/test.html">test</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/ampersand_in_attr.xml b/lib/feedparser/tests/wellformed/atom10/ampersand_in_attr.xml deleted file mode 100644 index 2dcec4289..000000000 --- a/lib/feedparser/tests/wellformed/atom10/ampersand_in_attr.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains URI with an ampersand -Expect: not bozo and feed['title_detail']['value'] == u'Example <a href="http://example.com/?a=1&b=2">test</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="http://example.com/?a=1&b=2">test</a></div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/atom10_namespace.xml b/lib/feedparser/tests/wellformed/atom10/atom10_namespace.xml deleted file mode 100644 index c12785300..000000000 --- a/lib/feedparser/tests/wellformed/atom10/atom10_namespace.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: Atom namespace (official) -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/atom10_version.xml b/lib/feedparser/tests/wellformed/atom10/atom10_version.xml deleted file mode 100644 index e27c91110..000000000 --- a/lib/feedparser/tests/wellformed/atom10/atom10_version.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: Atom 1.0 version from namespace -Expect: not bozo and version == u'atom10' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_author_email.xml b/lib/feedparser/tests/wellformed/atom10/entry_author_email.xml deleted file mode 100644 index 45d71fbf1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_author_email.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author email -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_author_map_author.xml b/lib/feedparser/tests/wellformed/atom10/entry_author_map_author.xml deleted file mode 100644 index 84a0776a2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_author_map_author.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author name + email maps to author -Expect: not bozo and entries[0]['author'] == u'Example author (me@example.com)' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_author_map_author_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_author_map_author_2.xml deleted file mode 100644 index 687d3d036..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_author_map_author_2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: entry author name maps to author if no email present -Expect: not bozo and entries[0]['author'] == u'Example author' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <author> - <name>Example author</name> - <uri>http://example.com/</uri> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_author_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_author_name.xml deleted file mode 100644 index fb2157d62..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_author_name.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author name -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example author' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_author_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_author_uri.xml deleted file mode 100644 index 86e1e8568..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_author_uri.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author uri -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_author_url.xml b/lib/feedparser/tests/wellformed/atom10/entry_author_url.xml deleted file mode 100644 index dae246ae4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_author_url.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry author url -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_authors_email.xml b/lib/feedparser/tests/wellformed/atom10/entry_authors_email.xml deleted file mode 100644 index d5a6369a7..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_authors_email.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author emails -Expect: not bozo and (entries[0]['authors'][0]['email'] == u'one@one.com') and (entries[0]['authors'][1]['email'] == u'two@two.com') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <author> - <email>one@one.com</email> - </author> - <author> - <email>two@two.com</email> - </author> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_authors_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_authors_name.xml deleted file mode 100644 index a0e74ae4d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_authors_name.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author names -Expect: not bozo and (entries[0]['authors'][0]['name'] == u'one') and (entries[0]['authors'][1]['name'] == u'two') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <author> - <name>one</name> - </author> - <author> - <name>two</name> - </author> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_authors_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_authors_uri.xml deleted file mode 100644 index 68dbc03b3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_authors_uri.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author uris -Expect: not bozo and (entries[0]['authors'][0]['url'] == u'http://one.com/') and (entries[0]['authors'][1]['url'] == u'http://two.com/') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <author> - <uri>http://one.com/</uri> - </author> - <author> - <uri>http://two.com/</uri> - </author> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_authors_url.xml b/lib/feedparser/tests/wellformed/atom10/entry_authors_url.xml deleted file mode 100644 index 09a1f843f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_authors_url.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author urls -Expect: not bozo and (entries[0]['authors'][0]['url'] == u'http://one.com/') and (entries[0]['authors'][1]['url'] == u'http://two.com/') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <author> - <url>http://one.com/</url> - </author> - <author> - <url>http://two.com/</url> - </author> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_category_label.xml b/lib/feedparser/tests/wellformed/atom10/entry_category_label.xml deleted file mode 100644 index 7691de379..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_category_label.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry category label -Expect: not bozo and entries[0]['tags'][0]['label'] == u'Atom 1.0 tests' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <category term="atom10" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_category_scheme.xml b/lib/feedparser/tests/wellformed/atom10/entry_category_scheme.xml deleted file mode 100644 index a88defc21..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_category_scheme.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry category scheme -Expect: not bozo and entries[0]['tags'][0]['scheme'] == u'http://feedparser.org/tests/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <category term="atom10" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_category_term.xml b/lib/feedparser/tests/wellformed/atom10/entry_category_term.xml deleted file mode 100644 index f0755b39f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_category_term.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry category term -Expect: not bozo and entries[0]['tags'][0]['term'] == u'atom10' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <category term="atom10" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_category_term_non_ascii.xml b/lib/feedparser/tests/wellformed/atom10/entry_category_term_non_ascii.xml deleted file mode 100644 index a2529b5f7..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_category_term_non_ascii.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry category term -Expect: not bozo and entries[0]['tags'][0]['term'] == u'Freir\xe4ume' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <category term="Freiräume" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_application_xml.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_application_xml.xml deleted file mode 100644 index 9506726e6..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_application_xml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content inline XML -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_base64.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_base64.xml deleted file mode 100644 index 09ff3b0ca..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry content base64-encoded -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_base64_2.xml deleted file mode 100644 index 84de7fe1a..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_base64_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry content base64-encoded -Expect: not bozo and entries[0]['content'][0]['value'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_div_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_div_escaped_markup.xml deleted file mode 100644 index f1f0a974c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_div_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: typepad style entry content escaped HTML with div -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="html"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_escaped_markup.xml deleted file mode 100644 index 44a6e0a27..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content escaped HTML -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="html">Example <b>Atom</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup.xml deleted file mode 100644 index 1dc354e63..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content inline XHTML -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup_2.xml deleted file mode 100644 index e47e68f84..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_inline_markup_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content inline XHTML with escaped markup -Expect: not bozo and entries[0]['content'][0]['value'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_src.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_src.xml deleted file mode 100644 index 0b808a8de..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_src.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content src -Expect: not bozo and entries[0]['content'][0]['src'] == u'http://example.com/movie.mp4' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content src="http://example.com/movie.mp4"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_text_plain.xml deleted file mode 100644 index 402d6dd93..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content with explicit type='text' -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="text">Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_text_plain_brackets.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_text_plain_brackets.xml deleted file mode 100644 index b6f7401cc..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_text_plain_brackets.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content with explicit type='text' contains brackets that are not markup -Expect: not bozo and entries[0]['content'][0]['value'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="text">History of the <blink> tag</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_type.xml deleted file mode 100644 index c2d3adb84..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content content type defaults to 'text/plain' -Expect: not bozo and entries[0]['content'][0]['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content>Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_type_text.xml deleted file mode 100644 index e6a5e98b9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_type_text.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content type='text' -Expect: not bozo and entries[0]['content'][0]['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content type="text">Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_content_value.xml deleted file mode 100644 index 9fd290b40..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content content value -Expect: not bozo and entries[0]['content'][0]['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <content>Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_contributor_email.xml b/lib/feedparser/tests/wellformed/atom10/entry_contributor_email.xml deleted file mode 100644 index ab60eeff2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_contributor_email.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor email -Expect: not bozo and entries[0]['contributors'][0]['email'] == u'me@example.com' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_contributor_multiple.xml b/lib/feedparser/tests/wellformed/atom10/entry_contributor_multiple.xml deleted file mode 100644 index f132f41b4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_contributor_multiple.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -Description: multiple entry contributors -Expect: not bozo and entries[0]['contributors'][0] == {'name': u'Contributor 1', 'email': u'me@example.com', 'href': u'http://example.com/'} and entries[0]['contributors'][1] == {'name': u'Contributor 2', 'email': u'you@example.com', 'href': 'http://two.example.com/'} ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <contributor> - <name>Contributor 1</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> - <contributor> - <name>Contributor 2</name> - <email>you@example.com</email> - <uri>http://two.example.com/</uri> - </contributor> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_contributor_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_contributor_name.xml deleted file mode 100644 index 3ac96e823..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_contributor_name.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor name -Expect: not bozo and entries[0]['contributors'][0]['name'] == u'Example contributor' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_contributor_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_contributor_uri.xml deleted file mode 100644 index 4a176b6d5..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_contributor_uri.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor uri -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_contributor_url.xml b/lib/feedparser/tests/wellformed/atom10/entry_contributor_url.xml deleted file mode 100644 index dcc87f9be..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_contributor_url.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry contributor url -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id.xml b/lib/feedparser/tests/wellformed/atom10/entry_id.xml deleted file mode 100644 index b06db1b54..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id -Expect: not bozo and entries[0]['id'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://example.com/</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_map_guid.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_map_guid.xml deleted file mode 100644 index aa4b2befe..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_map_guid.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id maps to guid -Expect: not bozo and entries[0]['guid'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://example.com/</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_1.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_1.xml deleted file mode 100644 index ea4f6e5c1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_1.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'http://www.example.org/thing' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://www.example.org/thing</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_2.xml deleted file mode 100644 index 8b4df51c1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'http://www.example.org/Thing' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://www.example.org/Thing</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_3.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_3.xml deleted file mode 100644 index e7f613eab..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_3.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'http://www.EXAMPLE.org/thing' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://www.EXAMPLE.org/thing</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_4.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_4.xml deleted file mode 100644 index 323293663..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_4.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'HTTP://www.example.org/thing' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>HTTP://www.example.org/thing</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_5.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_5.xml deleted file mode 100644 index 0c08db8d4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_5.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'http://www.example.com/~bob' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://www.example.com/~bob</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_6.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_6.xml deleted file mode 100644 index 45db81fa4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_6.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'http://www.example.com/%7ebob' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://www.example.com/%7ebob</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_7.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_7.xml deleted file mode 100644 index 25b6f7c77..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_no_normalization_7.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id not normalized (see Atom 1.0 section 4.2.6.1) -Expect: not bozo and entries[0]['id'] == u'http://www.example.com/%7Ebob' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>http://www.example.com/%7Ebob</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_id_with_attributes.xml b/lib/feedparser/tests/wellformed/atom10/entry_id_with_attributes.xml deleted file mode 100644 index 0829da911..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_id_with_attributes.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id retrieved when element contains attributes -Expect: not bozo and entries[0]['id'] == u'right' ---> -<feed xmlns:bogus="http://dom.test/ns"> - <entry> - <id bogus:attr="wrong">right</id> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link.xml deleted file mode 100644 index a507ee3e6..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href maps to link if rel="alternate" and type="text/html" -Expect: not bozo and entries[0]['link'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_2.xml deleted file mode 100644 index f46e8b619..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href maps to link if rel="alternate" and type="application/xhtml+xml" -Expect: not bozo and entries[0]['link'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_3.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_3.xml deleted file mode 100644 index ec49b5604..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_alternate_map_link_3.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry link href maps to link if rel="alternate", even if type is not present -Expect: not bozo and entries[0]['link'] == u'http://www.example.com/alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" href="http://www.example.com/alternate"></link> - <link rel="related" type="text/html" href="http://www.example.com/related"></link> - <link rel="via" type="text/html" href="http://www.example.com/via"></link> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_href.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_href.xml deleted file mode 100644 index f69da53bb..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_href.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href -Expect: not bozo and entries[0]['links'][0]['href'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_hreflang.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_hreflang.xml deleted file mode 100644 index 15b23a0e9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_hreflang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link hreflang -Expect: not bozo and entries[0]['links'][0]['hreflang'] == u'en' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/" hreflang="en"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_length.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_length.xml deleted file mode 100644 index c41378ee0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_length.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link length -Expect: not bozo and entries[0]['links'][0]['length'] == u'42301' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="enclosure" type="video/mpeg4" href="http://www.example.com/movie.mp4" length="42301"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_multiple.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_multiple.xml deleted file mode 100644 index c50f93eeb..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_multiple.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry multiple links -Expect: not bozo and entries[0]['links'][0] == {'rel': u'alternate', 'type': u'application/xhtml+xml', 'href': u'http://www.example.com/'} and entries[0]['links'][1] == {'rel': u'service.post', 'type': u'application/atom+xml', 'href': 'http://www.example.com/post'} ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> - <link rel="service.post" type="application/atom+xml" href="http://www.example.com/post"/> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_no_rel.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_no_rel.xml deleted file mode 100644 index d18a8115c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_no_rel.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel defaults to 'alternate' -Expect: not bozo and entries[0]['links'][0]['rel'] == u'alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel.xml deleted file mode 100644 index a056a8a7c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel -Expect: not bozo and entries[0]['links'][0]['rel'] == u'alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure.xml deleted file mode 100644 index 26f4d7f79..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='enclosure' -Expect: not bozo and entries[0]['links'][0]['rel'] == u'enclosure' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="enclosure" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_length.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_length.xml deleted file mode 100644 index 8798fa0e9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_length.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='enclosure' -Expect: not bozo and entries[0]['enclosures'][0]['length'] == u'42301' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="enclosure" type="video/mpeg4" href="http://www.example.com/movie.mp4" length="42301"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_type.xml deleted file mode 100644 index 73e8e16e8..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='enclosure' -Expect: not bozo and entries[0]['enclosures'][0]['type'] == u'video/mpeg4' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="enclosure" type="video/mpeg4" href="http://www.example.com/movie.mp4"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_url.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_url.xml deleted file mode 100644 index 4c085d6ba..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_enclosure_map_enclosure_url.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='enclosure' -Expect: not bozo and entries[0]['enclosures'][0]['href'] == u'http://www.example.com/movie.mp4' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="enclosure" type="video/mpeg4" href="http://www.example.com/movie.mp4"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_license.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_license.xml deleted file mode 100644 index 2438a177c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_license.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='enclosure' -Expect: not bozo and entries[0]['links'][0]['rel'] == u'license' and entries[0]['links'][0]['href'] == u'http://www.creativecommons.org/licenses/by-nc/1.0' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="license" href="http://www.creativecommons.org/licenses/by-nc/1.0"/> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_other.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_other.xml deleted file mode 100644 index b4117738f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_other.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel as URI -Expect: not bozo and entries[0]['links'][0]['rel'] == u'http://feedparser.org/rel/test' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="http://feedparser.org/rel/test" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_related.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_related.xml deleted file mode 100644 index 566140506..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_related.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='related' -Expect: not bozo and entries[0]['links'][0]['rel'] == u'related' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="related" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_self.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_self.xml deleted file mode 100644 index cf0570cb0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_self.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='self' -Expect: not bozo and entries[0]['links'][0]['rel'] == u'self' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="self" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_via.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_rel_via.xml deleted file mode 100644 index e60edd954..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_rel_via.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link rel='via' -Expect: not bozo and entries[0]['links'][0]['rel'] == u'via' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="via" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_title.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_title.xml deleted file mode 100644 index 590c9b3b9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link title -Expect: not bozo and entries[0]['links'][0]['title'] == u'Example title' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_link_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_link_type.xml deleted file mode 100644 index 04ec5f7d2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_link_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link type -Expect: not bozo and entries[0]['links'][0]['type'] == u'text/html' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights.xml deleted file mode 100644 index c86d9b940..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights -Expect: not bozo and entries[0]['rights'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights>Example Atom</rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_content_value.xml deleted file mode 100644 index 4f8276538..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights content value -Expect: not bozo and entries[0]['rights_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights>Example Atom</rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_escaped_markup.xml deleted file mode 100644 index 94dabcb7d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights escaped HTML -Expect: not bozo and entries[0]['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights type="html">Example <b>Atom</b></rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup.xml deleted file mode 100644 index 95d20ace9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights inline XHTML -Expect: not bozo and entries[0]['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></rights> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup_2.xml deleted file mode 100644 index 276167311..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_inline_markup_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights inline XHTML with escaped markup -Expect: not bozo and entries[0]['rights'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></rights> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain.xml deleted file mode 100644 index bc887b305..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights with explicit type='text' -Expect: not bozo and entries[0]['rights'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights type="text">Example Atom</rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain_brackets.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain_brackets.xml deleted file mode 100644 index 3516f9617..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_text_plain_brackets.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights with explicit type='text' contains brackets that are not markup -Expect: not bozo and entries[0]['rights'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights type="text">History of the <blink> tag</rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_type_default.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_type_default.xml deleted file mode 100644 index 31b400197..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_type_default.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights content type defaults to 'text/plain' -Expect: not bozo and entries[0]['rights_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights>Example Atom</rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_rights_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_rights_type_text.xml deleted file mode 100644 index c1b82cef7..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_rights_type_text.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry rights type='text' -Expect: not bozo and entries[0]['rights_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <rights type="text">Example Atom</rights> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_author_email.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_author_email.xml deleted file mode 100644 index fffb31979..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_author_email.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source author email -Expect: not bozo and entries[0]['source']['author_detail']['email'] == u'me@example.com' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author.xml deleted file mode 100644 index 4db9605e9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source author name + email maps to author -Expect: not bozo and entries[0]['source']['author'] == u'Example author (me@example.com)' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author_2.xml deleted file mode 100644 index 6d2c00df9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_author_map_author_2.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -Description: entry source author name maps to author if no email present -Expect: not bozo and entries[0]['source']['author'] == u'Example author' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <author> - <name>Example author</name> - <uri>http://example.com/</uri> - </author> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_author_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_author_name.xml deleted file mode 100644 index d4d5c74f9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_author_name.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source author name -Expect: not bozo and entries[0]['source']['author_detail']['name'] == u'Example author' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_author_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_author_uri.xml deleted file mode 100644 index df971db85..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_author_uri.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source author uri -Expect: not bozo and entries[0]['source']['author_detail']['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_email.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_authors_email.xml deleted file mode 100644 index b8125eb10..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_email.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author emails -Expect: not bozo and (entries[0]['source']['authors'][0]['email'] == u'one@one.com') and (entries[0]['source']['authors'][1]['email'] == u'two@two.com') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <source> - <author> - <email>one@one.com</email> - </author> - <author> - <email>two@two.com</email> - </author> - </source> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_authors_name.xml deleted file mode 100644 index 1c846064b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_name.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author names -Expect: not bozo and (entries[0]['source']['authors'][0]['name'] == u'one') and (entries[0]['source']['authors'][1]['name'] == u'two') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <source> - <author> - <name>one</name> - </author> - <author> - <name>two</name> - </author> - </source> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_authors_uri.xml deleted file mode 100644 index 9901ab75d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_uri.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author uris -Expect: not bozo and (entries[0]['source']['authors'][0]['url'] == u'http://one.com/') and (entries[0]['source']['authors'][1]['url'] == u'http://two.com/') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <source> - <author> - <uri>http://one.com/</uri> - </author> - <author> - <uri>http://two.com/</uri> - </author> - </source> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_url.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_authors_url.xml deleted file mode 100644 index c48af3437..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_authors_url.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: entry contains multiple author urls -Expect: not bozo and (entries[0]['source']['authors'][0]['url'] == u'http://one.com/') and (entries[0]['source']['authors'][1]['url'] == u'http://two.com/') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <source> - <author> - <url>http://one.com/</url> - </author> - <author> - <url>http://two.com/</url> - </author> - </source> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_category_label.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_category_label.xml deleted file mode 100644 index 037b357af..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_category_label.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source category label -Expect: not bozo and entries[0]['source']['tags'][0]['label'] == u'Atom 1.0 tests' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <category term="atom10" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_category_scheme.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_category_scheme.xml deleted file mode 100644 index a93edaaba..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_category_scheme.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source category scheme -Expect: not bozo and entries[0]['source']['tags'][0]['scheme'] == u'http://feedparser.org/tests/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <category term="atom10" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_category_term.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_category_term.xml deleted file mode 100644 index d75748d93..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_category_term.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source category term -Expect: not bozo and entries[0]['source']['tags'][0]['term'] == u'atom10' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <category term="atom10" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_category_term_non_ascii.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_category_term_non_ascii.xml deleted file mode 100644 index 5b1bd1446..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_category_term_non_ascii.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source category term -Expect: not bozo and entries[0]['source']['tags'][0]['term'] == u'Freir\xe4ume' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <category term="Freiräume" scheme="http://feedparser.org/tests/" label="Atom 1.0 tests"/> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_email.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_email.xml deleted file mode 100644 index 8662a9ac5..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_email.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source contributor email -Expect: not bozo and entries[0]['source']['contributors'][0]['email'] == u'me@example.com' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_multiple.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_multiple.xml deleted file mode 100644 index 4dd68e37d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_multiple.xml +++ /dev/null @@ -1,20 +0,0 @@ -<!-- -Description: multiple entry source contributors -Expect: not bozo and entries[0]['source']['contributors'][0] == {'name': u'Contributor 1', 'email': u'me@example.com', 'href': u'http://example.com/'} and entries[0]['source']['contributors'][1] == {'name': u'Contributor 2', 'email': u'you@example.com', 'href': 'http://two.example.com/'} ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <contributor> - <name>Contributor 1</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> - <contributor> - <name>Contributor 2</name> - <email>you@example.com</email> - <uri>http://two.example.com/</uri> - </contributor> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_name.xml deleted file mode 100644 index 6455366e8..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_name.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source contributor name -Expect: not bozo and entries[0]['source']['contributors'][0]['name'] == u'Example contributor' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_uri.xml deleted file mode 100644 index cedf60f8e..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_contributor_uri.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: entry source contributor uri -Expect: not bozo and entries[0]['source']['contributors'][0]['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_generator.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_generator.xml deleted file mode 100644 index 6c4605bf1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_generator.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source generator -Expect: not bozo and entries[0]['source']['generator'] == u'Example generator' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_generator_name.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_generator_name.xml deleted file mode 100644 index be328aafb..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_generator_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source generator name -Expect: not bozo and entries[0]['source']['generator_detail']['name'] == u'Example generator' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_generator_uri.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_generator_uri.xml deleted file mode 100644 index ec5696a6d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_generator_uri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source generator uri -Expect: not bozo and entries[0]['source']['generator_detail']['href'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_generator_version.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_generator_version.xml deleted file mode 100644 index cfbe01d0c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_generator_version.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source generator version -Expect: not bozo and entries[0]['source']['generator_detail']['version'] == u'2.65' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_icon.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_icon.xml deleted file mode 100644 index 1b40b28f3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_icon.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source icon -Expect: not bozo and entries[0]['source']['icon'] == u'http://example.com/favicon.ico' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <icon>http://example.com/favicon.ico</icon> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_id.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_id.xml deleted file mode 100644 index 56fa81917..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_id.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source id -Expect: not bozo and entries[0]['source']['id'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <id>http://example.com/</id> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link.xml deleted file mode 100644 index 9982b6b5e..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link href maps to link if rel="alternate" and type="text/html" -Expect: not bozo and entries[0]['source']['link'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link_2.xml deleted file mode 100644 index 140e749cd..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_alternate_map_link_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link href maps to link if rel="alternate" and type="application/xhtml+xml" -Expect: not bozo and entries[0]['source']['link'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_href.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_href.xml deleted file mode 100644 index 5e2bccf41..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_href.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link href -Expect: not bozo and entries[0]['source']['links'][0]['href'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_hreflang.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_hreflang.xml deleted file mode 100644 index 973a28df1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_hreflang.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link hreflang -Expect: not bozo and entries[0]['source']['links'][0]['hreflang'] == u'en' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/" hreflang="en"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_length.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_length.xml deleted file mode 100644 index 5fd2f8596..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_length.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link length -Expect: not bozo and entries[0]['source']['links'][0]['length'] == u'42301' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="enclosure" type="video/mpeg4" href="http://www.example.com/movie.mp4" length="42301"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_multiple.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_multiple.xml deleted file mode 100644 index a96562426..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_multiple.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: entry source multiple links -Expect: not bozo and entries[0]['source']['links'][0] == {'rel': u'alternate', 'type': u'application/xhtml+xml', 'href': u'http://www.example.com/'} and entries[0]['source']['links'][1] == {'rel': u'service.post', 'type': u'application/atom+xml', 'href': 'http://www.example.com/post'} ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> - <link rel="service.post" type="application/atom+xml" href="http://www.example.com/post"/> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_no_rel.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_no_rel.xml deleted file mode 100644 index ee9a6ea77..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_no_rel.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link rel defaults to 'alternate' -Expect: not bozo and entries[0]['source']['links'][0]['rel'] == u'alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel.xml deleted file mode 100644 index 5b1a8cdd2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link rel -Expect: not bozo and entries[0]['source']['links'][0]['rel'] == u'alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_other.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_other.xml deleted file mode 100644 index e24399f30..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_other.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link rel as URI -Expect: not bozo and entries[0]['source']['links'][0]['rel'] == u'http://feedparser.org/rel/test' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="http://feedparser.org/rel/test" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_related.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_related.xml deleted file mode 100644 index 5eb719768..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_related.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entries sourcelink rel='related' -Expect: not bozo and entries[0]['source']['links'][0]['rel'] == u'related' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="related" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_self.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_self.xml deleted file mode 100644 index ee04ef85a..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_self.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link rel='self' -Expect: not bozo and entries[0]['source']['links'][0]['rel'] == u'self' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="self" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_via.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_via.xml deleted file mode 100644 index 15b9bbfb7..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_rel_via.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link rel='via' -Expect: not bozo and entries[0]['source']['links'][0]['rel'] == u'via' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="via" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_title.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_title.xml deleted file mode 100644 index 1c8ff561d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_title.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link title -Expect: not bozo and entries[0]['source']['links'][0]['title'] == u'Example title' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_link_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_link_type.xml deleted file mode 100644 index d77060bb3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_link_type.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source link type -Expect: not bozo and entries[0]['source']['links'][0]['type'] == u'text/html' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_logo.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_logo.xml deleted file mode 100644 index 2b43b39c3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_logo.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source logo -Expect: not bozo and entries[0]['source']['logo'] == u'http://example.com/logo.jpg' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <logo>http://example.com/logo.jpg</logo> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights.xml deleted file mode 100644 index d8d6ede84..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights -Expect: not bozo and entries[0]['source']['rights'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights>Example Atom</rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64.xml deleted file mode 100644 index a101d3f1a..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry source rights base64-encoded -Expect: not bozo and entries[0]['source']['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64_2.xml deleted file mode 100644 index f0a5c1de9..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_base64_2.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry source rights base64-encoded -Expect: not bozo and entries[0]['source']['rights'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> -<rights type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type.xml deleted file mode 100644 index acf70585f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights content type defaults to 'text/plain' -Expect: not bozo and entries[0]['source']['rights_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights>Example Atom</rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type_text.xml deleted file mode 100644 index 5bd7d1316..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_type_text.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights type='text' -Expect: not bozo and entries[0]['source']['rights_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights type="text">Example Atom</rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_value.xml deleted file mode 100644 index 7a47e880d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_content_value.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights content value -Expect: not bozo and entries[0]['source']['rights_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights>Example Atom</rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_escaped_markup.xml deleted file mode 100644 index 4501ae592..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_escaped_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights escaped HTML -Expect: not bozo and entries[0]['source']['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights type="html">Example <b>Atom</b></rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup.xml deleted file mode 100644 index 1c264fb55..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights inline XHTML -Expect: not bozo and entries[0]['source']['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></rights> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup_2.xml deleted file mode 100644 index 9467b79b8..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_inline_markup_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights inline XHTML with escaped markup -Expect: not bozo and entries[0]['source']['rights'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></rights> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_rights_text_plain.xml deleted file mode 100644 index f5bc9d36b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_rights_text_plain.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source rights with explicit type='text' -Expect: not bozo and entries[0]['source']['rights'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <rights type="text">Example Atom</rights> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subittle_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subittle_content_type_text.xml deleted file mode 100644 index c4dda8320..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subittle_content_type_text.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle type='text' -Expect: not bozo and entries[0]['source']['subtitle_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle type="text">Example Atom</subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle.xml deleted file mode 100644 index 828129b03..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle -Expect: not bozo and entries[0]['source']['subtitle'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle>Example Atom</subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64.xml deleted file mode 100644 index 5821b8cd6..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry source subtitle base64-encoded -Expect: not bozo and entries[0]['source']['subtitle'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64_2.xml deleted file mode 100644 index 10fea62ba..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_base64_2.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry source subtitle base64-encoded -Expect: not bozo and entries[0]['source']['subtitle'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> -<subtitle type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_type.xml deleted file mode 100644 index b92408ede..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_type.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle content type defaults to 'text/plain' -Expect: not bozo and entries[0]['source']['subtitle_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle>Example Atom</subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_value.xml deleted file mode 100644 index 5a8d120eb..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_content_value.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle content value -Expect: not bozo and entries[0]['source']['subtitle_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle>Example Atom</subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_escaped_markup.xml deleted file mode 100644 index 4b7cf90c2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_escaped_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle escaped HTML -Expect: not bozo and entries[0]['source']['subtitle'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle type="html">Example <b>Atom</b></subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup.xml deleted file mode 100644 index a82035be0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle inline XHTML -Expect: not bozo and entries[0]['source']['subtitle'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></subtitle> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup_2.xml deleted file mode 100644 index 10df20c06..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_inline_markup_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle inline XHTML with escaped markup -Expect: not bozo and entries[0]['source']['subtitle'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></subtitle> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_text_plain.xml deleted file mode 100644 index e59944801..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_subtitle_text_plain.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source subtitle with explicit type='text' -Expect: not bozo and entries[0]['source']['subtitle'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <subtitle type="text">Example Atom</subtitle> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title.xml deleted file mode 100644 index f76409796..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title -Expect: not bozo and entries[0]['source']['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title>Example Atom</title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_base64.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_base64.xml deleted file mode 100644 index 32727421c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_base64.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry source title base64-encoded -Expect: not bozo and entries[0]['source']['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_base64_2.xml deleted file mode 100644 index 1687b7cb8..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_base64_2.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: entry source title base64-encoded -Expect: not bozo and entries[0]['source']['title'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> -<title type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type.xml deleted file mode 100644 index de8c0d330..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title content type defaults to 'text/plain' -Expect: not bozo and entries[0]['source']['title_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title>Example Atom</title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type_text.xml deleted file mode 100644 index d14b9aff3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_type_text.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title type='text' -Expect: not bozo and entries[0]['source']['title_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title type="text">Example Atom</title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_value.xml deleted file mode 100644 index 149e9a5c4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_content_value.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title content value -Expect: not bozo and entries[0]['source']['title_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title>Example Atom</title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_escaped_markup.xml deleted file mode 100644 index 1d6068686..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_escaped_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title escaped HTML -Expect: not bozo and entries[0]['source']['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title type="html">Example <b>Atom</b></title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup.xml deleted file mode 100644 index e2060b56e..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title inline XHTML -Expect: not bozo and entries[0]['source']['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></title> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup_2.xml deleted file mode 100644 index bc1867188..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_inline_markup_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title inline XHTML with escaped markup -Expect: not bozo and entries[0]['source']['title'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></title> -</source> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_source_title_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_source_title_text_plain.xml deleted file mode 100644 index 34f190b91..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_source_title_text_plain.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry source title with explicit type='text' -Expect: not bozo and entries[0]['source']['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<source> - <title type="text">Example Atom</title> -</source> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary.xml deleted file mode 100644 index 65ed3d6d8..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary -Expect: not bozo and entries[0]['summary'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary>Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_base64.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_base64.xml deleted file mode 100644 index 8c34a40d1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry summary base64-encoded -Expect: not bozo and entries[0]['summary'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_base64_2.xml deleted file mode 100644 index 7cd162589..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_base64_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry summary base64-encoded -Expect: not bozo and entries[0]['summary'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<summary type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_content_value.xml deleted file mode 100644 index ecf48929e..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content value -Expect: not bozo and entries[0]['summary_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary>Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_escaped_markup.xml deleted file mode 100644 index c6236c1da..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary escaped HTML -Expect: not bozo and entries[0]['summary'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary type="html">Example <b>Atom</b></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup.xml deleted file mode 100644 index b174bf8ff..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary inline XHTML -Expect: not bozo and entries[0]['summary'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></summary> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup_2.xml deleted file mode 100644 index 45ecf4528..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_inline_markup_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary inline XHTML with escaped markup -Expect: not bozo and entries[0]['summary'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></summary> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_text_plain.xml deleted file mode 100644 index 2a1731f99..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary with explicit type='text' -Expect: not bozo and entries[0]['summary'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary type="text">Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_type_default.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_type_default.xml deleted file mode 100644 index ac7d18ef5..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_type_default.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content type defaults to 'text/plain' -Expect: not bozo and entries[0]['summary_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary>Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_summary_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_summary_type_text.xml deleted file mode 100644 index 70a0e23c0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_summary_type_text.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary type='text' -Expect: not bozo and entries[0]['summary_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <summary type="text">Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title.xml b/lib/feedparser/tests/wellformed/atom10/entry_title.xml deleted file mode 100644 index b3ed03f84..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title -Expect: not bozo and entries[0]['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title>Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_base64.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_base64.xml deleted file mode 100644 index 856b9b2c7..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_base64.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry title base64-encoded -Expect: not bozo and entries[0]['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_base64_2.xml deleted file mode 100644 index 30e2bd8e0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_base64_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry title base64-encoded -Expect: not bozo and entries[0]['title'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<title type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_content_value.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_content_value.xml deleted file mode 100644 index b33242057..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_content_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content value -Expect: not bozo and entries[0]['title_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title>Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_escaped_markup.xml deleted file mode 100644 index 71e6e6d5b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title escaped HTML -Expect: not bozo and entries[0]['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="html">Example <b>Atom</b></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup.xml deleted file mode 100644 index 650468b48..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title inline XHTML -Expect: not bozo and entries[0]['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup_2.xml deleted file mode 100644 index 6998214db..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_inline_markup_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title inline XHTML with escaped markup -Expect: not bozo and entries[0]['title'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_text_plain.xml deleted file mode 100644 index 7692469e2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_text_plain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title with explicit type='text' -Expect: not bozo and entries[0]['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="text">Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_text_plain_brackets.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_text_plain_brackets.xml deleted file mode 100644 index 5a6e72e07..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_text_plain_brackets.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title with explicit type='text' contains brackets that are not markup -Expect: not bozo and entries[0]['title'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="text">History of the <blink> tag</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_type_default.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_type_default.xml deleted file mode 100644 index 07fd597ff..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_type_default.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content type defaults to 'text/plain' -Expect: not bozo and entries[0]['title_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title>Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/entry_title_type_text.xml b/lib/feedparser/tests/wellformed/atom10/entry_title_type_text.xml deleted file mode 100644 index d7621b06d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/entry_title_type_text.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title type='text' -Expect: not bozo and entries[0]['title_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="text">Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_author_email.xml b/lib/feedparser/tests/wellformed/atom10/feed_author_email.xml deleted file mode 100644 index 78e898d2d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_author_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author email -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_author_map_author.xml b/lib/feedparser/tests/wellformed/atom10/feed_author_map_author.xml deleted file mode 100644 index a85c04367..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_author_map_author.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author name + email maps to author -Expect: not bozo and feed['author'] == u'Example author (me@example.com)' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_author_map_author_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_author_map_author_2.xml deleted file mode 100644 index af8eb617c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_author_map_author_2.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: feed author name maps to author if no email present -Expect: not bozo and feed['author'] == u'Example author' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>Example author</name> - <uri>http://example.com/</uri> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_author_name.xml b/lib/feedparser/tests/wellformed/atom10/feed_author_name.xml deleted file mode 100644 index d0aa2f71b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_author_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author name -Expect: not bozo and feed['author_detail']['name'] == u'Example author' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_author_uri.xml b/lib/feedparser/tests/wellformed/atom10/feed_author_uri.xml deleted file mode 100644 index b5e56f5d1..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_author_uri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author uri -Expect: not bozo and feed['author_detail']['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_author_url.xml b/lib/feedparser/tests/wellformed/atom10/feed_author_url.xml deleted file mode 100644 index 0b6e40f27..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_author_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed author url -Expect: not bozo and feed['author_detail']['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>Example author</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_authors_email.xml b/lib/feedparser/tests/wellformed/atom10/feed_authors_email.xml deleted file mode 100644 index 83591e131..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_authors_email.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: feed contains multiple author emails -Expect: not bozo and (feed['authors'][0]['email'] == u'one@one.com') and (feed['authors'][1]['email'] == u'two@two.com') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <email>one@one.com</email> - </author> - <author> - <email>two@two.com</email> - </author> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_authors_name.xml b/lib/feedparser/tests/wellformed/atom10/feed_authors_name.xml deleted file mode 100644 index 7b02089cb..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_authors_name.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: feed contains multiple author names -Expect: not bozo and (feed['authors'][0]['name'] == u'one') and (feed['authors'][1]['name'] == u'two') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <name>one</name> - </author> - <author> - <name>two</name> - </author> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_authors_uri.xml b/lib/feedparser/tests/wellformed/atom10/feed_authors_uri.xml deleted file mode 100644 index 794299677..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_authors_uri.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: feed contains multiple author uris -Expect: not bozo and (feed['authors'][0]['url'] == u'http://one.com/') and (feed['authors'][1]['url'] == u'http://two.com/') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <uri>http://one.com/</uri> - </author> - <author> - <uri>http://two.com/</uri> - </author> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_authors_url.xml b/lib/feedparser/tests/wellformed/atom10/feed_authors_url.xml deleted file mode 100644 index d7fcde820..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_authors_url.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: feed contains multiple author urls -Expect: not bozo and (feed['authors'][0]['url'] == u'http://one.com/') and (feed['authors'][1]['url'] == u'http://two.com/') ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <author> - <url>http://one.com/</url> - </author> - <author> - <url>http://two.com/</url> - </author> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_contributor_email.xml b/lib/feedparser/tests/wellformed/atom10/feed_contributor_email.xml deleted file mode 100644 index f93819174..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_contributor_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor email -Expect: not bozo and feed['contributors'][0]['email'] == u'me@example.com' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_contributor_multiple.xml b/lib/feedparser/tests/wellformed/atom10/feed_contributor_multiple.xml deleted file mode 100644 index 8095a7411..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_contributor_multiple.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: multiple feed contributors -Expect: not bozo and feed['contributors'][0] == {'name': u'Contributor 1', 'email': u'me@example.com', 'href': u'http://example.com/'} and feed['contributors'][1] == {'name': u'Contributor 2', 'email': u'you@example.com', 'href': 'http://two.example.com/'} ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <contributor> - <name>Contributor 1</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> - <contributor> - <name>Contributor 2</name> - <email>you@example.com</email> - <uri>http://two.example.com/</uri> - </contributor> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_contributor_name.xml b/lib/feedparser/tests/wellformed/atom10/feed_contributor_name.xml deleted file mode 100644 index 4d7d163bc..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_contributor_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor name -Expect: not bozo and feed['contributors'][0]['name'] == u'Example contributor' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_contributor_uri.xml b/lib/feedparser/tests/wellformed/atom10/feed_contributor_uri.xml deleted file mode 100644 index a8fc8626e..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_contributor_uri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor uri -Expect: not bozo and feed['contributors'][0]['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <uri>http://example.com/</uri> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_contributor_url.xml b/lib/feedparser/tests/wellformed/atom10/feed_contributor_url.xml deleted file mode 100644 index b6cc8da90..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_contributor_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: feed contributor url -Expect: not bozo and feed['contributors'][0]['url'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <contributor> - <name>Example contributor</name> - <email>me@example.com</email> - <url>http://example.com/</url> - </contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_generator.xml b/lib/feedparser/tests/wellformed/atom10/feed_generator.xml deleted file mode 100644 index 88c3abfb0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_generator.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator -Expect: not bozo and feed['generator'] == u'Example generator' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_generator_name.xml b/lib/feedparser/tests/wellformed/atom10/feed_generator_name.xml deleted file mode 100644 index fd89ce59d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_generator_name.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator name -Expect: not bozo and feed['generator_detail']['name'] == u'Example generator' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_generator_url.xml b/lib/feedparser/tests/wellformed/atom10/feed_generator_url.xml deleted file mode 100644 index a321577ec..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_generator_url.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator uri -Expect: not bozo and feed['generator_detail']['href'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_generator_version.xml b/lib/feedparser/tests/wellformed/atom10/feed_generator_version.xml deleted file mode 100644 index 0660672ce..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_generator_version.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator version -Expect: not bozo and feed['generator_detail']['version'] == u'2.65' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <generator uri="http://example.com/" version="2.65">Example generator</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_icon.xml b/lib/feedparser/tests/wellformed/atom10/feed_icon.xml deleted file mode 100644 index 498b4d07c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_icon.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed icon -Expect: not bozo and feed['icon'] == u'http://example.com/favicon.ico' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <icon>http://example.com/favicon.ico</icon> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_id.xml b/lib/feedparser/tests/wellformed/atom10/feed_id.xml deleted file mode 100644 index dae9b121b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_id.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed id -Expect: not bozo and feed['id'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <id>http://example.com/</id> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_id_map_guid.xml b/lib/feedparser/tests/wellformed/atom10/feed_id_map_guid.xml deleted file mode 100644 index 94fe01c81..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_id_map_guid.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed id -Expect: not bozo and feed['guid'] == u'http://example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <id>http://example.com/</id> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link.xml deleted file mode 100644 index e25189f0f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href maps to link if rel="alternate" and type="text/html" -Expect: not bozo and feed['link'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link_2.xml deleted file mode 100644 index 26f09699d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_alternate_map_link_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href maps to link if rel="alternate" and type="application/xhtml+xml" -Expect: not bozo and feed['link'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_href.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_href.xml deleted file mode 100644 index 6d8919fce..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_href.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href -Expect: not bozo and feed['links'][0]['href'] == u'http://www.example.com/' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_hreflang.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_hreflang.xml deleted file mode 100644 index ea0361295..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_hreflang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link hreflang -Expect: not bozo and feed['links'][0]['hreflang'] == u'en' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/" hreflang="en"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_length.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_length.xml deleted file mode 100644 index b9e04e95d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_length.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link length -Expect: not bozo and feed['links'][0]['length'] == u'42301' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="enclosure" type="video/mpeg4" href="http://www.example.com/movie.mp4" length="42301"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_multiple.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_multiple.xml deleted file mode 100644 index 8745e6ef4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_multiple.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed multiple links -Expect: not bozo and feed['links'][0] == {'rel': u'alternate', 'type': u'application/xhtml+xml', 'href': u'http://www.example.com/'} and feed['links'][1] == {'rel': u'service.post', 'type': u'application/atom+xml', 'href': 'http://www.example.com/post'} ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="application/xhtml+xml" href="http://www.example.com/"/> - <link rel="service.post" type="application/atom+xml" href="http://www.example.com/post"/> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_no_rel.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_no_rel.xml deleted file mode 100644 index 69af2b886..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_no_rel.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel defaults to 'alternate' -Expect: not bozo and feed['links'][0]['rel'] == u'alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_rel.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_rel.xml deleted file mode 100644 index eb935d8d5..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_rel.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel -Expect: not bozo and feed['links'][0]['rel'] == u'alternate' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_other.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_rel_other.xml deleted file mode 100644 index c721a447b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_other.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel as URI -Expect: not bozo and feed['links'][0]['rel'] == u'http://feedparser.org/rel/test' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="http://feedparser.org/rel/test" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_related.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_rel_related.xml deleted file mode 100644 index b19d09bb6..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_related.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel='related' -Expect: not bozo and feed['links'][0]['rel'] == u'related' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="related" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_self.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_rel_self.xml deleted file mode 100644 index 601402acc..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_self.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel='self' -Expect: not bozo and feed['links'][0]['rel'] == u'self' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="self" type="application/atom+xml" href="http://www.example.com/"/> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_self_default_type.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_rel_self_default_type.xml deleted file mode 100644 index 11a542e3f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_self_default_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel='self' default mimetype -Expect: not bozo and feed['links'][0]['type'] == u'application/atom+xml' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="self" href="http://www.example.com/"/> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_via.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_rel_via.xml deleted file mode 100644 index 12993fde2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_rel_via.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link rel='via' -Expect: not bozo and feed['links'][0]['rel'] == u'via' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="via" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_title.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_title.xml deleted file mode 100644 index 72cc9e922..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_title.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link title -Expect: not bozo and feed['links'][0]['title'] == u'Example title' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="text/html" title="Example title" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_link_type.xml b/lib/feedparser/tests/wellformed/atom10/feed_link_type.xml deleted file mode 100644 index 8bf83efbe..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_link_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link type -Expect: not bozo and feed['links'][0]['type'] == u'text/html' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" type="text/html" href="http://www.example.com/"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_logo.xml b/lib/feedparser/tests/wellformed/atom10/feed_logo.xml deleted file mode 100644 index 1dbf1a1d2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_logo.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed logo -Expect: not bozo and feed['logo'] == u'http://example.com/logo.jpg' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <logo>http://example.com/logo.jpg</logo> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights.xml deleted file mode 100644 index a44db6faf..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights -Expect: not bozo and feed['rights'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights>Example Atom</rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_base64.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_base64.xml deleted file mode 100644 index 956daca3e..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed rights base64-encoded -Expect: not bozo and feed['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_base64_2.xml deleted file mode 100644 index 76b1b2b7c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed rights base64-encoded -Expect: not bozo and feed['rights'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<rights type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_content_type.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_content_type.xml deleted file mode 100644 index ee44d5adf..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights content type defaults to 'text/plain' -Expect: not bozo and feed['rights_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights>Example Atom</rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_content_type_text.xml deleted file mode 100644 index 6aa0412aa..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_content_type_text.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights type='text' -Expect: not bozo and feed['rights_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights type="text">Example Atom</rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_content_value.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_content_value.xml deleted file mode 100644 index fb0780031..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights content value -Expect: not bozo and feed['rights_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights>Example Atom</rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_escaped_markup.xml deleted file mode 100644 index 8384d2998..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights escaped HTML -Expect: not bozo and feed['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights type="html">Example <b>Atom</b></rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup.xml deleted file mode 100644 index 080f880e3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights inline XHTML -Expect: not bozo and feed['rights'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></rights> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup_2.xml deleted file mode 100644 index d8b953fd2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights inline XHTML with escaped markup -Expect: not bozo and feed['rights'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></rights> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_rights_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/feed_rights_text_plain.xml deleted file mode 100644 index 54e7e612d..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_rights_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed rights with explicit type='text' -Expect: not bozo and feed['rights'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <rights type="text">Example Atom</rights> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle.xml deleted file mode 100644 index 8a07142c4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle -Expect: not bozo and feed['subtitle'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle>Example Atom</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64.xml deleted file mode 100644 index 8dd6a864f..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed subtitle base64-encoded -Expect: not bozo and feed['subtitle'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64_2.xml deleted file mode 100644 index d2ef0d6e7..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed subtitle base64-encoded -Expect: not bozo and feed['subtitle'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<subtitle type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type.xml deleted file mode 100644 index 2e3395140..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle content type defaults to 'text/plain' -Expect: not bozo and feed['subtitle_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle>Example Atom</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type_text.xml deleted file mode 100644 index ce2073666..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_type_text.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle type='text' -Expect: not bozo and feed['subtitle_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle type="text">Example Atom</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_value.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_value.xml deleted file mode 100644 index 309deafbe..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle content value -Expect: not bozo and feed['subtitle_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle>Example Atom</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_escaped_markup.xml deleted file mode 100644 index fc7a85b87..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle escaped HTML -Expect: not bozo and feed['subtitle'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle type="html">Example <b>Atom</b></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup.xml deleted file mode 100644 index 2742f68e5..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle inline XHTML -Expect: not bozo and feed['subtitle'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></subtitle> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup_2.xml deleted file mode 100644 index 4b36e24ab..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle inline XHTML with escaped markup -Expect: not bozo and feed['subtitle'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></subtitle> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/feed_subtitle_text_plain.xml deleted file mode 100644 index bf97397ab..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_subtitle_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle with explicit type='text' -Expect: not bozo and feed['subtitle'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <subtitle type="text">Example Atom</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title.xml b/lib/feedparser/tests/wellformed/atom10/feed_title.xml deleted file mode 100644 index 37a26ea51..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_base64.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_base64.xml deleted file mode 100644 index 5c07e7295..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_base64.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed title base64-encoded -Expect: not bozo and feed['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="application/octet-stream"> - RXhhbXBsZSA8Yj5BdG9tPC9iPg== - </title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_base64_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_base64_2.xml deleted file mode 100644 index 409c1f328..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_base64_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed title base64-encoded -Expect: not bozo and feed['title'] == u'<p>History of the <blink> tag</p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<title type="application/octet-stream"> -PHA+SGlzdG9yeSBvZiB0aGUgJmx0O2JsaW5rJmd0OyB0YWc8L3A+ -</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_content_type.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_content_type.xml deleted file mode 100644 index 52d456757..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_content_type.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content type defaults to 'text/plain' -Expect: not bozo and feed['title_detail']['type'] == u'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_content_type_text.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_content_type_text.xml deleted file mode 100644 index d1649921c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_content_type_text.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title type='text' -Expect: not bozo and feed['title_detail']['type'] == 'text/plain' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="text">Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_content_value.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_content_value.xml deleted file mode 100644 index 7d31b22e4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_content_value.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content value -Expect: not bozo and feed['title_detail']['value'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title>Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_escaped_markup.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_escaped_markup.xml deleted file mode 100644 index ba23dc0bf..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_escaped_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title escaped HTML -Expect: not bozo and feed['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html">Example <b>Atom</b></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup.xml deleted file mode 100644 index fea23a77c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title inline XHTML -Expect: not bozo and feed['title'] == u'Example <b>Atom</b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <b>Atom</b></div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup_2.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup_2.xml deleted file mode 100644 index ec2da6b04..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_inline_markup_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title inline XHTML with escaped markup -Expect: not bozo and feed['title'] == u'History of the <blink> tag' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">History of the <blink> tag</div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/feed_title_text_plain.xml b/lib/feedparser/tests/wellformed/atom10/feed_title_text_plain.xml deleted file mode 100644 index 0f7ff9592..000000000 --- a/lib/feedparser/tests/wellformed/atom10/feed_title_text_plain.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title with explicit type='text' -Expect: not bozo and feed['title'] == u'Example Atom' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="text">Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/atom10/item_media_category_label.xml b/lib/feedparser/tests/wellformed/atom10/item_media_category_label.xml deleted file mode 100644 index c66c46d1c..000000000 --- a/lib/feedparser/tests/wellformed/atom10/item_media_category_label.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: multiple media:category tags - label -Expect: not bozo and entries[0].tags[0].label == u'lab1' ---> -<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss"> - <channel> - <item> - <media:category label="lab1">cat1</media:category> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/atom10/item_media_category_multiple.xml b/lib/feedparser/tests/wellformed/atom10/item_media_category_multiple.xml deleted file mode 100644 index 95b2f48c6..000000000 --- a/lib/feedparser/tests/wellformed/atom10/item_media_category_multiple.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: multiple media:category tags - multiple categories -Expect: not bozo and len(entries[0].tags) == 2 and entries[0].tags[1].term == u'cat2' ---> -<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss"> - <channel> - <item> - <media:category>cat1</media:category> - <media:category>cat2</media:category> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/atom10/item_media_category_scheme1.xml b/lib/feedparser/tests/wellformed/atom10/item_media_category_scheme1.xml deleted file mode 100644 index d1de91e2b..000000000 --- a/lib/feedparser/tests/wellformed/atom10/item_media_category_scheme1.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: multiple media:category tags - default scheme -Expect: not bozo and entries[0].tags[0].scheme == u'http://search.yahoo.com/mrss/category_schema' ---> -<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss"> - <channel> - <item> - <media:category>cat1</media:category> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/atom10/item_media_category_scheme2.xml b/lib/feedparser/tests/wellformed/atom10/item_media_category_scheme2.xml deleted file mode 100644 index 62f5c3657..000000000 --- a/lib/feedparser/tests/wellformed/atom10/item_media_category_scheme2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: multiple media:category tags - custom scheme -Expect: not bozo and entries[0].tags[0].scheme == u'http://example.INVALID/' ---> -<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss"> - <channel> - <item> - <media:category scheme="http://example.INVALID/">cat1</media:category> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/atom10/item_media_category_term.xml b/lib/feedparser/tests/wellformed/atom10/item_media_category_term.xml deleted file mode 100644 index d01d81fb0..000000000 --- a/lib/feedparser/tests/wellformed/atom10/item_media_category_term.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: multiple media:category tags - term -Expect: not bozo and entries[0].tags[0].term == u'cat1' ---> -<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss"> - <channel> - <item> - <media:category>cat1</media:category> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/atom10/item_media_title_type_plain.xml b/lib/feedparser/tests/wellformed/atom10/item_media_title_type_plain.xml deleted file mode 100644 index 4262d1962..000000000 --- a/lib/feedparser/tests/wellformed/atom10/item_media_title_type_plain.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: media:title @type="plain" -Expect: not bozo and entries[0]['title_detail']['type'] == u'text/plain' ---> -<rss xmlns:media="http://search.yahoo.com/mrss/"> - <channel> - <item> - <media:title type="plain">plain means text/plain</media:title> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/atom10/missing_quote_in_attr.xml b/lib/feedparser/tests/wellformed/atom10/missing_quote_in_attr.xml deleted file mode 100644 index a62a0d9ec..000000000 --- a/lib/feedparser/tests/wellformed/atom10/missing_quote_in_attr.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: href is missing a quote -Expect: not bozo and feed['title_detail']['value'] == u'<a href="http://example.com/"">example</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html"><![CDATA[<a href=http://example.com/">example</a>]]></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/qna.xml b/lib/feedparser/tests/wellformed/atom10/qna.xml deleted file mode 100644 index 6198ec1e3..000000000 --- a/lib/feedparser/tests/wellformed/atom10/qna.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: Q&A -Expect: not bozo and entries[0]['title_detail']['value'] == u'Q&A session' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title type="html">Q&A session</title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/quote_in_attr.xml b/lib/feedparser/tests/wellformed/atom10/quote_in_attr.xml deleted file mode 100644 index 88c133c76..000000000 --- a/lib/feedparser/tests/wellformed/atom10/quote_in_attr.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains URI with an amperand -Expect: not bozo and feed['title_detail']['value'] == u'<a title=""test"">test</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a title='"test"'>test</a></div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/relative_uri.xml b/lib/feedparser/tests/wellformed/atom10/relative_uri.xml deleted file mode 100644 index 8c5509bd4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/relative_uri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains relative URI resolved relative to xml:base -Expect: not bozo and feed['title_detail']['value'] == u'Example <a href="http://example.com/test/test.html">test</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="xhtml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/relative_uri_inherit.xml b/lib/feedparser/tests/wellformed/atom10/relative_uri_inherit.xml deleted file mode 100644 index 5462c18f4..000000000 --- a/lib/feedparser/tests/wellformed/atom10/relative_uri_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains relative URI resolved relative to xml:base inherited from parent element -Expect: not bozo and feed['title_detail']['value'] == u'Example <a href="http://example.com/test/test.html">test</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/test/"> - <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/relative_uri_inherit_2.xml b/lib/feedparser/tests/wellformed/atom10/relative_uri_inherit_2.xml deleted file mode 100644 index e018e2df2..000000000 --- a/lib/feedparser/tests/wellformed/atom10/relative_uri_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains relative URI resolved relative to xml:base overriding parent xml:base -Expect: not bozo and feed['title_detail']['value'] == u'Example <a href="http://example.com/test/test.html">test</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/parent/"> - <title type="xhtml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/atom10/tag_in_attr.xml b/lib/feedparser/tests/wellformed/atom10/tag_in_attr.xml deleted file mode 100644 index 9e4d3bebb..000000000 --- a/lib/feedparser/tests/wellformed/atom10/tag_in_attr.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: image attribute contains angle brackets -Expect: not bozo and feed['title_detail']['value'] == u'<img alt="cat<br />dog" src="http://example.com/cat-dog.jpg" />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html"><![CDATA[<img src="http://example.com/cat-dog.jpg" alt="cat<br />dog">]]></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/base/cdf_item_abstract_xml_base.xml b/lib/feedparser/tests/wellformed/base/cdf_item_abstract_xml_base.xml deleted file mode 100644 index f90968e40..000000000 --- a/lib/feedparser/tests/wellformed/base/cdf_item_abstract_xml_base.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -Description: CDF item abstract xml:base -Expect: not bozo and entries[0]['summary_detail']['base'] == u'http://base.example.org/' ---> -<CHANNEL - BASE="http://base.example.org/" - HREF="http://www.example.org/" - LASTMOD="2004-04-06T23:05:43-05:00" - PRECACHE="No"> - <TITLE>channel title</TITLE> - <ABSTRACT>channel abstract</ABSTRACT> - <ITEM HREF="/item/1" - PRECACHE="No" - LASTMOD="2004-04-06T23:05:43-05:00"> - <TITLE>item title</TITLE> - <ABSTRACT>item abstract</ABSTRACT> - </ITEM> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_content_xml_base.xml b/lib/feedparser/tests/wellformed/base/entry_content_xml_base.xml deleted file mode 100644 index d64344ec9..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_content_xml_base.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content xml:base -Expect: not bozo and entries[0]['content'][0]['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit.xml deleted file mode 100644 index cd09929e7..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content xml:base inherited from parent element -Expect: not bozo and entries[0]['content'][0]['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> -<entry> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_2.xml deleted file mode 100644 index 58c699d4c..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content xml:base overrides parent element -Expect: not bozo and entries[0]['content'][0]['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <content type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_3.xml deleted file mode 100644 index 49c3ceabe..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_3.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry content xml:base resets properly on new element -Expect: not bozo and entries[0]['content'][0]['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <summary type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <content type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_4.xml deleted file mode 100644 index 64053cf42..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_content_xml_base_inherit_4.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry content xml:base inherits properly on new element -Expect: not bozo and entries[0]['content'][0]['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <summary type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base.xml b/lib/feedparser/tests/wellformed/base/entry_summary_xml_base.xml deleted file mode 100644 index ae49ecf39..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content xml:base -Expect: not bozo and entries[0]['summary_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit.xml deleted file mode 100644 index 3fe233480..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content xml:base inherited from parent element -Expect: not bozo and entries[0]['summary_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> -<entry> - <summary type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_2.xml deleted file mode 100644 index cf0c95fd8..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content xml:base overrides parent element -Expect: not bozo and entries[0]['summary_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <summary type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_3.xml deleted file mode 100644 index 75f442b6c..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_3.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry summary content xml:base resets properly on new element -Expect: not bozo and entries[0]['summary_detail']['base'] == u'http://example.com/summary/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <summary type="application/xhtml+xml" xml:base="http://example.com/summary/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_4.xml deleted file mode 100644 index d36029944..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_summary_xml_base_inherit_4.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry summary content xml:base inherits properly on new element -Expect: not bozo and entries[0]['summary_detail']['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <summary type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_title_xml_base.xml b/lib/feedparser/tests/wellformed/base/entry_title_xml_base.xml deleted file mode 100644 index 10a13fe86..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_title_xml_base.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content xml:base -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit.xml deleted file mode 100644 index b838c9ec3..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content xml:base inherited from parent element -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> -<entry> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_2.xml deleted file mode 100644 index 7bef55e66..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title content xml:base overrides parent element -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_3.xml deleted file mode 100644 index 28518d98f..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_3.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry title content xml:base resets properly on new element -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <summary type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_4.xml deleted file mode 100644 index 7104e0981..000000000 --- a/lib/feedparser/tests/wellformed/base/entry_title_xml_base_inherit_4.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry title content xml:base inherits properly on new element -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> -<entry> - <summary type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base.xml b/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base.xml deleted file mode 100644 index 22a3de836..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright content xml:base -Expect: not bozo and feed['copyright_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit.xml deleted file mode 100644 index fd19cc4b8..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright content xml:base inherited from parent element -Expect: not bozo and feed['copyright_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> - <copyright type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_2.xml deleted file mode 100644 index 5d2b7a66c..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright content xml:base overrides parent element -Expect: not bozo and feed['copyright_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <copyright type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_3.xml deleted file mode 100644 index eddb60afa..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed copyright content xml:base resets properly on new element -Expect: not bozo and feed['copyright_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <copyright type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_4.xml deleted file mode 100644 index 14afc9d78..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_copyright_xml_base_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed copyright content xml:base inherits properly on new element -Expect: not bozo and feed['copyright_detail']['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <copyright type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_info_xml_base.xml b/lib/feedparser/tests/wellformed/base/feed_info_xml_base.xml deleted file mode 100644 index 2f830c6ad..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_info_xml_base.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info content xml:base -Expect: not bozo and feed['info_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit.xml deleted file mode 100644 index 50cf9cd47..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info content xml:base inherited from parent element -Expect: not bozo and feed['info_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> - <info type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_2.xml deleted file mode 100644 index 3a095a58e..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info content xml:base overrides parent element -Expect: not bozo and feed['info_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_3.xml deleted file mode 100644 index 92f6d36f6..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed info content xml:base resets properly on new element -Expect: not bozo and feed['info_detail']['base'] == u'http://example.com/info/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_4.xml deleted file mode 100644 index 09dcc337d..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_info_xml_base_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed info content xml:base inherits properly on new element -Expect: not bozo and feed['info_detail']['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <info type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_link_xml_base_iri.xml b/lib/feedparser/tests/wellformed/base/feed_link_xml_base_iri.xml deleted file mode 100644 index 4777baa2e..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_link_xml_base_iri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: xml:base is an IRI -Expect: not bozo and feed['links'][0]['href'] == u'http://www.\u8a79\u59c6\u65af.com/feed' ---> -<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://www.詹姆斯.com/feed"> - <link rel="self" type="application/atom+xml" href=""/> -</feed> diff --git a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base.xml b/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base.xml deleted file mode 100644 index 953f2b808..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline content xml:base -Expect: not bozo and feed['tagline_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit.xml deleted file mode 100644 index c6339d7f0..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline content xml:base inherited from parent element -Expect: not bozo and feed['tagline_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> - <tagline type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_2.xml deleted file mode 100644 index 5ce1d77f2..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline content xml:base overrides parent element -Expect: not bozo and feed['tagline_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <tagline type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_3.xml deleted file mode 100644 index 0e8403636..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed tagline content xml:base resets properly on new element -Expect: not bozo and feed['tagline_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <tagline type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_4.xml deleted file mode 100644 index 6248bbd6a..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_tagline_xml_base_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed tagline content xml:base inherits properly on new element -Expect: not bozo and feed['tagline_detail']['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <tagline type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_title_xml_base.xml b/lib/feedparser/tests/wellformed/base/feed_title_xml_base.xml deleted file mode 100644 index 3613c680b..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_title_xml_base.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content xml:base -Expect: not bozo and feed['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit.xml b/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit.xml deleted file mode 100644 index 8c06788b8..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content xml:base inherited from parent element -Expect: not bozo and feed['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/test/"> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_2.xml b/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_2.xml deleted file mode 100644 index 8137b7f54..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content xml:base overrides parent element -Expect: not bozo and feed['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_3.xml b/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_3.xml deleted file mode 100644 index 5123fb5db..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed title content xml:base resets properly on new element -Expect: not bozo and feed['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <title type="application/xhtml+xml" xml:base="http://example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_4.xml b/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_4.xml deleted file mode 100644 index 5675be27c..000000000 --- a/lib/feedparser/tests/wellformed/base/feed_title_xml_base_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed title content xml:base inherits properly on new element -Expect: not bozo and feed['title_detail']['base'] == u'http://example.com/parent/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/parent/"> - <info type="application/xhtml+xml" xml:base="http://example.com/info/"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_channel_docs_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_channel_docs_base_content_location.xml deleted file mode 100644 index 26f7ccd16..000000000 --- a/lib/feedparser/tests/wellformed/base/http_channel_docs_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: channel docs relative to Content-Location header -Expect: not bozo and feed['docs'] == u'http://example.com/relative/uri' ---> -<rss version="2.0"> -<channel> -<docs>/relative/uri</docs> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_channel_docs_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_channel_docs_base_docuri.xml deleted file mode 100644 index 933567e05..000000000 --- a/lib/feedparser/tests/wellformed/base/http_channel_docs_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel docs relative to document URI -Expect: not bozo and feed['docs'] == u'http://127.0.0.1:8097/relative/uri' ---> -<rss version="2.0"> -<channel> -<docs>/relative/uri</docs> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_channel_link_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_channel_link_base_content_location.xml deleted file mode 100644 index 400976b31..000000000 --- a/lib/feedparser/tests/wellformed/base/http_channel_link_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: channel link relative to Content-Location header -Expect: not bozo and feed['link'] == u'http://example.com/relative/uri' ---> -<rss version="2.0"> -<channel> -<link>/relative/uri</link> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_channel_link_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_channel_link_base_docuri.xml deleted file mode 100644 index 4611b5918..000000000 --- a/lib/feedparser/tests/wellformed/base/http_channel_link_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel link relative to document URI -Expect: not bozo and feed['link'] == u'http://127.0.0.1:8097/relative/uri' ---> -<rss version="2.0"> -<channel> -<link>/relative/uri</link> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_author_url_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_author_url_base_content_location.xml deleted file mode 100644 index ad89d1d45..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_author_url_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry author url relative to Content-Location header -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<author> - <url>/relative/link</url> -</author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_author_url_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_author_url_base_docuri.xml deleted file mode 100644 index 90de1ea27..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_author_url_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry author url relative to document URI -Expect: not bozo and entries[0]['author_detail']['url'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<author> - <url>/relative/link</url> -</author> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_content_location.xml deleted file mode 100644 index 5bdf866d6..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry content relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_docuri.xml deleted file mode 100644 index c2672064c..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_content_base64_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry content relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_content_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_content_base_content_location.xml deleted file mode 100644 index 650fbd93a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_content_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry content relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_content_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_content_base_docuri.xml deleted file mode 100644 index 97c0e437a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_content_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_content_location.xml deleted file mode 100644 index 718557236..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry content relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_docuri.xml deleted file mode 100644 index cbd82ca0d..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_content_inline_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_content_location.xml deleted file mode 100644 index 84f38b96f..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry contributor url relative to Content-Location header -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<item> -<contributor> - <url>/relative/link</url> -</contributor> -</item> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_docuri.xml deleted file mode 100644 index 7bf7738b5..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_contributor_url_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry contributor url relative to document URI -Expect: not bozo and entries[0]['contributors'][0]['url'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<item> -<contributor> - <url>/relative/link</url> -</contributor> -</item> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_id_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_id_base_content_location.xml deleted file mode 100644 index 2a3cf901b..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_id_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry id relative to Content-Location header -Expect: not bozo and entries[0]['id'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <id>/relative/link</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_id_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_id_base_docuri.xml deleted file mode 100644 index a9e146d0d..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_id_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry id relative to document URI -Expect: not bozo and entries[0]['id'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <id>/relative/link</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_link_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_link_base_content_location.xml deleted file mode 100644 index b09bde693..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_link_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry link href relative to Content-Location header -Expect: not bozo and entries[0]['links'][0]['href'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" href="/relative/link"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_link_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_link_base_docuri.xml deleted file mode 100644 index ec49b0825..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_link_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry link href relative to document URI -Expect: not bozo and entries[0]['links'][0]['href'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <link rel="alternate" type="text/html" href="/relative/link"/> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_content_location.xml deleted file mode 100644 index 0833f8112..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry summary relative to Content-Location header -Expect: not bozo and entries[0]['summary'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_docuri.xml deleted file mode 100644 index 4ae879cf7..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_summary_base64_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry summary relative to document URI -Expect: not bozo and entries[0]['summary'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_summary_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_summary_base_content_location.xml deleted file mode 100644 index 031cbdcce..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_summary_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry summary relative to Content-Location header -Expect: not bozo and entries[0]['summary'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_summary_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_summary_base_docuri.xml deleted file mode 100644 index 27279f602..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_summary_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary relative to document URI -Expect: not bozo and entries[0]['summary'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_content_location.xml deleted file mode 100644 index 32c365e5c..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry summary relative to Content-Location header -Expect: not bozo and entries[0]['summary'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_docuri.xml deleted file mode 100644 index ea7820db2..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_summary_inline_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary relative to document URI -Expect: not bozo and entries[0]['summary'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_content_location.xml deleted file mode 100644 index e23bdbb5a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry title relative to Content-Location header -Expect: not bozo and entries[0]['title'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_docuri.xml deleted file mode 100644 index b9a673f0a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_title_base64_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: entry title relative to document URI -Expect: not bozo and entries[0]['title'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_title_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_title_base_content_location.xml deleted file mode 100644 index 9a0bc2b44..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_title_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry title relative to Content-Location header -Expect: not bozo and entries[0]['title'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_title_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_title_base_docuri.xml deleted file mode 100644 index 776fbcde6..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_title_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title relative to document URI -Expect: not bozo and entries[0]['title'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_content_location.xml deleted file mode 100644 index 95f6bc07a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: entry title relative to Content-Location header -Expect: not bozo and entries[0]['title'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_docuri.xml deleted file mode 100644 index cb7668936..000000000 --- a/lib/feedparser/tests/wellformed/base/http_entry_title_inline_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title relative to document URI -Expect: not bozo and entries[0]['title'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_author_url_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_author_url_base_content_location.xml deleted file mode 100644 index f9c757fc8..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_author_url_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed author url relative to Content-Location header -Expect: not bozo and feed['author_detail']['url'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<author> - <url>/relative/link</url> -</author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_author_url_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_author_url_base_docuri.xml deleted file mode 100644 index f4c5ab2be..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_author_url_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed author url relative to document URI -Expect: not bozo and feed['author_detail']['url'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<author> - <url>/relative/link</url> -</author> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_content_location.xml deleted file mode 100644 index 07c762e62..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed contributor url relative to Content-Location header -Expect: not bozo and feed['contributors'][0]['url'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<contributor> - <url>/relative/link</url> -</contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_docuri.xml deleted file mode 100644 index 962836c82..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_contributor_url_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed contributor url relative to document URI -Expect: not bozo and feed['contributors'][0]['url'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<contributor> - <url>/relative/link</url> -</contributor> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_content_location.xml deleted file mode 100644 index 045f730ec..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed copyright relative to Content-Location header -Expect: not bozo and feed['copyright'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_docuri.xml deleted file mode 100644 index 717641426..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base64_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed copyright relative to document URI -Expect: not bozo and feed['copyright'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_copyright_base_content_location.xml deleted file mode 100644 index a15fe2a01..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed copyright relative to Content-Location header -Expect: not bozo and feed['copyright'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_copyright_base_docuri.xml deleted file mode 100644 index ff363af77..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_copyright_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright relative to document URI -Expect: not bozo and feed['copyright'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_content_location.xml deleted file mode 100644 index f9e8555f3..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed copyright relative to Content-Location header -Expect: not bozo and feed['copyright'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_docuri.xml deleted file mode 100644 index b076c7a1b..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_copyright_inline_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright relative to document URI -Expect: not bozo and feed['copyright'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_content_location.xml deleted file mode 100644 index 3b418bc0d..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed generator url relative to Content-Location header -Expect: not bozo and feed['generator_detail']['url'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<generator url="/relative/link" version="2.66">Movable Type</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_docuri.xml deleted file mode 100644 index b9d9e66e0..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_generator_url_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed generator url relative to document URI -Expect: not bozo and feed['generator_detail']['url'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<generator url="/relative/link" version="2.66">Movable Type</generator> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_id_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_id_base_content_location.xml deleted file mode 100644 index 3f8b6ae62..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_id_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed id relative to Content-Location header -Expect: not bozo and feed['id'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <id>/relative/link</id> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_id_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_id_base_docuri.xml deleted file mode 100644 index a4c670224..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_id_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed id relative to document URI -Expect: not bozo and feed['id'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <id>/relative/link</id> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_content_location.xml deleted file mode 100644 index 6bb78e83c..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed info relative to Content-Location header -Expect: not bozo and feed['info'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_docuri.xml deleted file mode 100644 index 66ba7854f..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_info_base64_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed info relative to document URI -Expect: not bozo and feed['info'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_info_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_info_base_content_location.xml deleted file mode 100644 index 78a09e5af..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_info_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed info relative to Content-Location header -Expect: not bozo and feed['info'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_info_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_info_base_docuri.xml deleted file mode 100644 index a19e737e8..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_info_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info relative to document URI -Expect: not bozo and feed['info'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_content_location.xml deleted file mode 100644 index 8e60e1572..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed info relative to Content-Location header -Expect: not bozo and feed['info'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_docuri.xml deleted file mode 100644 index 41bd64a1a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_info_inline_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info relative to document URI -Expect: not bozo and feed['info'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_link_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_link_base_content_location.xml deleted file mode 100644 index 3c416b1f4..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_link_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed link href relative to Content-Location header -Expect: not bozo and feed['links'][0]['href'] == u'http://example.com/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" href="/relative/link"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_link_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_link_base_docuri.xml deleted file mode 100644 index ab7fe93d7..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_link_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed link href relative to document URI -Expect: not bozo and feed['links'][0]['href'] == u'http://127.0.0.1:8097/relative/link' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <link rel="alternate" type="text/html" href="/relative/link"/> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_content_location.xml deleted file mode 100644 index cfa216da7..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed tagline relative to Content-Location header -Expect: not bozo and feed['tagline'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_docuri.xml deleted file mode 100644 index 2bd632327..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base64_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed tagline relative to document URI -Expect: not bozo and feed['tagline'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_tagline_base_content_location.xml deleted file mode 100644 index 29e93e545..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed tagline relative to Content-Location header -Expect: not bozo and feed['tagline'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_tagline_base_docuri.xml deleted file mode 100644 index 2fe14caa3..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_tagline_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline relative to document URI -Expect: not bozo and feed['tagline'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_content_location.xml deleted file mode 100644 index 619b3a6ac..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed tagline relative to Content-Location header -Expect: not bozo and feed['tagline'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_docuri.xml deleted file mode 100644 index e5a05f409..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_tagline_inline_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline relative to document URI -Expect: not bozo and feed['tagline'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_content_location.xml deleted file mode 100644 index 38975b42e..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_content_location.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed title relative to Content-Location header -Expect: not bozo and feed['title'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_docuri.xml deleted file mode 100644 index 88ee5ab39..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_title_base64_base_docuri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed title relative to document URI -Expect: not bozo and feed['title'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="base64"> -PGRpdj48YSBocmVmPSIvcmVsYXRpdmUvdXJpIj5jbGljayBoZXJlPC9hPjwvZGl2Pg== -</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_title_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_title_base_content_location.xml deleted file mode 100644 index a0d294068..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_title_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed title relative to Content-Location header -Expect: not bozo and feed['title'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_title_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_title_base_docuri.xml deleted file mode 100644 index 0a9a94144..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_title_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title relative to document URI -Expect: not bozo and feed['title'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><div><a href="/relative/uri">click here</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_content_location.xml deleted file mode 100644 index 2287791d6..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_content_location.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: feed title relative to Content-Location header -Expect: not bozo and feed['title'] == u'<div><a href="http://example.com/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_docuri.xml deleted file mode 100644 index 2eb83ad46..000000000 --- a/lib/feedparser/tests/wellformed/base/http_feed_title_inline_base_docuri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title relative to document URI -Expect: not bozo and feed['title'] == u'<div><a href="http://127.0.0.1:8097/relative/uri">click here</a></div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_body_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_body_base_content_location.xml deleted file mode 100644 index 036295ac8..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_body_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item body relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://example.com/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<body><a href="/relative/uri">click here</a></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_body_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_body_base_docuri.xml deleted file mode 100644 index 1abea1066..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_body_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item body relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://127.0.0.1:8097/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<body><a href="/relative/uri">click here</a></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_comments_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_comments_base_content_location.xml deleted file mode 100644 index 128cdddd2..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_comments_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item comments relative to Content-Location header -Expect: not bozo and entries[0]['comments'] == u'http://example.com/relative/uri' ---> -<rss version="2.0"> -<channel> -<item> -<comments>/relative/uri</comments> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_comments_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_comments_base_docuri.xml deleted file mode 100644 index a42a28481..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_comments_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item comments relative to document URI -Expect: not bozo and entries[0]['comments'] == u'http://127.0.0.1:8097/relative/uri' ---> -<rss version="2.0"> -<channel> -<item> -<comments>/relative/uri</comments> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_content_location.xml deleted file mode 100644 index 03526eba2..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item content:encoded relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://example.com/relative/uri">click here</a>' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><a href="/relative/uri">click here</a></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_docuri.xml deleted file mode 100644 index d7e7430b1..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_content_encoded_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://127.0.0.1:8097/relative/uri">click here</a>' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><a href="/relative/uri">click here</a></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_description_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_description_base_content_location.xml deleted file mode 100644 index f935976f0..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_description_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item description relative to Content-Location header -Expect: not bozo and entries[0]['description'] == u'<a href="http://example.com/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<description><a href="/relative/uri">click here</a></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_description_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_description_base_docuri.xml deleted file mode 100644 index 0e56e0a89..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_description_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description relative to document URI -Expect: not bozo and entries[0]['description'] == u'<a href="http://127.0.0.1:8097/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<description><a href="/relative/uri">click here</a></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_description_spaces.xml b/lib/feedparser/tests/wellformed/base/http_item_description_spaces.xml deleted file mode 100644 index 1efc8b7c3..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_description_spaces.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description relative to document URI -Expect: not bozo and entries[0]['description'] == u'<a href="http://127.0.0.1:8097/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<description><a href=" /relative/uri ">click here</a></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/base/http_item_fullitem_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_fullitem_base_content_location.xml deleted file mode 100644 index a10d10545..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_fullitem_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item fullitem relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://example.com/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><a href="/relative/uri">click here</a></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_fullitem_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_fullitem_base_docuri.xml deleted file mode 100644 index 145fb7c10..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_fullitem_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://127.0.0.1:8097/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><a href="/relative/uri">click here</a></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_link_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_link_base_content_location.xml deleted file mode 100644 index ad5fec181..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_link_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item link relative to Content-Location header -Expect: not bozo and entries[0]['link'] == u'http://example.com/relative/uri' ---> -<rss version="2.0"> -<channel> -<item> -<link>/relative/uri</link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_link_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_link_base_docuri.xml deleted file mode 100644 index c3dabac3a..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_link_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item link relative to document URI -Expect: not bozo and entries[0]['link'] == u'http://127.0.0.1:8097/relative/uri' ---> -<rss version="2.0"> -<channel> -<item> -<link>/relative/uri</link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_content_location.xml deleted file mode 100644 index fe5c1a721..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item wfw:commentRSS relative to Content-Location header -Expect: not bozo and entries[0]['wfw_commentrss'] == u'http://example.com/relative/uri' ---> -<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/"> -<channel> -<item> -<wfw:commentRSS>/relative/uri</wfw:commentRSS> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_docuri.xml deleted file mode 100644 index 0704efdbd..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_wfw_commentRSS_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item wfw:commentRSS relative to document URI -Expect: not bozo and entries[0]['wfw_commentrss'] == u'http://127.0.0.1:8097/relative/uri' ---> -<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/"> -<channel> -<item> -<wfw:commentRSS>/relative/uri</wfw:commentRSS> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_content_location.xml deleted file mode 100644 index f15c73a17..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item wfw:comment relative to Content-Location header -Expect: not bozo and entries[0]['wfw_comment'] == u'http://example.com/relative/uri' ---> -<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/"> -<channel> -<item> -<wfw:comment>/relative/uri</wfw:comment> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_docuri.xml deleted file mode 100644 index f01880b12..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_wfw_comment_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item wfw:comment relative to document URI -Expect: not bozo and entries[0]['wfw_comment'] == u'http://127.0.0.1:8097/relative/uri' ---> -<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/"> -<channel> -<item> -<wfw:comment>/relative/uri</wfw:comment> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_content_location.xml b/lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_content_location.xml deleted file mode 100644 index a30fdcea7..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_content_location.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: item body relative to Content-Location header -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://example.com/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_docuri.xml b/lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_docuri.xml deleted file mode 100644 index c7a441ea3..000000000 --- a/lib/feedparser/tests/wellformed/base/http_item_xhtml_body_base_docuri.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item body relative to document URI -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://127.0.0.1:8097/relative/uri">click here</a>' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><a href="/relative/uri">click here</a></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_relative_xml_base.xml b/lib/feedparser/tests/wellformed/base/http_relative_xml_base.xml deleted file mode 100644 index 46aa556e1..000000000 --- a/lib/feedparser/tests/wellformed/base/http_relative_xml_base.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: xml:base relative to parent (and Content-Location) -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/feed/entry/title/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="feed/"> -<entry xml:base="entry/"> - <title type="application/xhtml+xml" xml:base="title/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/http_relative_xml_base_2.xml b/lib/feedparser/tests/wellformed/base/http_relative_xml_base_2.xml deleted file mode 100644 index 362d948e6..000000000 --- a/lib/feedparser/tests/wellformed/base/http_relative_xml_base_2.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Location: http://example.com/ -Description: xml:base relative to parent (and Content-Location) -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/entry/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="feed/base/"> -<entry xml:base="/entry/base/"> - <title type="application/xhtml+xml" xml:base="../"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/item_media_title1.xml b/lib/feedparser/tests/wellformed/base/item_media_title1.xml deleted file mode 100644 index d3c272e38..000000000 --- a/lib/feedparser/tests/wellformed/base/item_media_title1.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: media title as a fallback -Expect: not bozo and entries[0]['title'] == u'bar' ---> -<rss xmlns:media="http://search.yahoo.com/mrss/"> - <channel> - <item> - <media:title>bar</media:title> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/base/item_media_title2.xml b/lib/feedparser/tests/wellformed/base/item_media_title2.xml deleted file mode 100644 index 57c7aef9f..000000000 --- a/lib/feedparser/tests/wellformed/base/item_media_title2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: media title as a fallback -Expect: not bozo and entries[0]['title'] == u'foo' ---> -<rss xmlns:media="http://search.yahoo.com/mrss/"> - <channel> - <item> - <media:title>bar</media:title> - <title>foo</title> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/base/item_media_title3.xml b/lib/feedparser/tests/wellformed/base/item_media_title3.xml deleted file mode 100644 index a9fbd31c5..000000000 --- a/lib/feedparser/tests/wellformed/base/item_media_title3.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: media title as a fallback -Expect: not bozo and entries[0]['title'] == u'foo' ---> -<rss xmlns:media="http://search.yahoo.com/mrss/"> - <channel> - <item> - <title>foo</title> - <media:title>bar</media:title> - </item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/base/malformed_base.xml b/lib/feedparser/tests/wellformed/base/malformed_base.xml deleted file mode 100644 index 3bed7b02f..000000000 --- a/lib/feedparser/tests/wellformed/base/malformed_base.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: xml:base is malformed (too many slashes after scheme) -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry xml:base="http://example.com/"> - <title type="application/xhtml+xml" xml:base="http:///example.com/test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/rel_uri_with_unicode_character.xml b/lib/feedparser/tests/wellformed/base/rel_uri_with_unicode_character.xml deleted file mode 100644 index 2f8d9330a..000000000 --- a/lib/feedparser/tests/wellformed/base/rel_uri_with_unicode_character.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: relative uri resolution with non-ascii characters -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://any.test/\u00c0">uri</a>' ---> -<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xml:base="http://any.test/"> -<channel> -<item> - <content:encoded><a href="À">uri</a></content:encoded> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/base/relative_xml_base.xml b/lib/feedparser/tests/wellformed/base/relative_xml_base.xml deleted file mode 100644 index 1c686c63f..000000000 --- a/lib/feedparser/tests/wellformed/base/relative_xml_base.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: xml:base relative to parent -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry xml:base="http://example.com/"> - <title type="application/xhtml+xml" xml:base="test/"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/relative_xml_base_2.xml b/lib/feedparser/tests/wellformed/base/relative_xml_base_2.xml deleted file mode 100644 index 4d2115e4b..000000000 --- a/lib/feedparser/tests/wellformed/base/relative_xml_base_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: xml:base relative to parent (recursive) -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/test/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:base="http://example.com/"> -<entry xml:base="test/entry/"> - <title type="application/xhtml+xml" xml:base="../"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/base/unsafe_base.xml b/lib/feedparser/tests/wellformed/base/unsafe_base.xml deleted file mode 100644 index 50b8c30fd..000000000 --- a/lib/feedparser/tests/wellformed/base/unsafe_base.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -SkipUnless: feedparser.ACCEPTABLE_URI_SCHEMES -Description: xml:base is unsafe (uses unacceptable URI protocol) -Expect: not bozo and entries[0]['title_detail']['base'] == u'http://example.com/' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry xml:base="http://example.com/"> - <title type="application/xhtml+xml" xml:base="javascript:alert('unsafe')"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/cdf/channel_abstract_map_description.xml b/lib/feedparser/tests/wellformed/cdf/channel_abstract_map_description.xml deleted file mode 100644 index 8bce8d9ee..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_abstract_map_description.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: CDF channel abstract maps to description -Expect: not bozo and feed['description'] == u'Example description' ---> -<CHANNEL> - <ABSTRACT>Example description</ABSTRACT> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/channel_abstract_map_tagline.xml b/lib/feedparser/tests/wellformed/cdf/channel_abstract_map_tagline.xml deleted file mode 100644 index 04feca0c1..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_abstract_map_tagline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: CDF channel abstract maps to tagline -Expect: not bozo and feed['tagline_detail']['value'] == u'Example description' ---> -<CHANNEL> - <ABSTRACT>Example description</ABSTRACT> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/channel_href_map_link.xml b/lib/feedparser/tests/wellformed/cdf/channel_href_map_link.xml deleted file mode 100644 index 133f14194..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_href_map_link.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: CDF channel href maps to link -Expect: not bozo and feed['link'] == u'http://www.example.org/' ---> -<CHANNEL HREF="http://www.example.org/"> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/channel_href_map_links.xml b/lib/feedparser/tests/wellformed/cdf/channel_href_map_links.xml deleted file mode 100644 index 0c65bc27a..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_href_map_links.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: CDF channel href maps to links -Expect: not bozo and feed['links'][0]['href'] == u'http://www.example.org/' ---> -<CHANNEL HREF="http://www.example.org/"> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/channel_lastmod.xml b/lib/feedparser/tests/wellformed/cdf/channel_lastmod.xml deleted file mode 100644 index 7b91da4df..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_lastmod.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: CDF channel lastmod -Expect: not bozo and feed['updated'] == u'2004-04-06T23:05:43-05:00' ---> -<CHANNEL LASTMOD="2004-04-06T23:05:43-05:00"> -</CHANNEL> diff --git a/lib/feedparser/tests/wellformed/cdf/channel_lastmod_parsed.xml b/lib/feedparser/tests/wellformed/cdf/channel_lastmod_parsed.xml deleted file mode 100644 index 65faa72c1..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_lastmod_parsed.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: CDF channel lastmod parsed -Expect: not bozo and feed['updated_parsed'] == (2004, 4, 7, 4, 5, 43, 2, 98, 0) ---> -<CHANNEL LASTMOD="2004-04-06T23:05:43-05:00"> -</CHANNEL> diff --git a/lib/feedparser/tests/wellformed/cdf/channel_title.xml b/lib/feedparser/tests/wellformed/cdf/channel_title.xml deleted file mode 100644 index 080c725fa..000000000 --- a/lib/feedparser/tests/wellformed/cdf/channel_title.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: CDF channel title -Expect: not bozo and feed['title'] == u'Example feed' ---> -<CHANNEL> - <TITLE>Example feed</TITLE> -</CHANNEL> diff --git a/lib/feedparser/tests/wellformed/cdf/item_abstract_map_description.xml b/lib/feedparser/tests/wellformed/cdf/item_abstract_map_description.xml deleted file mode 100644 index 64821d07d..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_abstract_map_description.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: CDF item abstract maps to description -Expect: not bozo and entries[0]['description'] == u'Example description' ---> -<CHANNEL> -<ITEM> - <ABSTRACT>Example description</ABSTRACT> -</ITEM> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/item_abstract_map_summary.xml b/lib/feedparser/tests/wellformed/cdf/item_abstract_map_summary.xml deleted file mode 100644 index 14946c9d7..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_abstract_map_summary.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: CDF item abstract maps to summary -Expect: not bozo and entries[0]['summary_detail']['value'] == u'Example description' ---> -<CHANNEL> -<ITEM> - <ABSTRACT>Example description</ABSTRACT> -</ITEM> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/item_href_map_link.xml b/lib/feedparser/tests/wellformed/cdf/item_href_map_link.xml deleted file mode 100644 index 973609eba..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_href_map_link.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: CDF item href maps to link -Expect: not bozo and entries[0]['link'] == u'http://www.example.org/' ---> -<CHANNEL> -<ITEM HREF="http://www.example.org/"> -</ITEM> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/item_href_map_links.xml b/lib/feedparser/tests/wellformed/cdf/item_href_map_links.xml deleted file mode 100644 index a55082e91..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_href_map_links.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: CDF item href maps to links -Expect: not bozo and entries[0]['links'][0]['href'] == u'http://www.example.org/' ---> -<CHANNEL> -<ITEM HREF="http://www.example.org/"> -</ITEM> -</CHANNEL> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/cdf/item_lastmod.xml b/lib/feedparser/tests/wellformed/cdf/item_lastmod.xml deleted file mode 100644 index 50db8a137..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_lastmod.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: CDF item lastmod -Expect: not bozo and entries[0]['updated'] == u'2004-04-06T23:05:43-05:00' ---> -<CHANNEL> -<ITEM LASTMOD="2004-04-06T23:05:43-05:00"> -</ITEM> -</CHANNEL> diff --git a/lib/feedparser/tests/wellformed/cdf/item_lastmod_parsed.xml b/lib/feedparser/tests/wellformed/cdf/item_lastmod_parsed.xml deleted file mode 100644 index 1767352f1..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_lastmod_parsed.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: CDF item lastmod parsed -Expect: not bozo and entries[0]['updated_parsed'] == (2004, 4, 7, 4, 5, 43, 2, 98, 0) ---> -<CHANNEL> -<ITEM LASTMOD="2004-04-06T23:05:43-05:00"> -</ITEM> -</CHANNEL> diff --git a/lib/feedparser/tests/wellformed/cdf/item_title.xml b/lib/feedparser/tests/wellformed/cdf/item_title.xml deleted file mode 100644 index 50fb359d5..000000000 --- a/lib/feedparser/tests/wellformed/cdf/item_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: CDF item title -Expect: not bozo and entries[0]['title'] == u'Example item' ---> -<CHANNEL> -<ITEM> - <TITLE>Example item</TITLE> -</ITEM> -</CHANNEL> diff --git a/lib/feedparser/tests/wellformed/feedburner/feedburner_browserfriendly.xml b/lib/feedparser/tests/wellformed/feedburner/feedburner_browserfriendly.xml deleted file mode 100644 index 4d341cf01..000000000 --- a/lib/feedparser/tests/wellformed/feedburner/feedburner_browserfriendly.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: FeedBurner browserFriendly maps to info -Expect: not bozo and feed['info'] == u'This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.' ---> -<rss version="2.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"> -<channel> - <feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/http/headers_content_location-relative.xml b/lib/feedparser/tests/wellformed/http/headers_content_location-relative.xml deleted file mode 100644 index 4c0254fe7..000000000 --- a/lib/feedparser/tests/wellformed/http/headers_content_location-relative.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Header: Content-Location: /feed/pg.cgi -Description: Content-Location header relative URI -Expect: not bozo and feed.link == u'http://127.0.0.1:8097/feed/absolute' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" href="absolute"/> -</feed> diff --git a/lib/feedparser/tests/wellformed/http/headers_content_location-unsafe.xml b/lib/feedparser/tests/wellformed/http/headers_content_location-unsafe.xml deleted file mode 100644 index e22c26257..000000000 --- a/lib/feedparser/tests/wellformed/http/headers_content_location-unsafe.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -SkipUnless: feedparser.ACCEPTABLE_URI_SCHEMES -Header: Content-Location: javascript:alert('unsafe'); -Description: Content-Location header unsafe URI -Expect: not bozo and feed.link == u'http://127.0.0.1:8097/abs' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <link rel="alternate" href="/abs"/> -</feed> diff --git a/lib/feedparser/tests/wellformed/http/headers_etag.xml b/lib/feedparser/tests/wellformed/http/headers_etag.xml deleted file mode 100644 index af4f905c6..000000000 --- a/lib/feedparser/tests/wellformed/http/headers_etag.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: ETag: foo -Description: etag should only exist in results if present in HTTP headers -Expect: not bozo and etag ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/http/headers_foo.xml b/lib/feedparser/tests/wellformed/http/headers_foo.xml deleted file mode 100644 index e32833fb0..000000000 --- a/lib/feedparser/tests/wellformed/http/headers_foo.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: X-Foo: bar -Description: capture arbitrary HTTP header -Expect: not bozo and headers.get('x-foo', headers.get('X-Foo')) == 'bar' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> diff --git a/lib/feedparser/tests/wellformed/http/headers_no_etag.xml b/lib/feedparser/tests/wellformed/http/headers_no_etag.xml deleted file mode 100644 index 051c2a154..000000000 --- a/lib/feedparser/tests/wellformed/http/headers_no_etag.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: X-Foo: bar -Description: etag should not exist in results if not present in HTTP headers -Expect: not bozo and not 'etag' in locals() ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -</feed> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_block.xml deleted file mode 100644 index 1d7b87ed0..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes block -Expect: not bozo and feed['itunes_block'] == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>yes</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_false.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_false.xml deleted file mode 100644 index a935e1ce7..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_false.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes block="false" -Expect: not bozo and feed['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>false</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_no.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_no.xml deleted file mode 100644 index 1aa627589..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_no.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes block='no' -Expect: not bozo and feed['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>no</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_true.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_true.xml deleted file mode 100644 index 93655ae57..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_true.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes block="true" -Expect: not bozo and feed['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>true</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_uppercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_uppercase.xml deleted file mode 100644 index c031ef2c4..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_uppercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes block="YES" -Expect: not bozo and feed['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>YES</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_whitespace.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_whitespace.xml deleted file mode 100644 index 864f5e3d8..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_block_whitespace.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes block with spurious whitespace, see http://lists.apple.com/faq/pub/syndication-dev/index.php?sid=359&aktion=artikel&rubrik=001&id=3&lang=en -Expect: not bozo and feed['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block> yes </itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_category.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_category.xml deleted file mode 100644 index 7a670a272..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_category.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel category -Expect: not bozo and feed['tags'][0]['term'] == u'Technology' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:category text="Technology"></itunes:category> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_category_nested.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_category_nested.xml deleted file mode 100644 index 7ec9d5881..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_category_nested.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes channel nested category -Expect: not bozo and feed['tags'][1]['term'] == u'Gadgets' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:category text="Technology"> - <itunes:category text="Gadgets"></itunes:category> -</itunes:category> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_category_scheme.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_category_scheme.xml deleted file mode 100644 index 00fde6bc8..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_category_scheme.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel category scheme -Expect: not bozo and feed['tags'][0]['scheme'] == u'http://www.itunes.com/' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:category text="Technology"></itunes:category> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit.xml deleted file mode 100644 index 584f1fd62..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel explicit -Expect: not bozo and feed['itunes_explicit'] == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit>yes</itunes:explicit> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_clean.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_clean.xml deleted file mode 100644 index caec32fd2..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_clean.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes explicit='clean' -Expect: not bozo and feed['itunes_explicit'] is False ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit>clean</itunes:explicit> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_false.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_false.xml deleted file mode 100644 index 71b2e0086..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_false.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes explicit="false" -Expect: not bozo and feed['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit>false</itunes:explicit> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_no.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_no.xml deleted file mode 100644 index 369021b68..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_no.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes explicit='no' -Expect: not bozo and feed['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit>no</itunes:explicit> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_true.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_true.xml deleted file mode 100644 index ddb7a8bd6..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_true.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes explicit="true" -Expect: not bozo and feed['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit>true</itunes:explicit> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_uppercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_uppercase.xml deleted file mode 100644 index a9fc6fa8c..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_uppercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes explicit="YES" -Expect: not bozo and feed['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit>YES</itunes:explicit> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_whitespace.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_whitespace.xml deleted file mode 100644 index 381053161..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_explicit_whitespace.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes explicit with spurious whitespace, see http://lists.apple.com/faq/pub/syndication-dev/index.php?sid=359&aktion=artikel&rubrik=001&id=3&lang=en , I'm assuming the same rules apply for explicit -Expect: not bozo and feed['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:explicit> yes </itunes:explicit> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_image.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_image.xml deleted file mode 100644 index 883352ef4..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_image.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel image -Expect: not bozo and feed['image']['href'] == u'http://example.com/logo.jpg' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:image href="http://example.com/logo.jpg"></itunes:image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_image_no_href.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_image_no_href.xml deleted file mode 100644 index a0d455a85..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_image_no_href.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: missing itunes:image@href doesn't overwrite existing image information -Expect: not bozo and feed['image']['href'] == u'http://i.INVALID/i.gif' ---> -<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"> -<channel> -<image> - <url>http://i.INVALID/i.gif</url> -</image> -<itunes:image></itunes:image> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_image_url.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_image_url.xml deleted file mode 100644 index 4778c7157..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_image_url.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel image (incorrectly using url attribute) -Expect: not bozo and feed['image']['href'] == u'http://a.b/i.png' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:image url="http://a.b/i.png"></itunes:image> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords.xml deleted file mode 100644 index 299fb7b3e..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel keywords -Expect: not bozo and feed['tags'][0]['term'] == u'Technology' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:keywords>Technology</itunes:keywords> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate.xml deleted file mode 100644 index 5ca4085dd..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel duplicate keywords -Expect: not bozo and len(feed['tags']) == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:keywords>Technology,Technology</itunes:keywords> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate_2.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate_2.xml deleted file mode 100644 index 4fcfa5b95..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_duplicate_2.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: iTunes channel keyword duplicated as category -Expect: not bozo and len(feed['tags']) == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:category text="Technology"></itunes:category> -<itunes:keywords>Technology</itunes:keywords> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_multiple.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_multiple.xml deleted file mode 100644 index 9629e014f..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_keywords_multiple.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel multiple keywords -Expect: not bozo and feed['tags'][1]['term'] == u'Gadgets' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:keywords>Technology, Gadgets</itunes:keywords> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_link_image.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_link_image.xml deleted file mode 100644 index c89dc9f1e..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_link_image.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel image as old-style link rel=image -Expect: not bozo and feed['image']['href'] == u'http://example.com/logo.jpg' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:link rel="image" href="http://example.com/logo.jpg"></itunes:link> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_email.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_email.xml deleted file mode 100644 index 92c433b46..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_email.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: iTunes channel owner name -Expect: not bozo and feed['publisher_detail']['email'] == u'mark@example.com' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:owner> -<itunes:name>Mark Pilgrim</itunes:name> -<itunes:email>mark@example.com</itunes:email> -</itunes:owner> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_name.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_name.xml deleted file mode 100644 index 6d3d54fe3..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_owner_name.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: iTunes channel owner name -Expect: not bozo and feed['publisher_detail']['name'] == u'Mark Pilgrim' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<itunes:owner> -<itunes:name>Mark Pilgrim</itunes:name> -<itunes:email>mark@example.com</itunes:email> -</itunes:owner> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_subtitle.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_subtitle.xml deleted file mode 100644 index c638bf5b4..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_subtitle.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel subtitle -Expect: not bozo and feed['subtitle'] == u'Example subtitle' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:subtitle>Example subtitle</itunes:subtitle> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_channel_summary.xml b/lib/feedparser/tests/wellformed/itunes/itunes_channel_summary.xml deleted file mode 100644 index f23b32844..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_channel_summary.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes channel summary -Expect: not bozo and feed['description'] == u'Example summary' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:summary>Example summary</itunes:summary> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_core_element_uppercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_core_element_uppercase.xml deleted file mode 100644 index 9b3e91f28..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_core_element_uppercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes treats non-iTunes element names as case-insensitive -Expect: not bozo and feed['title'] == u'Example title' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<TiTlE>Example title</TiTlE> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_author_map_author.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_author_map_author.xml deleted file mode 100644 index e67648450..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_author_map_author.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item author maps to author -Expect: not bozo and entries[0]['author'] == u'Mark Pilgrim' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:author>Mark Pilgrim</itunes:author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_block.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_block.xml deleted file mode 100644 index e7d05ccd0..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_block.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes block -Expect: not bozo and entries[0]['itunes_block'] == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:block>yes</itunes:block> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_false.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_block_false.xml deleted file mode 100644 index 7f9d4da7c..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_false.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes block="false" -Expect: not bozo and entries[0]['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:block>false</itunes:block> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_no.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_block_no.xml deleted file mode 100644 index f09435bbf..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_no.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes block='no' -Expect: not bozo and entries[0]['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:block>no</itunes:block> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_true.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_block_true.xml deleted file mode 100644 index e30de679d..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_true.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes block="true" -Expect: not bozo and entries[0]['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:block>true</itunes:block> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_uppercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_block_uppercase.xml deleted file mode 100644 index 8ebabeab5..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_uppercase.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes block="YES" -Expect: not bozo and entries[0]['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:block>YES</itunes:block> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_whitespace.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_block_whitespace.xml deleted file mode 100644 index ca71b54e1..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_block_whitespace.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes block with spurious whitespace, see http://lists.apple.com/faq/pub/syndication-dev/index.php?sid=359&aktion=artikel&rubrik=001&id=3&lang=en -Expect: not bozo and entries[0]['itunes_block'] == 0 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:block> yes </itunes:block> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_category.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_category.xml deleted file mode 100644 index 54e312ca2..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_category.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item category -Expect: not bozo and entries[0]['tags'][0]['term'] == u'Technology' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> -<itunes:category text="Technology"></itunes:category> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_category_nested.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_category_nested.xml deleted file mode 100644 index 4939da1bf..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_category_nested.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: iTunes item nested category -Expect: not bozo and entries[0]['tags'][1]['term'] == u'Gadgets' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> -<itunes:category text="Technology"> - <itunes:category text="Gadgets"></itunes:category> -</itunes:category> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_category_scheme.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_category_scheme.xml deleted file mode 100644 index ab66dcc47..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_category_scheme.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes channel category scheme -Expect: not bozo and entries[0]['tags'][0]['scheme'] == u'http://www.itunes.com/' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> -<itunes:category text="Technology"></itunes:category> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_duration.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_duration.xml deleted file mode 100644 index 20a83efbd..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_duration.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes duration -Expect: not bozo and entries[0]['itunes_duration'] == u'3:00' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:duration>3:00</itunes:duration> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit.xml deleted file mode 100644 index e5d9d39ce..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit -Expect: not bozo and entries[0]['itunes_explicit'] == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit>yes</itunes:explicit> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_clean.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_clean.xml deleted file mode 100644 index eb4e89e89..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_clean.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit='clean' -Expect: not bozo and entries[0]['itunes_explicit'] is False ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit>clean</itunes:explicit> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_false.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_false.xml deleted file mode 100644 index f3c0610d0..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_false.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit="false" -Expect: not bozo and entries[0]['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit>false</itunes:explicit> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_no.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_no.xml deleted file mode 100644 index b2a0b3cd2..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_no.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit='no' -Expect: not bozo and entries[0]['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit>no</itunes:explicit> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_true.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_true.xml deleted file mode 100644 index c42c3c58c..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_true.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit="true" -Expect: not bozo and entries[0]['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit>true</itunes:explicit> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_uppercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_uppercase.xml deleted file mode 100644 index 017c24d58..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_uppercase.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit="YES" -Expect: not bozo and entries[0]['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit>YES</itunes:explicit> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_whitespace.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_whitespace.xml deleted file mode 100644 index 8bf2f5392..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_explicit_whitespace.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes explicit with spurious whitespace, see http://lists.apple.com/faq/pub/syndication-dev/index.php?sid=359&aktion=artikel&rubrik=001&id=3&lang=en -Expect: not bozo and entries[0]['itunes_explicit'] is None ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:explicit> yes </itunes:explicit> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_image.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_image.xml deleted file mode 100644 index 2c0f9c76f..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_image.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item image -Expect: not bozo and entries[0]['image']['href'] == u'http://example.com/logo.jpg' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:image href="http://example.com/logo.jpg"></itunes:image> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_image_url.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_image_url.xml deleted file mode 100644 index 3a23c495e..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_image_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item image (incorrectly using url attribute) -Expect: not bozo and entries[0]['image']['href'] == u'http://a.b/i.png' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:image url="http://a.b/i.png"></itunes:image> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_link_image.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_link_image.xml deleted file mode 100644 index befa0ac97..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_link_image.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item image as old-style link rel=image -Expect: not bozo and entries[0]['image']['href'] == u'http://example.com/logo.jpg' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:link rel="image" href="http://example.com/logo.jpg"></itunes:link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_subtitle.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_subtitle.xml deleted file mode 100644 index 7a485236b..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_subtitle.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item subtitle -Expect: not bozo and entries[0]['subtitle'] == u'Example subtitle' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:subtitle>Example subtitle</itunes:subtitle> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_item_summary.xml b/lib/feedparser/tests/wellformed/itunes/itunes_item_summary.xml deleted file mode 100644 index 159918a1d..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_item_summary.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: iTunes item summary -Expect: not bozo and entries[0]['summary'] == u'Example summary' ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> -<item> - <itunes:summary>Example summary</itunes:summary> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_namespace.xml b/lib/feedparser/tests/wellformed/itunes/itunes_namespace.xml deleted file mode 100644 index 8a1fc43bc..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_namespace.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes namespace (2005-07-07 spec) -Expect: not bozo and feed['itunes_block'] == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>yes</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_namespace_example.xml b/lib/feedparser/tests/wellformed/itunes/itunes_namespace_example.xml deleted file mode 100644 index 24221d80d..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_namespace_example.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes namespace (example in 2005-07-07 spec) -Expect: not bozo and feed['itunes_block'] == 1 ---> -<rss xmlns:itunes="http://example.com/DTDs/Podcast-1.0.dtd"> -<channel> - <itunes:block>yes</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_namespace_lowercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_namespace_lowercase.xml deleted file mode 100644 index fdceb9e22..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_namespace_lowercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes namespace (lowercase) -Expect: not bozo and feed['itunes_block'] == 1 ---> -<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> -<channel> - <itunes:block>yes</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/itunes/itunes_namespace_uppercase.xml b/lib/feedparser/tests/wellformed/itunes/itunes_namespace_uppercase.xml deleted file mode 100644 index 9d78ea5e1..000000000 --- a/lib/feedparser/tests/wellformed/itunes/itunes_namespace_uppercase.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: iTunes namespace (uppercase) -Expect: not bozo and feed['itunes_block'] == 1 ---> -<rss xmlns:itunes="HTTP://WWW.ITUNES.COM/DTDS/PODCAST-1.0.DTD"> -<channel> - <itunes:block>yes</itunes:block> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/channel_dc_language.xml b/lib/feedparser/tests/wellformed/lang/channel_dc_language.xml deleted file mode 100644 index 8ca66fbea..000000000 --- a/lib/feedparser/tests/wellformed/lang/channel_dc_language.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:language -Expect: not bozo and feed['language'] == u'en' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:language>en</dc:language> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/channel_language.xml b/lib/feedparser/tests/wellformed/lang/channel_language.xml deleted file mode 100644 index 85009399a..000000000 --- a/lib/feedparser/tests/wellformed/lang/channel_language.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: normal language -Expect: not bozo and feed['language'] == u'en-us' ---> -<rss version="2.0"> -<channel> -<language>en-us</language> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang.xml deleted file mode 100644 index 96bf686bf..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content language from xml:lang -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content xml:lang="en">Example Atom</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank.xml deleted file mode 100644 index 25bf9c34c..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content defines blank xml:lang -Expect: not bozo and entries[0]['content'][0]['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <content type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_2.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_2.xml deleted file mode 100644 index 6c5084980..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry defines blank xml:lang which children inherit -Expect: not bozo and entries[0]['content'][0]['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry xml:lang=""> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_3.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_3.xml deleted file mode 100644 index ea34db9da..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_blank_3.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: entry defines blank xml:lang which siblings do not inherit -Expect: not bozo and entries[1]['content'][0]['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry xml:lang=""> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -<entry> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit.xml deleted file mode 100644 index 80445b178..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content xml:lang inherited from parent element -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_2.xml deleted file mode 100644 index fe1d3b073..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content xml:lang overrides parent element -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> -<entry> - <content type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_3.xml deleted file mode 100644 index c80c753dd..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_3.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry content xml:lang resets properly on new element -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> -<entry> - <summary type="application/xhtml+xml" xml:lang="de"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <content type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_4.xml deleted file mode 100644 index 8399d1f17..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_inherit_4.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry content xml:lang inherits properly on new element -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <summary type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <content type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_underscore.xml b/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_underscore.xml deleted file mode 100644 index 9de86a43f..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_content_xml_lang_underscore.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content language from xml:lang -Expect: not bozo and entries[0]['content'][0]['language'] == u'en-US' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <content xml:lang="en_US">Example Atom</content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang.xml deleted file mode 100644 index 63d8966c0..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary content language from xml:lang -Expect: not bozo and entries[0]['summary_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <summary xml:lang="en">Example Atom</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_blank.xml deleted file mode 100644 index 39383476e..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_blank.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary defines blank xml:lang -Expect: not bozo and entries[0]['summary_detail']['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <summary type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit.xml deleted file mode 100644 index 4d1b16591..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary xml:lang inherited from parent element -Expect: not bozo and entries[0]['summary_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <summary type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_2.xml deleted file mode 100644 index 3d8940612..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary xml:lang overrides parent element -Expect: not bozo and entries[0]['summary_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> -<entry> - <summary type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_3.xml deleted file mode 100644 index 37ada76ce..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_3.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry summary xml:lang resets properly on new element -Expect: not bozo and entries[0]['summary_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="de"> -<entry> - <title type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <summary type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_4.xml deleted file mode 100644 index 4a5909e2b..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_summary_xml_lang_inherit_4.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry summary xml:lang inherits properly on new element -Expect: not bozo and entries[0]['summary_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <title type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <summary type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang.xml deleted file mode 100644 index e10a4fd69..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title language from xml:lang -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> - <title xml:lang="en">Example Atom</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_blank.xml deleted file mode 100644 index 0152a4aa6..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_blank.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title defines blank xml:lang -Expect: not bozo and entries[0]['title_detail']['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <title type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit.xml deleted file mode 100644 index 752bf686b..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title xml:lang inherited from parent element -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_2.xml deleted file mode 100644 index 2fa32a825..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title xml:lang overrides parent element -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> -<entry> - <title type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_3.xml deleted file mode 100644 index 93efc4d21..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_3.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry title xml:lang resets properly on new element -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> -<entry> - <summary type="application/xhtml+xml" xml:lang="de"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <title type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_4.xml deleted file mode 100644 index 28c8a0df2..000000000 --- a/lib/feedparser/tests/wellformed/lang/entry_title_xml_lang_inherit_4.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: entry title xml:lang inherits properly on new element -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<entry> - <summary type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></summary> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang.xml deleted file mode 100644 index 2ec0dffc5..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright content language from xml:lang -Expect: not bozo and feed['copyright_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <copyright xml:lang="en">Example Atom</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_blank.xml deleted file mode 100644 index 1dc0b95d1..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_blank.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright defines blank xml:lang -Expect: not bozo and feed['copyright_detail']['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <copyright type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit.xml deleted file mode 100644 index 0edff944e..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright xml:lang inherited from parent element -Expect: not bozo and feed['copyright_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <copyright type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_2.xml deleted file mode 100644 index 900a3242b..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright xml:lang overrides parent element -Expect: not bozo and feed['copyright_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> - <copyright type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_3.xml deleted file mode 100644 index 3957f4547..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed copyright xml:lang resets properly on new element -Expect: not bozo and feed['copyright_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="de"> - <info type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <copyright type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_4.xml deleted file mode 100644 index 0752e9662..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_copyright_xml_lang_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed copyright xml:lang inherits properly on new element -Expect: not bozo and feed['copyright_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <copyright type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang.xml deleted file mode 100644 index e863e8de9..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info content language from xml:lang -Expect: not bozo and feed['info_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <info xml:lang="en">Example Atom</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_blank.xml deleted file mode 100644 index cb8f7f5aa..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_blank.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info defines blank xml:lang -Expect: not bozo and feed['info_detail']['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit.xml deleted file mode 100644 index b36cfa8d5..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info xml:lang inherited from parent element -Expect: not bozo and feed['info_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_2.xml deleted file mode 100644 index 8e6654060..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info xml:lang overrides parent element -Expect: not bozo and feed['info_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> - <info type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_3.xml deleted file mode 100644 index 5aaf56a25..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed info xml:lang resets properly on new element -Expect: not bozo and feed['info_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> - <title type="application/xhtml+xml" xml:lang="de"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <info type="application/xhtml+xml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_4.xml deleted file mode 100644 index 4764fb03b..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_info_xml_lang_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed info xml:lang inherits properly on new element -Expect: not bozo and feed['info_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <title type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> - <info type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_language.xml b/lib/feedparser/tests/wellformed/lang/feed_language.xml deleted file mode 100644 index 4301594c8..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_language.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed language from language -Expect: not bozo and feed['language'] == u'en' ---> -<rss> -<channel> -<language>en</language> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_language_override.xml b/lib/feedparser/tests/wellformed/lang/feed_language_override.xml deleted file mode 100644 index 4301594c8..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_language_override.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: feed language from language -Expect: not bozo and feed['language'] == u'en' ---> -<rss> -<channel> -<language>en</language> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_not_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/feed_not_xml_lang.xml deleted file mode 100644 index 6e89e9c93..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_not_xml_lang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed language from xml:lang -Expect: not bozo and feed['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -<title xml:lang="fr">foo</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_not_xml_lang_2.xml b/lib/feedparser/tests/wellformed/lang/feed_not_xml_lang_2.xml deleted file mode 100644 index 5ea58f5e7..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_not_xml_lang_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed language from language -Expect: not bozo and not feed.has_key('language') ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title xml:lang="en">foo</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang.xml deleted file mode 100644 index c7a3088e4..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline content language from xml:lang -Expect: not bozo and feed['tagline_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <tagline xml:lang="en">Example Atom</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_blank.xml deleted file mode 100644 index ece120842..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_blank.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline defines blank xml:lang -Expect: not bozo and feed['tagline_detail']['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <tagline type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit.xml deleted file mode 100644 index 97d788963..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline xml:lang inherited from parent element -Expect: not bozo and feed['tagline_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <tagline type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_2.xml deleted file mode 100644 index 72fea3c62..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline xml:lang overrides parent element -Expect: not bozo and feed['tagline_detail']['language'] == u'fr' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <tagline type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_3.xml deleted file mode 100644 index bda6b065f..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed tagline xml:lang resets properly on new element -Expect: not bozo and feed['tagline_detail']['language'] == u'de' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <tagline type="application/xhtml+xml" xml:lang="de"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_4.xml deleted file mode 100644 index 8d9b83dd8..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_tagline_xml_lang_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed tagline xml:lang inherits properly on new element -Expect: not bozo and feed['tagline_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <tagline type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang.xml deleted file mode 100644 index 3ce6b48d3..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title content language from xml:lang -Expect: not bozo and feed['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> - <title xml:lang="en">Example Atom</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_blank.xml b/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_blank.xml deleted file mode 100644 index 12a5d4656..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_blank.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title defines blank xml:lang -Expect: not bozo and feed['title_detail']['language'] == None ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <title type="application/xhtml+xml" xml:lang=""><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit.xml deleted file mode 100644 index 0a2e6b205..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title xml:lang inherited from parent element -Expect: not bozo and feed['title_detail']['language'] == u'de' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="de"> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_2.xml deleted file mode 100644 index 1d9a636d5..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_2.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title xml:lang overrides parent element -Expect: not bozo and feed['title_detail']['language'] == u'de' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <title type="application/xhtml+xml" xml:lang="de"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_3.xml b/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_3.xml deleted file mode 100644 index 535e34e83..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_3.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed title xml:lang resets properly on new element -Expect: not bozo and feed['title_detail']['language'] == u'de' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <title type="application/xhtml+xml" xml:lang="de"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_4.xml b/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_4.xml deleted file mode 100644 index de9bff9ef..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_title_xml_lang_inherit_4.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: feed title xml:lang inherits properly on new element -Expect: not bozo and feed['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> - <info type="application/xhtml+xml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml">blah blah blah</div></info> - <title type="application/xhtml+xml"><div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/feed_xml_lang.xml deleted file mode 100644 index e60bc5593..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_xml_lang.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: feed language from xml:lang -Expect: not bozo and feed['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en"> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/feed_xml_lang_underscore.xml b/lib/feedparser/tests/wellformed/lang/feed_xml_lang_underscore.xml deleted file mode 100644 index d29a49e78..000000000 --- a/lib/feedparser/tests/wellformed/lang/feed_xml_lang_underscore.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: feed language from xml:lang -Expect: not bozo and feed['language'] == u'en-US' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="en_US"> -</feed> diff --git a/lib/feedparser/tests/wellformed/lang/http_content_language.xml b/lib/feedparser/tests/wellformed/lang/http_content_language.xml deleted file mode 100644 index cc245abb8..000000000 --- a/lib/feedparser/tests/wellformed/lang/http_content_language.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Content-Language: en -Description: feed language from content-language -Expect: not bozo and feed['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit.xml b/lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit.xml deleted file mode 100644 index 97c4b199b..000000000 --- a/lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Language: en -Description: entry title language from content-language -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title>foo</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit_2.xml b/lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit_2.xml deleted file mode 100644 index cc573e9a4..000000000 --- a/lib/feedparser/tests/wellformed/lang/http_content_language_entry_title_inherit_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Header: Content-Language: en -Description: entry title language from content-language (this one is harder than the others) -Expect: not bozo and entries[0]['title_detail']['language'] == u'en' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<id xml:lang="fr">1</id> -<title>foo</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/http_content_language_feed_language.xml b/lib/feedparser/tests/wellformed/lang/http_content_language_feed_language.xml deleted file mode 100644 index 4421746b9..000000000 --- a/lib/feedparser/tests/wellformed/lang/http_content_language_feed_language.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Header: Content-Language: en -Description: feed language overrides content-language -Expect: not bozo and feed['language'] == u'fr' ---> -<rss> -<channel> -<language>fr</language> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/http_content_language_feed_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/http_content_language_feed_xml_lang.xml deleted file mode 100644 index 0ab11869e..000000000 --- a/lib/feedparser/tests/wellformed/lang/http_content_language_feed_xml_lang.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Header: Content-Language: en -Description: feed xml:lang overrides content-language -Expect: not bozo and feed['language'] == u'fr' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr"> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang.xml deleted file mode 100644 index 0a61f55b2..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: content:encoded -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded xml:lang="en"><p>Example content</p></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang_inherit.xml deleted file mode 100644 index 69397d46c..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_content_encoded_xml_lang_inherit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: content:encoded -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xml:lang="en"> -<channel> -<item> -<content:encoded><p>Example content</p></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_dc_language.xml b/lib/feedparser/tests/wellformed/lang/item_dc_language.xml deleted file mode 100644 index 045a4715a..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_dc_language.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:language -Expect: not bozo and entries[0]['language'] == u'en' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:language>en</dc:language> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang.xml deleted file mode 100644 index 0a4da4ad0..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: fullitem language -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem xml:lang="en"><p>Example content</p></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang_inherit.xml deleted file mode 100644 index 7fe98d1ce..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_fullitem_xml_lang_inherit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: fullitem xml:lang inherited from parent element -Expect: not bozo and entries[0]['content'][0]['language'] == u'en' ---> -<rss version="2.0" xml:lang="en"> -<channel> -<item> -<fullitem><p>Example content</p></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang.xml b/lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang.xml deleted file mode 100644 index 4f4838776..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: xhtml:body xml:lang -Expect: not bozo and entries[0]['content'][0]['language'] == 'en' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> -<p>Example content</p> -</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang_inherit.xml b/lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang_inherit.xml deleted file mode 100644 index a9eb6347a..000000000 --- a/lib/feedparser/tests/wellformed/lang/item_xhtml_body_xml_lang_inherit.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: xhtml:body xml:lang -Expect: not bozo and entries[0]['content'][0]['language'] == 'en' ---> -<rss version="2.0" xml:lang="en"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"> -<p>Example content</p> -</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/mf_hcard/3-5-5-org-unicode.xml b/lib/feedparser/tests/wellformed/mf_hcard/3-5-5-org-unicode.xml deleted file mode 100644 index 3cb6c96f8..000000000 --- a/lib/feedparser/tests/wellformed/mf_hcard/3-5-5-org-unicode.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: hcard contains non-ascii character -Expect: not bozo and entries[0]['vcard'] == u"BEGIN:vCard\nVERSION:3.0\nORG:\u00b4\nEND:vCard" ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <content type="html"> -<div class="vcard"> -<span class='org'>´</span> -</div> - </content> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/mf_rel_tag/rel_tag_term_no_term.xml b/lib/feedparser/tests/wellformed/mf_rel_tag/rel_tag_term_no_term.xml deleted file mode 100644 index 75db178e8..000000000 --- a/lib/feedparser/tests/wellformed/mf_rel_tag/rel_tag_term_no_term.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -SkipUnless: feedparser.BeautifulSoup -Description: rel='tag' link contains no actual term -Expect: not bozo and 'tags' not in entries[0] ---> -<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> -<channel> -<item> -<content:encoded><a href='http://empty-path.test' rel='tag'>anything</a></content:encoded> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/namespace/atommathml.xml b/lib/feedparser/tests/wellformed/namespace/atommathml.xml deleted file mode 100644 index 1795a2e03..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atommathml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: MathML w/XLink -Expect: not bozo and entries[0]['description'] == '<math xmlns="http://www.w3.org/1998/Math/MathML"><mrow xlink:href="http://golem.ph.utexas.edu" xlink:show="replace" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mrow></math>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry xmlns:xlink="http://www.w3.org/1999/xlink"> -<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow xlink:type="simple" xlink:show="replace" xlink:href="http://golem.ph.utexas.edu"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mrow></math></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomsvg.xml b/lib/feedparser/tests/wellformed/namespace/atomsvg.xml deleted file mode 100644 index ecee5ed7f..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomsvg.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></circle></svg>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg"> -<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg:svg version="1.1" baseProfile="full" width="300px" height="200px"><svg:circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px"/></svg:svg></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomsvgdctitle.xml b/lib/feedparser/tests/wellformed/namespace/atomsvgdctitle.xml deleted file mode 100644 index d28c9e336..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomsvgdctitle.xml +++ /dev/null @@ -1,36 +0,0 @@ -<!-- -Description: SVG -Expect: 1 ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <entry> - <content type="xhtml"> - <div xmlns="http://www.w3.org/1999/xhtml"> - <p>Before</p> - <svg xmlns="http://www.w3.org/2000/svg"> - <metadata> - <rdf:RDF xmlns:cc="http://web.resource.org/cc/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> - <cc:Work rdf:about=""> - <dc:title>Christmas Tree</dc:title> - <dc:description></dc:description> - <dc:creator> - <cc:Agent> - <dc:title>Aaron Spike</dc:title> - </cc:Agent> - </dc:creator> - </cc:Work> - <cc:License rdf:about="http://web.resource.org/cc/PublicDomain"> - <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/> - <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/> - <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/> - </cc:License> - </rdf:RDF> - </metadata> - </svg> - <p>After</p> - </div> - </content> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomsvgdesc.xml b/lib/feedparser/tests/wellformed/namespace/atomsvgdesc.xml deleted file mode 100644 index 5f9311cd9..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomsvgdesc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><desc><abbr>foo</abbr></desc><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></circle></svg>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg version="1.1" baseProfile="full" width="300px" height="200px" xmlns="http://www.w3.org/2000/svg"><desc><abbr>foo</abbr></desc><circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px"/></svg></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomsvgtitle.xml b/lib/feedparser/tests/wellformed/namespace/atomsvgtitle.xml deleted file mode 100644 index 7848e992f..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomsvgtitle.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><title>foo</title><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></circle></svg>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg version="1.1" baseProfile="full" width="300px" height="200px" xmlns="http://www.w3.org/2000/svg"><title>foo</title><circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px"/></svg></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomthreading.xml b/lib/feedparser/tests/wellformed/namespace/atomthreading.xml deleted file mode 100644 index b5d6ea66d..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomthreading.xml +++ /dev/null @@ -1,5 +0,0 @@ -<!-- -Description: Atom threading extension -Expect: not bozo and feed['thr_in-reply-to']['href'] == u'http://salmon-test.blogspot.com/2009/10/test-post.html' and feed['thr_in-reply-to']['ref'] == u'tag:blogger.com,1999:blog-893591374313312737.post-3861663258538857954' and feed['thr_in-reply-to']['source'] == u'http://www.blogger.com/feeds/893591374313312737/posts/default/3861663258538857954' and feed['thr_in-reply-to']['type'] == u'text/html' ---> -<feed xmlns="http://www.w3.org/2005/Atom"><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://salmon-test.blogspot.com/2009/10/test-post.html' ref='tag:blogger.com,1999:blog-893591374313312737.post-3861663258538857954' source='http://www.blogger.com/feeds/893591374313312737/posts/default/3861663258538857954' type='text/html'/></feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomthreadingwithentry.xml b/lib/feedparser/tests/wellformed/namespace/atomthreadingwithentry.xml deleted file mode 100644 index 79c7e4d0b..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomthreadingwithentry.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- -Description: Atom threading extension -Expect: not bozo and entries[0]['thr_in-reply-to']['href'] == u'http://salmon-test.blogspot.com/2009/10/test-post.html' and entries[0]['thr_in-reply-to']['ref'] == u'tag:blogger.com,1999:blog-893591374313312737.post-3861663258538857954' and entries[0]['thr_in-reply-to']['source'] == u'http://www.blogger.com/feeds/893591374313312737/posts/default/3861663258538857954' and entries[0]['thr_in-reply-to']['type'] == u'text/html' ---> -<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-893591374313312737.post3861663258538857954..comments</id><updated>2009-12-08T16:59:02.563-08:00</updated><title type='text'>Comments on salmon-test: Test post</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://salmon-test.blogspot.com/feeds/3861663258538857954/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/893591374313312737/3861663258538857954/comments/default'/><link rel='alternate' type='text/html' href='http://salmon-test.blogspot.com/2009/10/test-post.html'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/893591374313312737/3861663258538857954/comments/default?start-index=26&max-results=25'/><author><name>John</name><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-893591374313312737.post-4788628857625737701</id><published>2009-12-08T16:59:02.544-08:00</published><updated>2009-12-08T16:59:02.544-08:00</updated><title type='text'>bloffo bliff by te...</title><content type='html'>bloffo bliff by <a href="http://example.org/profile/te..." rel="nofollow">te...</a></content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/893591374313312737/3861663258538857954/comments/default/4788628857625737701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/893591374313312737/3861663258538857954/comments/default/4788628857625737701'/><link rel='alternate' type='text/html' href='http://salmon-test.blogspot.com/2009/10/test-post.html?showComment=1260320342544#c4788628857625737701' title=''/><author><name>John</name><uri>http://www.blogger.com/profile/12344017489797258795</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='07886630143387711930'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://salmon-test.blogspot.com/2009/10/test-post.html' ref='tag:blogger.com,1999:blog-893591374313312737.post-3861663258538857954' source='http://www.blogger.com/feeds/893591374313312737/posts/default/3861663258538857954' type='text/html'/></entry></feed> diff --git a/lib/feedparser/tests/wellformed/namespace/atomxlink.xml b/lib/feedparser/tests/wellformed/namespace/atomxlink.xml deleted file mode 100644 index ed7105ece..000000000 --- a/lib/feedparser/tests/wellformed/namespace/atomxlink.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><a xlink:href="http://example.com/" xmlns:xlink="http://www.w3.org/1999/xlink"><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></circle></a></svg>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg"> -<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg:svg version="1.1" baseProfile="full" width="300px" height="200px"><svg:a xlink:href="http://example.com/"><svg:circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px"/></svg:a></svg:svg></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/namespace/rss1.0withModules.xml b/lib/feedparser/tests/wellformed/namespace/rss1.0withModules.xml deleted file mode 100644 index 469b7630e..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss1.0withModules.xml +++ /dev/null @@ -1,47 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss1.0withModules.xml - included here with permission -Description: RSS 1.0 with modules -Expect: not bozo and entries[0]['title'] == u'Test Item - RSS 1.0' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns="http://purl.org/rss/1.0/" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <channel rdf:about="http://www.pocketsoap.com/rssTests/"> - <title>RSS Tests - RSS 1.0</title> - <link>http://www.pocketsoap.com/rssTests/rss1.0withModules.xml</link> - <description>A set of test RSS files for examining the state of extension support in RSS aggregators</description> - <dc:language>en-gb</dc:language> - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - - <dc:date>2002-09-28T20:01:19Z</dc:date> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - <image rdf:resource="http://www.w3.org/RDF/icons/rdf_powered_button.32" /> - <items> - <rdf:Seq> - <rdf:li rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModules.xml#1" /> - </rdf:Seq> - </items> - - </channel> - <item rdf:about="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModules.xml#1"> - <title>Test Item - RSS 1.0</title> - <link>http://www.pocketsoap.com/weblog/rssTests/rss1.0withModules.xml#1</link> - <l:link l:rel="http://purl.org/rss/1.0/modules/proposed/link/#permalink" l:type="text/html" rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModules.xml#1" /> - <description>This is a fairly standard RSS 1.0 feed with a few modules, with no localname clashes, any aggregator that supports RSS 1.0 should handle this fine (RSS 1.0)</description> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - </item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNS.xml b/lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNS.xml deleted file mode 100644 index d0442be1f..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNS.xml +++ /dev/null @@ -1,48 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss1.0withModulesNoDefNS.xml - included here with permission -Description: RSS 1.0, no default namespace -Expect: not bozo and entries[0]['title'] == u'Test Item - RSS 1.0 no Default NS' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:rss="http://purl.org/rss/1.0/" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <rss:channel rdf:about="http://www.pocketsoap.com/rssTests/"> - <rss:title>RSS Tests - RSS 1.0 no Default NS</rss:title> - <rss:link>http://www.pocketsoap.com/rssTests/rss1.0withModulesNoDefNS.xml</rss:link> - <rss:description>A set of test RSS files for examining the state of extension support in RSS aggregators</rss:description> - <dc:language>en-gb</dc:language> - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - - <dc:date>2002-09-28T20:01:19Z</dc:date> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - <rss:image rdf:resource="http://www.w3.org/RDF/icons/rdf_powered_button.32" /> - <rss:items> - <rdf:Seq> - <rdf:li rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNS.xml#1" /> - </rdf:Seq> - </rss:items> - - </rss:channel> - <rss:item rdf:about="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNS.xml#1"> - <rss:title>Test Item - RSS 1.0 no Default NS</rss:title> - <rss:link>http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNS.xml#1</rss:link> - <l:link l:rel="http://purl.org/rss/1.0/modules/proposed/link/#permalink" l:type="text/html" rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNS.xml#1" /> - <rss:description>This is a fairly standard RSS 1.0 feed with a few modules, with no localname clashes, any aggregator that supports RSS 1.0 should handle this fine. This doesn't use - any default namespace declarations, all namespaces are mapped to prefixes. As far the namespace spec is concerned this is identical to the rss1.0withModules.xml version (RSS 1.0 no Default NS)</rss:description> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - </rss:item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNSLocalNameClash.xml b/lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNSLocalNameClash.xml deleted file mode 100644 index f09c9f5fd..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss1.0withModulesNoDefNSLocalNameClash.xml +++ /dev/null @@ -1,53 +0,0 @@ -<!-- -Credits: Simon Fell - adapted from http://www.pocketsoap.com/rssTests/rss1.0withModulesNoDefNSLocalNameClash.xml - included here with permission -Description: RSS 1.0, no default namespace, local namespace clash -Expect: not bozo and entries[0]['description'] == u'correct description' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:rss="http://purl.org/rss/1.0/" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:szf="http://schemas.pocketsoap.com/rss/myDescModule/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <rss:channel rdf:about="http://www.pocketsoap.com/rssTests/"> - <rss:title>RSS Tests - RSS 1.0 no Default NS, localName clashes</rss:title> - <rss:link>http://www.pocketsoap.com/rssTests/rss1.0withModulesNoDefNSLocalNameClash.xml</rss:link> - <rss:description>A set of test RSS files for examining the state of extension support in RSS aggregators</rss:description> - <dc:language>en-gb</dc:language> - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - - <dc:date>2002-09-28T20:01:19Z</dc:date> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - <rss:image rdf:resource="http://www.w3.org/RDF/icons/rdf_powered_button.32" /> - <rss:items> - <rdf:Seq> - <rdf:li rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNSLocalNameClash.xml#1" /> - </rdf:Seq> - </rss:items> - - </rss:channel> - <rss:item rdf:about="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNSLocalNameClash.xml#1"> - <rss:title>Test Item - RSS 1.0 no Default NS, localName clashes</rss:title> - <rss:link>http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNSLocalNameClash.xml#1</rss:link> - <l:link l:rel="http://purl.org/rss/1.0/modules/proposed/link/#permalink" l:type="text/html" rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss1.0withModulesNoDefNSLocalNameClash.xml#1" /> - <szf:description>This is a extension module that is in a different namespace, but uses a localname from the RSS core spec. - This shouldn't appear in your aggregator, but probably does. (pre rss:description RSS 1.0 no Default NS, localName clashes) - </szf:description> - <rss:description>correct description</rss:description> - <szf:description>This is a extension module that is in a different namespace, but uses a localname from the RSS core spec. - This shouldn't appear in your aggregator, but probably does. (post rss:description RSS 1.0 no Default NS, localName clashes) - </szf:description> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - </rss:item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModules.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModules.xml deleted file mode 100644 index 99f40d770..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModules.xml +++ /dev/null @@ -1,50 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss2.0NSwithModules.xml - included here with permission -Description: RSS 2.0 in Username namespace -Expect: not bozo and entries[0]['title'] == u'Test Item - RSS2.0 w/ NS' ---> -<rss version="2.0" - xmlns="http://backend.userland.com/rss2" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <channel> - <title>RSS Tests - RSS2.0 w/ NS</title> - <link>http://www.pocketsoap.com/rssTests/rss2.0NSwithModules.xml</link> - <description>A set of test RSS files for examining the state of extension support in RSS aggregators</description> - <language>en-gb</language> - <copyright>Copyright 2002 Simon Fell</copyright> - - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - <dc:date>2002-09-28T21:00:02Z</dc:date> - <lastBuildDate>Sat, 28 Sep 2002 21:00:02 GMT</lastBuildDate> - <pubDate>Sat, 28 Sep 2002 21:00:02 GMT</pubDate> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - <managingEditor>sf@zaks.demon.co.uk</managingEditor> - - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <generator>ultraedit-32</generator> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <webMaster>sf@zaks.demon.co.uk (Simon Fell)</webMaster> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - - <item> - <title>Test Item - RSS2.0 w/ NS</title> - <link>http://www.pocketsoap.com/weblog/rssTests/rss2.0NSwithModules.xml#1</link> - <description>This is a fairly standard RSS 2.0 feed, it uses a few modules, the RSS 2.0 elements are in the http://backend.userland.com/rss2 namespace, all module elements are in their required namespaces. - there are no localname clashes. This is very similar to a RSS1.0 feed. (RSS2.0 w/ NS) - </description> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - </item> - </channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNS.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNS.xml deleted file mode 100644 index 7f374dd20..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNS.xml +++ /dev/null @@ -1,50 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss2.0NSwithModulesNoDefNS.xml - included here with permission -Description: RSS 2.0 in Username namespace, no default namespace -Expect: not bozo and entries[0]['title'] == u'Test Item - - RSS2.0 w/ NS no default NS' ---> -<r:rss version="2.0" - xmlns:r="http://backend.userland.com/rss2" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <r:channel> - <r:title>RSS Tests - RSS2.0 w/ NS no default NS</r:title> - <r:link>http://www.pocketsoap.com/rssTests/rss2.0NSwithModulesNoDefNS.xml</r:link> - <r:description>A set of test RSS files for examining the state of extension support in RSS aggregators</r:description> - <r:language>en-gb</r:language> - <r:copyright>Copyright 2002 Simon Fell</r:copyright> - - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - <dc:date>2002-09-28T21:00:02Z</dc:date> - <r:lastBuildDate>Sat, 28 Sep 2002 21:00:02 GMT</r:lastBuildDate> - <r:pubDate>Sat, 28 Sep 2002 21:00:02 GMT</r:pubDate> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - <r:managingEditor>sf@zaks.demon.co.uk</r:managingEditor> - - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <r:generator>ultraedit-32</r:generator> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <r:webMaster>sf@zaks.demon.co.uk (Simon Fell)</r:webMaster> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - - <r:item> - <r:title>Test Item - - RSS2.0 w/ NS no default NS</r:title> - <r:link>http://www.pocketsoap.com/weblog/rssTests/rss2.0withModulesNoDefNS.xml#1</r:link> - <r:description>This is a fairly standard RSS 2.0 feed, it uses a few modules, the RSS 2.0 elements are in the http://backend.userland.com/rss2 namespace, all module elements are in their required namespaces. - there are no localname clashes, all elements uses namespace prefixes, there is no default namespace declared. This is very similar to a RSS1.0 feed. (RSS2.0 w/ NS no default NS) - </r:description> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - </r:item> - </r:channel> -</r:rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNSLocalNameClash.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNSLocalNameClash.xml deleted file mode 100644 index be99b57c4..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0NSwithModulesNoDefNSLocalNameClash.xml +++ /dev/null @@ -1,58 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss2.0NSwithModulesNoDefNSLocalNameClash.xml - included here with permission -Description: RSS 2.0 in Username namespace, no default namespace, local namespace clash -Expect: not bozo and entries[0]['description'] == u'correct description' ---> -<r:rss version="2.0" - xmlns:r="http://backend.userland.com/rss2" - xmlns:admin="http://webns.net/mvcb/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:szf="http://schemas.pocketsoap.com/rss/myDescModule/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <r:channel> - <r:title>RSS Tests - RSS2.0 w/ NS, no default NS, localName clash</r:title> - <r:link>http://www.pocketsoap.com/rssTests/rss2.0NSwithModulesNoDefNSLocalNameClash.xml</r:link> - <r:description>A set of test RSS files for examining the state of extension support in RSS aggregators</r:description> - <r:language>en-gb</r:language> - <dc:language>en-gb</dc:language> - - <r:copyright>Copyright 2002 Simon Fell</r:copyright> - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - <dc:date>2002-09-28T21:00:02Z</dc:date> - <r:lastBuildDate>Sat, 28 Sep 2002 21:00:02 GMT</r:lastBuildDate> - <r:pubDate>Sat, 28 Sep 2002 21:00:02 GMT</r:pubDate> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - - <r:managingEditor>sf@zaks.demon.co.uk</r:managingEditor> - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <r:generator>ultraedit-32</r:generator> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <r:webMaster>sf@zaks.demon.co.uk (Simon Fell)</r:webMaster> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - - <r:item> - <r:title>Test Item - RSS2.0 w/ NS, no default NS, localName clash</r:title> - <r:link>http://www.pocketsoap.com/weblog/rssTests/rss2.0NSwithModulesNoDefNSLocalNameClash.xml#1</r:link> - - <l:link l:rel="http://purl.org/rss/1.0/modules/proposed/link/#permalink" l:type="text/html" rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss2.0NSwithModulesLocalNameClash.xml#1" /> - <szf:description>This is a extension module that is in a different namespace, but uses a localname from the RSS core spec. - This shouldn't appear in your aggregator, but probably does. (pre rss:description - RSS2.0 w/ NS, no default NS, localName clash) - </szf:description> - <r:description>correct description</r:description> - <szf:description>This is a extension module that is in a different namespace, but uses a localname from the RSS core spec. - This shouldn't appear in your aggregator, but probably does. (post rss:description - RSS2.0 w/ NS, no default NS, localName clash) - </szf:description> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - - </r:item> - </r:channel> -</r:rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0mathml.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0mathml.xml deleted file mode 100644 index 0a1bbca74..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0mathml.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: MathML w/XLink -Expect: not bozo and entries[0]['description'] == '<math xmlns="http://www.w3.org/1998/Math/MathML"><mrow xlink:href="http://golem.ph.utexas.edu" xlink:show="replace" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mrow></math>' ---> -<rss version="2.0"> -<channel> -<item> -<description><math xmlns='http://www.w3.org/1998/Math/MathML'><mrow xlink:type="simple" xlink:show="replace" xlink:href="http://golem.ph.utexas.edu"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mrow></math></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModules.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModules.xml deleted file mode 100644 index 3869d9641..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModules.xml +++ /dev/null @@ -1,49 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss2.0noNSwithModules.xml - included here with permission -Description: RSS 2.0 with modules -Expect: not bozo and entries[0]['title'] == u'Test Item - RSS 2.0 no NS' ---> -<rss version="2.0" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <channel> - <title>RSS Tests - RSS2.0 no NS</title> - <link>http://www.pocketsoap.com/rssTests/rss2.0noNSwithModules.xml</link> - <description>A set of test RSS files for examining the state of extension support in RSS aggregators</description> - <language>en-gb</language> - <copyright>Copyright 2002 Simon Fell</copyright> - - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - <dc:date>2002-09-28T21:00:02Z</dc:date> - <lastBuildDate>Sat, 28 Sep 2002 21:00:02 GMT</lastBuildDate> - <pubDate>Sat, 28 Sep 2002 21:00:02 GMT</pubDate> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - <managingEditor>sf@zaks.demon.co.uk</managingEditor> - - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <generator>ultraedit-32</generator> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <webMaster>sf@zaks.demon.co.uk (Simon Fell)</webMaster> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - - <item> - <title>Test Item - RSS 2.0 no NS</title> - <link>http://www.pocketsoap.com/weblog/rssTests/rss2.0noNSwithModules.xml</link> - <description>This is a fairly standard RSS 2.0 feed, it uses a few modules, the RSS 2.0 elements aren't in any namespace, all module elements are in their required namespaces. - there are no localname clashes. This is largely backwardly compatible with 0.9x. (RSS 2.0 no NS) - </description> - - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - </item> - </channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModulesLocalNameClash.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModulesLocalNameClash.xml deleted file mode 100644 index 174de089d..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0noNSwithModulesLocalNameClash.xml +++ /dev/null @@ -1,57 +0,0 @@ -<!-- -Credits: Simon Fell - http://www.pocketsoap.com/rssTests/rss2.0noNSwithModulesLocalNameClash.xml - included here with permission -Description: RSS 2.0 with modules, local namespace clash -Expect: not bozo and entries[0]['description'] == u'correct description' ---> -<rss version="2.0" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:admin="http://webns.net/mvcb/" - xmlns:ag="http://purl.org/rss/modules/aggregation/" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:l="http://purl.org/rss/1.0/modules/link/" - xmlns:szf="http://schemas.pocketsoap.com/rss/myDescModule/" - xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"> - <channel> - <title>RSS Tests - RSS2.0 no NS localName clash</title> - <link>http://www.pocketsoap.com/rssTests/rss2.0noNSwithModulesLocalNameClash.xml</link> - <description>A set of test RSS files for examining the state of extension support in RSS aggregators</description> - <language>en-gb</language> - <dc:language>en-gb</dc:language> - - <copyright>Copyright 2002 Simon Fell</copyright> - <dc:rights>Copyright 2002 Simon Fell</dc:rights> - <dc:date>2002-09-28T21:00:02Z</dc:date> - <lastBuildDate>Sat, 28 Sep 2002 21:00:02 GMT</lastBuildDate> - <pubDate>Sat, 28 Sep 2002 21:00:02 GMT</pubDate> - <dc:creator>sf@zaks.demon.co.uk</dc:creator> - - <managingEditor>sf@zaks.demon.co.uk</managingEditor> - <dc:publisher>sf@zaks.demon.co.uk</dc:publisher> - <generator>ultraedit-32</generator> - <admin:errorReportsTo rdf:resource="mailto:sf@zaks.demon.co.uk" /> - <webMaster>sf@zaks.demon.co.uk (Simon Fell)</webMaster> - <dcterms:issued>2002-09-28T20:01:19Z</dcterms:issued> - - <dcterms:created>2002-01-12T02:15:32Z</dcterms:created> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:dateCopyrighted>2002</dcterms:dateCopyrighted> - - <item> - <title>Test Item - RSS2.0 no NS localName clash</title> - <link>http://www.pocketsoap.com/weblog/rssTests/rss2.0noNSwithModulesLocalNameClash.xml#1</link> - - <l:link l:rel="http://purl.org/rss/1.0/modules/proposed/link/#permalink" l:type="text/html" rdf:resource="http://www.pocketsoap.com/weblog/rssTests/rss2.0noNSwithModulesLocalNameClash.xml#1" /> - <szf:description>This is a extension module that is in a different namespace, but uses a localname from the RSS core spec. - This shouldn't appear in your aggregator, but probably does. (pre rss:description - RSS2.0 no NS localName clash) - </szf:description> - <description>correct description</description> - <szf:description>This is a extension module that is in a different namespace, but uses a localname from the RSS core spec. - This shouldn't appear in your aggregator, but probably does. (post rss:description - RSS2.0 no NS localName clash) - </szf:description> - <dcterms:modified>2002-09-28T20:01:19Z</dcterms:modified> - <dcterms:created>2002-09-28T20:01:19Z</dcterms:created> - - </item> - </channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0svg.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0svg.xml deleted file mode 100644 index 1a7a55465..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0svg.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></svg>' ---> -<rss version="2.0"> -<channel> -<item> -<description><svg version="1.1" baseProfile="full" width="300px" height="200px" xmlns="http://www.w3.org/2000/svg"><circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px" /></svg></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0svg5.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0svg5.xml deleted file mode 100644 index 8119615b2..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0svg5.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></svg>' ---> -<rss version="2.0"> -<channel> -<item> -<description><svg version="1.1" baseProfile="full" width="300px" height="200px"><circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px" /></svg></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0svgtitle.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0svgtitle.xml deleted file mode 100644 index e06a69ca4..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0svgtitle.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><title>foo</title><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></svg>' ---> -<rss version="2.0"> -<channel> -<item> -<description><svg version="1.1" baseProfile="full" width="300px" height="200px" xmlns="http://www.w3.org/2000/svg"><title>foo</title><circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px"/></svg></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0withAtomNS.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0withAtomNS.xml deleted file mode 100644 index 6f4bbe0b2..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0withAtomNS.xml +++ /dev/null @@ -1,27 +0,0 @@ -<!-- -Description: rss feed with Atom namespace -Expect: not bozo and version == 'rss20' ---> -<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/"> - <channel> - <title>Delicious/wearehugh</title> - <link>http://delicious.com/wearehugh</link> - <description>bookmarks posted by wearehugh</description> - <atom:link rel="self" type="application/rss+xml" href="http://feeds.delicious.com/v2/rss/wearehugh"/> - <item> - <title>rsync and vfat | Geek at Play</title> - <pubDate>Fri, 25 Dec 2009 03:30:22 +0000</pubDate> - <guid isPermaLink="false">http://delicious.com/url/174603f9d836a1aafac49e28ace1c19e#wearehugh</guid> - <link>http://www.kylev.com/2005/03/29/rsync-and-vfat/</link> - <dc:creator><![CDATA[wearehugh]]></dc:creator> - <comments>http://delicious.com/url/174603f9d836a1aafac49e28ace1c19e</comments> - <wfw:commentRss>http://feeds.delicious.com/v2/rss/url/174603f9d836a1aafac49e28ace1c19e</wfw:commentRss> - <source url="http://feeds.delicious.com/v2/rss/wearehugh">wearehugh's bookmarks</source> - <category domain="http://delicious.com/wearehugh/">rsync</category> - <category domain="http://delicious.com/wearehugh/">vfat</category> - <category domain="http://delicious.com/wearehugh/">windows</category> - <category domain="http://delicious.com/wearehugh/">linux</category> - <category domain="http://delicious.com/wearehugh/">mount</category> - </item> - </channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/namespace/rss2.0xlink.xml b/lib/feedparser/tests/wellformed/namespace/rss2.0xlink.xml deleted file mode 100644 index 047c0bce3..000000000 --- a/lib/feedparser/tests/wellformed/namespace/rss2.0xlink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: SVG -Expect: not bozo and entries[0]['description'] == '<svg baseProfile="full" height="200px" version="1.1" width="300px" xmlns="http://www.w3.org/2000/svg"><a xlink:href="http://example.com/" xmlns:xlink="http://www.w3.org/1999/xlink"><circle cx="150px" cy="100px" fill="#ff0000" r="50px" stroke="#000000" stroke-width="5px"></a></svg>' ---> -<rss version="2.0"> -<channel> -<item> -<description><svg version="1.1" baseProfile="full" width="300px" height="200px" xmlns="http://www.w3.org/2000/svg"><a xlink:href="http://example.com/"><circle cx="150px" cy="100px" r="50px" fill="#ff0000" stroke="#000000" stroke-width="5px" /></a></svg></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/node_precedence/atom10_arbitrary_element.xml b/lib/feedparser/tests/wellformed/node_precedence/atom10_arbitrary_element.xml deleted file mode 100644 index 4421f817d..000000000 --- a/lib/feedparser/tests/wellformed/node_precedence/atom10_arbitrary_element.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -Description: The arbitrarily named node of the least depth should be preferred to those with the same name of greater depth. -Expect: not bozo and entries[0]['abcdefg'] == entries[1]['abcdefg'] == u'Correct Value' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <abcdefg>Correct Value</abcdefg> - <image> - <abcdefg>Incorrect Value</abcdefg> - </image> -</entry> -<entry> - <image> - <abcdefg>Incorrect Value</abcdefg> - </image> - <abcdefg>Correct Value</abcdefg> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/node_precedence/atom10_id.xml b/lib/feedparser/tests/wellformed/node_precedence/atom10_id.xml deleted file mode 100644 index e6741531d..000000000 --- a/lib/feedparser/tests/wellformed/node_precedence/atom10_id.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -Description: The id node which is a child of entry should be used regardless of source order. -Expect: not bozo and entries[0]['id'] == entries[1]['id'] == u'Correct Value' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <id>Correct Value</id> - <image> - <id>Incorrect Value</id> - </image> -</entry> -<entry> - <image> - <id>Incorrect Value</id> - </image> - <id>Correct Value</id> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/node_precedence/atom10_title.xml b/lib/feedparser/tests/wellformed/node_precedence/atom10_title.xml deleted file mode 100644 index bf3a201ba..000000000 --- a/lib/feedparser/tests/wellformed/node_precedence/atom10_title.xml +++ /dev/null @@ -1,18 +0,0 @@ -<!-- -Description: The title node which is a child of entry should be used regardless of source order. -Expect: not bozo and entries[0]['title'] == entries[1]['title'] == u'Correct Value' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> - <title>Correct Value</title> - <image> - <title>Incorrect Value</title> - </image> -</entry> -<entry> - <image> - <title>Incorrect Value</title> - </image> - <title>Correct Value</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/doctype_contains_entity_decl.xml b/lib/feedparser/tests/wellformed/rdf/doctype_contains_entity_decl.xml deleted file mode 100644 index e235aa05d..000000000 --- a/lib/feedparser/tests/wellformed/rdf/doctype_contains_entity_decl.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0"?> -<!-- -Description: not stripping doctype properly if doctype contains entity declaration -Expect: not bozo ---> -<!DOCTYPE rdf:RDF [ -<!ENTITY % HTMLlat1 PUBLIC - "-//W3C//ENTITIES Latin 1 for XHTML//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"> -%HTMLlat1; -]> - -<rdf:RDF - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns="http://purl.org/rss/1.0/" -> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_channel_description.xml b/lib/feedparser/tests/wellformed/rdf/rdf_channel_description.xml deleted file mode 100644 index 26be54e78..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_channel_description.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel description -Expect: not bozo and feed['description'] == u'Example description' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <description>Example description</description> -</channel> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_channel_link.xml b/lib/feedparser/tests/wellformed/rdf/rdf_channel_link.xml deleted file mode 100644 index 9c50f64a3..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_channel_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel link -Expect: not bozo and feed['link'] == u'http://example.com/' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <link>http://example.com/</link> -</channel> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_channel_title.xml b/lib/feedparser/tests/wellformed/rdf/rdf_channel_title.xml deleted file mode 100644 index edca2428e..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_channel_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel title -Expect: not bozo and feed['title'] == u'Example feed' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <title>Example feed</title> -</channel> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_item_description.xml b/lib/feedparser/tests/wellformed/rdf/rdf_item_description.xml deleted file mode 100644 index a40ea0807..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_item_description.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: item description -Expect: not bozo and entries[0]['description'] == u'Example description' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <items> - <rdf:Seq> - <rdf:li resource="http://example.com/1"/> - </rdf:Seq> - </items> -</channel> -<item rdf:about="http://example.com/1"> - <description>Example description</description> -</item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_item_link.xml b/lib/feedparser/tests/wellformed/rdf/rdf_item_link.xml deleted file mode 100644 index 8f0a07c7d..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_item_link.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: item link -Expect: not bozo and entries[0]['link'] == u'http://example.com/1' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <items> - <rdf:Seq> - <rdf:li resource="http://example.com/1"/> - </rdf:Seq> - </items> -</channel> -<item rdf:about="http://example.com/1"> - <link>http://example.com/1</link> -</item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_item_rdf_about.xml b/lib/feedparser/tests/wellformed/rdf/rdf_item_rdf_about.xml deleted file mode 100644 index 1362e1b10..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_item_rdf_about.xml +++ /dev/null @@ -1,15 +0,0 @@ -<!-- -Description: item rdf:about -Expect: not bozo and entries[0]['id'] == u'http://example.org/1' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <items> - <rdf:Seq> - <rdf:li resource="http://example.org/1"/> - </rdf:Seq> - </items> -</channel> -<item rdf:about="http://example.org/1"> -</item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rdf_item_title.xml b/lib/feedparser/tests/wellformed/rdf/rdf_item_title.xml deleted file mode 100644 index 04ec848db..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rdf_item_title.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: item title -Expect: not bozo and entries[0]['title'] == u'Example title' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -<channel rdf:about="http://example.com/index.rdf"> - <items> - <rdf:Seq> - <rdf:li resource="http://example.com/1"/> - </rdf:Seq> - </items> -</channel> -<item rdf:about="http://example.com/1"> - <title>Example title</title> -</item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rss090_channel_title.xml b/lib/feedparser/tests/wellformed/rdf/rss090_channel_title.xml deleted file mode 100644 index 0169e311e..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rss090_channel_title.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: RSS version 0.90 channel title -Expect: not bozo and feed['title'] == u'Example title' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/"> -<channel> -<title>Example title</title> -</channel> -<item> -<title>Item title</title> -</item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rss090_item_title.xml b/lib/feedparser/tests/wellformed/rdf/rss090_item_title.xml deleted file mode 100644 index 41d88e31d..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rss090_item_title.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: RSS version 0.90 item title -Expect: not bozo and entries[0]['title'] == u'Item title' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/"> -<channel> -<title>Example title</title> -</channel> -<item> -<title>Item title</title> -</item> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rss_version_10.xml b/lib/feedparser/tests/wellformed/rdf/rss_version_10.xml deleted file mode 100644 index b51a1130e..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rss_version_10.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 1.0 -Expect: not bozo and version == u'rss10' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rdf/rss_version_10_not_default_ns.xml b/lib/feedparser/tests/wellformed/rdf/rss_version_10_not_default_ns.xml deleted file mode 100644 index e033013ef..000000000 --- a/lib/feedparser/tests/wellformed/rdf/rss_version_10_not_default_ns.xml +++ /dev/null @@ -1,8 +0,0 @@ -<!-- -Description: RSS version 1.0 -Expect: not bozo and version == 'rss10' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rss="http://purl.org/rss/1.0/"> -<rss:channel rdf:about="http://www.osswatch.ac.uk/rss/summary.rss"> -</rss:channel> -</rdf:RDF> diff --git a/lib/feedparser/tests/wellformed/rss/aaa_wellformed.xml b/lib/feedparser/tests/wellformed/rss/aaa_wellformed.xml deleted file mode 100644 index c9c70bede..000000000 --- a/lib/feedparser/tests/wellformed/rss/aaa_wellformed.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: wellformed XML -Expect: not bozo ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_author.xml b/lib/feedparser/tests/wellformed/rss/channel_author.xml deleted file mode 100644 index 74aecd762..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_author.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel author -Expect: not bozo and feed['author'] == u'Example editor (me@example.com)' ---> -<rss version="2.0"> -<channel> -<author>Example editor (me@example.com)</author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email.xml deleted file mode 100644 index c0919c2b3..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel author maps to author_detail email if both name and email are given -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<author>Example editor (me@example.com)</author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_2.xml b/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_2.xml deleted file mode 100644 index da0b9c19e..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel author maps to author_detail email if both name and email are given (email contains +) -Expect: not bozo and feed['author_detail']['email'] == u'me+spam@example.com' ---> -<rss version="2.0"> -<channel> -<author>Example editor (me+spam@example.com)</author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_3.xml b/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_3.xml deleted file mode 100644 index 8deba3e75..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_email_3.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel author maps to author_detail email if both name and email are given (name in parens) -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<author>me@example.com (Example editor)</author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name.xml deleted file mode 100644 index 3e5f87056..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel author maps to author_detail name if both name and email are given -Expect: not bozo and feed['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<author>Example editor (me@example.com)</author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name_2.xml b/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name_2.xml deleted file mode 100644 index ec1336993..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_author_map_author_detail_name_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel author maps to author_detail name if both name and email are given (name in parens) -Expect: not bozo and feed['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<author>me@example.com (Example editor)</author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_category.xml b/lib/feedparser/tests/wellformed/rss/channel_category.xml deleted file mode 100644 index 37ddf22df..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_category.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel single category -Expect: not bozo and feed['category'] == u'Example category' ---> -<rss version="2.0"> -<channel> -<category>Example category</category> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_category_domain.xml b/lib/feedparser/tests/wellformed/rss/channel_category_domain.xml deleted file mode 100644 index 6c07ccc59..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_category_domain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel single category with domain -Expect: not bozo and feed['tags'][0]['scheme'] == u'http://www.example.com/' ---> -<rss version="2.0"> -<channel> -<category domain="http://www.example.com/">Example category</category> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_category_multiple.xml b/lib/feedparser/tests/wellformed/rss/channel_category_multiple.xml deleted file mode 100644 index 9effbfddb..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_category_multiple.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: channel multiple categories -Expect: not bozo and feed['tags'][1]['scheme'] == u'http://www.example.com/2' ---> -<rss version="2.0"> -<channel> -<category domain="http://www.example.com/1">Example category 1</category> -<category domain="http://www.example.com/2">Example category 2</category> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_category_multiple_2.xml b/lib/feedparser/tests/wellformed/rss/channel_category_multiple_2.xml deleted file mode 100644 index 00daebe24..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_category_multiple_2.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: channel multiple categories -Expect: not bozo and feed['tags'][1]['term'] == u'Example category 2' ---> -<rss version="2.0"> -<channel> -<category>Example category 1</category> -<category>Example category 2</category> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_cloud_domain.xml b/lib/feedparser/tests/wellformed/rss/channel_cloud_domain.xml deleted file mode 100644 index ef926b6c1..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_cloud_domain.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cloud domain -Expect: not bozo and feed['cloud']['domain'] == u'rpc.sys.com' ---> -<rss version="2.0"> -<channel> -<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" /> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_cloud_path.xml b/lib/feedparser/tests/wellformed/rss/channel_cloud_path.xml deleted file mode 100644 index eccf1b9d9..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_cloud_path.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cloud path -Expect: not bozo and feed['cloud']['path'] == u'/RPC2' ---> -<rss version="2.0"> -<channel> -<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" /> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_cloud_port.xml b/lib/feedparser/tests/wellformed/rss/channel_cloud_port.xml deleted file mode 100644 index 0cd2bc655..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_cloud_port.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cloud port -Expect: not bozo and feed['cloud']['port'] == u'80' ---> -<rss version="2.0"> -<channel> -<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" /> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_cloud_protocol.xml b/lib/feedparser/tests/wellformed/rss/channel_cloud_protocol.xml deleted file mode 100644 index 73e3392c2..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_cloud_protocol.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cloud protocol -Expect: not bozo and feed['cloud']['protocol'] == u'xml-rpc' ---> -<rss version="2.0"> -<channel> -<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" /> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_cloud_registerProcedure.xml b/lib/feedparser/tests/wellformed/rss/channel_cloud_registerProcedure.xml deleted file mode 100644 index 703f53658..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_cloud_registerProcedure.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: cloud registerProcedure -Expect: not bozo and feed['cloud']['registerprocedure'] == u'myCloud.rssPleaseNotify' ---> -<rss version="2.0"> -<channel> -<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" /> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_copyright.xml b/lib/feedparser/tests/wellformed/rss/channel_copyright.xml deleted file mode 100644 index c1dec40c2..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_copyright.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: normal copyright -Expect: not bozo and feed['copyright'] == u'Example copyright' ---> -<rss version="2.0"> -<channel> -<copyright>Example copyright</copyright> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_author.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_author.xml deleted file mode 100644 index 6bae15e15..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_author.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:author -Expect: not bozo and feed['author'] == u'Example editor' and feed['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:author>Example editor</dc:author> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_email.xml deleted file mode 100644 index b5d73d55c..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_email.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:author maps to author_detail email if both name and email are given -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:author>Example editor (me@example.com)</dc:author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_name.xml deleted file mode 100644 index f68944569..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_author_map_author_detail_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:author maps to author_detail name if both name and email are given -Expect: not bozo and feed['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:author>Example editor (me@example.com)</dc:author> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_contributor.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_contributor.xml deleted file mode 100644 index 76450c2f1..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_contributor.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:contributor -Expect: not bozo and feed['contributors'][0]['name'] == u'Example contributor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:contributor>Example contributor</dc:contributor> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_creator.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_creator.xml deleted file mode 100644 index 111ae8ba4..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_creator.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:creator maps to author -Expect: not bozo and feed['author'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:creator>Example editor</dc:creator> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_email.xml deleted file mode 100644 index 05cb34ac5..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_email.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:creator maps to author_detail email if both name and email are given -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:creator>Example editor (me@example.com)</dc:creator> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_name.xml deleted file mode 100644 index 451dd86e2..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_creator_map_author_detail_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:creator maps to author_detail name if both name and email are given -Expect: not bozo and feed['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:creator>Example editor (me@example.com)</dc:creator> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_date.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_date.xml deleted file mode 100644 index cbf3fa79a..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_date.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:date -Expect: not bozo and feed['updated'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:date>2003-12-31T10:14:55Z</dc:date> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_date_parsed.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_date_parsed.xml deleted file mode 100644 index 795114883..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_date_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:date parsed -Expect: not bozo and feed['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:date>2003-12-31T10:14:55Z</dc:date> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_publisher.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_publisher.xml deleted file mode 100644 index b21d4ad80..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_publisher.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:publisher -Expect: not bozo and feed['publisher'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:publisher>Example editor</dc:publisher> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_publisher_email.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_publisher_email.xml deleted file mode 100644 index 1c5d8cd1b..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_publisher_email.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:publisher -Expect: not bozo and feed['publisher_detail']['email'] == u'me@example.com' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:publisher>Example editor (me@example.com)</dc:publisher> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_publisher_name.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_publisher_name.xml deleted file mode 100644 index e581af65d..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_publisher_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:publisher -Expect: not bozo and feed['publisher_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:publisher>Example editor (me@example.com)</dc:publisher> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_rights.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_rights.xml deleted file mode 100644 index 9d33d75ca..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_rights.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:rights -Expect: not bozo and feed['copyright'] == u'Example copyright' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:rights>Example copyright</dc:rights> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_subject.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_subject.xml deleted file mode 100644 index c8ab30102..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_subject.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:subject -Expect: not bozo and feed['category'] == u'Example category' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:subject>Example category</dc:subject> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_subject_2.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_subject_2.xml deleted file mode 100644 index 953d4d3fc..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_subject_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:subject maps to categories -Expect: not bozo and feed['tags'][0]['term'] == u'Example category' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:subject>Example category</dc:subject> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_subject_multiple.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_subject_multiple.xml deleted file mode 100644 index 3ff2558c4..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_subject_multiple.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: multiple dc:subject -Expect: not bozo and feed['tags'][1]['term'] == u'Example category 2' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:subject>Example category 1</dc:subject> -<dc:subject>Example category 2</dc:subject> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dc_title.xml b/lib/feedparser/tests/wellformed/rss/channel_dc_title.xml deleted file mode 100644 index 299ae2339..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dc_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dc:title -Expect: not bozo and feed['title'] == u'Example title' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<dc:title>Example title</dc:title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_dcterms_created.xml b/lib/feedparser/tests/wellformed/rss/channel_dcterms_created.xml deleted file mode 100644 index aa36aadb1..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dcterms_created.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dcterms:created -Expect: not bozo and feed['created'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<dcterms:created>2003-12-31T10:14:55Z</dcterms:created> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dcterms_created_parsed.xml b/lib/feedparser/tests/wellformed/rss/channel_dcterms_created_parsed.xml deleted file mode 100644 index 211178596..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dcterms_created_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dcterms:created parsed -Expect: not bozo and feed['created_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<dcterms:created>2003-12-31T10:14:55Z</dcterms:created> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dcterms_issued.xml b/lib/feedparser/tests/wellformed/rss/channel_dcterms_issued.xml deleted file mode 100644 index a17cee672..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dcterms_issued.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dcterms:issued -Expect: not bozo and feed['published'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<dcterms:issued>2003-12-31T10:14:55Z</dcterms:issued> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dcterms_issued_parsed.xml b/lib/feedparser/tests/wellformed/rss/channel_dcterms_issued_parsed.xml deleted file mode 100644 index dda97dca5..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dcterms_issued_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dcterms:issued parsed -Expect: not bozo and feed['published_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<dcterms:issued>2003-12-31T10:14:55Z</dcterms:issued> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dcterms_modified.xml b/lib/feedparser/tests/wellformed/rss/channel_dcterms_modified.xml deleted file mode 100644 index 5a436d2cb..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dcterms_modified.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dcterms:modified -Expect: not bozo and feed['updated'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<dcterms:modified>2003-12-31T10:14:55Z</dcterms:modified> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_dcterms_modified_parsed.xml b/lib/feedparser/tests/wellformed/rss/channel_dcterms_modified_parsed.xml deleted file mode 100644 index 53ed3b264..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_dcterms_modified_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel dcterms:modified parsed -Expect: not bozo and feed['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<dcterms:modified>2003-12-31T10:14:55Z</dcterms:modified> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_description.xml b/lib/feedparser/tests/wellformed/rss/channel_description.xml deleted file mode 100644 index d26210113..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_description.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: normal description -Expect: not bozo and feed['description'] == u'Example description' ---> -<rss version="2.0"> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_description_escaped_markup.xml b/lib/feedparser/tests/wellformed/rss/channel_description_escaped_markup.xml deleted file mode 100644 index fa86a59ce..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_description_escaped_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: escaped markup in description -Expect: not bozo and feed['description'] == u'<p>Example description</p>' ---> -<rss version="2.0"> -<channel> -<description><p>Example description</p></description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_description_map_tagline.xml b/lib/feedparser/tests/wellformed/rss/channel_description_map_tagline.xml deleted file mode 100644 index f83cc50dd..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_description_map_tagline.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel description is mapped to tagline -Expect: not bozo and feed['tagline'] == u'Example description' ---> -<rss version="2.0"> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_description_naked_markup.xml b/lib/feedparser/tests/wellformed/rss/channel_description_naked_markup.xml deleted file mode 100644 index 671452fbd..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_description_naked_markup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: naked markup in description -Expect: not bozo and feed['description'] == u'<p>Example description</p>' ---> -<rss version="2.0"> -<channel> -<description><p>Example description</p></description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_description_shorttag.xml b/lib/feedparser/tests/wellformed/rss/channel_description_shorttag.xml deleted file mode 100644 index d0d492857..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_description_shorttag.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: description shorttag and link following -Expect: not bozo and feed['description'] == u'' and feed['link'] == u'http://example.com/' ---> -<rss version="2.0"> -<channel> -<description/> -<link>http://example.com/</link> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_docs.xml b/lib/feedparser/tests/wellformed/rss/channel_docs.xml deleted file mode 100644 index f2e312a94..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_docs.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: docs -Expect: not bozo and feed['docs'] == u'http://www.example.com/' ---> -<rss version="2.0"> -<channel> -<docs>http://www.example.com/</docs> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_generator.xml b/lib/feedparser/tests/wellformed/rss/channel_generator.xml deleted file mode 100644 index 5c046e353..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_generator.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: generator -Expect: not bozo and feed['generator'] == u'Example generator' ---> -<rss version="2.0"> -<channel> -<generator>Example generator</generator> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_description.xml b/lib/feedparser/tests/wellformed/rss/channel_image_description.xml deleted file mode 100644 index e498675e7..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_description.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: image description -Expect: not bozo and feed['image']['description'] == u'Available in Netscape RSS 0.91' ---> -<rss version="0.91"> -<channel> -<image> -<title>Sample image</title> -<url>http://example.org/url</url> -<link>http://example.org/link</link> -<width>80</width> -<height>15</height> -<description>Available in Netscape RSS 0.91</description> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_height.xml b/lib/feedparser/tests/wellformed/rss/channel_image_height.xml deleted file mode 100644 index 97c68b340..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_height.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: image height -Expect: not bozo and feed['image']['height'] == 15 ---> -<rss version="2.0"> -<channel> -<image> -<title>Sample image</title> -<url>http://example.org/url</url> -<link>http://example.org/link</link> -<width>80</width> -<height>15</height> -<description>Available in Netscape RSS 0.91</description> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_link.xml b/lib/feedparser/tests/wellformed/rss/channel_image_link.xml deleted file mode 100644 index 3e1ad8c4d..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_link.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: image link -Expect: not bozo and feed['image']['link'] == u'http://example.org/link' ---> -<rss version="2.0"> -<channel> -<image> -<title>Sample image</title> -<url>http://example.org/url</url> -<link>http://example.org/link</link> -<width>80</width> -<height>15</height> -<description>Available in Netscape RSS 0.91</description> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_link_bleed.xml b/lib/feedparser/tests/wellformed/rss/channel_image_link_bleed.xml deleted file mode 100644 index d6b1c026b..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_link_bleed.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: image link does not bleed into channel link array -Expect: not bozo and len(feed['links']) == 1 ---> -<rss version="2.0"> -<channel> -<link>http://channel.example.com/</link> -<image> -<link>http://image.example.com/</link> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_link_conflict.xml b/lib/feedparser/tests/wellformed/rss/channel_image_link_conflict.xml deleted file mode 100644 index 6187df743..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_link_conflict.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: image link does not conflict with channel link -Expect: not bozo and feed['link'] == u'http://channel.example.com/' ---> -<rss version="2.0"> -<channel> -<link>http://channel.example.com/</link> -<image> -<link>http://image.example.com/</link> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_title.xml b/lib/feedparser/tests/wellformed/rss/channel_image_title.xml deleted file mode 100644 index 66d8fe830..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_title.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: image title -Expect: not bozo and feed['image']['title'] == u'Sample image' ---> -<rss version="2.0"> -<channel> -<image> -<title>Sample image</title> -<url>http://example.org/url</url> -<link>http://example.org/link</link> -<width>80</width> -<height>15</height> -<description>Available in Netscape RSS 0.91</description> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_title_conflict.xml b/lib/feedparser/tests/wellformed/rss/channel_image_title_conflict.xml deleted file mode 100644 index aac174d64..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_title_conflict.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: image title does not conflict with channel title -Expect: not bozo and feed['title'] == u'Real title' ---> -<rss version="2.0"> -<channel> -<title>Real title</title> -<image> -<title>textInput title</title> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_url.xml b/lib/feedparser/tests/wellformed/rss/channel_image_url.xml deleted file mode 100644 index cd3c05290..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_url.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: image url -Expect: not bozo and feed['image']['url'] == u'http://example.org/url' ---> -<rss version="2.0"> -<channel> -<image> -<title>Sample image</title> -<url>http://example.org/url</url> -<link>http://example.org/link</link> -<width>80</width> -<height>15</height> -<description>Available in Netscape RSS 0.91</description> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_image_width.xml b/lib/feedparser/tests/wellformed/rss/channel_image_width.xml deleted file mode 100644 index 96470d64a..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_image_width.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: image width -Expect: not bozo and feed['image']['width'] == 80 ---> -<rss version="2.0"> -<channel> -<image> -<title>Sample image</title> -<url>http://example.org/url</url> -<link>http://example.org/link</link> -<width>80</width> -<height>15</height> -<description>Available in Netscape RSS 0.91</description> -</image> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_lastBuildDate.xml b/lib/feedparser/tests/wellformed/rss/channel_lastBuildDate.xml deleted file mode 100644 index 88b1398a6..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_lastBuildDate.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel lastBuildDate -Expect: not bozo and feed['updated'] == u'Sat, 07 Sep 2002 00:00:01 GMT' ---> -<rss version="2.0"> -<channel> - <lastBuildDate>Sat, 07 Sep 2002 00:00:01 GMT</lastBuildDate> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_lastBuildDate_parsed.xml b/lib/feedparser/tests/wellformed/rss/channel_lastBuildDate_parsed.xml deleted file mode 100644 index aa0ff822a..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_lastBuildDate_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel lastBuildDate parsed -Expect: not bozo and feed['updated_parsed'] == (2002, 9, 7, 0, 0, 1, 5, 250, 0) ---> -<rss version="2.0"> -<channel> - <lastBuildDate>Sat, 07 Sep 2002 00:00:01 GMT</lastBuildDate> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_link.xml b/lib/feedparser/tests/wellformed/rss/channel_link.xml deleted file mode 100644 index 51b616fa3..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: normal link -Expect: not bozo and feed['link'] == u'http://example.com/' ---> -<rss version="2.0"> -<channel> -<link>http://example.com/</link> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_managingEditor.xml b/lib/feedparser/tests/wellformed/rss/channel_managingEditor.xml deleted file mode 100644 index 56cfa70fd..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_managingEditor.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel managingEditor maps to author -Expect: not bozo and feed['author'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<managingEditor>Example editor</managingEditor> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_email.xml deleted file mode 100644 index bfe888576..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_email.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: managingEditor maps to author_detail email if both name and email are given -Expect: not bozo and feed['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<managingEditor>Example editor (me@example.com)</managingEditor> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_name.xml deleted file mode 100644 index 58294445e..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_managingEditor_map_author_detail_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: managingEditor maps to author_detail name if both name and email are given -Expect: not bozo and feed['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<managingEditor>Example editor (me@example.com)</managingEditor> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_pubDate.xml b/lib/feedparser/tests/wellformed/rss/channel_pubDate.xml deleted file mode 100644 index b60f8474b..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_pubDate.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel pubDate -Expect: not bozo and feed['published'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<rss version="2.0"> -<channel> -<pubDate>Thu, 01 Jan 2004 19:48:21 GMT</pubDate> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_pubDate_map_updated_parsed.xml b/lib/feedparser/tests/wellformed/rss/channel_pubDate_map_updated_parsed.xml deleted file mode 100644 index 271338d8d..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_pubDate_map_updated_parsed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel pubDate parsed and mapped to published_parsed -Expect: not bozo and feed['published_parsed'] == (2004, 1, 1, 19, 48, 21, 3, 1, 0) ---> -<rss version="2.0"> -<channel> -<pubDate>Thu, 01 Jan 2004 19:48:21 GMT</pubDate> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_description.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_description.xml deleted file mode 100644 index 91ca14baf..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_description.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -Description: textInput description -Expect: not bozo and feed['textinput']['description'] == u'textInput description' ---> -<rss version="2.0"> -<channel> -<title>Real title</title> -<description>Real description</description> -<textInput> -<title>textInput title</title> -<description>textInput description</description> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_description_conflict.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_description_conflict.xml deleted file mode 100644 index 3eb6e7bcd..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_description_conflict.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: textInput description does not conflict with channel description -Expect: not bozo and feed['description'] == u'Real description' ---> -<rss version="2.0"> -<channel> -<description>Real description</description> -<textInput> -<description>textInput description</description> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_link.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_link.xml deleted file mode 100644 index ce5073bdc..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_link.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: textInput link -Expect: not bozo and feed['textinput']['link'] == u'http://textinput.example.com/' ---> -<rss version="2.0"> -<channel> -<link>http://channel.example.com/</link> -<textInput> -<link>http://textinput.example.com/</link> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_link_bleed.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_link_bleed.xml deleted file mode 100644 index 77d1aca60..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_link_bleed.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: textInput link does not bleed into channel link array -Expect: not bozo and len(feed['links']) == 1 ---> -<rss version="2.0"> -<channel> -<link>http://channel.example.com/</link> -<textInput> -<link>http://textinput.example.com/</link> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_link_conflict.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_link_conflict.xml deleted file mode 100644 index 9d1ffb67d..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_link_conflict.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: textInput link does not conflict with channel link -Expect: not bozo and feed['link'] == u'http://channel.example.com/' ---> -<rss version="2.0"> -<channel> -<link>http://channel.example.com/</link> -<textInput> -<link>http://textinput.example.com/</link> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_name.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_name.xml deleted file mode 100644 index cf2316ca4..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: textInput name -Expect: not bozo and feed['textinput']['name'] == u'textinput name' ---> -<rss version="2.0"> -<channel> -<textInput> -<name>textinput name</name> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_title.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_title.xml deleted file mode 100644 index 7d2f4b704..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_title.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: textInput title -Expect: not bozo and feed['textinput']['title'] == u'textInput title' ---> -<rss version="2.0"> -<channel> -<title>Real title</title> -<textInput> -<title>textInput title</title> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_textInput_title_conflict.xml b/lib/feedparser/tests/wellformed/rss/channel_textInput_title_conflict.xml deleted file mode 100644 index f6a9d3745..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_textInput_title_conflict.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: textInput title does not conflict with channel title -Expect: not bozo and feed['title'] == u'Real title' ---> -<rss version="2.0"> -<channel> -<title>Real title</title> -<textInput> -<title>textInput title</title> -</textInput> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_title.xml b/lib/feedparser/tests/wellformed/rss/channel_title.xml deleted file mode 100644 index c4ea8c076..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: normal title -Expect: not bozo and feed['title'] == u'Example feed' ---> -<rss version="2.0"> -<channel> -<title>Example feed</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_title_apos.xml b/lib/feedparser/tests/wellformed/rss/channel_title_apos.xml deleted file mode 100644 index 35b36f3f2..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_title_apos.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel title contains apos entity -Expect: not bozo and feed['title'] == u"Mark's title" ---> -<rss version="0.91"> -<channel> -<title>Mark's title</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_title_gt.xml b/lib/feedparser/tests/wellformed/rss/channel_title_gt.xml deleted file mode 100644 index dec60c1a6..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_title_gt.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel title contains gt entity -Expect: not bozo and feed['title'] == u'2 > 1' ---> -<rss version="0.91"> -<channel> -<title>2 > 1</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_title_lt.xml b/lib/feedparser/tests/wellformed/rss/channel_title_lt.xml deleted file mode 100644 index c1cf9ec5a..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_title_lt.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel title contains lt entity -Expect: not bozo and feed['title'] == u'1 < 2' ---> -<rss version="0.91"> -<channel> -<title>1 < 2</title> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_ttl.xml b/lib/feedparser/tests/wellformed/rss/channel_ttl.xml deleted file mode 100644 index 781d05857..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_ttl.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ttl -Expect: not bozo and feed['ttl'] == u'60' ---> -<rss version="2.0"> -<channel> -<ttl>60</ttl> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_webMaster.xml b/lib/feedparser/tests/wellformed/rss/channel_webMaster.xml deleted file mode 100644 index 2f0ff5f14..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_webMaster.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel webMaster maps to publisher -Expect: not bozo and feed['publisher'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<webMaster>Example editor</webMaster> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_webMaster_email.xml b/lib/feedparser/tests/wellformed/rss/channel_webMaster_email.xml deleted file mode 100644 index ff0410db9..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_webMaster_email.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel webMaster maps to publisher -Expect: not bozo and feed['publisher_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<webMaster>Example editor (me@example.com)</webMaster> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/channel_webMaster_name.xml b/lib/feedparser/tests/wellformed/rss/channel_webMaster_name.xml deleted file mode 100644 index 1fad57321..000000000 --- a/lib/feedparser/tests/wellformed/rss/channel_webMaster_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: channel webMaster maps to publisher -Expect: not bozo and feed['publisher_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<webMaster>Example editor (me@example.com)</webMaster> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/entity_in_doctype.xml b/lib/feedparser/tests/wellformed/rss/entity_in_doctype.xml deleted file mode 100644 index b88907638..000000000 --- a/lib/feedparser/tests/wellformed/rss/entity_in_doctype.xml +++ /dev/null @@ -1,16 +0,0 @@ -<!-- -Description: AT&T -Expect: not bozo and entries[0]['guid'] == 'tag:example.com,2006-05-04:/blog/' ---> - -<!DOCTYPE rss [ - <!ENTITY id "tag:example.com,"> -]> - -<rss version="2.0"> -<channel> -<item> -<guid isPermaLink='false'>&id;2006-05-04:/blog/</guid> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_author.xml b/lib/feedparser/tests/wellformed/rss/item_author.xml deleted file mode 100644 index 176ce1c9e..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author -Expect: not bozo and entries[0]['author'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<item> -<author>Example editor</author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email.xml deleted file mode 100644 index e990c9f5a..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author maps to author_detail email if both name and email are given -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<item> -<author>Example editor (me@example.com)</author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email2.xml b/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email2.xml deleted file mode 100644 index 4cbf2da9b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author maps to author_detail email if both name and email are given -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<item> -<author>Example editor <me@example.com></author> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email3.xml b/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email3.xml deleted file mode 100644 index 42aafb03c..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_email3.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author maps to author_detail email if both name and email are given -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0"> -<channel> -<item> -<author>me@example.com (Example editor)</author> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name.xml deleted file mode 100644 index 8083ff44d..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author maps to author_detail_name if both name and email are given -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<item> -<author>Example editor (me@example.com)</author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name2.xml b/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name2.xml deleted file mode 100644 index bcc451355..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author maps to author_detail_name if both name and email are given -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<item> -<author>Example editor <me@example.com></author> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name3.xml b/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name3.xml deleted file mode 100644 index c0f64169b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_author_map_author_detail_name3.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item author maps to author_detail_name if both name and email are given -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0"> -<channel> -<item> -<author>me@example.com (Example editor)</author> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_category.xml b/lib/feedparser/tests/wellformed/rss/item_category.xml deleted file mode 100644 index 2b50558cd..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_category.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item single category -Expect: not bozo and entries[0]['category'] == u'Example category' ---> -<rss version="2.0"> -<channel> -<item> -<category>Example category</category> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_category_domain.xml b/lib/feedparser/tests/wellformed/rss/item_category_domain.xml deleted file mode 100644 index 8cbe25fd9..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_category_domain.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item category with domain -Expect: not bozo and entries[0]['tags'][0]['scheme'] == u'http://www.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<category domain="http://www.example.com/">Example category</category> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_category_image.xml b/lib/feedparser/tests/wellformed/rss/item_category_image.xml deleted file mode 100644 index 6c1c5e851..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_category_image.xml +++ /dev/null @@ -1,17 +0,0 @@ -<!-- -Description: item with an image inside a category should not cause error -Expect: not bozo and entries[0]['category'] != None ---> -<rss version="2.0"> -<channel> -<item> -<category>Example category - <image> - <url>http://www.thestranger.com/imager/b/story/4281993/a0a6/SavageLove-400.jpg</url> - <title><![CDATA[Savage Love]]></title> - <link><![CDATA[http://www.thestranger.com/seattle/SavageLove?oid=4281993]]></link> - </image> -</category> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_category_multiple.xml b/lib/feedparser/tests/wellformed/rss/item_category_multiple.xml deleted file mode 100644 index c2f121d34..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_category_multiple.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item multiple categories -Expect: not bozo and entries[0]['tags'][1]['scheme'] == u'http://www.example.com/2' ---> -<rss version="2.0"> -<channel> -<item> -<category domain="http://www.example.com/1">Example category 1</category> -<category domain="http://www.example.com/2">Example category 2</category> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_category_multiple_2.xml b/lib/feedparser/tests/wellformed/rss/item_category_multiple_2.xml deleted file mode 100644 index 861dd92e5..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_category_multiple_2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item multiple categories -Expect: not bozo and entries[0]['tags'][1]['term'] == u'Example category 2' ---> -<rss version="2.0"> -<channel> -<item> -<category>Example category 1</category> -<category>Example category 2</category> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_cc_license.xml b/lib/feedparser/tests/wellformed/rss/item_cc_license.xml deleted file mode 100644 index 6b023b9a8..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_cc_license.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: creative commons license -Expect: not bozo and entries[0]['license'] == u'http://www.creativecommons.org/licenses/by-nc/1.0' ---> -<rss version="2.0" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> -<channel> -<item> -<cc:license rdf:resource="http://www.creativecommons.org/licenses/by-nc/1.0"/> -<link>http://example.com/</link> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_comments.xml b/lib/feedparser/tests/wellformed/rss/item_comments.xml deleted file mode 100644 index 9751403cd..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_comments.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item comments -Expect: not bozo and entries[0]['comments'] == u'http://example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<comments>http://example.com/</comments> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_content_encoded.xml b/lib/feedparser/tests/wellformed/rss/item_content_encoded.xml deleted file mode 100644 index e826c39b0..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_content_encoded.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: content:encoded -Expect: not bozo and entries[0]['content'][0]['value'] == u'<p>Example content</p>' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><p>Example content</p></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_content_encoded_mode.xml b/lib/feedparser/tests/wellformed/rss/item_content_encoded_mode.xml deleted file mode 100644 index 6cbd874b0..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_content_encoded_mode.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: content:encoded mode -Expect: 1 ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><p>Example content</p></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_content_encoded_type.xml b/lib/feedparser/tests/wellformed/rss/item_content_encoded_type.xml deleted file mode 100644 index 3640386bb..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_content_encoded_type.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: content:encoded type -Expect: not bozo and entries[0]['content'][0]['type'] == u'text/html' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><p>Example content</p></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_creativeCommons_license.xml b/lib/feedparser/tests/wellformed/rss/item_creativeCommons_license.xml deleted file mode 100644 index 65353d91d..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_creativeCommons_license.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: creative commons license -Expect: not bozo and entries[0]['license'] == u'http://www.creativecommons.org/licenses/by-nc/1.0' ---> -<rss version="2.0" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"> -<channel> -<item> -<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/1.0</creativeCommons:license> -<link>http://example.com/</link> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_author.xml b/lib/feedparser/tests/wellformed/rss/item_dc_author.xml deleted file mode 100644 index 22e71c64b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_author.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:author -Expect: not bozo and entries[0]['author'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:author>Example editor</dc:author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_email.xml deleted file mode 100644 index eb81dc965..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:author maps to author_detail email if both name and email are given -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:author>Example editor (me@example.com)</dc:author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_name.xml deleted file mode 100644 index 5139a2435..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_author_map_author_detail_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:author maps to author_detail name if both name and email are given -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:author>Example editor (me@example.com)</dc:author> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_contributor.xml b/lib/feedparser/tests/wellformed/rss/item_dc_contributor.xml deleted file mode 100644 index 79d16d030..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_contributor.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:contributor -Expect: not bozo and entries[0]['contributors'][0]['name'] == u'Example contributor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:contributor>Example contributor</dc:contributor> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_creator.xml b/lib/feedparser/tests/wellformed/rss/item_dc_creator.xml deleted file mode 100644 index c214414b0..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_creator.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:creator maps to author -Expect: not bozo and entries[0]['author'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:creator>Example editor</dc:creator> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_email.xml b/lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_email.xml deleted file mode 100644 index 899464eca..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:creator maps to author_detail email if both name and email are given -Expect: not bozo and entries[0]['author_detail']['email'] == u'me@example.com' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:creator>Example editor (me@example.com)</dc:creator> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_name.xml b/lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_name.xml deleted file mode 100644 index ca20ab083..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_creator_map_author_detail_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:creator maps to author_detail name if both name and email are given -Expect: not bozo and entries[0]['author_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:creator>Example editor (me@example.com)</dc:creator> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_date.xml b/lib/feedparser/tests/wellformed/rss/item_dc_date.xml deleted file mode 100644 index 0f0f11797..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_date.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:date -Expect: not bozo and entries[0]['updated'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:date>2003-12-31T10:14:55Z</dc:date> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_date_parsed.xml b/lib/feedparser/tests/wellformed/rss/item_dc_date_parsed.xml deleted file mode 100644 index 1d39df938..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_date_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:date parsed -Expect: not bozo and entries[0]['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:date>2003-12-31T10:14:55Z</dc:date> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_description.xml b/lib/feedparser/tests/wellformed/rss/item_dc_description.xml deleted file mode 100644 index 973d736c0..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_description.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:description -Expect: not bozo and entries[0]['description'] == u'Example description' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:description>Example description</dc:description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_publisher.xml b/lib/feedparser/tests/wellformed/rss/item_dc_publisher.xml deleted file mode 100644 index 7b4e82b53..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_publisher.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:publisher -Expect: not bozo and entries[0]['publisher'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:publisher>Example editor</dc:publisher> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_publisher_email.xml b/lib/feedparser/tests/wellformed/rss/item_dc_publisher_email.xml deleted file mode 100644 index d321bed4d..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_publisher_email.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:publisher -Expect: not bozo and entries[0]['publisher_detail']['email'] == u'me@example.com' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:publisher>Example editor (me@example.com)</dc:publisher> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_publisher_name.xml b/lib/feedparser/tests/wellformed/rss/item_dc_publisher_name.xml deleted file mode 100644 index 636c739e5..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_publisher_name.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:publisher -Expect: not bozo and entries[0]['publisher_detail']['name'] == u'Example editor' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:publisher>Example editor (me@example.com)</dc:publisher> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_rights.xml b/lib/feedparser/tests/wellformed/rss/item_dc_rights.xml deleted file mode 100644 index 2d734a98f..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_rights.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:rights -Expect: not bozo and entries[0]['copyright'] == u'Example copyright' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:rights>Example copyright</dc:rights> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_subject.xml b/lib/feedparser/tests/wellformed/rss/item_dc_subject.xml deleted file mode 100644 index 745a78645..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_subject.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:subject -Expect: not bozo and entries[0]['category'] == u'Example category' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:subject>Example category</dc:subject> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_subject_2.xml b/lib/feedparser/tests/wellformed/rss/item_dc_subject_2.xml deleted file mode 100644 index b7de4cc01..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_subject_2.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:subject maps to categories -Expect: not bozo and entries[0]['tags'][0]['term'] == u'Example category' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:subject>Example category</dc:subject> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_subject_multiple.xml b/lib/feedparser/tests/wellformed/rss/item_dc_subject_multiple.xml deleted file mode 100644 index aa7722d6b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_subject_multiple.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: multiple item dc:subject -Expect: not bozo and entries[0]['tags'][1]['term'] == u'Example category 2' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:subject>Example category 1</dc:subject> -<dc:subject>Example category 2</dc:subject> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dc_title.xml b/lib/feedparser/tests/wellformed/rss/item_dc_title.xml deleted file mode 100644 index dbe113439..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dc_title.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dc:title -Expect: not bozo and entries[0]['title'] == u'Example title' ---> -<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> -<channel> -<item> -<dc:title>Example title</dc:title> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_dcterms_created.xml b/lib/feedparser/tests/wellformed/rss/item_dcterms_created.xml deleted file mode 100644 index f70882b12..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dcterms_created.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dcterms:created -Expect: not bozo and entries[0]['created'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<item> -<dcterms:created>2003-12-31T10:14:55Z</dcterms:created> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dcterms_created_parsed.xml b/lib/feedparser/tests/wellformed/rss/item_dcterms_created_parsed.xml deleted file mode 100644 index 5d235c147..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dcterms_created_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dcterms:created parsed -Expect: not bozo and entries[0]['created_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<item> -<dcterms:created>2003-12-31T10:14:55Z</dcterms:created> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dcterms_issued.xml b/lib/feedparser/tests/wellformed/rss/item_dcterms_issued.xml deleted file mode 100644 index 789d514ce..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dcterms_issued.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dcterms:issued -Expect: not bozo and entries[0]['published'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<item> -<dcterms:issued>2003-12-31T10:14:55Z</dcterms:issued> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dcterms_issued_parsed.xml b/lib/feedparser/tests/wellformed/rss/item_dcterms_issued_parsed.xml deleted file mode 100644 index 4a3db36e1..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dcterms_issued_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dcterms:issued parsed -Expect: not bozo and entries[0]['published_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<item> -<dcterms:issued>2003-12-31T10:14:55Z</dcterms:issued> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dcterms_modified.xml b/lib/feedparser/tests/wellformed/rss/item_dcterms_modified.xml deleted file mode 100644 index 00409dd57..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dcterms_modified.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dcterms:modified -Expect: not bozo and entries[0]['updated'] == u'2003-12-31T10:14:55Z' ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<item> -<dcterms:modified>2003-12-31T10:14:55Z</dcterms:modified> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_dcterms_modified_parsed.xml b/lib/feedparser/tests/wellformed/rss/item_dcterms_modified_parsed.xml deleted file mode 100644 index 388e3e702..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_dcterms_modified_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item dcterms:modified parsed -Expect: not bozo and entries[0]['updated_parsed'] == (2003, 12, 31, 10, 14, 55, 2, 365, 0) ---> -<rss version="2.0" xmlns:dcterms="http://purl.org/dc/terms/"> -<channel> -<item> -<dcterms:modified>2003-12-31T10:14:55Z</dcterms:modified> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_description.xml b/lib/feedparser/tests/wellformed/rss/item_description.xml deleted file mode 100644 index f5a49448e..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description -Expect: not bozo and entries[0]['description'] == u'Example description' ---> -<rss version="2.0"> -<channel> -<item> -<description>Example description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_and_summary.xml b/lib/feedparser/tests/wellformed/rss/item_description_and_summary.xml deleted file mode 100644 index 355f1c47a..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_and_summary.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item contains both description and summary elements -Expect: not bozo and entries[0]['description'] == u'Example description' and entries[0]['content'][0]['value'] == u'Example summary' ---> -<rss version="2.0"> -<channel> -<item> -<description>Example description</description> -<summary>Example summary</summary> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_br.xml b/lib/feedparser/tests/wellformed/rss/item_description_br.xml deleted file mode 100644 index 19a5a121c..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_br.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains both <br/> and <br /> -Expect: not bozo and entries[0]['description'] == u'article title<br /><br /> article byline<br /><br />text of article' ---> -<rss version="2.0"> -<channel> -<item> -<description><![CDATA[article title<br /><br /> article byline<br/><br/>text of article]]></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_br_shorttag.xml b/lib/feedparser/tests/wellformed/rss/item_description_br_shorttag.xml deleted file mode 100644 index aa11391fc..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_br_shorttag.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item description ends with <br /> -Expect: not bozo and entries[0]['description'] == u'<b>x</b><br />' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://www.example.com/</link> -<description><b>x</b><br/></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_description_code_br.xml b/lib/feedparser/tests/wellformed/rss/item_description_code_br.xml deleted file mode 100644 index d5b98d625..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_code_br.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item description contains <code> with <br /> -Expect: not bozo and entries[0]['description'] == u'<code><br /></code>' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://www.example.com/</link> -<description><![CDATA[<code><br /></code>]]></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_description_escaped_markup.xml b/lib/feedparser/tests/wellformed/rss/item_description_escaped_markup.xml deleted file mode 100644 index 4f461a30c..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_escaped_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: escaped markup in item description -Expect: not bozo and entries[0]['description'] == u'<p>Example description</p>' ---> -<rss version="2.0"> -<channel> -<item> -<description><p>Example description</p></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_map_summary.xml b/lib/feedparser/tests/wellformed/rss/item_description_map_summary.xml deleted file mode 100644 index a43ece73f..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_map_summary.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description is mapped to summary -Expect: not bozo and entries[0]['summary'] == u'Example description' ---> -<rss version="2.0"> -<channel> -<item> -<description>Example description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_naked_markup.xml b/lib/feedparser/tests/wellformed/rss/item_description_naked_markup.xml deleted file mode 100644 index 95d544608..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_naked_markup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: naked markup in item description -Expect: not bozo and entries[0]['description'] == u'<p>Example description</p>' ---> -<rss version="2.0"> -<channel> -<item> -<description><p>Example description</p></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype.xml b/lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype.xml deleted file mode 100644 index 1930555ca..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: item description is not a DOCTYPE (but HTML parser thinks it is) -Expect: not bozo and entries[0]['description'] == """<!' <a href="foo">""" ---> -<rss> -<item> -<description><!' <a href="foo"></description> -</item> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype2.xml b/lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype2.xml deleted file mode 100644 index a32d25edc..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_description_not_a_doctype2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: item description is not a DOCTYPE (but HTML parser thinks it is) -Expect: not bozo and entries[0]['description'] == "<!DOCTYPE" ---> -<rss> -<item> -<description><![CDATA[ <!DOCTYPE ]]></description> -</item> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_enclosure_length.xml b/lib/feedparser/tests/wellformed/rss/item_enclosure_length.xml deleted file mode 100644 index 5f0f72fec..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_enclosure_length.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item enclosure length -Expect: not bozo and entries[0]['enclosures'][0]['length'] == u'100000' ---> -<rss version="2.0"> -<channel> -<item> -<enclosure url="http://example.com/" length="100000" type="image/jpeg" /> -<link>http://example.com/</link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_enclosure_multiple.xml b/lib/feedparser/tests/wellformed/rss/item_enclosure_multiple.xml deleted file mode 100644 index 0e40abd03..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_enclosure_multiple.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: multiple enclosures -Expect: not bozo and entries[0]['enclosures'][1] == {'href': u'http://example.com/2', 'length': u'200000', 'type': u'image/gif'} ---> -<rss version="2.0"> -<channel> -<item> -<enclosure url="http://example.com/1" length="100000" type="image/jpeg" /> -<enclosure url="http://example.com/2" length="200000" type="image/gif" /> -<link>http://example.com/</link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_enclosure_type.xml b/lib/feedparser/tests/wellformed/rss/item_enclosure_type.xml deleted file mode 100644 index 3b191c6db..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_enclosure_type.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item enclosure type -Expect: not bozo and entries[0]['enclosures'][0]['type'] == u'image/jpeg' ---> -<rss version="2.0"> -<channel> -<item> -<enclosure url="http://example.com/" length="100000" type="image/jpeg" /> -<link>http://example.com/</link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_enclosure_url.xml b/lib/feedparser/tests/wellformed/rss/item_enclosure_url.xml deleted file mode 100644 index b5da8cd5a..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_enclosure_url.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item enclosure url -Expect: not bozo and entries[0]['enclosures'][0]['url'] == u'http://example.com/' and entries[0]['links'][0]['rel'] == 'enclosure' ---> -<rss version="2.0"> -<channel> -<item> -<enclosure url="http://example.com/" length="100000" type="image/jpeg" /> -<link>http://example.com/</link> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_expirationDate.xml b/lib/feedparser/tests/wellformed/rss/item_expirationDate.xml deleted file mode 100644 index c4738acdc..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_expirationDate.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item expirationDate -Expect: not bozo and entries[0]['expired'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<rss version="0.93"> -<channel> -<item> -<expirationDate>Thu, 01 Jan 2004 19:48:21 GMT</expirationDate> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_expirationDate_multiple_values.xml b/lib/feedparser/tests/wellformed/rss/item_expirationDate_multiple_values.xml deleted file mode 100644 index 59a099f63..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_expirationDate_multiple_values.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item expirationDate with multiple values -Expect: not bozo and entries[0]['expired_parsed'] == (2004, 1, 1, 19, 48, 21, 3, 1, 0) ---> -<rss version="0.93"> -<channel> -<item> -<expirationDate>Wed, 01 Dec 2010 19:48:21 GMT</expirationDate> -<expirationDate>Thu, 01 Jan 2004 19:48:21 GMT</expirationDate> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_expirationDate_parsed.xml b/lib/feedparser/tests/wellformed/rss/item_expirationDate_parsed.xml deleted file mode 100644 index 39ec50d67..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_expirationDate_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item expirationDate parsed -Expect: not bozo and entries[0]['expired_parsed'] == (2004, 1, 1, 19, 48, 21, 3, 1, 0) ---> -<rss version="0.93"> -<channel> -<item> -<expirationDate>Thu, 01 Jan 2004 19:48:21 GMT</expirationDate> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_fullitem.xml b/lib/feedparser/tests/wellformed/rss/item_fullitem.xml deleted file mode 100644 index afe454b9e..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_fullitem.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: fullitem -Expect: not bozo and entries[0]['content'][0]['value'] == u'<p>Example content</p>' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><p>Example content</p></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_fullitem_mode.xml b/lib/feedparser/tests/wellformed/rss/item_fullitem_mode.xml deleted file mode 100644 index bc14adaa1..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_fullitem_mode.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: fullitem mode -Expect: 1 ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><p>Example content</p></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_fullitem_type.xml b/lib/feedparser/tests/wellformed/rss/item_fullitem_type.xml deleted file mode 100644 index f667d695b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_fullitem_type.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: fullitem type -Expect: not bozo and entries[0]['content'][0]['type'] == u'text/html' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><p>Example content</p></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid.xml b/lib/feedparser/tests/wellformed/rss/item_guid.xml deleted file mode 100644 index 52ed08439..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item guid -Expect: not bozo and entries[0]['guid'] == u'http://guid.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<guid>http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_conflict_link.xml b/lib/feedparser/tests/wellformed/rss/item_guid_conflict_link.xml deleted file mode 100644 index b579c3cd4..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_conflict_link.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item guid does not override link -Expect: not bozo and entries[0]['link'] == u'http://link.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://link.example.com/</link> -<guid>http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_guidislink.xml b/lib/feedparser/tests/wellformed/rss/item_guid_guidislink.xml deleted file mode 100644 index 1f9705e87..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_guidislink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: guidislink -Expect: not bozo and entries[0]['guidislink'] ---> -<rss version="2.0"> -<channel> -<item> -<guid>http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link.xml b/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link.xml deleted file mode 100644 index 64bd5753f..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item guid does not override link even if isPermaLink="true" -Expect: not bozo and entries[0]['link'] == u'http://link.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://link.example.com/</link> -<guid isPermaLink="true">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link_not_guidislink.xml b/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link_not_guidislink.xml deleted file mode 100644 index d8505fb1e..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_conflict_link_not_guidislink.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: not guidislink when link present (even if isPermaLink="true") -Expect: not bozo and not entries[0]['guidislink'] ---> -<rss version="2.0"> -<channel> -<item> -<link>http://link.example.com/</link> -<guid isPermaLink="true">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_guidislink.xml b/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_guidislink.xml deleted file mode 100644 index bed21fec3..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_guidislink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: guidislink when isPermaLink="true" -Expect: not bozo and entries[0]['guidislink'] ---> -<rss version="2.0"> -<channel> -<item> -<guid isPermaLink="true">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_map_link.xml b/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_map_link.xml deleted file mode 100644 index ce2e90cb5..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_isPermaLink_map_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item guid maps to link when isPermaLink="true" -Expect: not bozo and entries[0]['link'] == u'http://guid.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<guid isPermaLink="true">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_map_link.xml b/lib/feedparser/tests/wellformed/rss/item_guid_map_link.xml deleted file mode 100644 index bb778e79a..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_map_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item guid maps to link -Expect: not bozo and entries[0]['link'] == u'http://guid.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<guid>http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink.xml b/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink.xml deleted file mode 100644 index 79f20e247..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item guid not permalink is not duplicated into link -Expect: not bozo and not entries[0].has_key('link') ---> -<rss version="2.0"> -<channel> -<item> -<guid isPermaLink="false">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_conflict_link.xml b/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_conflict_link.xml deleted file mode 100644 index 5f16a2923..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_conflict_link.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item guid (not permalink) is not duplicated into link -Expect: not bozo and entries[0]['link'] == u'http://link.example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://link.example.com/</link> -<guid isPermaLink="false">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink.xml b/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink.xml deleted file mode 100644 index c25de446d..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: not guidislink since item guid is not permalink -Expect: not bozo and not entries[0]['guidislink'] ---> -<rss version="2.0"> -<channel> -<item> -<guid isPermaLink="false">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink_2.xml b/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink_2.xml deleted file mode 100644 index 7052b455a..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_guidislink_2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: not guidislink because guid is not permalink -Expect: not bozo and not entries[0]['guidislink'] ---> -<rss version="2.0"> -<channel> -<item> -<link>http://link.example.com/</link> -<guid isPermaLink="false">http://guid.example.com/</guid> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_url.xml b/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_url.xml deleted file mode 100644 index cb9e82d35..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_guid_not_permalink_not_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item guid not permalink is not resolved as a URL -Expect: not bozo and entries[0]['id'] == u'abc' ---> -<rss version="2.0" xml:base="http://dom.test/"> -<channel> -<item> -<guid isPermaLink="false">abc</guid> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_image_link_bleed.xml b/lib/feedparser/tests/wellformed/rss/item_image_link_bleed.xml deleted file mode 100644 index ae5b9864f..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_image_link_bleed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -Description: image link does not bleed into item link array -Expect: not bozo and len(entries[0]['links']) == 1 ---> -<rss version="2.0"> -<channel> - <item> - <link>http://item.TEST/</link> - <image> - <link>http://item.TEST/imagelink</link> - </image> - </item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_image_link_conflict.xml b/lib/feedparser/tests/wellformed/rss/item_image_link_conflict.xml deleted file mode 100644 index 3fa86ae7d..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_image_link_conflict.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!-- -Description: image link does not conflict with item link -Expect: not bozo and entries[0]['link'] == u'http://item.TEST/' ---> -<rss version="2.0"> -<channel> - <item> - <link>http://item.TEST/</link> - <image> - <link>http://item.TEST/imagelink</link> - </image> - </item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_link.xml b/lib/feedparser/tests/wellformed/rss/item_link.xml deleted file mode 100644 index f56a3d4c7..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item link -Expect: not bozo and entries[0]['link'] == u'http://example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<link>http://example.com/</link> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_pubDate.xml b/lib/feedparser/tests/wellformed/rss/item_pubDate.xml deleted file mode 100644 index 23c3c8966..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_pubDate.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item pubDate -Expect: not bozo and entries[0]['published'] == u'Thu, 01 Jan 2004 19:48:21 GMT' ---> -<rss version="2.0"> -<channel> -<item> -<pubDate>Thu, 01 Jan 2004 19:48:21 GMT</pubDate> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_pubDate_map_updated_parsed.xml b/lib/feedparser/tests/wellformed/rss/item_pubDate_map_updated_parsed.xml deleted file mode 100644 index 32db8be4b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_pubDate_map_updated_parsed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item pubDate parsed and mapped to published_parsed -Expect: not bozo and entries[0]['published_parsed'] == (2004, 1, 1, 19, 48, 21, 3, 1, 0) ---> -<rss version="2.0"> -<channel> -<item> -<pubDate>Thu, 01 Jan 2004 19:48:21 GMT</pubDate> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_source.xml b/lib/feedparser/tests/wellformed/rss/item_source.xml deleted file mode 100644 index 12b7745e1..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_source.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item source -Expect: not bozo and entries[0]['source']['title'] == 'Example source' ---> -<rss version="2.0"> -<channel> -<item> -<source url="http://example.com/">Example source</source> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_source_url.xml b/lib/feedparser/tests/wellformed/rss/item_source_url.xml deleted file mode 100644 index c5f235a4f..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_source_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item source url -Expect: not bozo and entries[0].source.href == u'http://example.com/' ---> -<rss version="2.0"> -<channel> -<item> -<source url="http://example.com/">Example source</source> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/item_summary_and_description.xml b/lib/feedparser/tests/wellformed/rss/item_summary_and_description.xml deleted file mode 100644 index 9fd152f0b..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_summary_and_description.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: item contains both summary and description elements -Expect: not bozo and entries[0]['summary'] == u'Example summary' and entries[0]['content'][0]['value'] == u'Example description' ---> -<rss version="2.0"> -<channel> -<item> -<summary>Example summary</summary> -<description>Example description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_title.xml b/lib/feedparser/tests/wellformed/rss/item_title.xml deleted file mode 100644 index b0d62660d..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_title.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item title -Expect: not bozo and entries[0]['title'] == u'Item 1 title' ---> -<rss version="2.0"> -<channel> -<item> -<title>Item 1 title</title> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_xhtml_body.xml b/lib/feedparser/tests/wellformed/rss/item_xhtml_body.xml deleted file mode 100644 index cf41c29a6..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_xhtml_body.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: xhtml:body -Expect: not bozo and entries[0]['content'][0]['value'] == u'<p>Example content</p>' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"> -<p>Example content</p> -</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_xhtml_body_mode.xml b/lib/feedparser/tests/wellformed/rss/item_xhtml_body_mode.xml deleted file mode 100644 index 5d30b0f2e..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_xhtml_body_mode.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: xhtml:body mode -Expect: 1 ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"> -<p>Example content</p> -</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/item_xhtml_body_type.xml b/lib/feedparser/tests/wellformed/rss/item_xhtml_body_type.xml deleted file mode 100644 index ded661a08..000000000 --- a/lib/feedparser/tests/wellformed/rss/item_xhtml_body_type.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- -Description: xhtml:body type -Expect: not bozo and entries[0]['content'][0]['type'] == u'application/xhtml+xml' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"> -<p>Example content</p> -</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/newlocation.xml b/lib/feedparser/tests/wellformed/rss/newlocation.xml deleted file mode 100644 index b6b992394..000000000 --- a/lib/feedparser/tests/wellformed/rss/newlocation.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: rss newLocation -Expect: not bozo and feed.newlocation == u'http://example/new' ---> -<rss version="2.0"> -<redirect> - <newLocation>http://example/new</newLocation> -</redirect> -</rss> diff --git a/lib/feedparser/tests/wellformed/rss/rss_namespace_1.xml b/lib/feedparser/tests/wellformed/rss/rss_namespace_1.xml deleted file mode 100644 index 9f583c691..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_namespace_1.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: RSS Userland namespace #1 -Expect: not bozo and feed['description'] == u'Example description' ---> -<rss xmlns="http://backend.userland.com/rss"> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_namespace_2.xml b/lib/feedparser/tests/wellformed/rss/rss_namespace_2.xml deleted file mode 100644 index 38af22008..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_namespace_2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: RSS Userland namespace #2 -Expect: not bozo and feed['description'] == u'Example description' ---> -<rss xmlns="http://backend.userland.com/rss2"> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_namespace_3.xml b/lib/feedparser/tests/wellformed/rss/rss_namespace_3.xml deleted file mode 100644 index 8bd75469b..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_namespace_3.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: RSS Userland namespace #3 -Expect: not bozo and feed['description'] == u'Example description' ---> -<rss xmlns="http://backend.userland.com/rss2.1"> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_namespace_4.xml b/lib/feedparser/tests/wellformed/rss/rss_namespace_4.xml deleted file mode 100644 index 52dc603eb..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_namespace_4.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: RSS Userland namespace #4 -Expect: not bozo and feed['description'] == u'Example description' ---> -<rss xmlns="http://blogs.law.harvard.edu/tech/rss"> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_090.xml b/lib/feedparser/tests/wellformed/rss/rss_version_090.xml deleted file mode 100644 index a73e246b2..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_090.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 0.90 -Expect: not bozo and version == u'rss090' ---> -<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://my.netscape.com/rdf/simple/0.9/"> -</rdf:RDF> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_091_netscape.xml b/lib/feedparser/tests/wellformed/rss/rss_version_091_netscape.xml deleted file mode 100644 index fbcc15cec..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_091_netscape.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: RSS version 0.91 (Netscape) -Expect: not bozo and version == u'rss091n' ---> -<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd"> -<rss version="0.91"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_091_userland.xml b/lib/feedparser/tests/wellformed/rss/rss_version_091_userland.xml deleted file mode 100644 index ee9f1cc35..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_091_userland.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 0.91 (Userland) -Expect: not bozo and version == u'rss091u' ---> -<rss version="0.91"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_092.xml b/lib/feedparser/tests/wellformed/rss/rss_version_092.xml deleted file mode 100644 index 3f3b82ad4..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_092.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 0.92 -Expect: not bozo and version == u'rss092' ---> -<rss version="0.92"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_093.xml b/lib/feedparser/tests/wellformed/rss/rss_version_093.xml deleted file mode 100644 index 5855af68c..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_093.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 0.93 -Expect: not bozo and version == u'rss093' ---> -<rss version="0.93"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_094.xml b/lib/feedparser/tests/wellformed/rss/rss_version_094.xml deleted file mode 100644 index 8b03e17d9..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_094.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 0.94 -Expect: not bozo and version == u'rss094' ---> -<rss version="0.94"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_20.xml b/lib/feedparser/tests/wellformed/rss/rss_version_20.xml deleted file mode 100644 index 56ffbdde0..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_20.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 2.0 -Expect: not bozo and version == u'rss20' ---> -<rss version="2.0"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_201.xml b/lib/feedparser/tests/wellformed/rss/rss_version_201.xml deleted file mode 100644 index 749659793..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_201.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 2.01 -Expect: not bozo and version == u'rss20' ---> -<rss version="2.01"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_21.xml b/lib/feedparser/tests/wellformed/rss/rss_version_21.xml deleted file mode 100644 index b7d45ef75..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_21.xml +++ /dev/null @@ -1,6 +0,0 @@ -<!-- -Description: RSS version 2.1 -Expect: not bozo and version == u'rss20' ---> -<rss version="2.1"> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/rss/rss_version_missing.xml b/lib/feedparser/tests/wellformed/rss/rss_version_missing.xml deleted file mode 100644 index e6440d881..000000000 --- a/lib/feedparser/tests/wellformed/rss/rss_version_missing.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: missing RSS version number -Expect: not bozo and version == u'rss' ---> -<rss> -<channel> -<description>Example description</description> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_abbr.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_abbr.xml deleted file mode 100644 index 71c1aa744..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_abbr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain abbr attribute -Expect: not bozo and entries[0]['description'] == '<span abbr=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span abbr=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept-charset.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept-charset.xml deleted file mode 100644 index 28c849776..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept-charset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain accept-charset attribute -Expect: not bozo and entries[0]['description'] == '<span accept-charset=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span accept-charset=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept.xml deleted file mode 100644 index 9eaee2335..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accept.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain accept attribute -Expect: not bozo and entries[0]['description'] == '<span accept=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span accept=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accesskey.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accesskey.xml deleted file mode 100644 index dd41be868..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_accesskey.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain accesskey attribute -Expect: not bozo and entries[0]['description'] == '<span accesskey=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span accesskey=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_action.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_action.xml deleted file mode 100644 index fa15e1e95..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_action.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain action attribute -Expect: not bozo and entries[0]['description'] == '<span action=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span action=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_align.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_align.xml deleted file mode 100644 index 9d1c53b74..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_align.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain align attribute -Expect: not bozo and entries[0]['description'] == '<span align=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span align=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_alt.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_alt.xml deleted file mode 100644 index 88c0b1943..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_alt.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain alt attribute -Expect: not bozo and entries[0]['description'] == '<span alt=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span alt=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autocomplete.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autocomplete.xml deleted file mode 100644 index 71399464b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autocomplete.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain autocomplete attribute -Expect: not bozo and entries[0]['description'] == '<span autocomplete=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span autocomplete=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autofocus.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autofocus.xml deleted file mode 100644 index 77cd3fa34..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autofocus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain autofocus attribute -Expect: not bozo and entries[0]['description'] == '<span autofocus=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span autofocus=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autoplay.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autoplay.xml deleted file mode 100644 index 0d8729343..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_autoplay.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain autoplay attribute -Expect: not bozo and entries[0]['description'] == '<span></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span autoplay=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_axis.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_axis.xml deleted file mode 100644 index 2d3232f1f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_axis.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain axis attribute -Expect: not bozo and entries[0]['description'] == '<span axis=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span axis=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_background.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_background.xml deleted file mode 100644 index bc0fb9b94..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_background.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain background attribute -Expect: not bozo and entries[0]['description'] == '<span background=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span background=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_balance.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_balance.xml deleted file mode 100644 index 9a9dfc741..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_balance.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain balance attribute -Expect: not bozo and entries[0]['description'] == '<span balance=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span balance=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgcolor.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgcolor.xml deleted file mode 100644 index efc9f5c35..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgcolor.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain bgcolor attribute -Expect: not bozo and entries[0]['description'] == '<span bgcolor=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span bgcolor=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgproperties.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgproperties.xml deleted file mode 100644 index 8f964272e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bgproperties.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain bgproperties attribute -Expect: not bozo and entries[0]['description'] == '<span bgproperties=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span bgproperties=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_border.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_border.xml deleted file mode 100644 index 80b118dd9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_border.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain border attribute -Expect: not bozo and entries[0]['description'] == '<span border=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span border=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolor.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolor.xml deleted file mode 100644 index 5b314be88..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolor.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain bordercolor attribute -Expect: not bozo and entries[0]['description'] == '<span bordercolor=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span bordercolor=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolordark.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolordark.xml deleted file mode 100644 index 5913ffabb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolordark.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain bordercolordark attribute -Expect: not bozo and entries[0]['description'] == '<span bordercolordark=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span bordercolordark=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolorlight.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolorlight.xml deleted file mode 100644 index 4883e64a6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bordercolorlight.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain bordercolorlight attribute -Expect: not bozo and entries[0]['description'] == '<span bordercolorlight=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span bordercolorlight=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bottompadding.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bottompadding.xml deleted file mode 100644 index beaad75f1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_bottompadding.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain bottompadding attribute -Expect: not bozo and entries[0]['description'] == '<span bottompadding=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span bottompadding=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellpadding.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellpadding.xml deleted file mode 100644 index 27c4df18b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellpadding.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain cellpadding attribute -Expect: not bozo and entries[0]['description'] == '<span cellpadding=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span cellpadding=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellspacing.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellspacing.xml deleted file mode 100644 index 4043ac5cf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cellspacing.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain cellspacing attribute -Expect: not bozo and entries[0]['description'] == '<span cellspacing=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span cellspacing=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ch.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ch.xml deleted file mode 100644 index e1dcbcec6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ch.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain ch attribute -Expect: not bozo and entries[0]['description'] == '<span ch=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span ch=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_challenge.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_challenge.xml deleted file mode 100644 index 2eb2869ca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_challenge.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain challenge attribute -Expect: not bozo and entries[0]['description'] == '<span challenge=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span challenge=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_char.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_char.xml deleted file mode 100644 index 31d30b4ea..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_char.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain char attribute -Expect: not bozo and entries[0]['description'] == '<span char=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span char=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charoff.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charoff.xml deleted file mode 100644 index 4f8663404..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charoff.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain charoff attribute -Expect: not bozo and entries[0]['description'] == '<span charoff=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span charoff=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charset.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charset.xml deleted file mode 100644 index 85d2a1fb1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_charset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain charset attribute -Expect: not bozo and entries[0]['description'] == '<span charset=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span charset=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_checked.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_checked.xml deleted file mode 100644 index 259e17c75..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_checked.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain checked attribute -Expect: not bozo and entries[0]['description'] == '<span checked=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span checked=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_choff.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_choff.xml deleted file mode 100644 index 2e3e79bfe..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_choff.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain choff attribute -Expect: not bozo and entries[0]['description'] == '<span choff=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span choff=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cite.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cite.xml deleted file mode 100644 index 5eb0011fa..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cite.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain cite attribute -Expect: not bozo and entries[0]['description'] == '<span cite=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span cite=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_class.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_class.xml deleted file mode 100644 index bd2577dbe..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_class.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain class attribute -Expect: not bozo and entries[0]['description'] == '<span class=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span class=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_clear.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_clear.xml deleted file mode 100644 index a1a572dc5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_clear.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain clear attribute -Expect: not bozo and entries[0]['description'] == '<span clear=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span clear=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_color.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_color.xml deleted file mode 100644 index 980ccfc14..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_color.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain color attribute -Expect: not bozo and entries[0]['description'] == '<span color=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span color=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cols.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cols.xml deleted file mode 100644 index ceeef598c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_cols.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain cols attribute -Expect: not bozo and entries[0]['description'] == '<span cols=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span cols=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_colspan.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_colspan.xml deleted file mode 100644 index eef6cb6c6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_colspan.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain colspan attribute -Expect: not bozo and entries[0]['description'] == '<span colspan=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span colspan=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_compact.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_compact.xml deleted file mode 100644 index 61a0bbe68..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_compact.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain compact attribute -Expect: not bozo and entries[0]['description'] == '<span compact=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span compact=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_contenteditable.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_contenteditable.xml deleted file mode 100644 index 328c6249b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_contenteditable.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain contenteditable attribute -Expect: not bozo and entries[0]['description'] == '<span contenteditable=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span contenteditable=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_coords.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_coords.xml deleted file mode 100644 index 9d389fb68..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_coords.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain coords attribute -Expect: not bozo and entries[0]['description'] == '<span coords=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span coords=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_data.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_data.xml deleted file mode 100644 index 537d331ea..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_data.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain data attribute -Expect: not bozo and entries[0]['description'] == '<span data=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span data=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datafld.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datafld.xml deleted file mode 100644 index 44837182d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datafld.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain datafld attribute -Expect: not bozo and entries[0]['description'] == '<span datafld=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span datafld=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datapagesize.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datapagesize.xml deleted file mode 100644 index 4093280af..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datapagesize.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain datapagesize attribute -Expect: not bozo and entries[0]['description'] == '<span datapagesize=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span datapagesize=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datasrc.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datasrc.xml deleted file mode 100644 index 3d86946b9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datasrc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain datasrc attribute -Expect: not bozo and entries[0]['description'] == '<span datasrc=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span datasrc=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datetime.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datetime.xml deleted file mode 100644 index 6554045bd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_datetime.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain datetime attribute -Expect: not bozo and entries[0]['description'] == '<span datetime=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span datetime=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_default.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_default.xml deleted file mode 100644 index 17829c043..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_default.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain default attribute -Expect: not bozo and entries[0]['description'] == '<span default=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span default=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_delay.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_delay.xml deleted file mode 100644 index ee7777d72..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_delay.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain delay attribute -Expect: not bozo and entries[0]['description'] == '<span delay=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span delay=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dir.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dir.xml deleted file mode 100644 index c0618cc1e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dir.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain dir attribute -Expect: not bozo and entries[0]['description'] == '<span dir=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span dir=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_disabled.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_disabled.xml deleted file mode 100644 index aa9194a9e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_disabled.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain disabled attribute -Expect: not bozo and entries[0]['description'] == '<span disabled=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span disabled=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_draggable.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_draggable.xml deleted file mode 100644 index 88720d3d9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_draggable.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain draggable attribute -Expect: not bozo and entries[0]['description'] == '<span draggable=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span draggable=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dynsrc.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dynsrc.xml deleted file mode 100644 index c57ccb764..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_dynsrc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain dynsrc attribute -Expect: not bozo and entries[0]['description'] == '<span dynsrc=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span dynsrc=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_enctype.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_enctype.xml deleted file mode 100644 index ab50610ae..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_enctype.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain enctype attribute -Expect: not bozo and entries[0]['description'] == '<span enctype=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span enctype=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_end.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_end.xml deleted file mode 100644 index 22cc29e44..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_end.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain end attribute -Expect: not bozo and entries[0]['description'] == '<span end=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span end=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_face.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_face.xml deleted file mode 100644 index 6c595b035..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_face.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain face attribute -Expect: not bozo and entries[0]['description'] == '<span face=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span face=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_for.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_for.xml deleted file mode 100644 index 2b08493f5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_for.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain for attribute -Expect: not bozo and entries[0]['description'] == '<span for=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span for=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_form.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_form.xml deleted file mode 100644 index 4b37f62c9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_form.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain form attribute -Expect: not bozo and entries[0]['description'] == '<span form=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span form=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_frame.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_frame.xml deleted file mode 100644 index ed8d85a22..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_frame.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain frame attribute -Expect: not bozo and entries[0]['description'] == '<span frame=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span frame=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_galleryimg.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_galleryimg.xml deleted file mode 100644 index f46682585..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_galleryimg.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain galleryimg attribute -Expect: not bozo and entries[0]['description'] == '<span galleryimg=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span galleryimg=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_gutter.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_gutter.xml deleted file mode 100644 index ed5a8f5a6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_gutter.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain gutter attribute -Expect: not bozo and entries[0]['description'] == '<span gutter=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span gutter=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_headers.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_headers.xml deleted file mode 100644 index 6e805fcce..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_headers.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain headers attribute -Expect: not bozo and entries[0]['description'] == '<span headers=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span headers=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_height.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_height.xml deleted file mode 100644 index 881636bc4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_height.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain height attribute -Expect: not bozo and entries[0]['description'] == '<span height=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span height=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidden.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidden.xml deleted file mode 100644 index 7e45d5b42..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidden.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain hidden attribute -Expect: not bozo and entries[0]['description'] == '<span hidden=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span hidden=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidefocus.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidefocus.xml deleted file mode 100644 index b1ae3e083..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hidefocus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain hidefocus attribute -Expect: not bozo and entries[0]['description'] == '<span hidefocus=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span hidefocus=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_high.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_high.xml deleted file mode 100644 index b89160b75..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_high.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain high attribute -Expect: not bozo and entries[0]['description'] == '<span high=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span high=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_href.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_href.xml deleted file mode 100644 index 4382e9fca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_href.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain href attribute -Expect: not bozo and entries[0]['description'] == '<span href=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span href=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hreflang.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hreflang.xml deleted file mode 100644 index a48b42f33..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hreflang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain hreflang attribute -Expect: not bozo and entries[0]['description'] == '<span hreflang=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span hreflang=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hspace.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hspace.xml deleted file mode 100644 index c08a60273..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_hspace.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain hspace attribute -Expect: not bozo and entries[0]['description'] == '<span hspace=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span hspace=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_icon.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_icon.xml deleted file mode 100644 index 444a6b8f1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_icon.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain icon attribute -Expect: not bozo and entries[0]['description'] == '<span icon=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span icon=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_id.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_id.xml deleted file mode 100644 index d9f93a842..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_id.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain id attribute -Expect: not bozo and entries[0]['description'] == '<span id=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span id=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_inputmode.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_inputmode.xml deleted file mode 100644 index b09563904..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_inputmode.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain inputmode attribute -Expect: not bozo and entries[0]['description'] == '<span inputmode=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span inputmode=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ismap.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ismap.xml deleted file mode 100644 index eda48b6ef..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ismap.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain ismap attribute -Expect: not bozo and entries[0]['description'] == '<span ismap=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span ismap=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_keytype.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_keytype.xml deleted file mode 100644 index 074727b9d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_keytype.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain keytype attribute -Expect: not bozo and entries[0]['description'] == '<span keytype=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span keytype=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_label.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_label.xml deleted file mode 100644 index 340a4c389..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_label.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain label attribute -Expect: not bozo and entries[0]['description'] == '<span label=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span label=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lang.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lang.xml deleted file mode 100644 index 2d7e5261e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lang.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain lang attribute -Expect: not bozo and entries[0]['description'] == '<span lang=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span lang=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_leftspacing.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_leftspacing.xml deleted file mode 100644 index a6432e0cd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_leftspacing.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain leftspacing attribute -Expect: not bozo and entries[0]['description'] == '<span leftspacing=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span leftspacing=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_list.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_list.xml deleted file mode 100644 index 360b27f81..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_list.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain list attribute -Expect: not bozo and entries[0]['description'] == '<span list=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span list=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_longdesc.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_longdesc.xml deleted file mode 100644 index 97b7d9412..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_longdesc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain longdesc attribute -Expect: not bozo and entries[0]['description'] == '<span longdesc=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span longdesc=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loop.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loop.xml deleted file mode 100644 index 8201f52dc..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loop.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain loop attribute -Expect: not bozo and entries[0]['description'] == '<span loop=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span loop=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopcount.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopcount.xml deleted file mode 100644 index 8bde8e888..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopcount.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain loopcount attribute -Expect: not bozo and entries[0]['description'] == '<span loopcount=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span loopcount=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopend.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopend.xml deleted file mode 100644 index fa608d175..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopend.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain loopend attribute -Expect: not bozo and entries[0]['description'] == '<span loopend=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span loopend=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopstart.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopstart.xml deleted file mode 100644 index f11901278..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_loopstart.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain loopstart attribute -Expect: not bozo and entries[0]['description'] == '<span loopstart=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span loopstart=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_low.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_low.xml deleted file mode 100644 index 8ec062fe6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_low.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain low attribute -Expect: not bozo and entries[0]['description'] == '<span low=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span low=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lowsrc.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lowsrc.xml deleted file mode 100644 index a4258e36e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_lowsrc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain lowsrc attribute -Expect: not bozo and entries[0]['description'] == '<span lowsrc=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span lowsrc=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_max.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_max.xml deleted file mode 100644 index 80cbaebad..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_max.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain max attribute -Expect: not bozo and entries[0]['description'] == '<span max=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span max=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_maxlength.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_maxlength.xml deleted file mode 100644 index ad16126e3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_maxlength.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain maxlength attribute -Expect: not bozo and entries[0]['description'] == '<span maxlength=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span maxlength=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_media.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_media.xml deleted file mode 100644 index daeea4417..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_media.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain media attribute -Expect: not bozo and entries[0]['description'] == '<span media=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span media=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_method.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_method.xml deleted file mode 100644 index c3a81ce55..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_method.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain method attribute -Expect: not bozo and entries[0]['description'] == '<span method=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span method=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_min.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_min.xml deleted file mode 100644 index ad28c081f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_min.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain min attribute -Expect: not bozo and entries[0]['description'] == '<span min=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span min=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_multiple.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_multiple.xml deleted file mode 100644 index ef1e17ac0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_multiple.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain multiple attribute -Expect: not bozo and entries[0]['description'] == '<span multiple=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span multiple=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_name.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_name.xml deleted file mode 100644 index 0f98d7696..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_name.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain name attribute -Expect: not bozo and entries[0]['description'] == '<span name=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span name=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nohref.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nohref.xml deleted file mode 100644 index 1b7fb0d96..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nohref.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain nohref attribute -Expect: not bozo and entries[0]['description'] == '<span nohref=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span nohref=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_noshade.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_noshade.xml deleted file mode 100644 index b1371da35..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_noshade.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain noshade attribute -Expect: not bozo and entries[0]['description'] == '<span noshade=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span noshade=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nowrap.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nowrap.xml deleted file mode 100644 index b312dea07..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_nowrap.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain nowrap attribute -Expect: not bozo and entries[0]['description'] == '<span nowrap=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span nowrap=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_open.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_open.xml deleted file mode 100644 index 2f4fc43ca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_open.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain open attribute -Expect: not bozo and entries[0]['description'] == '<span open=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span open=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_optimum.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_optimum.xml deleted file mode 100644 index a12207634..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_optimum.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain optimum attribute -Expect: not bozo and entries[0]['description'] == '<span optimum=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span optimum=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pattern.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pattern.xml deleted file mode 100644 index c4e10322c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pattern.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain pattern attribute -Expect: not bozo and entries[0]['description'] == '<span pattern=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span pattern=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ping.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ping.xml deleted file mode 100644 index 03b4f233a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_ping.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain ping attribute -Expect: not bozo and entries[0]['description'] == '<span ping=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span ping=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_point-size.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_point-size.xml deleted file mode 100644 index f6a6713f2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_point-size.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain point-size attribute -Expect: not bozo and entries[0]['description'] == '<span point-size=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span point-size=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_poster.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_poster.xml deleted file mode 100644 index 4148f5e70..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_poster.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain poster attribute -Expect: not bozo and entries[0]['description'] == '<video poster="http://d.test/p.jpeg"></video>' ---> -<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://d.test/"> -<entry> -<content type="html"><video poster="p.jpeg"></video></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pqg.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pqg.xml deleted file mode 100644 index c2afa36a0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_pqg.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain pqg attribute -Expect: not bozo and entries[0]['description'] == '<span pqg=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span pqg=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_preload.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_preload.xml deleted file mode 100644 index 0e26d0914..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_preload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain preload attribute -Expect: not bozo and entries[0]['description'] == '<video preload="auto"></video>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><video preload="auto"></video></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_prompt.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_prompt.xml deleted file mode 100644 index 86f0d0b6d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_prompt.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain prompt attribute -Expect: not bozo and entries[0]['description'] == '<span prompt=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span prompt=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_radiogroup.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_radiogroup.xml deleted file mode 100644 index d575eace6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_radiogroup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain radiogroup attribute -Expect: not bozo and entries[0]['description'] == '<span radiogroup=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span radiogroup=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_readonly.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_readonly.xml deleted file mode 100644 index f123f839e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_readonly.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain readonly attribute -Expect: not bozo and entries[0]['description'] == '<span readonly=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span readonly=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rel.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rel.xml deleted file mode 100644 index cd09d3085..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rel.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain rel attribute -Expect: not bozo and entries[0]['description'] == '<span rel=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span rel=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-max.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-max.xml deleted file mode 100644 index 15b868742..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-max.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain repeat-max attribute -Expect: not bozo and entries[0]['description'] == '<span repeat-max=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span repeat-max=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-min.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-min.xml deleted file mode 100644 index 9549f0e42..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_repeat-min.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain repeat-min attribute -Expect: not bozo and entries[0]['description'] == '<span repeat-min=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span repeat-min=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_replace.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_replace.xml deleted file mode 100644 index 2fb1e8c45..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_replace.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain replace attribute -Expect: not bozo and entries[0]['description'] == '<span replace=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span replace=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_required.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_required.xml deleted file mode 100644 index 3252c8a49..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_required.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain required attribute -Expect: not bozo and entries[0]['description'] == '<span required=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span required=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rev.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rev.xml deleted file mode 100644 index 8f56b0267..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rev.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain rev attribute -Expect: not bozo and entries[0]['description'] == '<span rev=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span rev=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rightspacing.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rightspacing.xml deleted file mode 100644 index 9a90e34ac..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rightspacing.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain rightspacing attribute -Expect: not bozo and entries[0]['description'] == '<span rightspacing=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span rightspacing=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rows.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rows.xml deleted file mode 100644 index 6817c5435..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rows.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain rows attribute -Expect: not bozo and entries[0]['description'] == '<span rows=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span rows=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rowspan.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rowspan.xml deleted file mode 100644 index daca0671c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rowspan.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain rowspan attribute -Expect: not bozo and entries[0]['description'] == '<span rowspan=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span rowspan=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rules.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rules.xml deleted file mode 100644 index 62a718cc8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_rules.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain rules attribute -Expect: not bozo and entries[0]['description'] == '<span rules=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span rules=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_scope.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_scope.xml deleted file mode 100644 index 7ae2c075a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_scope.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain scope attribute -Expect: not bozo and entries[0]['description'] == '<span scope=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span scope=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_selected.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_selected.xml deleted file mode 100644 index e1ff4b1f7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_selected.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain selected attribute -Expect: not bozo and entries[0]['description'] == '<span selected=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span selected=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_shape.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_shape.xml deleted file mode 100644 index 9bcb69231..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_shape.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain shape attribute -Expect: not bozo and entries[0]['description'] == '<span shape=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span shape=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_size.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_size.xml deleted file mode 100644 index 5a7d7a98a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_size.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain size attribute -Expect: not bozo and entries[0]['description'] == '<span size=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span size=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_span.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_span.xml deleted file mode 100644 index e6da56c4c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_span.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain span attribute -Expect: not bozo and entries[0]['description'] == '<span span=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span span=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_src.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_src.xml deleted file mode 100644 index fd6636bac..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_src.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain src attribute -Expect: not bozo and entries[0]['description'] == '<span src=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span src=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_start.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_start.xml deleted file mode 100644 index 813747487..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_start.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain start attribute -Expect: not bozo and entries[0]['description'] == '<span start=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span start=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_step.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_step.xml deleted file mode 100644 index 3935b8105..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_step.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain step attribute -Expect: not bozo and entries[0]['description'] == '<span step=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span step=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_summary.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_summary.xml deleted file mode 100644 index 903ccf68e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_summary.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain summary attribute -Expect: not bozo and entries[0]['description'] == '<span summary=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span summary=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_suppress.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_suppress.xml deleted file mode 100644 index 9779ee12e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_suppress.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain suppress attribute -Expect: not bozo and entries[0]['description'] == '<span suppress=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span suppress=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_tabindex.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_tabindex.xml deleted file mode 100644 index a6c0ec6e2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_tabindex.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain tabindex attribute -Expect: not bozo and entries[0]['description'] == '<span tabindex=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span tabindex=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_target.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_target.xml deleted file mode 100644 index 3716ecd3f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_target.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain target attribute -Expect: not bozo and entries[0]['description'] == '<span target=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span target=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_template.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_template.xml deleted file mode 100644 index b624ee091..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_template.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain template attribute -Expect: not bozo and entries[0]['description'] == '<span template=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span template=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_title.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_title.xml deleted file mode 100644 index 0e8d52070..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_title.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain title attribute -Expect: not bozo and entries[0]['description'] == '<span title=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span title=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_toppadding.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_toppadding.xml deleted file mode 100644 index 248bfbfb3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_toppadding.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain toppadding attribute -Expect: not bozo and entries[0]['description'] == '<span toppadding=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span toppadding=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_type.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_type.xml deleted file mode 100644 index 7f9479f40..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_type.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain type attribute -Expect: not bozo and entries[0]['description'] == '<span type=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span type=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_unselectable.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_unselectable.xml deleted file mode 100644 index 4ef7f63ad..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_unselectable.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain unselectable attribute -Expect: not bozo and entries[0]['description'] == '<span unselectable=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span unselectable=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_urn.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_urn.xml deleted file mode 100644 index ebbcfc5b0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_urn.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain urn attribute -Expect: not bozo and entries[0]['description'] == '<span urn=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span urn=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_usemap.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_usemap.xml deleted file mode 100644 index d0a76387d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_usemap.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain usemap attribute -Expect: not bozo and entries[0]['description'] == '<span usemap=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span usemap=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_valign.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_valign.xml deleted file mode 100644 index 21efa6bf8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_valign.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain valign attribute -Expect: not bozo and entries[0]['description'] == '<span valign=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span valign=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_value.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_value.xml deleted file mode 100644 index 56ce060c1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_value.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain value attribute -Expect: not bozo and entries[0]['description'] == '<span value=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span value=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_variable.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_variable.xml deleted file mode 100644 index ada4076f1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_variable.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain variable attribute -Expect: not bozo and entries[0]['description'] == '<span variable=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span variable=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_volume.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_volume.xml deleted file mode 100644 index 058520922..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_volume.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain volume attribute -Expect: not bozo and entries[0]['description'] == '<span volume=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span volume=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vrml.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vrml.xml deleted file mode 100644 index 50b7a3f4e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vrml.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain vrml attribute -Expect: not bozo and entries[0]['description'] == '<span vrml=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span vrml=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vspace.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vspace.xml deleted file mode 100644 index 7eca04f8b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_vspace.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain vspace attribute -Expect: not bozo and entries[0]['description'] == '<span vspace=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span vspace=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_width.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_width.xml deleted file mode 100644 index c2b4cebe0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_width.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain width attribute -Expect: not bozo and entries[0]['description'] == '<span width=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span width=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_wrap.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_wrap.xml deleted file mode 100644 index 1b23e49fb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_attribute_wrap.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain wrap attribute -Expect: not bozo and entries[0]['description'] == '<span wrap=""></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span wrap=""></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_a.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_a.xml deleted file mode 100644 index 3c5028912..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_a.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <a></a> -Expect: not bozo and entries[0]['description'] == '<a></a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><a></a></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_abbr.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_abbr.xml deleted file mode 100644 index 4aafa029e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_abbr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <abbr></abbr> -Expect: not bozo and entries[0]['description'] == '<abbr></abbr>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><abbr></abbr></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_acronym.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_acronym.xml deleted file mode 100644 index 5762c3980..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_acronym.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <acronym></acronym> -Expect: not bozo and entries[0]['description'] == '<acronym></acronym>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><acronym></acronym></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_address.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_address.xml deleted file mode 100644 index e11de2fb2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_address.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <address></address> -Expect: not bozo and entries[0]['description'] == '<address></address>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><address></address></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_area.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_area.xml deleted file mode 100644 index ce4a14fe6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_area.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <area></area> -Expect: not bozo and entries[0]['description'] == '<area />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><area></area></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_article.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_article.xml deleted file mode 100644 index 3c1c3285e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_article.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <article></article> -Expect: not bozo and entries[0]['description'] == '<article></article>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><article></article></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_aside.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_aside.xml deleted file mode 100644 index 035ab288b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_aside.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <aside></aside> -Expect: not bozo and entries[0]['description'] == '<aside></aside>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><aside></aside></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_audio.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_audio.xml deleted file mode 100644 index 3923dfab1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_audio.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <audio></audio> -Expect: not bozo and entries[0]['description'] == '<audio></audio>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><audio></audio></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_b.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_b.xml deleted file mode 100644 index 76cdf89c6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_b.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <b></b> -Expect: not bozo and entries[0]['description'] == '<b></b>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><b></b></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_big.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_big.xml deleted file mode 100644 index 8671e0962..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_big.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <big></big> -Expect: not bozo and entries[0]['description'] == '<big></big>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><big></big></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_blockquote.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_blockquote.xml deleted file mode 100644 index 5eae04510..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_blockquote.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <blockquote></blockquote> -Expect: not bozo and entries[0]['description'] == '<blockquote></blockquote>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><blockquote></blockquote></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_br.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_br.xml deleted file mode 100644 index 192a27ced..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_br.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <br></br> -Expect: not bozo and entries[0]['description'] == '<br />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><br></br></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_button.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_button.xml deleted file mode 100644 index 9a07d9f05..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_button.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <button></button> -Expect: not bozo and entries[0]['description'] == '<button></button>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><button></button></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_canvas.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_canvas.xml deleted file mode 100644 index 99b97bd09..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_canvas.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <canvas></canvas> -Expect: not bozo and entries[0]['description'] == '<canvas></canvas>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><canvas></canvas></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_caption.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_caption.xml deleted file mode 100644 index fc4c55af8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_caption.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <caption></caption> -Expect: not bozo and entries[0]['description'] == '<caption></caption>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><caption></caption></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_center.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_center.xml deleted file mode 100644 index 8aecf8f35..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_center.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <center></center> -Expect: not bozo and entries[0]['description'] == '<center></center>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><center></center></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_cite.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_cite.xml deleted file mode 100644 index 0af1302eb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_cite.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <cite></cite> -Expect: not bozo and entries[0]['description'] == '<cite></cite>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><cite></cite></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_code.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_code.xml deleted file mode 100644 index c43bfe026..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_code.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <code></code> -Expect: not bozo and entries[0]['description'] == '<code></code>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><code></code></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_col.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_col.xml deleted file mode 100644 index 14b064fe8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_col.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <col></col> -Expect: not bozo and entries[0]['description'] == '<col />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><col></col></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_colgroup.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_colgroup.xml deleted file mode 100644 index 0b628463f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_colgroup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <colgroup></colgroup> -Expect: not bozo and entries[0]['description'] == '<colgroup></colgroup>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><colgroup></colgroup></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_command.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_command.xml deleted file mode 100644 index c09276c88..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_command.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <command /> -Expect: not bozo and entries[0]['description'] == '<command />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><command></command></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_datagrid.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_datagrid.xml deleted file mode 100644 index a9b1a681c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_datagrid.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <datagrid></datagrid> -Expect: not bozo and entries[0]['description'] == '<datagrid></datagrid>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><datagrid></datagrid></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_datalist.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_datalist.xml deleted file mode 100644 index d4ab94bbc..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_datalist.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <datalist></datalist> -Expect: not bozo and entries[0]['description'] == '<datalist></datalist>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><datalist></datalist></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dd.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dd.xml deleted file mode 100644 index 99b110ae1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dd.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <dd></dd> -Expect: not bozo and entries[0]['description'] == '<dd></dd>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><dd></dd></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_del.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_del.xml deleted file mode 100644 index 36444a5ec..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_del.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <del></del> -Expect: not bozo and entries[0]['description'] == '<del></del>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><del></del></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_details.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_details.xml deleted file mode 100644 index c66b6b07d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_details.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <details></details> -Expect: not bozo and entries[0]['description'] == '<details></details>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><details></details></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dfn.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dfn.xml deleted file mode 100644 index d6d09546d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dfn.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <dfn></dfn> -Expect: not bozo and entries[0]['description'] == '<dfn></dfn>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><dfn></dfn></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dialog.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dialog.xml deleted file mode 100644 index c0f912209..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dialog.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <dialog></dialog> -Expect: not bozo and entries[0]['description'] == '<dialog></dialog>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><dialog></dialog></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dir.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dir.xml deleted file mode 100644 index 55e74651c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dir.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <dir></dir> -Expect: not bozo and entries[0]['description'] == '<dir></dir>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><dir></dir></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_div.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_div.xml deleted file mode 100644 index aecbff335..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_div.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <div></div> -Expect: not bozo and entries[0]['description'] == '<div></div>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><div></div></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dl.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dl.xml deleted file mode 100644 index bd14c61c8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dl.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <dl></dl> -Expect: not bozo and entries[0]['description'] == '<dl></dl>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><dl></dl></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dt.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dt.xml deleted file mode 100644 index 9cb828c66..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_dt.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <dt></dt> -Expect: not bozo and entries[0]['description'] == '<dt></dt>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><dt></dt></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_em.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_em.xml deleted file mode 100644 index 1fad48eda..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_em.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <em></em> -Expect: not bozo and entries[0]['description'] == '<em></em>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><em></em></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_event-source.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_event-source.xml deleted file mode 100644 index 693381fc9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_event-source.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <event-source></event-source> -Expect: not bozo and entries[0]['description'] == '<event-source></event-source>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><event-source></event-source></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_fieldset.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_fieldset.xml deleted file mode 100644 index 489fc29db..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_fieldset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <fieldset></fieldset> -Expect: not bozo and entries[0]['description'] == '<fieldset></fieldset>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><fieldset></fieldset></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_figure.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_figure.xml deleted file mode 100644 index 0314699c1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_figure.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <figure></figure> -Expect: not bozo and entries[0]['description'] == '<figure></figure>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><figure></figure></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_font.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_font.xml deleted file mode 100644 index 4356a897c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_font.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <font></font> -Expect: not bozo and entries[0]['description'] == '<font></font>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><font></font></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_footer.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_footer.xml deleted file mode 100644 index 05fddcfaf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_footer.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <footer></footer> -Expect: not bozo and entries[0]['description'] == '<footer></footer>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><footer></footer></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_form.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_form.xml deleted file mode 100644 index b2795de9d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_form.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <form></form> -Expect: not bozo and entries[0]['description'] == '<form></form>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><form></form></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h1.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h1.xml deleted file mode 100644 index 792d84384..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h1.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <h1></h1> -Expect: not bozo and entries[0]['description'] == '<h1></h1>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><h1></h1></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h2.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h2.xml deleted file mode 100644 index 1e559c17b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h2.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <h2></h2> -Expect: not bozo and entries[0]['description'] == '<h2></h2>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><h2></h2></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h3.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h3.xml deleted file mode 100644 index d778b68ac..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h3.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <h3></h3> -Expect: not bozo and entries[0]['description'] == '<h3></h3>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><h3></h3></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h4.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h4.xml deleted file mode 100644 index 736e40d0c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h4.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <h4></h4> -Expect: not bozo and entries[0]['description'] == '<h4></h4>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><h4></h4></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h5.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h5.xml deleted file mode 100644 index 44d0cece3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h5.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <h5></h5> -Expect: not bozo and entries[0]['description'] == '<h5></h5>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><h5></h5></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h6.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h6.xml deleted file mode 100644 index e50a6a17b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_h6.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <h6></h6> -Expect: not bozo and entries[0]['description'] == '<h6></h6>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><h6></h6></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_header.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_header.xml deleted file mode 100644 index c6e124dc6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_header.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <header></header> -Expect: not bozo and entries[0]['description'] == '<header></header>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><header></header></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_hr.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_hr.xml deleted file mode 100644 index 9d960505a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_hr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <hr></hr> -Expect: not bozo and entries[0]['description'] == '<hr />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><hr></hr></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_i.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_i.xml deleted file mode 100644 index 6d61b4613..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_i.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <i></i> -Expect: not bozo and entries[0]['description'] == '<i></i>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><i></i></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_img.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_img.xml deleted file mode 100644 index 87c3e14e3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_img.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <img></img> -Expect: not bozo and entries[0]['description'] == '<img />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><img></img></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_input.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_input.xml deleted file mode 100644 index 955bcd852..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_input.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <input></input> -Expect: not bozo and entries[0]['description'] == '<input />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><input></input></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ins.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ins.xml deleted file mode 100644 index 75ebb8c75..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ins.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <ins></ins> -Expect: not bozo and entries[0]['description'] == '<ins></ins>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><ins></ins></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_kbd.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_kbd.xml deleted file mode 100644 index a26b8771c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_kbd.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <kbd></kbd> -Expect: not bozo and entries[0]['description'] == '<kbd></kbd>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><kbd></kbd></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_keygen.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_keygen.xml deleted file mode 100644 index e86b15f5e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_keygen.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <keygen /> -Expect: not bozo and entries[0]['description'] == '<keygen />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><keygen></keygen></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_label.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_label.xml deleted file mode 100644 index 64379d86f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_label.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <label></label> -Expect: not bozo and entries[0]['description'] == '<label></label>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><label></label></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_legend.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_legend.xml deleted file mode 100644 index c858b6fd2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_legend.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <legend></legend> -Expect: not bozo and entries[0]['description'] == '<legend></legend>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><legend></legend></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_li.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_li.xml deleted file mode 100644 index 212ed94cd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_li.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <li></li> -Expect: not bozo and entries[0]['description'] == '<li></li>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><li></li></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_m.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_m.xml deleted file mode 100644 index 0b14b58f8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_m.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <m></m> -Expect: not bozo and entries[0]['description'] == '<m></m>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><m></m></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_map.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_map.xml deleted file mode 100644 index 3f8835a0f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_map.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <map></map> -Expect: not bozo and entries[0]['description'] == '<map></map>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><map></map></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_menu.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_menu.xml deleted file mode 100644 index 3ecc3a214..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_menu.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <menu></menu> -Expect: not bozo and entries[0]['description'] == '<menu></menu>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><menu></menu></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_meter.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_meter.xml deleted file mode 100644 index d263e8aa0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_meter.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <meter></meter> -Expect: not bozo and entries[0]['description'] == '<meter></meter>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><meter></meter></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_multicol.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_multicol.xml deleted file mode 100644 index 96c65fbc8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_multicol.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <multicol></multicol> -Expect: not bozo and entries[0]['description'] == '<multicol></multicol>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><multicol></multicol></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_nav.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_nav.xml deleted file mode 100644 index 0a4be553b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_nav.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <nav></nav> -Expect: not bozo and entries[0]['description'] == '<nav></nav>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><nav></nav></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_nextid.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_nextid.xml deleted file mode 100644 index 83ac0b543..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_nextid.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <nextid></nextid> -Expect: not bozo and entries[0]['description'] == '<nextid></nextid>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><nextid></nextid></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_noscript.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_noscript.xml deleted file mode 100644 index 4d53a0804..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_noscript.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <noscript></noscript> -Expect: not bozo and entries[0]['description'] == '<noscript></noscript>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><noscript></noscript></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ol.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ol.xml deleted file mode 100644 index d41750ea7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ol.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <ol></ol> -Expect: not bozo and entries[0]['description'] == '<ol></ol>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><ol></ol></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_optgroup.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_optgroup.xml deleted file mode 100644 index 2ed4a5b34..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_optgroup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <optgroup></optgroup> -Expect: not bozo and entries[0]['description'] == '<optgroup></optgroup>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><optgroup></optgroup></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_option.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_option.xml deleted file mode 100644 index 944a0897c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_option.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <option></option> -Expect: not bozo and entries[0]['description'] == '<option></option>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><option></option></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_output.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_output.xml deleted file mode 100644 index bd6d2399b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_output.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <output></output> -Expect: not bozo and entries[0]['description'] == '<output></output>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><output></output></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_p.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_p.xml deleted file mode 100644 index ad67e0c72..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_p.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <p></p> -Expect: not bozo and entries[0]['description'] == '<p></p>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><p></p></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_pre.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_pre.xml deleted file mode 100644 index c6da1b86a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_pre.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <pre></pre> -Expect: not bozo and entries[0]['description'] == '<pre></pre>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><pre></pre></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_progress.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_progress.xml deleted file mode 100644 index 7b335e940..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_progress.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <progress></progress> -Expect: not bozo and entries[0]['description'] == '<progress></progress>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><progress></progress></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_q.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_q.xml deleted file mode 100644 index 95958d29d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_q.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <q></q> -Expect: not bozo and entries[0]['description'] == '<q></q>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><q></q></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_s.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_s.xml deleted file mode 100644 index 6a5e91181..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_s.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <s></s> -Expect: not bozo and entries[0]['description'] == '<s></s>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><s></s></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_samp.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_samp.xml deleted file mode 100644 index ededff49a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_samp.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <samp></samp> -Expect: not bozo and entries[0]['description'] == '<samp></samp>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><samp></samp></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_section.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_section.xml deleted file mode 100644 index 97044eb32..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_section.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <section></section> -Expect: not bozo and entries[0]['description'] == '<section></section>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><section></section></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_select.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_select.xml deleted file mode 100644 index 2f8091cb8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_select.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <select></select> -Expect: not bozo and entries[0]['description'] == '<select></select>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><select></select></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_small.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_small.xml deleted file mode 100644 index 3ec2a3ac2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_small.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <small></small> -Expect: not bozo and entries[0]['description'] == '<small></small>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><small></small></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sound.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sound.xml deleted file mode 100644 index d65966fb6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sound.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <sound></sound> -Expect: not bozo and entries[0]['description'] == '<sound></sound>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><sound></sound></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_source.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_source.xml deleted file mode 100644 index 87e924859..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_source.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <source /> -Expect: not bozo and entries[0]['description'] == '<source />' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><source></source></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_spacer.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_spacer.xml deleted file mode 100644 index 537b415fb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_spacer.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <spacer></spacer> -Expect: not bozo and entries[0]['description'] == '<spacer></spacer>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><spacer></spacer></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_span.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_span.xml deleted file mode 100644 index d1f19a145..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_span.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <span></span> -Expect: not bozo and entries[0]['description'] == '<span></span>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><span></span></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_strike.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_strike.xml deleted file mode 100644 index 0185a3d05..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_strike.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <strike></strike> -Expect: not bozo and entries[0]['description'] == '<strike></strike>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><strike></strike></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_strong.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_strong.xml deleted file mode 100644 index b931d2702..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_strong.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <strong></strong> -Expect: not bozo and entries[0]['description'] == '<strong></strong>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><strong></strong></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sub.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sub.xml deleted file mode 100644 index 578c437b4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sub.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <sub></sub> -Expect: not bozo and entries[0]['description'] == '<sub></sub>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><sub></sub></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sup.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sup.xml deleted file mode 100644 index 3e90091cf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_sup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <sup></sup> -Expect: not bozo and entries[0]['description'] == '<sup></sup>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><sup></sup></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_table.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_table.xml deleted file mode 100644 index d23afb57f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_table.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <table></table> -Expect: not bozo and entries[0]['description'] == '<table></table>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><table></table></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tbody.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tbody.xml deleted file mode 100644 index 09d43dae0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tbody.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <tbody></tbody> -Expect: not bozo and entries[0]['description'] == '<tbody></tbody>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><tbody></tbody></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_td.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_td.xml deleted file mode 100644 index 09d4ccdd4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_td.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <td></td> -Expect: not bozo and entries[0]['description'] == '<td></td>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><td></td></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_textarea.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_textarea.xml deleted file mode 100644 index b2a6758c2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_textarea.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <textarea></textarea> -Expect: not bozo and entries[0]['description'] == '<textarea></textarea>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><textarea></textarea></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tfoot.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tfoot.xml deleted file mode 100644 index 3ada9d6fb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tfoot.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <tfoot></tfoot> -Expect: not bozo and entries[0]['description'] == '<tfoot></tfoot>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><tfoot></tfoot></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_th.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_th.xml deleted file mode 100644 index 5441dac47..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_th.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <th></th> -Expect: not bozo and entries[0]['description'] == '<th></th>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><th></th></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_thead.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_thead.xml deleted file mode 100644 index 317100db1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_thead.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <thead></thead> -Expect: not bozo and entries[0]['description'] == '<thead></thead>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><thead></thead></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_time.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_time.xml deleted file mode 100644 index b69259925..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_time.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <time></time> -Expect: not bozo and entries[0]['description'] == '<time></time>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><time></time></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tr.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tr.xml deleted file mode 100644 index 2b83aace1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tr.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <tr></tr> -Expect: not bozo and entries[0]['description'] == '<tr></tr>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><tr></tr></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tt.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tt.xml deleted file mode 100644 index e23719e4e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_tt.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <tt></tt> -Expect: not bozo and entries[0]['description'] == '<tt></tt>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><tt></tt></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_u.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_u.xml deleted file mode 100644 index dd85877ca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_u.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <u></u> -Expect: not bozo and entries[0]['description'] == '<u></u>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><u></u></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ul.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ul.xml deleted file mode 100644 index a6e825e2e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_ul.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <ul></ul> -Expect: not bozo and entries[0]['description'] == '<ul></ul>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><ul></ul></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_var.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_var.xml deleted file mode 100644 index e39e71235..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_var.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <var></var> -Expect: not bozo and entries[0]['description'] == '<var></var>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><var></var></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_video.xml b/lib/feedparser/tests/wellformed/sanitize/acceptable_element_video.xml deleted file mode 100644 index c88a91c81..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/acceptable_element_video.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: content may contain <video></video> -Expect: not bozo and entries[0]['description'] == '<video></video>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> -<entry> -<content type="html"><video></video></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/blogger_dollar_sign_in_attribute.xml b/lib/feedparser/tests/wellformed/sanitize/blogger_dollar_sign_in_attribute.xml deleted file mode 100644 index c66295e4d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/blogger_dollar_sign_in_attribute.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: Blogger's stupid invalid img attribute (circa August 2011) -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img border="0" src="http://site.invalid/img.jpg" />' ---> -<feed xmlns='http://www.w3.org/2005/Atom'> - <entry> - <content type='html'> - <img border="0" i$="true" src="http://site.invalid/img.jpg" /> - </content> - </entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_applet.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_applet.xml deleted file mode 100644 index d2c314373..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_applet.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains applet -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://example.com/"></applet> <b>description</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_blink.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_blink.xml deleted file mode 100644 index 64f9e5749..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_blink.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains embed -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><blink>safe</blink> description</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_crazy.xml deleted file mode 100644 index 9260c1ca4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_crazy.xml +++ /dev/null @@ -1,75 +0,0 @@ -<!-- -Description: entry content is crazy -Expect: not bozo and entries[0]['content'][0]['value'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_embed.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_embed.xml deleted file mode 100644 index d8ff3775f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_embed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains embed -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<embed src="http://example.com/"> <b>description</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_frame.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_frame.xml deleted file mode 100644 index cfc75d170..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_frame.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains frameset -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> <b>description</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_iframe.xml deleted file mode 100644 index fc2a07be8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_iframe.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains iframe -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<iframe src="http://example.com/"> <b>description</b></iframe></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_link.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_link.xml deleted file mode 100644 index 2672577f2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains link -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> <b>description</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_meta.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_meta.xml deleted file mode 100644 index d22be265f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_meta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains meta -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> <b>description</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_object.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_object.xml deleted file mode 100644 index 24542192b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_object.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains object -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> <b>description</b></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onabort.xml deleted file mode 100644 index 55ddeb5f3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onabort.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onabort -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onblur.xml deleted file mode 100644 index a45a40c8b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onblur.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onblur -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onchange.xml deleted file mode 100644 index 3d4c3edea..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onchange.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onchange -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onclick.xml deleted file mode 100644 index 10f544c38..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onclick.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onclick -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_ondblclick.xml deleted file mode 100644 index 4817e3f9f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_ondblclick.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains ondblclick -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onerror.xml deleted file mode 100644 index 1d0bd0428..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onerror.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onerror -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onfocus.xml deleted file mode 100644 index b547ab437..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onfocus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onfocus -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeydown.xml deleted file mode 100644 index e3cc00642..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeydown.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onkeydown -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeypress.xml deleted file mode 100644 index 2e622b80b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeypress.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onkeypress -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeyup.xml deleted file mode 100644 index 668b8fb99..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onkeyup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onkeyup -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onload.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onload.xml deleted file mode 100644 index 11a25672e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onload -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onmousedown.xml deleted file mode 100644 index 546ae7cc9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmousedown.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onmousedown -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseout.xml deleted file mode 100644 index 3c34adbb9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseout.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onmouseout -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseover.xml deleted file mode 100644 index baccde4e9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseover.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onmouseover -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseup.xml deleted file mode 100644 index 5c11c082a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onmouseup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onmouseup -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onreset.xml deleted file mode 100644 index 5a69ab580..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onreset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onreset -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onresize.xml deleted file mode 100644 index ffa3bff69..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onresize.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onresize -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onsubmit.xml deleted file mode 100644 index c39468496..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onsubmit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onsubmit -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_onunload.xml deleted file mode 100644 index 3f42aa36f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_onunload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains onunload -Expect: not bozo and entries[0]['content'][0]['value'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_script.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_script.xml deleted file mode 100644 index e975dad56..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_script.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains script -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_script_base64.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_script_base64.xml deleted file mode 100644 index 210eb6ca9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_script_base64.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: entry content contains script (base64) -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="base64"> -c2FmZTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5sb2NhdGlvbi5ocmVmPSdodHRwOi8n -KycvZXhhbXBsZS5jb20vJzs8L3NjcmlwdD4gZGVzY3JpcHRpb24= -</content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_script_cdata.xml deleted file mode 100644 index 0bb07b9f5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_script_cdata.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains script (cdata) -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_script_inline.xml deleted file mode 100644 index 9c5c62394..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_script_inline.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains script (inline) -Expect: not bozo and entries[0]['content'][0]['value'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_style.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_style.xml deleted file mode 100644 index b243bf18f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_style.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains style -Expect: not bozo and entries[0]['content'][0]['value'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></content> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_content_style_tag.xml b/lib/feedparser/tests/wellformed/sanitize/entry_content_style_tag.xml deleted file mode 100644 index 6b38beb9d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_content_style_tag.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry content contains applet -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe <b>description</b>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<content type="text/html" mode="escaped">safe<style>b {color:red}</style> <b>description</b></content> -</entry> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_applet.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_applet.xml deleted file mode 100644 index 4404687f2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_applet.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains applet -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://example.com/"></applet> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_blink.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_blink.xml deleted file mode 100644 index 64e95bc68..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_blink.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains blink -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><blink>safe</blink> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_crazy.xml deleted file mode 100644 index cdc2ad176..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_crazy.xml +++ /dev/null @@ -1,75 +0,0 @@ -<!-- -Description: entry summary is crazy -Expect: not bozo and entries[0]['summary'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_embed.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_embed.xml deleted file mode 100644 index f7403ef99..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_embed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains embed -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<embed src="http://example.com/"> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_frame.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_frame.xml deleted file mode 100644 index a59a2d043..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_frame.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains frame -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_iframe.xml deleted file mode 100644 index a93899aad..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_iframe.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains iframe -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<iframe src="http://example.com/"> description</iframe></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_link.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_link.xml deleted file mode 100644 index 4db83dbe3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains link -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_meta.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_meta.xml deleted file mode 100644 index 42345e153..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_meta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains meta -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_object.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_object.xml deleted file mode 100644 index f38dcb5fd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_object.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains object -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onabort.xml deleted file mode 100644 index 97c867638..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onabort.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onabort -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onblur.xml deleted file mode 100644 index 1bc3f8302..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onblur.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onblur -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onchange.xml deleted file mode 100644 index 553aa3110..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onchange.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onchange -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onclick.xml deleted file mode 100644 index b5d1d4e1b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onclick.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onclick -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_ondblclick.xml deleted file mode 100644 index fc3a61a2f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_ondblclick.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains ondblclick -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onerror.xml deleted file mode 100644 index 60d46a18a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onerror.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onerror -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onfocus.xml deleted file mode 100644 index 6f47ec69b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onfocus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onfocus -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeydown.xml deleted file mode 100644 index 7eaa42c84..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeydown.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onkeydown -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeypress.xml deleted file mode 100644 index 8085f65d4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeypress.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onkeypress -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeyup.xml deleted file mode 100644 index 557422ee0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onkeyup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onkeyup -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onload.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onload.xml deleted file mode 100644 index 04323bcef..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onload -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmousedown.xml deleted file mode 100644 index bb74f81c1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmousedown.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onmousedown -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseout.xml deleted file mode 100644 index 3c60df977..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseout.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onmouseout -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseover.xml deleted file mode 100644 index f0732d052..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseover.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onmouseover -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseup.xml deleted file mode 100644 index 8b28f6dca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onmouseup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onmouseup -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onreset.xml deleted file mode 100644 index 997cfc4b2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onreset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onreset -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onresize.xml deleted file mode 100644 index 9a6a84e80..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onresize.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onresize -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onsubmit.xml deleted file mode 100644 index af6682fb1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onsubmit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onsubmit -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_onunload.xml deleted file mode 100644 index 6b1539dcd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_onunload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains onunload -Expect: not bozo and entries[0]['summary'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_script.xml deleted file mode 100644 index 3787017e0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains script -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_base64.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_base64.xml deleted file mode 100644 index 61c013cc2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_base64.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- -Description: entry summary contains script (base64) -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="base64"> -c2FmZTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5sb2NhdGlvbi5ocmVmPSdodHRwOi8n -KycvZXhhbXBsZS5jb20vJzs8L3NjcmlwdD4gZGVzY3JpcHRpb24= -</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_cdata.xml deleted file mode 100644 index 055e36608..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_cdata.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains script -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_inline.xml deleted file mode 100644 index 06d8ff9cf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_inline.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains script -Expect: not bozo and entries[0]['summary'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_map_description.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_map_description.xml deleted file mode 100644 index d3ffcc910..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_script_map_description.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains script (maps to description) -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_summary_style.xml b/lib/feedparser/tests/wellformed/sanitize/entry_summary_style.xml deleted file mode 100644 index 320de4e38..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_summary_style.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry summary contains style -Expect: not bozo and entries[0]['summary'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<summary type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></summary> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_applet.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_applet.xml deleted file mode 100644 index 4a84cf71e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_applet.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains applet -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://www.example.com/"></applet> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_blink.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_blink.xml deleted file mode 100644 index d7c7618af..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_blink.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains blink -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><blink>safe</blink> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_crazy.xml deleted file mode 100644 index 4d6929a04..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_crazy.xml +++ /dev/null @@ -1,75 +0,0 @@ -<!-- -Description: entry title is crazy -Expect: not bozo and entries[0]['title'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_embed.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_embed.xml deleted file mode 100644 index cc56f982d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_embed.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains embed -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<embed src="http://www.example.com/"> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_frame.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_frame.xml deleted file mode 100644 index eb5f80f9f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_frame.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains frame -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_iframe.xml deleted file mode 100644 index d3dd7b70c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_iframe.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains iframe -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<iframe src="http://www.example.com/"></iframe> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_link.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_link.xml deleted file mode 100644 index 28fa2fa95..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_link.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains link -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_meta.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_meta.xml deleted file mode 100644 index c707fe2e4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_meta.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains meta -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_object.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_object.xml deleted file mode 100644 index 06ba3788e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_object.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains object -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onabort.xml deleted file mode 100644 index 6669690ed..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onabort.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onabort -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onblur.xml deleted file mode 100644 index a5a09c9b4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onblur.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onblur -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onchange.xml deleted file mode 100644 index 9b5e22a4f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onchange.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onchange -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onclick.xml deleted file mode 100644 index 1e7c20c21..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onclick.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onclick -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_ondblclick.xml deleted file mode 100644 index 800904bb7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_ondblclick.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains ondblclick -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onerror.xml deleted file mode 100644 index d60cc44b7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onerror.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onerror -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onfocus.xml deleted file mode 100644 index b1218955c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onfocus.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onfocus -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeydown.xml deleted file mode 100644 index dfd3c2279..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeydown.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onkeydown -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeypress.xml deleted file mode 100644 index 5343e9480..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeypress.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onkeypress -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeyup.xml deleted file mode 100644 index 587d616dd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onkeyup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onkeyup -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onload.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onload.xml deleted file mode 100644 index 7b71552d4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onload -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onmousedown.xml deleted file mode 100644 index 69681fd90..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmousedown.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onmousedown -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseout.xml deleted file mode 100644 index fc25b8a88..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseout.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onmouseout -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseover.xml deleted file mode 100644 index 4dde5f37c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseover.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onmouseover -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseup.xml deleted file mode 100644 index 81cfdfce4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onmouseup.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onmouseup -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onreset.xml deleted file mode 100644 index e2bc481b8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onreset.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onreset -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onresize.xml deleted file mode 100644 index f96a76b28..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onresize.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onresize -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onsubmit.xml deleted file mode 100644 index b07628ac1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onsubmit.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onsubmit -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_onunload.xml deleted file mode 100644 index 0a6f998b6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_onunload.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains onunload -Expect: not bozo and entries[0]['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_script.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_script.xml deleted file mode 100644 index 868558867..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_script.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains script -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_script_cdata.xml deleted file mode 100644 index e315d623b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_script_cdata.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains script -Expect: not bozo and entries[0]['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_script_inline.xml deleted file mode 100644 index 790cfd5cb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_script_inline.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains script -Expect: not bozo and entries[0]['title'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/entry_title_style.xml b/lib/feedparser/tests/wellformed/sanitize/entry_title_style.xml deleted file mode 100644 index f1fb8d660..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/entry_title_style.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: entry title contains style -Expect: not bozo and entries[0]['title'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<entry> -<title type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></title> -</entry> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_applet.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_applet.xml deleted file mode 100644 index bc1aacb37..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_applet.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains applet -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://www.example.com/"></applet> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_blink.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_blink.xml deleted file mode 100644 index 4018115f7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_blink.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains blink -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><blink>safe</blink> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_crazy.xml deleted file mode 100644 index 70ef93fc4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_crazy.xml +++ /dev/null @@ -1,73 +0,0 @@ -<!-- -Description: feed copyright is crazy -Expect: not bozo and feed['copyright'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_embed.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_embed.xml deleted file mode 100644 index 1e73ef5fb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_embed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains embed -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<embed src="http://www.example.com/"> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_frame.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_frame.xml deleted file mode 100644 index 4c6f8105e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_frame.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains frame -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_iframe.xml deleted file mode 100644 index 3cefdfc5f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_iframe.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains iframe -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<iframe src="http://www.example.com/"></iframe> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_link.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_link.xml deleted file mode 100644 index 3cdec2e50..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains link -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_meta.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_meta.xml deleted file mode 100644 index 6974afb3b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_meta.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains meta -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_object.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_object.xml deleted file mode 100644 index 9beabb6b5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_object.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains object -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onabort.xml deleted file mode 100644 index 264e99a5c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onabort.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onabort -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onblur.xml deleted file mode 100644 index 0f39eba04..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onblur.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onblur -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onchange.xml deleted file mode 100644 index 8e33cb906..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onchange.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onchange -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onclick.xml deleted file mode 100644 index 37eeb8a10..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onclick -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_ondblclick.xml deleted file mode 100644 index c2636fed0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_ondblclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains ondblclick -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onerror.xml deleted file mode 100644 index 7f79e671a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onerror.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onerror -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onfocus.xml deleted file mode 100644 index 73c97e0eb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onfocus.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onfocus -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeydown.xml deleted file mode 100644 index f0a6fd24f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeydown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onkeydown -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeypress.xml deleted file mode 100644 index 762819cdb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeypress.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onkeypress -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeyup.xml deleted file mode 100644 index 3bb08dc0d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onkeyup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onkeyup -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onload.xml deleted file mode 100644 index 41078416e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onload -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmousedown.xml deleted file mode 100644 index 9d4f709ad..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmousedown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onmousedown -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseout.xml deleted file mode 100644 index 008e90746..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseout.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onmouseout -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseover.xml deleted file mode 100644 index b77c39124..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseover.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onmouseover -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseup.xml deleted file mode 100644 index 5a5d42bf0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onmouseup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onmouseup -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onreset.xml deleted file mode 100644 index 99062f477..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onreset.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onreset -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onresize.xml deleted file mode 100644 index b7b5e1a8d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onresize.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onresize -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onsubmit.xml deleted file mode 100644 index b09b8e8b5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onsubmit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onsubmit -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onunload.xml deleted file mode 100644 index 17aa1f344..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_onunload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains onunload -Expect: not bozo and feed['copyright'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script.xml deleted file mode 100644 index 842e93f26..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains script -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_cdata.xml deleted file mode 100644 index 0113b7efa..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_cdata.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains script -Expect: not bozo and feed['copyright'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_inline.xml deleted file mode 100644 index fcae4f060..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_script_inline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains script -Expect: not bozo and feed['copyright'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_style.xml b/lib/feedparser/tests/wellformed/sanitize/feed_copyright_style.xml deleted file mode 100644 index a9dc4e5b0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_copyright_style.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed copyright contains style -Expect: not bozo and feed['copyright'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<copyright type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></copyright> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_applet.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_applet.xml deleted file mode 100644 index ed783f53e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_applet.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains applet -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://example.com/"></applet> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_blink.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_blink.xml deleted file mode 100644 index 0a94622ba..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_blink.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains blink -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><blink>safe</blink> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_crazy.xml deleted file mode 100644 index b8bc995d0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_crazy.xml +++ /dev/null @@ -1,73 +0,0 @@ -<!-- -Description: feed info is crazy -Expect: not bozo and feed['info'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_embed.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_embed.xml deleted file mode 100644 index 82b0e3d44..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_embed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains embed -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<embed src="http://example.com/"> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_frame.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_frame.xml deleted file mode 100644 index de61c2fce..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_frame.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains frame -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_iframe.xml deleted file mode 100644 index 49f1edc68..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_iframe.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains iframe -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<iframe src="http://example.com/"> description</iframe></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_link.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_link.xml deleted file mode 100644 index 4ef66897d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains link -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_meta.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_meta.xml deleted file mode 100644 index 85ca47806..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_meta.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains meta -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_object.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_object.xml deleted file mode 100644 index a32f5124b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_object.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains object -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onabort.xml deleted file mode 100644 index c6f2a96aa..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onabort.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onabort -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onblur.xml deleted file mode 100644 index b10c4e8f0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onblur.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onblur -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onchange.xml deleted file mode 100644 index 653af579d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onchange.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onchange -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onclick.xml deleted file mode 100644 index 93644d6d7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onclick -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_ondblclick.xml deleted file mode 100644 index 1776c913d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_ondblclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains ondblclick -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onerror.xml deleted file mode 100644 index 9b8dd9cf0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onerror.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onerror -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onfocus.xml deleted file mode 100644 index 51a390bb5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onfocus.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onfocus -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeydown.xml deleted file mode 100644 index 4674d0e3c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeydown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onkeydown -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeypress.xml deleted file mode 100644 index cc2af96a4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeypress.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onkeypress -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeyup.xml deleted file mode 100644 index cde7c4232..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onkeyup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onkeyup -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onload.xml deleted file mode 100644 index 7763fbf3b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onload -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onmousedown.xml deleted file mode 100644 index 45651554d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmousedown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onmousedown -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseout.xml deleted file mode 100644 index e2de0c6c5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseout.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onmouseout -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseover.xml deleted file mode 100644 index 9e5200795..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseover.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onmouseover -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseup.xml deleted file mode 100644 index 15b0aac6d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onmouseup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onmouseup -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onreset.xml deleted file mode 100644 index be8bdc4cb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onreset.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onreset -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onresize.xml deleted file mode 100644 index f2429be6f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onresize.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onresize -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onsubmit.xml deleted file mode 100644 index c230a4009..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onsubmit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onsubmit -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_onunload.xml deleted file mode 100644 index 9c66418c5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_onunload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains onunload -Expect: not bozo and feed['info'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_script.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_script.xml deleted file mode 100644 index 34d20bd59..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_script.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains script -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_script_cdata.xml deleted file mode 100644 index ae3fb8e59..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_script_cdata.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains script -Expect: not bozo and feed['info'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_script_inline.xml deleted file mode 100644 index dafc46a7e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_script_inline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains script -Expect: not bozo and feed['info'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_info_style.xml b/lib/feedparser/tests/wellformed/sanitize/feed_info_style.xml deleted file mode 100644 index d1aac49ab..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_info_style.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed info contains style -Expect: not bozo and feed['info'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<info type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></info> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_applet.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_applet.xml deleted file mode 100644 index 30d75af16..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_applet.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains applet -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://example.com/"></applet> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_blink.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_blink.xml deleted file mode 100644 index 89e14e364..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_blink.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains blink -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><blink>safe</blink> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_crazy.xml deleted file mode 100644 index 2c286dd8d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_crazy.xml +++ /dev/null @@ -1,73 +0,0 @@ -<!-- -Description: feed subtitle is crazy -Expect: not bozo and feed['tagline'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_embed.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_embed.xml deleted file mode 100644 index c83d6dabd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_embed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains embed -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<embed src="http://example.com/"> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_frame.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_frame.xml deleted file mode 100644 index 0f165f0ec..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_frame.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains frame -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_iframe.xml deleted file mode 100644 index f3c14bfc3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_iframe.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains iframe -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<iframe src="http://example.com/"> description</iframe></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_link.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_link.xml deleted file mode 100644 index 2daccf307..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains link -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_meta.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_meta.xml deleted file mode 100644 index bb530e35a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_meta.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains meta -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_object.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_object.xml deleted file mode 100644 index 4116bff8e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_object.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains object -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onabort.xml deleted file mode 100644 index 597c482e0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onabort.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onabort -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onblur.xml deleted file mode 100644 index 5a1301f8e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onblur.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onblur -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onchange.xml deleted file mode 100644 index cec13dc74..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onchange.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onchange -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onclick.xml deleted file mode 100644 index 18bd7a76e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onclick -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_ondblclick.xml deleted file mode 100644 index b3e0fea55..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_ondblclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains ondblclick -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onerror.xml deleted file mode 100644 index 9693ee51a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onerror.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onerror -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onfocus.xml deleted file mode 100644 index 315c86498..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onfocus.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onfocus -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeydown.xml deleted file mode 100644 index 8290367fa..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeydown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onkeydown -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeypress.xml deleted file mode 100644 index 6def555e5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeypress.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onkeypress -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeyup.xml deleted file mode 100644 index 618a0c2ff..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onkeyup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onkeyup -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onload.xml deleted file mode 100644 index 78a45b9e8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onload -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmousedown.xml deleted file mode 100644 index 77010aaea..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmousedown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onmousedown -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseout.xml deleted file mode 100644 index 5e353ee07..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseout.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onmouseout -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseover.xml deleted file mode 100644 index 8d20666c8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseover.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onmouseover -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseup.xml deleted file mode 100644 index 4c6893155..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onmouseup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onmouseup -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onreset.xml deleted file mode 100644 index f7f2abaec..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onreset.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onreset -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onresize.xml deleted file mode 100644 index eb7ebda05..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onresize.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onresize -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onsubmit.xml deleted file mode 100644 index 5bb7dd6bf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onsubmit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onsubmit -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onunload.xml deleted file mode 100644 index 57824a3a8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_onunload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains onunload -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script.xml deleted file mode 100644 index 59e76db18..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains script -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_cdata.xml deleted file mode 100644 index b7ee3f4f5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_cdata.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains script -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_inline.xml deleted file mode 100644 index 61c7c7b1a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_script_inline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains script -Expect: not bozo and feed['tagline'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_style.xml b/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_style.xml deleted file mode 100644 index 332a65b90..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_subtitle_style.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed subtitle contains style -Expect: not bozo and feed['tagline'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<subtitle type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></subtitle> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_applet.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_applet.xml deleted file mode 100644 index 6bcca5d92..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_applet.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains applet -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://example.com/"></applet> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_blink.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_blink.xml deleted file mode 100644 index cd758dd61..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_blink.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains blink -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><blink>safe</blink> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_crazy.xml deleted file mode 100644 index 63617d335..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_crazy.xml +++ /dev/null @@ -1,73 +0,0 @@ -<!-- -Description: feed tagline is crazy -Expect: not bozo and feed['tagline'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_embed.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_embed.xml deleted file mode 100644 index 68fca0f01..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_embed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains embed -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<embed src="http://example.com/"> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_frame.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_frame.xml deleted file mode 100644 index 9a3a14fb0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_frame.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains frame -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_iframe.xml deleted file mode 100644 index 6863469c6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_iframe.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains iframe -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<iframe src="http://example.com/"></iframe> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_link.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_link.xml deleted file mode 100644 index f46ac8e7f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains link -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_meta.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_meta.xml deleted file mode 100644 index 21efed777..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_meta.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains meta -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_object.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_object.xml deleted file mode 100644 index 114c62560..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_object.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains object -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onabort.xml deleted file mode 100644 index a4ce80010..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onabort.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onabort -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onblur.xml deleted file mode 100644 index 2f2958e90..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onblur.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onblur -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onchange.xml deleted file mode 100644 index 2afe2267e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onchange.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onchange -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onclick.xml deleted file mode 100644 index fa104ca6c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onclick -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_ondblclick.xml deleted file mode 100644 index 6b72d9fa2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_ondblclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains ondblclick -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onerror.xml deleted file mode 100644 index 3744e11d6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onerror.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onerror -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onfocus.xml deleted file mode 100644 index a11a3030e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onfocus.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onfocus -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeydown.xml deleted file mode 100644 index 46ddf0cac..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeydown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onkeydown -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeypress.xml deleted file mode 100644 index 5703a1fc1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeypress.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onkeypress -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeyup.xml deleted file mode 100644 index dc78e6725..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onkeyup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onkeyup -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onload.xml deleted file mode 100644 index 972655376..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onload -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmousedown.xml deleted file mode 100644 index a25f3f214..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmousedown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onmousedown -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseout.xml deleted file mode 100644 index ef7c5063a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseout.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onmouseout -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseover.xml deleted file mode 100644 index aac3d54e8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseover.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onmouseover -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseup.xml deleted file mode 100644 index 41ab39e72..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onmouseup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onmouseup -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onreset.xml deleted file mode 100644 index 17932f368..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onreset.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onreset -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onresize.xml deleted file mode 100644 index bf712f872..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onresize.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onresize -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onsubmit.xml deleted file mode 100644 index a33ebf451..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onsubmit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onsubmit -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onunload.xml deleted file mode 100644 index 2d1550557..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_onunload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains onunload -Expect: not bozo and feed['tagline'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script.xml deleted file mode 100644 index b818be55f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains script -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_cdata.xml deleted file mode 100644 index 943c8d616..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_cdata.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains script -Expect: not bozo and feed['tagline'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_inline.xml deleted file mode 100644 index 902946517..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_inline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains script -Expect: not bozo and feed['tagline'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_map_description.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_map_description.xml deleted file mode 100644 index fb9d0ef64..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_script_map_description.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains script (maps to description) -Expect: not bozo and feed['description'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_style.xml b/lib/feedparser/tests/wellformed/sanitize/feed_tagline_style.xml deleted file mode 100644 index abc68f35a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_tagline_style.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed tagline contains style -Expect: not bozo and feed['tagline'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<tagline type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></tagline> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_applet.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_applet.xml deleted file mode 100644 index 7d6156bc1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_applet.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains applet -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<applet code="foo.class" codebase="http://example.com/"></applet> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_blink.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_blink.xml deleted file mode 100644 index e9fb536c9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_blink.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains blink -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><blink>safe</blink> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_crazy.xml deleted file mode 100644 index dfca8a2cf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_crazy.xml +++ /dev/null @@ -1,73 +0,0 @@ -<!-- -Description: feed title is crazy -Expect: not bozo and feed['title'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_embed.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_embed.xml deleted file mode 100644 index 0ae3167d8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_embed.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains embed -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<embed src="http://example.com/"> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_frame.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_frame.xml deleted file mode 100644 index c6df6c008..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_frame.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains frame -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_iframe.xml deleted file mode 100644 index 9422d3684..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_iframe.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains iframe -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<iframe src="http://example.com/"></iframe> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_link.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_link.xml deleted file mode 100644 index d540cc411..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_link.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains link -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_meta.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_meta.xml deleted file mode 100644 index 801c4df35..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_meta.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains meta -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_object.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_object.xml deleted file mode 100644 index 312cc841b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_object.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains object -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onabort.xml deleted file mode 100644 index 36f5e9134..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onabort.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onabort -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onblur.xml deleted file mode 100644 index dbf5f3af8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onblur.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onblur -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onchange.xml deleted file mode 100644 index 26ba2385c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onchange.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onchange -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onclick.xml deleted file mode 100644 index 76be05c88..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onclick -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_ondblclick.xml deleted file mode 100644 index 69df1cd24..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_ondblclick.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains ondblclick -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onerror.xml deleted file mode 100644 index 254a630a3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onerror.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onerror -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onfocus.xml deleted file mode 100644 index 0f2cfa7e1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onfocus.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onfocus -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeydown.xml deleted file mode 100644 index 665771306..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeydown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onkeydown -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeypress.xml deleted file mode 100644 index dc3e3bd44..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeypress.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onkeypress -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeyup.xml deleted file mode 100644 index 5f2e98a48..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onkeyup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onkeyup -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onload.xml deleted file mode 100644 index 066a375ec..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onload -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onmousedown.xml deleted file mode 100644 index a4a9281d7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmousedown.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onmousedown -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseout.xml deleted file mode 100644 index 6edc7e3ea..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseout.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onmouseout -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseover.xml deleted file mode 100644 index 6da205b8c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseover.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onmouseover -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseup.xml deleted file mode 100644 index b76931025..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onmouseup.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onmouseup -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onreset.xml deleted file mode 100644 index cd3422e27..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onreset.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onreset -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onresize.xml deleted file mode 100644 index 9d6bcee72..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onresize.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onresize -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onsubmit.xml deleted file mode 100644 index 153d6f2f3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onsubmit.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onsubmit -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_onunload.xml deleted file mode 100644 index 77866f89a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_onunload.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains onunload -Expect: not bozo and feed['title'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_script.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_script.xml deleted file mode 100644 index 632841633..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_script.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains script -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_script_cdata.xml deleted file mode 100644 index a37085f3b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_script_cdata.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains script -Expect: not bozo and feed['title'] == u'safe description' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_script_inline.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_script_inline.xml deleted file mode 100644 index 889667e63..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_script_inline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains script -Expect: not bozo and feed['title'] == u'<div>safe description</div>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="application/xhtml+xml" mode="xml"><div xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</div></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_style.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_style.xml deleted file mode 100644 index c1aeaec82..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_style.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: feed title contains style -Expect: not bozo and feed['title'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<feed version="0.3" xmlns="http://purl.org/atom/ns#"> -<title type="text/html" mode="escaped"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></title> -</feed> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/feed_title_unacceptable_uri.xml b/lib/feedparser/tests/wellformed/sanitize/feed_title_unacceptable_uri.xml deleted file mode 100644 index 7d66c5a85..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/feed_title_unacceptable_uri.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: anchor href contains unacceptable uri scheme -Expect: not bozo and feed['title'] == u'<a href="">safe</a>' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html"><a href="javascript:alert(1)">safe</a></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_applet.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_applet.xml deleted file mode 100644 index 10dea8b0d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_applet.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains applet -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<applet code="foo.class" codebase="http://example.com/"></applet> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_blink.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_blink.xml deleted file mode 100644 index b570ff208..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_blink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains blink -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body><blink>safe</blink> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_embed.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_embed.xml deleted file mode 100644 index 2f2a2db17..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_embed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains embed -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<embed src="http://example.com/" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_frame.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_frame.xml deleted file mode 100644 index 7228ecfb9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_frame.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains frame -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<frameset rows="*"><frame src="http://example.com/" /></frameset> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_iframe.xml deleted file mode 100644 index 561fe3129..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_iframe.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains iframe -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<iframe src="http://example.com/" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_link.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_link.xml deleted file mode 100644 index aa8881470..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains link -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_meta.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_meta.xml deleted file mode 100644 index 7bfbddf1c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_meta.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains meta -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<meta http-equiv="Refresh" content="0; URL=http://example.com/" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_object.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_object.xml deleted file mode 100644 index 11b8bbfb0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_object.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains object -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onabort.xml deleted file mode 100644 index 4570265a2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onabort.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onabort -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onblur.xml deleted file mode 100644 index db9fdd63f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onblur.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onblur -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onchange.xml deleted file mode 100644 index 34283c222..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onchange.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onchange -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onclick.xml deleted file mode 100644 index 0d5aa97cf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_ondblclick.xml deleted file mode 100644 index da15eb7e6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_ondblclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains ondblclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onerror.xml deleted file mode 100644 index fa03c8804..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onerror.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onerror -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onfocus.xml deleted file mode 100644 index 527daffa7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onfocus.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onfocus -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onkeydown.xml deleted file mode 100644 index 3dd446f6f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onkeydown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onkeydown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onkeypress.xml deleted file mode 100644 index b11ca5298..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onkeypress.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onkeypress -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onkeyup.xml deleted file mode 100644 index 2a023e8f5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onkeyup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onkeyup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onload.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onload.xml deleted file mode 100644 index b50f61b6b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onmousedown.xml deleted file mode 100644 index 29ed18866..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onmousedown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmousedown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseout.xml deleted file mode 100644 index 17c1e9da7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseout.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmouseout -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseover.xml deleted file mode 100644 index 6d0c28d51..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseover.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmouseover -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseup.xml deleted file mode 100644 index b0c71b570..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onmouseup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmouseup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onreset.xml deleted file mode 100644 index e38ed3a66..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onreset.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onreset -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onresize.xml deleted file mode 100644 index f567550e0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onresize.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onresize -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onsubmit.xml deleted file mode 100644 index d51966e5d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onsubmit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onsubmit -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_onunload.xml deleted file mode 100644 index 3f6ed3bf2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_onunload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onunload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_script.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_script.xml deleted file mode 100644 index c51e8882f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_script.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_script_map_content.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_script_map_content.xml deleted file mode 100644 index 699e24de2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_script_map_content.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains script (maps to content) -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_body_style.xml b/lib/feedparser/tests/wellformed/sanitize/item_body_style.xml deleted file mode 100644 index cf4a9bdf4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_body_style.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains style -Expect: not bozo and entries[0]['description'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<rss version="2.0"> -<channel> -<item> -<body><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_applet.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_applet.xml deleted file mode 100644 index 415e98757..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_applet.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains applet -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<applet code="foo.class" codebase="http://example.com"></applet> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_blink.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_blink.xml deleted file mode 100644 index e9d6d4c50..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_blink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains blink -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><blink>safe</blink> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_crazy.xml deleted file mode 100644 index 1f05f8a43..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_crazy.xml +++ /dev/null @@ -1,77 +0,0 @@ -<!-- -Description: item content:encoded is crazy -Expect: not bozo and entries[0]['description'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_embed.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_embed.xml deleted file mode 100644 index 1f93f0597..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_embed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains embed -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<embed src="http://example.com"> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_frame.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_frame.xml deleted file mode 100644 index a4afb4045..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_frame.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains frame -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_iframe.xml deleted file mode 100644 index 38ce41e80..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_iframe.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains iframe -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<iframe src="http://example.com" /> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_link.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_link.xml deleted file mode 100644 index d1b71f898..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains link -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_map_content.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_map_content.xml deleted file mode 100644 index eeedc6b62..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_map_content.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains script -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_meta.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_meta.xml deleted file mode 100644 index c10b683f0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_meta.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains meta -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_object.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_object.xml deleted file mode 100644 index f78f9470d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_object.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains object -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onabort.xml deleted file mode 100644 index ef3aa24e4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onabort.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onabort -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onblur.xml deleted file mode 100644 index 2ce078728..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onblur.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onblur -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onchange.xml deleted file mode 100644 index b486c17db..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onchange.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onchange -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onclick.xml deleted file mode 100644 index d09e92c81..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_ondblclick.xml deleted file mode 100644 index 6471081a6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_ondblclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains ondblclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onerror.xml deleted file mode 100644 index 8d4b4ff3e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onerror.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onerror -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onfocus.xml deleted file mode 100644 index f8265b650..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onfocus.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onfocus -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeydown.xml deleted file mode 100644 index f7b12784e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeydown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onkeydown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeypress.xml deleted file mode 100644 index ee3fa7fe9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeypress.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onkeypress -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeyup.xml deleted file mode 100644 index 1acea49f4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onkeyup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onkeyup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onload.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onload.xml deleted file mode 100644 index 49fed6def..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmousedown.xml deleted file mode 100644 index 9628e7c7f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmousedown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onmousedown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseout.xml deleted file mode 100644 index 4e5b3c1ad..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseout.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onmouseout -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseover.xml deleted file mode 100644 index 3c1e02165..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseover.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onmouseover -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseup.xml deleted file mode 100644 index d1df98f53..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onmouseup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onmouseup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onreset.xml deleted file mode 100644 index 469b429fe..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onreset.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onreset -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onresize.xml deleted file mode 100644 index 67bd116ec..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onresize.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onresize -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onsubmit.xml deleted file mode 100644 index 5acd05e84..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onsubmit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onsubmit -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onunload.xml deleted file mode 100644 index 458a05677..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_onunload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains onunload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script.xml deleted file mode 100644 index f7ed178dc..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_cdata.xml deleted file mode 100644 index 89adffb80..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_cdata.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_map_content.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_map_content.xml deleted file mode 100644 index ee8d3afa6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_map_content.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains script (maps to content) -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_nested_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_nested_cdata.xml deleted file mode 100644 index 5663c57f9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_script_nested_cdata.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: ensure nested CDATA sections are sanitized properly -Expect: not bozo and entries[0]['content'][0]['value'] == u'<![CDATA[]]>' ---> -<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"> -<channel> - <item> - <content:encoded><![CDATA[<![CDATA[<script></script>]]>]]></content:encoded> - </item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_style.xml b/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_style.xml deleted file mode 100644 index 1b9f957cb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_content_encoded_style.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item content:encoded contains style -Expect: not bozo and entries[0]['description'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> -<channel> -<item> -<content:encoded><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></content:encoded> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_applet.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_applet.xml deleted file mode 100644 index 8e694c934..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_applet.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains applet -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<applet code="foo.class" codebase="http://example.com/"></applet> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_blink.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_blink.xml deleted file mode 100644 index c84dedefb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_blink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains blink -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description><blink>safe</blink> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_crazy.xml deleted file mode 100644 index 13e161abb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_crazy.xml +++ /dev/null @@ -1,81 +0,0 @@ -<!-- -Description: item description is crazy -Expect: not bozo and entries[0]['description'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<rss version="2.0"> -<channel> -<title>Crazy RSS</title> -<description>Contains unsafe script</description> -<link>http://crazy.example.com/</link> -<language>en</language> -<item> -<description> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_embed.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_embed.xml deleted file mode 100644 index 82524aad5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_embed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains embed -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<embed src="http://example.com/"> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_frame.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_frame.xml deleted file mode 100644 index 3ca0fa55e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_frame.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains frame -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_iframe.xml deleted file mode 100644 index 93866748f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_iframe.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains iframe -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<iframe src="http://example.com/"/> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_link.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_link.xml deleted file mode 100644 index 0d8956db4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains link -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_meta.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_meta.xml deleted file mode 100644 index d9bfb014d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_meta.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains meta -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_object.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_object.xml deleted file mode 100644 index 9b197da1c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_object.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains object -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onabort.xml deleted file mode 100644 index 418885b19..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onabort.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onabort -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onblur.xml deleted file mode 100644 index 121c72346..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onblur.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onblur -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onchange.xml deleted file mode 100644 index e37c8c8a8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onchange.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onchange -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onclick.xml deleted file mode 100644 index 58c2d5656..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_ondblclick.xml deleted file mode 100644 index 9acaa1137..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_ondblclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains ondblclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onerror.xml deleted file mode 100644 index 32c0cfb2b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onerror.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onerror -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onfocus.xml deleted file mode 100644 index 7c07c7e69..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onfocus.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onfocus -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onkeydown.xml deleted file mode 100644 index 39f67db35..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onkeydown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onkeydown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onkeypress.xml deleted file mode 100644 index d1e4943ba..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onkeypress.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onkeypress -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onkeyup.xml deleted file mode 100644 index 31b5117ce..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onkeyup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onkeyup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onload.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onload.xml deleted file mode 100644 index ebd8bd371..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onmousedown.xml deleted file mode 100644 index 7433d4e51..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onmousedown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onmousedown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseout.xml deleted file mode 100644 index 6090a130d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseout.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onmouseout -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseover.xml deleted file mode 100644 index 479c311bf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseover.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onmouseover -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseup.xml deleted file mode 100644 index d8daa0199..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onmouseup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onmouseup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onreset.xml deleted file mode 100644 index b2f3f1831..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onreset.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onreset -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onresize.xml deleted file mode 100644 index 4295a4ba0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onresize.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onresize -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onsubmit.xml deleted file mode 100644 index 125fe5c14..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onsubmit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onsubmit -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_onunload.xml deleted file mode 100644 index b4dc59191..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_onunload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains onunload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<description><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_script.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_script.xml deleted file mode 100644 index b158ce7fa..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_script.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_script_cdata.xml deleted file mode 100644 index 1a40c2fc4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_script_cdata.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_script_map_summary.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_script_map_summary.xml deleted file mode 100644 index d90a7aede..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_script_map_summary.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains script (maps to content) -Expect: not bozo and entries[0]['summary'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<description>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_description_style.xml b/lib/feedparser/tests/wellformed/sanitize/item_description_style.xml deleted file mode 100644 index 68a05eb49..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_description_style.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item description contains style -Expect: not bozo and entries[0]['description'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<rss version="2.0"> -<channel> -<item> -<description><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></description> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_applet.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_applet.xml deleted file mode 100644 index 25a1c1ba1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_applet.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains applet -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<applet code="foo.class" codebase="http://example.com/"></applet> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_blink.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_blink.xml deleted file mode 100644 index edda4f489..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_blink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains blink -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><blink>safe</blink> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_crazy.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_crazy.xml deleted file mode 100644 index d92918385..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_crazy.xml +++ /dev/null @@ -1,77 +0,0 @@ -<!-- -Description: item fullitem is crazy -Expect: not bozo and entries[0]['description'] == u'Crazy HTML -' + u'- Can Your Regex Parse This?\n\n\n\n<!-' + u'- <script> -' + u'->\n\n<!-' + u'- \n\t<script> \n-' + u'->\n\n\n\nfunction executeMe()\n{\n\n\n\n\n/* \n<h1>Did The Javascript Execute?</h1>\n<div>\nI will execute here, too, if you mouse over me\n</div>' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<title>Crazy HTML -- Can Your Regex Parse This?</title> - -</head> -<body notRealAttribute="value"onload="executeMe();"foo="bar" - -> -<!-- <script> --> - -<!-- - <script> ---> - -</script> - - -<script - - -> - -function executeMe() -{ - - - - -/* <script> -function am_i_javascript() -{ - var str = "Some innocuously commented out stuff"; -} -< /script> -*/ - - - - - - - - - - alert("Executed"); -} - - </script - - - -> -<h1>Did The Javascript Execute?</h1> -<div notRealAttribute="value -"onmouseover=" -executeMe(); -"foo="bar"> -I will execute here, too, if you mouse over me -</div> - -</body> - -</html> -</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_embed.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_embed.xml deleted file mode 100644 index dfa85cb78..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_embed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains embed -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<embed src="http://example.com/"> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_frame.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_frame.xml deleted file mode 100644 index aa10c3aa3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_frame.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains frame -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<frameset rows="*"><frame src="http://example.com/"></frameset> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_iframe.xml deleted file mode 100644 index 7b23d2693..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_iframe.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains iframe -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<iframe src="http://example.com/"/> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_link.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_link.xml deleted file mode 100644 index 9cd909bd3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains link -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css"> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_meta.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_meta.xml deleted file mode 100644 index 520185628..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_meta.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains meta -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<meta http-equiv="Refresh" content="0; URL=http://example.com/"> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_object.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_object.xml deleted file mode 100644 index f5df5c1bc..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_object.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains object -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC"> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onabort.xml deleted file mode 100644 index 528aa42c5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onabort.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onabort -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onblur.xml deleted file mode 100644 index c302e997c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onblur.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onblur -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onchange.xml deleted file mode 100644 index 28282e2e2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onchange.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onchange -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onclick.xml deleted file mode 100644 index 59a379b11..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_ondblclick.xml deleted file mode 100644 index f493d93af..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_ondblclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains ondblclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onerror.xml deleted file mode 100644 index 5b5bcecbf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onerror.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onerror -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onfocus.xml deleted file mode 100644 index bb221a5c5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onfocus.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onfocus -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeydown.xml deleted file mode 100644 index fae1baa94..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeydown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onkeydown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeypress.xml deleted file mode 100644 index 5165a6bc5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeypress.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onkeypress -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeyup.xml deleted file mode 100644 index 253849f6b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onkeyup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onkeyup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onload.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onload.xml deleted file mode 100644 index 8d12e39f0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmousedown.xml deleted file mode 100644 index 458060b59..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmousedown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onmousedown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseout.xml deleted file mode 100644 index 6c29bbd9b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseout.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onmouseout -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseover.xml deleted file mode 100644 index f6fb17b88..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseover.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onmouseover -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseup.xml deleted file mode 100644 index aa259b0a1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onmouseup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onmouseup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onreset.xml deleted file mode 100644 index 8fb27e17b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onreset.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onreset -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onresize.xml deleted file mode 100644 index b50a30208..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onresize.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onresize -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onsubmit.xml deleted file mode 100644 index d9e93efa0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onsubmit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onsubmit -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onunload.xml deleted file mode 100644 index 8fc6faeca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_onunload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains onunload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script.xml deleted file mode 100644 index 79f834832..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_cdata.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_cdata.xml deleted file mode 100644 index 288abc29a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_cdata.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><![CDATA[safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description]]></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_map_summary.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_map_summary.xml deleted file mode 100644 index 8009588a8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_script_map_summary.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains script (maps to content) -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem>safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_style.xml b/lib/feedparser/tests/wellformed/sanitize/item_fullitem_style.xml deleted file mode 100644 index 7a1a9dcce..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_fullitem_style.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item fullitem contains style -Expect: not bozo and entries[0]['description'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<rss version="2.0"> -<channel> -<item> -<fullitem><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></fullitem> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_applet.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_applet.xml deleted file mode 100644 index 851e8e794..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_applet.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains applet -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<applet code="foo.class" codebase="http://example.com/" ></applet> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_blink.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_blink.xml deleted file mode 100644 index c83b046c9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_blink.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains blink -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><blink>safe</blink> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_embed.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_embed.xml deleted file mode 100644 index a87d908e4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_embed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains embed -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<embed src="http://example.com/" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_frame.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_frame.xml deleted file mode 100644 index 2535b58e7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_frame.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains frame -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<frameset rows="*"><frame src="http://example.com/" /></frameset> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_iframe.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_iframe.xml deleted file mode 100644 index 5929e8742..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_iframe.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains iframe -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<iframe src="http://example.com/"/> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_link.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_link.xml deleted file mode 100644 index a9f10e6d4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_link.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains link -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<link rel="stylesheet" type="text/css" href="http://example.com/evil.css" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_meta.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_meta.xml deleted file mode 100644 index 60f379d3d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_meta.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains meta -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<meta http-equiv="Refresh" content="0; URL=http://example.com/" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_object.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_object.xml deleted file mode 100644 index d82649046..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_object.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains object -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<object classid="clsid:C932BA85-4374-101B-A56C-00AA003668DC" /> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onabort.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onabort.xml deleted file mode 100644 index bc20e5184..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onabort.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onabort -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onabort="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onblur.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onblur.xml deleted file mode 100644 index c09939e8c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onblur.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onblur -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onblur="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onchange.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onchange.xml deleted file mode 100644 index 26538b7f2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onchange.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onchange -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onchange="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onclick.xml deleted file mode 100644 index 3110dfe05..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onclick="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_ondblclick.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_ondblclick.xml deleted file mode 100644 index 73e93831e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_ondblclick.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains ondblclick -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" ondblclick="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onerror.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onerror.xml deleted file mode 100644 index 3d2f27fa0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onerror.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onerror -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onerror="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onfocus.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onfocus.xml deleted file mode 100644 index 712c2fef9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onfocus.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onfocus -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onfocus="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeydown.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeydown.xml deleted file mode 100644 index 51beae7f9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeydown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onkeydown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeydown="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeypress.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeypress.xml deleted file mode 100644 index 4e0e4c765..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeypress.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onkeypress -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeypress="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeyup.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeyup.xml deleted file mode 100644 index 1fd9da2e6..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onkeyup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onkeyup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onkeyup="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onload.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onload.xml deleted file mode 100644 index 72d2b5b28..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onload="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmousedown.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmousedown.xml deleted file mode 100644 index e07c10acf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmousedown.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmousedown -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmousedown="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseout.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseout.xml deleted file mode 100644 index 00ba1c505..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseout.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmouseout -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseout="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseover.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseover.xml deleted file mode 100644 index a71016754..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseover.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmouseover -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseover="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseup.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseup.xml deleted file mode 100644 index 40a26c7ee..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onmouseup.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onmouseup -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onmouseup="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onreset.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onreset.xml deleted file mode 100644 index edd1b8d0b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onreset.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onreset -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onreset="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onresize.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onresize.xml deleted file mode 100644 index b6d2bb34b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onresize.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onresize -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onresize="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onsubmit.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onsubmit.xml deleted file mode 100644 index 540c3e87e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onsubmit.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onsubmit -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onsubmit="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onunload.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onunload.xml deleted file mode 100644 index f3c7753f0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_onunload.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains onunload -Expect: not bozo and entries[0]['description'] == u'<img src="http://www.ragingplatypus.com/i/cam-full.jpg" />' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><img src="http://www.ragingplatypus.com/i/cam-full.jpg" onunload="location.href='http://www.ragingplatypus.com/';" /></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script.xml deleted file mode 100644 index 407c910e2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains script -Expect: not bozo and entries[0]['description'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script_map_content.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script_map_content.xml deleted file mode 100644 index 870d0374c..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_script_map_content.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains script (maps to content) -Expect: not bozo and entries[0]['content'][0]['value'] == u'safe description' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml">safe<script type="text/javascript">location.href='http:/'+'/example.com/';</script> description</body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_style.xml b/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_style.xml deleted file mode 100644 index bcfc3038e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/item_xhtml_body_style.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: item xhtml:body contains style -Expect: not bozo and entries[0]['description'] == u'<a href="http://www.ragingplatypus.com/" style="display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;">never trust your upstream platypus</a>' ---> -<rss version="2.0"> -<channel> -<item> -<body xmlns="http://www.w3.org/1999/xhtml"><a href="http://www.ragingplatypus.com/" style="display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;">never trust your upstream platypus</a></body> -</item> -</channel> -</rss> \ No newline at end of file diff --git a/lib/feedparser/tests/wellformed/sanitize/large_atom_feed_that_needs_css_sanitisation.xml b/lib/feedparser/tests/wellformed/sanitize/large_atom_feed_that_needs_css_sanitisation.xml deleted file mode 100644 index 1692e5d1a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/large_atom_feed_that_needs_css_sanitisation.xml +++ /dev/null @@ -1,528 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Description: content can be sanitized without going into an infinite loop due to pathological regexp backtracking -Expect: not bozo ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title>Все для Nokia 5800 XM Nokia N97 Samsung i8910 Omnia HD : Программы, игры, темы, свежие новости и советы</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/" /> - <link rel="self" type="application/atom+xml" href="http://touchnokia.ru/atom.xml" /> - <id>tag:touchnokia.ru,2008-12-14://1</id> - <updated>2009-04-08T14:25:12Z</updated> - <subtitle>Все для Nokia 5800 XM Nokia N97 Samsung i8910 Omnia HD : Программы, игры, темы, свежие новости и советы</subtitle> - <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.25-ru</generator> - -<entry> - <title>Невидимая броня для Вашего Nokia 5800</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/09/nevidimaja-bronja-dlja-vashego-nokia-5800.html" /> - <id>tag:touchnokia.ru,2009://1.666</id> - - <published>2009-09-09T14:19:45Z</published> - <updated>2009-04-08T14:25:12Z</updated> - - <summary></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Новости" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="броня" label="броня" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Вашего" label="Вашего" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Невидимая" label="Невидимая" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<div style="text-align: center;"><a href="http://savecase.ru/TN" target="_blank"><img alt="SaveCase - невидимая броня для вашего девайса." src="http://savecase.ru/downloads/468-60.gif" width="468" height="60" /></a><br /><br /></div>]]> - <![CDATA[ <h2>Невидимая броня для Вашего девайса.</h2> -<p><img alt="SaveCase" src="http://savecase.ru/downloads/news/savecase-logo.gif" width="139" height="150" /></p> -<p>Вы из тех, кто хотел бы защитить корпус и дисплей своего девайса от царапин и грязи, но при этом не хотели бы нарушать эстетику дизайна девайса, например, чехлом? Великолепная новость для вас - в России появился способ надежной защиты девайсов от царапин и грязи - защитный комплект SaveCase. Пленка, вошедшая в основу данного защитного комплекта, совместно с лабораторией SavePatterns, изначально нашла свое применение в автомобильной промышленности для защиты дорогостоящего лакокрасочного покрытия автомобилей. Теперь это технологическое новшество применяют и для защиты девайсов.</p> -<p><img alt="SaveCase" src="http://savecase.ru/downloads/news/protected.gif" width="450" height="188" /> </p> -<p>Описание с официального сайта <a href="http://savecase.ru/TN">www.savecase.ru</a>:</p> -<p><em>Установив защитный комплект SaveCase на свой телефон, плеер, ноутбук или игровую консоль, Вы получаете 100% невидимую защиту от износа, царапин и трещин на протяжении всего срока использования. SaveCase защищает ваше устройство со всех сторон, делая его практически неуязвимым. Не удивляйтесь, если ваше устройство с SaveCase, даже спустя месяцы использования остается таким же как и в первый день, ведь для этого применяется необычайно прочный материал, в народе получивший название - "легкая броня"! Мы настолько уверены в качестве защитного комплекта SaveCase, что даем на него пожизненную гарантию.</em></p> -<p><object width="470" height="353"><param name="movie" value="http://video.rutube.ru/00b4ba3668ba366844180570ae87fc7a" /><param name="wmode" value="window" /><param name="allowFullScreen" value="true" /><embed src="http://video.rutube.ru/00b4ba3668ba366844180570ae87fc7a" type="application/x-shockwave-flash" wmode="window" allowfullscreen="true" width="470" height="353"></object></p> - - - ]]> - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: ZXLightControl v.1.0.0</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-zxlightcontrol-v100.html" /> - <id>tag:touchnokia.ru,2009://1.814</id> - - <published>2009-05-31T10:22:58Z</published> - <updated>2009-05-31T10:23:41Z</updated> - - <summary><![CDATA[ZXLightControl v.1.0.0 Уменьшено до 50%360 x 640 (38,06 килобайт) Уменьшено до 50%360 x 640 (37,13 килобайт) Разработчик: ZXStylesЯзык: EnglishСостояние: FreeОписание: Программа для управления подсветкой экрана и клавиш на смартфонах Symbian 9.2, 9.3, 9.4Программа является выделенным в отдельное приложение блоком управления расширенной подсветкой из программы ZXReader.Возможности:* настройка яркости...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Утилиты" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="zxlightcontrol" label="ZXLightControl" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v100" label="v.1.0.0" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>ZXLightControl v.1.0.0</b></span><br /><br /><table id="ipb-attach-table-1634-0-00930600-1243765331" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1634-0-00930600-1243765331" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1634-0-00930600-1243765331" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1634-0-00930600-1243765331" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1634" title="Scr000404.jpg - Размер: 38,06 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243765219_thumb.jpg" id="ipb-attach-img-1634-0-00930600-1243765331" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1634-0-00930600-1243765331" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (38,06 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1633-0-00946000-1243765331" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1633-0-00946000-1243765331" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1633-0-00946000-1243765331" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1633-0-00946000-1243765331" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1633" title="Scr000403.jpg - Размер: 37,13 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243765213_thumb.jpg" id="ipb-attach-img-1633-0-00946000-1243765331" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1633-0-00946000-1243765331" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (37,13 килобайт)</div></div></td></tr></tbody></table> <br /><b>Разработчик:</b> ZXStyles<br /><b>Язык:</b> English<br /><b>Состояние:</b> Free<br /><b>Описание:</b> Программа для управления подсветкой экрана и клавиш на смартфонах Symbian 9.2, 9.3, 9.4<br />Программа является выделенным в отдельное приложение блоком управления расширенной подсветкой из программы ZXReader.<br /><b>Возможности:</b><br />* настройка яркости подсветки экрана<br />* Отключение подсветки клавиш<br />* Удерживание подсветки экрана включенной бесконечно <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1635" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1635" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">ZXLightControl_v1.0.0_S60_5th_signed.zip</a> ( 12,71 килобайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=958">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: Voice Inbox v.1.09.112</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-voice-inbox-v109112.html" /> - <id>tag:touchnokia.ru,2009://1.813</id> - - <published>2009-05-31T09:57:06Z</published> - <updated>2009-05-31T09:59:46Z</updated> - - <summary><![CDATA[Voice Inbox v.1.09.112 Уменьшено до 50%360 x 640 (53,6 килобайт) Уменьшено до 50%360 x 640 (50,23 килобайт) Разработчик: WebGateЯзык: Русский ( В архиве лежит русификатор) Состояние: FreeОписание: Программа автоответчик[*] Если у вас разблокирован смартфон то качаем и ставим, если нет то файл необходимо подписать Voice_Inbox_v.1.09.112.zip ( 152,48 килобайт )Обсуждение ведем здесь...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Разное" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="inbox" label="Inbox" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v109112" label="v.1.09.112" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="voice" label="Voice" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<font class="Apple-style-span" color="#26394D" face="Verdana" size="6"><span class="Apple-style-span" style="font-size: 19px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><b><span class="Apple-style-span" style="font-size: 12px; font-weight: normal; "><span style="font-size: 14pt; line-height: 19px; "><b>Voice Inbox v.1.09.112</b></span><br /><br /><table id="ipb-attach-table-1339-0-82301900-1243763904" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1339-0-82301900-1243763904" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1339-0-82301900-1243763904" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1339-0-82301900-1243763904" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1339" title="Scr000276.jpg - Размер: 53,6 килобайт, Скачано: 9" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1242031946_thumb.jpg" id="ipb-attach-img-1339-0-82301900-1243763904" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1339-0-82301900-1243763904" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (53,6 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1340-0-82335200-1243763904" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1340-0-82335200-1243763904" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1340-0-82335200-1243763904" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1340-0-82335200-1243763904" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1340" title="Scr000277.jpg - Размер: 50,23 килобайт, Скачано: 10" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1242031954_thumb.jpg" id="ipb-attach-img-1340-0-82335200-1243763904" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1340-0-82335200-1243763904" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (50,23 килобайт)</div></div></td></tr></tbody></table> <br /><b>Разработчик:</b> WebGate<br /><b>Язык:</b> Русский ( В архиве лежит русификатор) <br /><b>Состояние:</b> Free<br /><b>Описание:</b> Программа автоответчик<br /><b><span style="color: rgb(255, 0, 0); ">[*]</span> </b>Если у вас <a href="http://touchnokia.ru/forums/index.php?showtopic=252" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><span style="color: rgb(255, 0, 0); ">разблокирован смартфон</span></a> то качаем и ставим, если нет то файл необходимо <a href="http://touchnokia.ru/forums/index.php?showtopic=8" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><span style="color: rgb(0, 128, 0); ">подписать</span></a><br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1632" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1632" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">Voice_Inbox_v.1.09.112.zip</a> ( 152,48 килобайт )<br /></span></b></span></font><div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=770">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: Smart Movie v.4.15</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-smart-movie-v415.html" /> - <id>tag:touchnokia.ru,2009://1.812</id> - - <published>2009-05-31T09:24:12Z</published> - <updated>2009-05-31T09:26:29Z</updated> - - <summary><![CDATA[Smart Movie v.4.15 Уменьшено до 50%360 x 640 (61,1 килобайт) Уменьшено до 50%360 x 640 (63,72 килобайт) Разработчик: Lonely Cat GamesЯзык: EnglishСостояние: TrialОписание: Наонецто взломаная версияВозможности SmartMovie:- Стандартный формат AVI- Использует подгружаемые кодеки- Портретный и пейзажный режимы просмотра видео- Первый мобильный плеер с поддержкой субтитров, можно смотреть...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Мультимедиа" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="movie" label="Movie" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="smart" label="Smart" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v415" label="v.4.15" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>Smart Movie v.4.15</b></span><br /><br /><table id="ipb-attach-table-1090-0-82600900-1243761824" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1090-0-82600900-1243761824" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1090-0-82600900-1243761824" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1090-0-82600900-1243761824" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1090" title="Scr000194.jpg - Размер: 61,1 килобайт, Скачано: 37" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_04_2009/post-1-1240072182_thumb.jpg" id="ipb-attach-img-1090-0-82600900-1243761824" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1090-0-82600900-1243761824" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (61,1 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1091-0-82636200-1243761824" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1091-0-82636200-1243761824" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1091-0-82636200-1243761824" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1091-0-82636200-1243761824" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1091" title="Scr000195.jpg - Размер: 63,72 килобайт, Скачано: 46" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_04_2009/post-1-1240072186_thumb.jpg" id="ipb-attach-img-1091-0-82636200-1243761824" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1091-0-82636200-1243761824" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (63,72 килобайт)</div></div></td></tr></tbody></table> <br /><br /><b>Разработчик:</b> Lonely Cat Games<br /><b>Язык:</b> English<br /><b>Состояние:</b> Trial<br /><b>Описание:</b> Наонецто взломаная версия<br />Возможности SmartMovie:<br />- Стандартный формат AVI<br />- Использует подгружаемые кодеки<br />- Портретный и пейзажный режимы просмотра видео<br />- Первый мобильный плеер с поддержкой субтитров, можно смотреть видео на многих языках<br />- Поддержка кодеков DirectShow<br />- Очень быстрое конвертирование<br />- Бикубическая интерполяция - максимальное качество ужатого видео<br />- Настраиваемые параметры качества/объема в Smart Movie<br />- Богатые настройки плеера <br /><br /><b>Новое в SmartMovie v.4.15:</b><br />- Возможность выбора папки воспроизведения<br />- Японская и китайская кодировки для субтитров</span><div><span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1631" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">SmartMovie_4.15_not_cracked.zip</a> ( 605,24 килобайт )</span> </div><div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=626">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: PowerMP3 v.1.15 Beta</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-powermp3-v115-beta.html" /> - <id>tag:touchnokia.ru,2009://1.811</id> - - <published>2009-05-31T09:13:04Z</published> - <updated>2009-05-31T09:21:41Z</updated> - - <summary><![CDATA[PowerMP3 v.1.15 Beta Уменьшено до 50%360 x 640 (52,76 килобайт) Уменьшено до 50%360 x 640 (48,81 килобайт) Разработчик: MobiFactorЯзык: РусскийСостояние: FreeОписание: Музыкальный плеер. Теперь со специальными скинами полноценно работает и на 5800.Особенности:- поддержка большинства популярных аудио форматов (MP3/OGG/AAC/MP4)- отображение обложки альбома с поиском в интернете- эффекты визуализации-...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Мультимедиа" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="beta" label="Beta" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="powermp3" label="PowerMP3" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v115" label="v.1.15" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>PowerMP3 v.1.15 Beta</b></span></span><div><span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="line-height: 19px; "></span><font class="Apple-style-span" size="6"><span class="Apple-style-span" style="font-size: 19px;"><b><br /></b></span></font><table id="ipb-attach-table-1479-0-50851300-1243761298" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1479-0-50851300-1243761298" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1479-0-50851300-1243761298" style="font-size: 9px; "> Уменьшено до 50%</div><a id="ipb-attach-url-1479-0-50851300-1243761298" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1479" title="Scr000326.jpg - Размер: 52,76 килобайт, Скачано: 34" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1242843276_thumb.jpg" id="ipb-attach-img-1479-0-50851300-1243761298" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1479-0-50851300-1243761298" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (52,76 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1480-0-50890900-1243761298" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1480-0-50890900-1243761298" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1480-0-50890900-1243761298" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1480-0-50890900-1243761298" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1480" title="Scr000327.jpg - Размер: 48,81 килобайт, Скачано: 22" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1242843286_thumb.jpg" id="ipb-attach-img-1480-0-50890900-1243761298" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1480-0-50890900-1243761298" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (48,81 килобайт)</div></div></td></tr></tbody></table> <br /><b>Разработчик:</b> MobiFactor<br /><b>Язык:</b> Русский<br /><b>Состояние:</b> Free<br /><b>Описание:</b> Музыкальный плеер. Теперь со специальными скинами полноценно работает и на 5800.<br /><b>Особенности:</b><br />- поддержка большинства популярных аудио форматов (MP3/OGG/AAC/MP4)<br />- отображение обложки альбома с поиском в интернете<br />- эффекты визуализации<br />- поддержка скинов<br />- поддержка пультов AD-4х<br />- слип-таймер<br />- воспроизведение по выбранным папкам<br />- создание плей-листов<br />- эквалайзер<br />- расширенное стерео<br /><b>Новое в PowerMP3 v1.15:</b><br />-Исправлена ошибка с переключением дорожек минигарнитурой<br />-Исправлена куча небольших ошибок<br />-Сделали собственный эквалайзер для всех телефонов<br />-Добавлена поддержка папок. Теперь, когда вы удаляете композиции из списка воспроизведения, появится диалоговое окно, где вы можете выбрать для удаления песни с диска<br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1630" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1630" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">PowerMP3_v.1.15b.zip</a> ( 1,04 мегабайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=862">здесь</a></span></font></div></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: XpressCut v.0.1</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-xpresscut-v01.html" /> - <id>tag:touchnokia.ru,2009://1.810</id> - - <published>2009-05-31T08:57:55Z</published> - <updated>2009-05-31T09:00:27Z</updated> - - <summary><![CDATA[XpressCut v.0.1Разработчик: kAISTЯзык: РусскийСостояние: FreeОписание: программа для Nokia 5800 и N97, предназначенная для простой и быстрой нарезки mp3 файлов на звонок. Теперь нарезать любимую мелодию себе или друзьям можно "на ходу" без помощи компьютера, всего за несколько секунд. Достаточно открыть mp3 файл, установить...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Мультимедиа" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v01" label="v.0.1" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="xpresscut" label="XpressCut" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><font class="Apple-style-span" size="6"><span class="Apple-style-span" style="font-size: 24px; line-height: 24px;"><b><span class="Apple-style-span" style="font-size: 12px; font-weight: normal; line-height: 19px; "><span style="font-size: 18pt; line-height: 24px; "><b>XpressCut v.0.1</b></span><br /><br /><b>Разработчик</b>: <a href="http://soft.mobile-master.org/" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">kAIST</a><br /><b>Язык</b>: Русский<br /><b>Состояние</b>: Free<br /><b>Описание</b>: программа для Nokia 5800 и N97, предназначенная для простой и быстрой нарезки mp3 файлов на звонок. <br />Теперь нарезать любимую мелодию себе или друзьям можно "на ходу" без помощи компьютера, всего за несколько секунд. <br />Достаточно открыть mp3 файл, установить точку начала, точку окончания, нажать "save" и рингтон готов! <br /><b>Инструкция по применению</b>: сверху "трека" распологается полоса покрутки, переместив которую, выбирите нужную позицию. Установите курсор в нужную позицию, ткнув стилусом на "треке". С места, где установлен курсор, трек можно проиграть, нажав на "play" (остановить можно, нажав на ту же кнопку). Установите метки начала и конца нарезки, воспользовавшись соответствующими кнопками. После этого, можно нажать на "save". После сохранения трека, его можно прослушать. <br />ВНИМАНИЕ!! Программа работает только с mp3 файлами,созданными с постоянным битрейтом! <br /><b>Для работоспособности нужен python не ниже версии 1.9.4. Python и программу ставить на один и тот же диск! </b><br /><table id="ipb-attach-table-1627-0-99970000-1243760335" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1627-0-99970000-1243760335" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 240px; height: 173px; text-align: center; "><div id="ipb-attach-ct-1627-0-99970000-1243760335" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 63%</div><a id="ipb-attach-url-1627-0-99970000-1243760335" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1627" title="Scr000400.jpg - Размер: 38,46 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243760017_thumb.jpg" id="ipb-attach-img-1627-0-99970000-1243760335" class="ipb" width="240" height="135" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1627-0-99970000-1243760335" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">640 x 360 (38,46 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1626-0-99981600-1243760335" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1626-0-99981600-1243760335" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 240px; height: 173px; text-align: center; "><div id="ipb-attach-ct-1626-0-99981600-1243760335" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 63%</div><a id="ipb-attach-url-1626-0-99981600-1243760335" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1626" title="Scr000399.jpg - Размер: 59,26 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243760011_thumb.jpg" id="ipb-attach-img-1626-0-99981600-1243760335" class="ipb" width="240" height="135" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1626-0-99981600-1243760335" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">640 x 360 (59,26 килобайт)</div></div></td></tr></tbody></table> </span><br /></b></span></font><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1628" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1628" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">Python_1.9.5.zip</a> ( 2,75 мегабайт )<br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1629" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1629" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">XpressCut_0.1_ru.zip</a> ( 142,57 килобайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=951">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Игры для Nokia 5800 и Nokia N97: Asphalt 4 Elite Racing 3D v.1.0.1</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/igri-dlja-nokia-5800-i-nokia-n97-asphalt-4-elite-racing-3d-v101.html" /> - <id>tag:touchnokia.ru,2009://1.808</id> - - <published>2009-05-31T08:37:27Z</published> - <updated>2009-05-31T08:44:42Z</updated> - - <summary><![CDATA[Asphalt 4 Elite Racing 3D v1.0.1Разработчик: GameloftЯзык: Английский (В sis версии Русский)Состояние: FreeОписание: Долгожданная, великолепная, бриллиантовая 3D версия самых лучших гонок для мобильного Asphalt 4: Elite Racing 3D! Ты до сих пор это читаешь? Быстро качать, ты не должен пропустить эту игру!-10 удивительных автомобилей...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Игры для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="3d" label="3D" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="4" label="4" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="asphalt" label="Asphalt" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="elite" label="Elite" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="racing" label="Racing" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v101" label="v.1.0.1" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Игры" label="Игры" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<font class="Apple-style-span" color="#26394D" face="Verdana" size="6"><span class="Apple-style-span" style="font-size: 19px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><b><span class="Apple-style-span" style="font-size: 12px; font-weight: normal; "><span style="font-size: 14pt; line-height: 19px; "><b>Asphalt 4 Elite Racing 3D v1.0.1</b></span><br /><br /><b>Разработчик:</b> Gameloft<br /><b>Язык:</b> Английский (В sis версии Русский)<br /><b>Состояние:</b> Free<br /><b>Описание:</b> Долгожданная, великолепная, бриллиантовая 3D версия самых лучших гонок для мобильного Asphalt 4: Elite Racing 3D! Ты до сих пор это читаешь? Быстро качать, ты не должен пропустить эту игру!<br />-10 удивительных автомобилей и мотоциклов, включая такие, как Bugatti Veyron, Ferrari F430 Spider, Nissan GT-R, Ducati 1098.<br />-Гоняй по шести самых горячих городам мира: Монте Карло, Беверли Хиллз, Шангай, Нью-Йорк, Дюбай, Париж.<br />-Удивительная 3D графика просто захватывает дыхание!<br />-Тюнингуй свой автомобиль в собственном гараже!<br />-Наслаждайся пятью различными режимами игры, такими как преследование, дрифт, и сбей всех.<br />-Адаптируйся в различных погодных условиях: сможешь ли управлять своим автомобилем в ливень?<br /><table id="ipb-attach-table-1607-0-92318400-1243759431" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1607-0-92318400-1243759431" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 240px; height: 173px; text-align: center; "><div id="ipb-attach-ct-1607-0-92318400-1243759431" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 63%</div><a id="ipb-attach-url-1607-0-92318400-1243759431" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1607" title="Scr000391.jpg - Размер: 61,07 килобайт, Скачано: 17" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243712008_thumb.jpg" id="ipb-attach-img-1607-0-92318400-1243759431" class="ipb" width="240" height="135" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1607-0-92318400-1243759431" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">640 x 360 (61,07 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1608-0-92356700-1243759431" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1608-0-92356700-1243759431" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 240px; height: 173px; text-align: center; "><div id="ipb-attach-ct-1608-0-92356700-1243759431" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 63%</div><a id="ipb-attach-url-1608-0-92356700-1243759431" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1608" title="Scr000393.jpg - Размер: 63,54 килобайт, Скачано: 62" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243712016_thumb.jpg" id="ipb-attach-img-1608-0-92356700-1243759431" class="ipb" width="240" height="135" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1608-0-92356700-1243759431" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">640 x 360 (63,54 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1609" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1609" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">Asphalt4.zip</a> ( 684,82 килобайт )<br /><br /><b>И версия Asphalt 4 HD в sis</b><br /><table id="ipb-attach-table-1622-0-92421200-1243759431" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1622-0-92421200-1243759431" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 240px; height: 173px; text-align: center; "><div id="ipb-attach-ct-1622-0-92421200-1243759431" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 63%</div><a id="ipb-attach-url-1622-0-92421200-1243759431" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1622" title="screen1.jpg - Размер: 72,42 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243758764_thumb.jpg" id="ipb-attach-img-1622-0-92421200-1243759431" class="ipb" width="240" height="135" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1622-0-92421200-1243759431" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">639 x 359 (72,42 килобайт)</div></div></td></tr></tbody></table> <br /><table id="ipb-attach-table-1623-0-92441100-1243759431" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1623-0-92441100-1243759431" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 240px; height: 173px; text-align: center; "><div id="ipb-attach-ct-1623-0-92441100-1243759431" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 63%</div><a id="ipb-attach-url-1623-0-92441100-1243759431" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1623" title="screen2.jpg - Размер: 60,41 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243758819_thumb.jpg" id="ipb-attach-img-1623-0-92441100-1243759431" class="ipb" width="240" height="135" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1623-0-92441100-1243759431" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">639 x 359 (60,41 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1624" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1624" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">Asphalt4.N5800.Unsigned.zip</a> ( 5,35 мегабайт )</span><br /></b></span></font><div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=949">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Игры для Nokia 5800 и Nokia N97: 3D Fast and Furious</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/igri-dlja-nokia-5800-i-nokia-n97-3d-fast-and-furious.html" /> - <id>tag:touchnokia.ru,2009://1.809</id> - - <published>2009-05-30T19:47:24Z</published> - <updated>2009-05-31T08:24:20Z</updated> - - <summary><![CDATA[3D Fast and FuriousРазработчик: i-playЯзык: АнглийскийСостояние:Описание: Хорошая игра с 3D графикой Уменьшено до 50%360 x 640 (34,56 килобайт) Уменьшено до 50%360 x 640 (44,54 килобайт) 3D_Fast_and_Furious_n5800.zip ( 675,77 килобайт ) Обсуждение ведем здесь...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Игры для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="3d" label="3D" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="and" label="and" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="fast" label="Fast" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="furious" label="Furious" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Игры" label="Игры" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>3D Fast and Furious</b></span><br /><br /><b>Разработчик:</b> i-play<br /><b>Язык:</b> Английский<br /><b>Состояние:</b><br /><b>Описание:</b> Хорошая игра с 3D графикой<br /><table id="ipb-attach-table-1616-0-66426500-1243758190" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1616-0-66426500-1243758190" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1616-0-66426500-1243758190" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1616-0-66426500-1243758190" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1616" title="Scr000396.jpg - Размер: 34,56 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243757911_thumb.jpg" id="ipb-attach-img-1616-0-66426500-1243758190" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1616-0-66426500-1243758190" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (34,56 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1617-0-66441400-1243758190" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1617-0-66441400-1243758190" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1617-0-66441400-1243758190" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1617-0-66441400-1243758190" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1617" title="Scr000397.jpg - Размер: 44,54 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243757917_thumb.jpg" id="ipb-attach-img-1617-0-66441400-1243758190" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1617-0-66441400-1243758190" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (44,54 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1621" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1621" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">3D_Fast_and_Furious_n5800.zip</a> ( 675,77 килобайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=956">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: Kaspersky Mobile Security 8.0 release v.8.0.51 - Обновление</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-kaspersky-mobile-security-80-release-v8051---obnovlenie.html" /> - <id>tag:touchnokia.ru,2009://1.807</id> - - <published>2009-05-30T19:16:24Z</published> - <updated>2009-05-30T19:46:19Z</updated> - - <summary><![CDATA[Kaspersky Mobile Security 8.0 release v.8.0.51Разработчик: ЗАО "Лаборатория Касперского"Язык: РусскийСостояние: Free (действительна до 1.02.2048 года)Описание: Антивирус Касперского® Mobile это удобное и надежное решение для защиты смартфонов под управлением Symbian OS и Windows Mobile от вредоносных программ для мобильных платформ.ПреимуществаЗащита от мобильных вирусов в режиме реального...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Безопасность" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="80" label="8.0" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="kaspersky" label="Kaspersky" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="mobile" label="Mobile" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="release" label="release" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="security" label="Security" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v8051" label="v.8.0.51" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<font class="Apple-style-span" color="#26394D" face="Verdana" size="6"><span class="Apple-style-span" style="font-size: 19px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"><b><span class="Apple-style-span" style="font-size: 12px; font-weight: normal; "><span style="font-size: 14pt; line-height: 19px; "><b>Kaspersky Mobile Security 8.0 release v.8.0.51</b></span><br /><br /><b>Разработчик:</b> ЗАО "Лаборатория Касперского"<br /><b>Язык:</b> Русский<br /><b>Состояние:</b> Free <u><i>(действительна до 1.02.2048 года)</i></u><br /><b>Описание:</b> Антивирус Касперского® Mobile это удобное и надежное решение для защиты смартфонов под управлением Symbian OS и Windows Mobile от вредоносных программ для мобильных платформ.<br />Преимущества<br />Защита от мобильных вирусов в режиме реального времени<br />Защита от спама в SMS/EMS/MMS с помощью черных и белых списков<br />Незаметная работа в фоновом режиме<br />Автоматическое обновление антивирусных баз<br />Основные функции<br />Антивирусная проверка встроенной памяти телефона, а также карт памяти по требованию<br />Проверка всех входящих или модифицируемых объектов без участия пользователя<br />Полная антивирусная проверка по расписанию в удобное для пользователя время<br />Бесплатная техническая поддержка по вопросам установки, активации, настройки и эксплуатации продукта<br /><br /><table id="ipb-attach-table-1605-0-65086900-1243712699" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1605-0-65086900-1243712699" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1605-0-65086900-1243712699" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1605-0-65086900-1243712699" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1605" title="Scr000390.jpg - Размер: 42,68 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243710731_thumb.jpg" id="ipb-attach-img-1605-0-65086900-1243712699" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1605-0-65086900-1243712699" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (42,68 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1604-0-65116400-1243712699" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1604-0-65116400-1243712699" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1604-0-65116400-1243712699" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1604-0-65116400-1243712699" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1604" title="Scr000389.jpg - Размер: 69,83 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243710725_thumb.jpg" id="ipb-attach-img-1604-0-65116400-1243712699" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1604-0-65116400-1243712699" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (69,83 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1610" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1610" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">kaspersky_mobil.zip</a> ( 885,88 килобайт ) <font class="Apple-style-span" style="font-size: 0.8em; ">- <i>в архиве находится инструкция на английском по регистрации программы</i></font></span><br /></b></span></font><div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=478">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: Dudu Recorder v.3.20</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-dudu-recorder-v320.html" /> - <id>tag:touchnokia.ru,2009://1.806</id> - - <published>2009-05-30T18:37:40Z</published> - <updated>2009-05-30T18:39:45Z</updated> - - <summary><![CDATA[Dudu Recorder v.3.20Разработчик: HongDi TechnologyЯзык: English Состояние: Free (для регистрации вводим 12090704Описание: Маленький диктофон, имеющий функции: записывает в формате АМR, умеет сортировать записи, есть авто-старт, неограниченная длительность записи (зависит от количества свободного места на диске), скрывает записи, выбор памяти для записи. Если при установке выдает ошибка...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Мультимедиа" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="dudu" label="Dudu" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="recorder" label="Recorder" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v320" label="v.3.20" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>Dudu Recorder v.3.20</b></span><br /><br /><b>Разработчик:</b> HongDi Technology<br /><b>Язык:</b> English <br /><b>Состояние:</b> Free (для регистрации вводим <span style="color: rgb(0, 255, 0); ">12090704</span><br /><b>Описание:</b> Маленький диктофон, имеющий функции: записывает в формате АМR, умеет сортировать записи, есть авто-старт, неограниченная длительность записи (зависит от количества свободного места на диске), скрывает записи, выбор памяти для записи. Если при установке выдает ошибка обновления удалите предыдущие версии!<br /><b>Изменения в v.3.20:</b><br />-Добавлена защита паролем<br />-горячии клавиши<br />-скрытый режим (приложения не видно в списке запущенных) <br /><table id="ipb-attach-table-1233-0-61670800-1243708652" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1233-0-61670800-1243708652" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1233-0-61670800-1243708652" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1233-0-61670800-1243708652" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1233" title="Scr000232.jpg - Размер: 49,76 килобайт, Скачано: 4" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1241347699_thumb.jpg" id="ipb-attach-img-1233-0-61670800-1243708652" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1233-0-61670800-1243708652" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (49,76 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1234-0-61699800-1243708652" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1234-0-61699800-1243708652" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1234-0-61699800-1243708652" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1234-0-61699800-1243708652" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1234" title="Scr000233.jpg - Размер: 50,93 килобайт, Скачано: 2" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1241347705_thumb.jpg" id="ipb-attach-img-1234-0-61699800-1243708652" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1234-0-61699800-1243708652" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (50,93 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1602" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1602" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">dudu320.zip</a> ( 114,99 килобайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=710">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: MyPhone v.2.11 - Обновление</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-myphone-v211---obnovlenie.html" /> - <id>tag:touchnokia.ru,2009://1.805</id> - - <published>2009-05-30T17:58:41Z</published> - <updated>2009-05-30T17:59:38Z</updated> - - <summary><![CDATA[MyPhone v.2.11Разработчик: immmoooЯзык: АнглийскийСостояние: TrialОписание: Эмулятор интерфейса iPhone на 5800 Уменьшено до 50%360 x 640 (32,26 килобайт) Уменьшено до 50%360 x 640 (63,16 килобайт) myphone.zip ( 410,09 килобайт )Обсуждение ведем здесь...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Разное" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="myphone" label="MyPhone" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v211" label="v.2.11" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>MyPhone v.2.11</b></span><br /><br /><b>Разработчик:</b> immmooo<br /><b>Язык:</b> Английский<br /><b>Состояние:</b> Trial<br /><b>Описание:</b> Эмулятор интерфейса iPhone на 5800<br /><table id="ipb-attach-table-1313-0-50472400-1243706274" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1313-0-50472400-1243706274" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1313-0-50472400-1243706274" style="font-size: 9px; "> Уменьшено до 50%</div><a id="ipb-attach-url-1313-0-50472400-1243706274" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1313" title="Scr000270.jpg - Размер: 32,26 килобайт, Скачано: 36" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1241950940_thumb.jpg" id="ipb-attach-img-1313-0-50472400-1243706274" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1313-0-50472400-1243706274" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (32,26 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1314-0-50507200-1243706274" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1314-0-50507200-1243706274" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1314-0-50507200-1243706274" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1314-0-50507200-1243706274" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1314" title="Scr000272.jpg - Размер: 63,16 килобайт, Скачано: 28" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1241950944_thumb.jpg" id="ipb-attach-img-1314-0-50507200-1243706274" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1314-0-50507200-1243706274" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (63,16 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1601" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1601" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">myphone.zip</a> ( 410,09 килобайт )<br />Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=762">здесь</a></span>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: Eye Call v.1.04</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-eye-call-v104.html" /> - <id>tag:touchnokia.ru,2009://1.804</id> - - <published>2009-05-30T17:47:01Z</published> - <updated>2009-05-30T17:58:12Z</updated> - - <summary><![CDATA[Eye Call v.1.04Разработчик: EyeSight.Язык: АнглийскийСостояние: FreeОписание: Бывает так что кто-то звонит, а звук так неуместен, а с помощью вот этой программы достаточно махнуть рукой и телефон заглушит его. Также можно настроить что-бы на 2-ой взмах отсылалось SMS звонящему.[*] Если у вас разблокирован смартфон то качаем и ставим,...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Разное" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="call" label="Call" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="eye" label="Eye" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v104" label="v.1.04" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>Eye Call v.1.04</b></span><br /><br /><b>Разработчик:</b> EyeSight.<br /><b>Язык:</b> Английский<br /><b>Состояние:</b> Free<br /><b>Описание:</b> Бывает так что кто-то звонит, а звук так неуместен, а с помощью вот этой программы достаточно махнуть рукой и телефон заглушит его. Также можно настроить что-бы на 2-ой взмах отсылалось SMS звонящему.<br /><b><span style="color: rgb(255, 0, 0); ">[*]</span> </b>Если у вас <a href="http://touchnokia.ru/forums/index.php?showtopic=252" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><span style="color: rgb(255, 0, 0); ">разблокирован смартфон</span></a> то качаем и ставим, если нет то файл необходимо <a href="http://touchnokia.ru/forums/index.php?showtopic=8" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><span style="color: rgb(0, 128, 0); ">подписать</span></a><br /><table id="ipb-attach-table-1598-0-56466900-1243705624" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1598-0-56466900-1243705624" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1598-0-56466900-1243705624" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1598-0-56466900-1243705624" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1598" title="Scr000385.jpg - Размер: 30,56 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243705383_thumb.jpg" id="ipb-attach-img-1598-0-56466900-1243705624" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1598-0-56466900-1243705624" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (30,56 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1599-0-56483600-1243705624" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1599-0-56483600-1243705624" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1599-0-56483600-1243705624" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1599-0-56483600-1243705624" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1599" title="Scr000388.jpg - Размер: 47,39 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243705390_thumb.jpg" id="ipb-attach-img-1599-0-56483600-1243705624" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1599-0-56483600-1243705624" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (47,39 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1600" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1600" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">eyesight.zip</a> ( 1,34 мегабайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=947">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: OVI Store</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-ovi-store.html" /> - <id>tag:touchnokia.ru,2009://1.803</id> - - <published>2009-05-28T19:57:54Z</published> - <updated>2009-05-28T19:59:03Z</updated> - - <summary><![CDATA[OVI StoreРазработчик: Язык: РусскийСостояние: FreeОписание: Программа для скачивания контента из Nokia OVI Store (программы, игры, картинки и т.д) прямо на телефоне.Присутствует возможность фильтрации представленного - только бесплатные. Уменьшено до 50%360 x 640 (61,05 килобайт) Уменьшено до 50%360 x 640 (25,44 килобайт) OVIStore.zip ( 616,74 килобайт ) Обсуждение ведем...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Интернет" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="ovi" label="OVI" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="store" label="Store" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>OVI Store</b></span><br /><br /><b>Разработчик:</b> <br /><b>Язык:</b> Русский<br /><b>Состояние:</b> Free<br /><b>Описание:</b> Программа для скачивания контента из Nokia OVI Store (программы, игры, картинки и т.д) прямо на телефоне.<br />Присутствует возможность фильтрации представленного - только бесплатные.<br /><table id="ipb-attach-table-1594-0-86762900-1243540593" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1594-0-86762900-1243540593" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1594-0-86762900-1243540593" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1594-0-86762900-1243540593" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1594" title="Scr000379.jpg - Размер: 61,05 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243540199_thumb.jpg" id="ipb-attach-img-1594-0-86762900-1243540593" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1594-0-86762900-1243540593" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (61,05 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1595-0-86774400-1243540593" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1595-0-86774400-1243540593" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1595-0-86774400-1243540593" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1595-0-86774400-1243540593" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1595" title="Scr000380.jpg - Размер: 25,44 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243540204_thumb.jpg" id="ipb-attach-img-1595-0-86774400-1243540593" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1595-0-86774400-1243540593" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (25,44 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1596" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1596" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">OVIStore.zip</a> ( 616,74 килобайт )</span> <br /><div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=934">здесь </a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: Talkonaut v.5.51.68</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-talkonaut-v55168.html" /> - <id>tag:touchnokia.ru,2009://1.802</id> - - <published>2009-05-28T19:16:28Z</published> - <updated>2009-05-28T19:18:50Z</updated> - - <summary>Talkonaut v.5.51.68Разработчик: talkonaut.comЯзык: РусскийСостояние: FreeОписание: Talkonaut - это бесплатный GoogleTalk/Jabber IM клиент с голосовыми функциями.Функции:бесплатные звонки на GTalk, MSN Messenger, Yahoo, SIP;отправка и получение сообщений из: GTalk, Jabber, ICQ, MSN, AIM и Yahoo;дешевые звонки через GTalk;бесплатные звонки с вашего существующего...</summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Интернет" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="talkonaut" label="Talkonaut" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v55168" label="v.5.51.68" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b>Talkonaut v.5.51.68</b></span><br /><br /><b>Разработчик</b>: talkonaut.com<br /><b>Язык</b>: Русский<br /><b>Состояние</b>: Free<br /><b>Описание</b>: Talkonaut - это бесплатный GoogleTalk/Jabber IM клиент с голосовыми функциями.<br /><b>Функции:</b><ul><li>бесплатные звонки на GTalk, MSN Messenger, Yahoo, SIP;</li><li>отправка и получение сообщений из: GTalk, Jabber, ICQ, MSN, AIM и Yahoo;</li><li>дешевые звонки через GTalk;</li><li>бесплатные звонки с вашего существующего SIP-счета;</li><li>наличие смайликов, сигналов, передачи файлов через Jabber;</li><li>поддержка Jabber Service Discovery для работы с другими IM клиентами, поиск контактов ICQ и отправка SMS с помощью Mail.RU Agent;</li><li>поддержка сжатия трафика в 5-10 раз.</li></ul><b>Что нового:</b><br /><ul><li>Добавлено расширение (PNG, JPG или GIF) к имени файла при сохранении аватара.</li></ul><table id="ipb-attach-table-1592-0-63012200-1243538186" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1592-0-63012200-1243538186" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1592-0-63012200-1243538186" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1592-0-63012200-1243538186" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1592" title="Scr000002.jpg - Размер: 74,56 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243538165_thumb.jpg" id="ipb-attach-img-1592-0-63012200-1243538186" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1592-0-63012200-1243538186" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (74,56 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1591-0-63028800-1243538186" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1591-0-63028800-1243538186" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1591-0-63028800-1243538186" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1591-0-63028800-1243538186" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1591" title="Scr000001.jpg - Размер: 34,58 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243538155_thumb.jpg" id="ipb-attach-img-1591-0-63028800-1243538186" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1591-0-63028800-1243538186" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (34,58 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1590" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a> <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1590" title="Скачать файл" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; ">talkonaut.zip</a> ( 1,29 мегабайт )</span> <div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=928">здесь</a></span></font></div>]]> - - </content> -</entry> - -<entry> - <title>Программы для Nokia 5800 и Nokia N97: MobileAgent v.1.51</title> - <link rel="alternate" type="text/html" href="http://touchnokia.ru/2009/05/programmi-dlja-nokia-5800-i-nokia-n97-mobileagent-v151.html" /> - <id>tag:touchnokia.ru,2009://1.801</id> - - <published>2009-05-27T20:38:05Z</published> - <updated>2009-05-28T19:27:55Z</updated> - - <summary><![CDATA[MobileAgent v.1.51Разработчик: mail.ruЯзык: РусскийСостояние: FreeОписание: - Одновременная работа в агенте, аське и Jabber/GTalk- передача файлов- анимированные смайлы- доступ к почтеи многое другое...Изменения:- анимация интерфейса;- поддержка системных скинов;- поддержка графических скинов;- поддержка Jabber/GTalk/Я.Онлайн/Live Journal и т.п.- расширенный поиск по Агенту;- автостатусы и автоответчик;- работа с...]]></summary> - <author> - <name>iPod</name> - <uri>http://TouchNokia.ru</uri> - </author> - - <category term="Интернет" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="Программы для Nokia 5800" scheme="http://www.sixapart.com/ns/types#category" /> - - <category term="5800" label="5800" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="mobileagent" label="MobileAgent" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="n97" label="N97:" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="nokia" label="Nokia" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="v151" label="v.1.51" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="для" label="для" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="и" label="и" scheme="http://www.sixapart.com/ns/types#tag" /> - <category term="Программы" label="Программы" scheme="http://www.sixapart.com/ns/types#tag" /> - - <content type="html" xml:lang="ru" xml:base="http://touchnokia.ru/"> - <![CDATA[<span class="Apple-style-span" style="color: rgb(38, 57, 77); font-family: Verdana; font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "><span style="font-size: 14pt; line-height: 19px; "><b><div>MobileAgent v.1.51</div></b></span><br /><b>Разработчик:</b> mail.ru<br /><b>Язык:</b> Русский<br /><b>Состояние:</b> Free<br /><b>Описание:</b> - Одновременная работа в агенте, аське и Jabber/GTalk<br />- передача файлов<br />- анимированные смайлы<br />- доступ к почте<br />и многое другое...<br /><b>Изменения:</b><br />- анимация интерфейса;<br />- поддержка системных скинов;<br />- поддержка графических скинов;<br />- поддержка Jabber/GTalk/Я.Онлайн/Live Journal и т.п.<br />- расширенный поиск по Агенту;<br />- автостатусы и автоответчик;<br />- работа с картами (пока Москва Питер детально, вся Россия в небольшом зуме);<br />- возможность заранее загрузить файлы кэша Москвы и Питера;<br />- показ пробок;<br />- поиск по карте;<br />- позиционирование по GPS или сотовым вышкам;<br />- отправка своего местоположения собеседникам;<br />- просмотр чужих локаций;<br />- виджет на рабочий стол для быстрого доступа к данным о погоде, пробках и валюте. <br /><table id="ipb-attach-table-1570-0-85779200-1243456696" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1570-0-85779200-1243456696" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1570-0-85779200-1243456696" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1570-0-85779200-1243456696" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1570" title="Scr000377.jpg - Размер: 45,85 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243456529_thumb.jpg" id="ipb-attach-img-1570-0-85779200-1243456696" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; cursor: pointer; " /></a><div id="ipb-attach-cb-1570-0-85779200-1243456696" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (45,85 килобайт)</div></div></td></tr></tbody></table> <table id="ipb-attach-table-1571-0-85795300-1243456696" cellspacing="0" cellpadding="0" style="width: auto; display: inline-block; "><tbody><tr><td style="padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div id="ipb-attach-div-1571-0-85795300-1243456696" class="resized-linked-image" title="Нажмите для просмотра полного изображения" style="margin-top: 1px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-right: 8px; padding-bottom: 5px; padding-left: 8px; background-color: rgb(134, 161, 184); border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(0, 0, 0); font-size: 10px; width: 180px; height: 358px; text-align: center; "><div id="ipb-attach-ct-1571-0-85795300-1243456696" style="font-size: 9px; "><img src="http://touchnokia.ru/forums/style_images/hi-tech/img-resized.png" border="0" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /> Уменьшено до 50%</div><a id="ipb-attach-url-1571-0-85795300-1243456696" href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1571" title="Scr000378.jpg - Размер: 48,64 килобайт, Скачано: 0" target="_blank" style="background-image: initial; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; background-color: transparent; color: rgb(14, 21, 29); text-decoration: underline; background-position: initial initial; "><img src="http://touchnokia.ru/forums/uploads/monthly_05_2009/post-1-1243456538_thumb.jpg" id="ipb-attach-img-1571-0-85795300-1243456696" class="ipb" width="180" height="320" alt="Прикрепленное изображение" title="Нажмите для просмотра полного изображения" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; vertical-align: middle; " /></a><div id="ipb-attach-cb-1571-0-85795300-1243456696" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; text-align: center; ">360 x 640 (48,64 килобайт)</div></div></td></tr></tbody></table> <br /><a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1593" title="Скачать файл" target="_blank"><img src="http://touchnokia.ru/forums/style_images/hi-tech/folder_mime_types/zip.gif" alt="Прикрепленный файл" /></a> - <a href="http://touchnokia.ru/forums/index.php?act=attach&type=post&id=1593" title="Скачать файл" target="_blank">mobileagent.zip</a> ( 1,36 мегабайт )</span><div><font class="Apple-style-span" color="#26394D" face="Verdana" size="3"><span class="Apple-style-span" style="font-size: 12px; line-height: 19px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; ">Обсуждение ведем <a href="http://touchnokia.ru/forums/index.php?showtopic=926">здесь</a></span></font></div>]]> - - </content> -</entry> - -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_background_repeat_repeat_x.xml b/lib/feedparser/tests/wellformed/sanitize/style_background_repeat_repeat_x.xml deleted file mode 100644 index a18a4ed2e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_background_repeat_repeat_x.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="background-repeat: repeat-x;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="background-repeat: repeat-x;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_background_url.xml b/lib/feedparser/tests/wellformed/sanitize/style_background_url.xml deleted file mode 100644 index 6a11b45bf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_background_url.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style contains url -Expect: not bozo and entries[0]['description'] == '<span style="background-color: #000;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="background-color: #000; background-image: url(/category/images/cafeneon_small.jpg); background-repeat: no-repeat;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_background_yellow.xml b/lib/feedparser/tests/wellformed/sanitize/style_background_yellow.xml deleted file mode 100644 index a96c7fe3b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_background_yellow.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="background: yellow;" -Expect: not bozo and entries[0]['description'] == '<span style="background: yellow;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="background: yellow;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_0.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_0.xml deleted file mode 100644 index 082aeb471..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_0.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border: 0;" -Expect: not bozo and entries[0]['description'] == '<span style="border: 0;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border: 0;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_1px_solid_rgb_0_0_0_.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_1px_solid_rgb_0_0_0_.xml deleted file mode 100644 index ead5a4df2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_1px_solid_rgb_0_0_0_.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border: 1px solid rgb(0, 0, 0);" -Expect: not bozo and entries[0]['description'] == '<span style="border: 1px solid rgb(0, 0, 0);">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border: 1px solid rgb(0, 0, 0);">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_3px_solid_ccc.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_3px_solid_ccc.xml deleted file mode 100644 index 211b47f1d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_3px_solid_ccc.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border: 3px solid #ccc;" -Expect: not bozo and entries[0]['description'] == '<span style="border: 3px solid #ccc;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border: 3px solid #ccc;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_0pt.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_0pt.xml deleted file mode 100644 index 0a6157046..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_0pt.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-bottom: 0pt;" -Expect: not bozo and entries[0]['description'] == '<span style="border-bottom: 0pt;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-bottom: 0pt;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dashed.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dashed.xml deleted file mode 100644 index 3938ecca4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dashed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-bottom: dashed;" -Expect: not bozo and entries[0]['description'] == '<span style="border-bottom: dashed;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-bottom: dashed;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dotted.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dotted.xml deleted file mode 100644 index 6f22f48f3..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_bottom_dotted.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-bottom: dotted;" -Expect: not bozo and entries[0]['description'] == '<span style="border-bottom: dotted;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-bottom: dotted;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_collapse_collapse.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_collapse_collapse.xml deleted file mode 100644 index 6e6d62e94..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_collapse_collapse.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-collapse: collapse;" -Expect: not bozo and entries[0]['description'] == '<span style="border-collapse: collapse;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-collapse: collapse;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_left_0pt.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_left_0pt.xml deleted file mode 100644 index 3f00fe001..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_left_0pt.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-left: 0pt;" -Expect: not bozo and entries[0]['description'] == '<span style="border-left: 0pt;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-left: 0pt;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_medium_none_.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_medium_none_.xml deleted file mode 100644 index bea1e643a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_medium_none_.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border: medium none ;" -Expect: not bozo and entries[0]['description'] == '<span style="border: medium none ;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border: medium none ;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_none_important.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_none_important.xml deleted file mode 100644 index 1b9dfa94f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_none_important.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border: none !important;" -Expect: not bozo and entries[0]['description'] == '<span style="border: none !important;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border: none !important;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_right_0pt.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_right_0pt.xml deleted file mode 100644 index d9066f523..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_right_0pt.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-right: 0pt;" -Expect: not bozo and entries[0]['description'] == '<span style="border-right: 0pt;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-right: 0pt;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_solid_2px_000000.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_solid_2px_000000.xml deleted file mode 100644 index 2fc5f4b69..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_solid_2px_000000.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border: solid 2px #000000;" -Expect: not bozo and entries[0]['description'] == '<span style="border: solid 2px #000000;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border: solid 2px #000000;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_border_top_0pt.xml b/lib/feedparser/tests/wellformed/sanitize/style_border_top_0pt.xml deleted file mode 100644 index d12947118..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_border_top_0pt.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="border-top: 0pt;" -Expect: not bozo and entries[0]['description'] == '<span style="border-top: 0pt;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="border-top: 0pt;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_clear_both.xml b/lib/feedparser/tests/wellformed/sanitize/style_clear_both.xml deleted file mode 100644 index 2efb73de0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_clear_both.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="clear: both;" -Expect: not bozo and entries[0]['description'] == '<span style="clear: both;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="clear: both;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_000080.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_000080.xml deleted file mode 100644 index a03fde1e2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_000080.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: #000080;" -Expect: not bozo and entries[0]['description'] == '<span style="color: #000080;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: #000080;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_008.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_008.xml deleted file mode 100644 index 4f412b304..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_008.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: #008;" -Expect: not bozo and entries[0]['description'] == '<span style="color: #008;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: #008;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_999999.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_999999.xml deleted file mode 100644 index e741bfa7b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_999999.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: #999999;" -Expect: not bozo and entries[0]['description'] == '<span style="color: #999999;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: #999999;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_blue.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_blue.xml deleted file mode 100644 index 06eb8fe72..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_blue.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: blue;" -Expect: not bozo and entries[0]['description'] == '<span style="color: blue;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: blue;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_maroon.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_maroon.xml deleted file mode 100644 index 42649ebc2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_maroon.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: maroon;" -Expect: not bozo and entries[0]['description'] == '<span style="color: maroon;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: maroon;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_red.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_red.xml deleted file mode 100644 index 6cacbbec0..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_red.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: red;" -Expect: not bozo and entries[0]['description'] == '<span style="color: red;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: red;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_rgb_0_128_0_.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_rgb_0_128_0_.xml deleted file mode 100644 index b269a17f9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_rgb_0_128_0_.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: rgb(0, 128, 0);" -Expect: not bozo and entries[0]['description'] == '<span style="color: rgb(0, 128, 0);">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: rgb(0, 128, 0);">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_color_teal.xml b/lib/feedparser/tests/wellformed/sanitize/style_color_teal.xml deleted file mode 100644 index b5afc8f1a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_color_teal.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="color: teal;" -Expect: not bozo and entries[0]['description'] == '<span style="color: teal;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="color: teal;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_cursor_pointer.xml b/lib/feedparser/tests/wellformed/sanitize/style_cursor_pointer.xml deleted file mode 100644 index ee69ca178..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_cursor_pointer.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="cursor: pointer;" -Expect: not bozo and entries[0]['description'] == '<span style="cursor: pointer;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="cursor: pointer;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_display_block.xml b/lib/feedparser/tests/wellformed/sanitize/style_display_block.xml deleted file mode 100644 index 95642617f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_display_block.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="display: block;" -Expect: not bozo and entries[0]['description'] == '<span style="display: block;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="display: block;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_float_left.xml b/lib/feedparser/tests/wellformed/sanitize/style_float_left.xml deleted file mode 100644 index b9e11fa78..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_float_left.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="float: left;" -Expect: not bozo and entries[0]['description'] == '<span style="float: left;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="float: left;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_float_right.xml b/lib/feedparser/tests/wellformed/sanitize/style_float_right.xml deleted file mode 100644 index eb4009cf7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_float_right.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="float: right;" -Expect: not bozo and entries[0]['description'] == '<span style="float: right;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="float: right;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_family__comic_sans_ms.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_family__comic_sans_ms.xml deleted file mode 100644 index 3ae327dc1..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_family__comic_sans_ms.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-family : Comic Sans MS;" -Expect: not bozo and entries[0]['description'] == '<span style="font-family: Comic Sans MS;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-family : Comic Sans MS;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_family_arial_sans_serif.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_family_arial_sans_serif.xml deleted file mode 100644 index 5b21c4245..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_family_arial_sans_serif.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-family: arial,sans-serif;" -Expect: not bozo and entries[0]['description'] == '<span style="font-family: arial,sans-serif;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-family: arial,sans-serif;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_family_lucida_console_.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_family_lucida_console_.xml deleted file mode 100644 index a8a6fe5fb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_family_lucida_console_.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-family: 'Lucida Console';" -Expect: not bozo and entries[0]['description'] == '''<span style="font-family: 'Lucida Console';">Some text</span>''' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-family: 'Lucida Console';">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_family_symbol.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_family_symbol.xml deleted file mode 100644 index 0221e7a8e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_family_symbol.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-family: Symbol;" -Expect: not bozo and entries[0]['description'] == '<span style="font-family: Symbol;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-family: Symbol;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_size_0_9em.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_size_0_9em.xml deleted file mode 100644 index 4b658fcfc..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_size_0_9em.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-size: 0.9em;" -Expect: not bozo and entries[0]['description'] == '<span style="font-size: 0.9em;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-size: 0.9em;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_size_10pt.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_size_10pt.xml deleted file mode 100644 index 27a79943d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_size_10pt.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-size: 10pt;" -Expect: not bozo and entries[0]['description'] == '<span style="font-size: 10pt;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-size: 10pt;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_size_10px.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_size_10px.xml deleted file mode 100644 index ba00024a2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_size_10px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-size: 10px;" -Expect: not bozo and entries[0]['description'] == '<span style="font-size: 10px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-size: 10px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_size_smaller.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_size_smaller.xml deleted file mode 100644 index 04bf3641a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_size_smaller.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-size: smaller;" -Expect: not bozo and entries[0]['description'] == '<span style="font-size: smaller;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-size: smaller;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_style_italic.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_style_italic.xml deleted file mode 100644 index 31aa7539b..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_style_italic.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-style: italic;" -Expect: not bozo and entries[0]['description'] == '<span style="font-style: italic;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-style: italic;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_font_weight_bold.xml b/lib/feedparser/tests/wellformed/sanitize/style_font_weight_bold.xml deleted file mode 100644 index f63a008f8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_font_weight_bold.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="font-weight: bold;" -Expect: not bozo and entries[0]['description'] == '<span style="font-weight: bold;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="font-weight: bold;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_height_100px.xml b/lib/feedparser/tests/wellformed/sanitize/style_height_100px.xml deleted file mode 100644 index bba108a59..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_height_100px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="height: 100px;" -Expect: not bozo and entries[0]['description'] == '<span style="height: 100px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="height: 100px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_height_2px.xml b/lib/feedparser/tests/wellformed/sanitize/style_height_2px.xml deleted file mode 100644 index 4b2291617..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_height_2px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="height: 2px;" -Expect: not bozo and entries[0]['description'] == '<span style="height: 2px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="height: 2px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_letter_spacing_1px.xml b/lib/feedparser/tests/wellformed/sanitize/style_letter_spacing_1px.xml deleted file mode 100644 index 23e7b90c8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_letter_spacing_1px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="letter-spacing:1px;" -Expect: not bozo and entries[0]['description'] == '<span style="letter-spacing: 1px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="letter-spacing:1px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_line_height_normal.xml b/lib/feedparser/tests/wellformed/sanitize/style_line_height_normal.xml deleted file mode 100644 index 1637198b8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_line_height_normal.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="line-height: normal;" -Expect: not bozo and entries[0]['description'] == '<span style="line-height: normal;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="line-height: normal;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_0.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_0.xml deleted file mode 100644 index 572664ff5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_0.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin: 0;" -Expect: not bozo and entries[0]['description'] == '<span style="margin: 0;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin: 0;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_0_15px_0_0.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_0_15px_0_0.xml deleted file mode 100644 index 0ff41b46a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_0_15px_0_0.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin: 0 15px 0 0;" -Expect: not bozo and entries[0]['description'] == '<span style="margin: 0 15px 0 0;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin: 0 15px 0 0;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_0px_important.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_0px_important.xml deleted file mode 100644 index 2c9fb9cd7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_0px_important.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin: 0px !important;" -Expect: not bozo and entries[0]['description'] == '<span style="margin: 0px !important;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin: 0px !important;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_5px.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_5px.xml deleted file mode 100644 index e64fcffff..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_5px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin: 5px;" -Expect: not bozo and entries[0]['description'] == '<span style="margin: 5px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin: 5px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_99999em.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_99999em.xml deleted file mode 100644 index 09e9b2b78..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_99999em.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin: 99999em;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin: 99999em;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_0pt.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_0pt.xml deleted file mode 100644 index 2b7f4a71f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_0pt.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin-bottom: 0pt;" -Expect: not bozo and entries[0]['description'] == '<span style="margin-bottom: 0pt;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin-bottom: 0pt;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_10px.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_10px.xml deleted file mode 100644 index ab6801a84..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_bottom_10px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin-bottom: 10px;" -Expect: not bozo and entries[0]['description'] == '<span style="margin-bottom: 10px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin-bottom: 10px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_left_5px.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_left_5px.xml deleted file mode 100644 index be252c76d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_left_5px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin-left: 5px;" -Expect: not bozo and entries[0]['description'] == '<span style="margin-left: 5px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin-left: 5px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_right_0px.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_right_0px.xml deleted file mode 100644 index 14fc788c7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_right_0px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin-right: 0px;" -Expect: not bozo and entries[0]['description'] == '<span style="margin-right: 0px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin-right: 0px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_top_0in.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_top_0in.xml deleted file mode 100644 index 906cbb556..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_top_0in.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin-top: 0in;" -Expect: not bozo and entries[0]['description'] == '<span style="margin-top: 0in;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin-top: 0in;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_margin_top_10px.xml b/lib/feedparser/tests/wellformed/sanitize/style_margin_top_10px.xml deleted file mode 100644 index 78fb3c85a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_margin_top_10px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="margin-top: 10px;" -Expect: not bozo and entries[0]['description'] == '<span style="margin-top: 10px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="margin-top: 10px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_moz_background_clip_initial.xml b/lib/feedparser/tests/wellformed/sanitize/style_moz_background_clip_initial.xml deleted file mode 100644 index f4ab50682..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_moz_background_clip_initial.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="-moz-background-clip: initial;" -Expect: not bozo and entries[0]['description'] == '<tr>Some text</tr>' ---> -<rss version="2.0"> -<channel> -<item> -<description><tr style="background: yellow none repeat scroll 0%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;">Some text</tr></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_ansi_language_nl.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_ansi_language_nl.xml deleted file mode 100644 index 3fea651e4..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_ansi_language_nl.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-ansi-language: NL;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-ansi-language: NL;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_bidi_font_weight_normal.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_bidi_font_weight_normal.xml deleted file mode 100644 index d075aa0d8..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_bidi_font_weight_normal.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-bidi-font-weight: normal;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-bidi-font-weight: normal;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_highlight_yellow.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_highlight_yellow.xml deleted file mode 100644 index b44c6dc40..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_highlight_yellow.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-highlight: yellow;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-highlight: yellow;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_layout_grid_align_none.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_layout_grid_align_none.xml deleted file mode 100644 index 275bfcae9..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_layout_grid_align_none.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-layout-grid-align: none;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-layout-grid-align: none;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_list_l0_level1_lfo1.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_list_l0_level1_lfo1.xml deleted file mode 100644 index d743dd108..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_list_l0_level1_lfo1.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-list: l0 level1 lfo1;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-list: l0 level1 lfo1;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_no_proof_yes.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_no_proof_yes.xml deleted file mode 100644 index 8a9f5b1c2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_no_proof_yes.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-no-proof: yes;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-no-proof: yes;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_spacerun_yes.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_spacerun_yes.xml deleted file mode 100644 index a7ed12c67..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_spacerun_yes.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-spacerun: yes;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-spacerun: yes;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_mso_tab_count_3.xml b/lib/feedparser/tests/wellformed/sanitize/style_mso_tab_count_3.xml deleted file mode 100644 index 665118d12..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_mso_tab_count_3.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="mso-tab-count: 3;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="mso-tab-count: 3;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_overflow_auto.xml b/lib/feedparser/tests/wellformed/sanitize/style_overflow_auto.xml deleted file mode 100644 index bc347ec5d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_overflow_auto.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="overflow: auto;" -Expect: not bozo and entries[0]['description'] == '<span style="overflow: auto;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="overflow: auto;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_padding_0.xml b/lib/feedparser/tests/wellformed/sanitize/style_padding_0.xml deleted file mode 100644 index 7f3ee3fcf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_padding_0.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="padding: 0;" -Expect: not bozo and entries[0]['description'] == '<span style="padding: 0;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="padding: 0;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_padding_0_0_12px_12px.xml b/lib/feedparser/tests/wellformed/sanitize/style_padding_0_0_12px_12px.xml deleted file mode 100644 index 4a4310cd7..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_padding_0_0_12px_12px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="padding: 0 0 12px 12px;" -Expect: not bozo and entries[0]['description'] == '<span style="padding: 0 0 12px 12px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="padding: 0 0 12px 12px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_padding_2ex.xml b/lib/feedparser/tests/wellformed/sanitize/style_padding_2ex.xml deleted file mode 100644 index 6dc1b5b3d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_padding_2ex.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="padding: 2ex;" -Expect: not bozo and entries[0]['description'] == '<span style="padding: 2ex;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="padding: 2ex;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_padding_99999em.xml b/lib/feedparser/tests/wellformed/sanitize/style_padding_99999em.xml deleted file mode 100644 index eca4144ca..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_padding_99999em.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="padding: 99999em;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="padding: 99999em;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_padding_left_4px.xml b/lib/feedparser/tests/wellformed/sanitize/style_padding_left_4px.xml deleted file mode 100644 index 7cbe16efc..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_padding_left_4px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="padding-left: 4px;" -Expect: not bozo and entries[0]['description'] == '<span style="padding-left: 4px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="padding-left: 4px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_padding_right_0in.xml b/lib/feedparser/tests/wellformed/sanitize/style_padding_right_0in.xml deleted file mode 100644 index 1077f170f..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_padding_right_0in.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="padding-right: 0in;" -Expect: not bozo and entries[0]['description'] == '<span style="padding-right: 0in;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="padding-right: 0in;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_position_absolute.xml b/lib/feedparser/tests/wellformed/sanitize/style_position_absolute.xml deleted file mode 100644 index 4b436e00d..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_position_absolute.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="position: absolute;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="position: absolute;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_tab_stops_list_5in.xml b/lib/feedparser/tests/wellformed/sanitize/style_tab_stops_list_5in.xml deleted file mode 100644 index 6bd2c9abb..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_tab_stops_list_5in.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="tab-stops: list .5in;" -Expect: not bozo and entries[0]['description'] == '<span>Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="tab-stops: list .5in;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_text_align_center.xml b/lib/feedparser/tests/wellformed/sanitize/style_text_align_center.xml deleted file mode 100644 index f3055eae5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_text_align_center.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="text-align: center;" -Expect: not bozo and entries[0]['description'] == '<span style="text-align: center;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="text-align: center;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_text_align_left.xml b/lib/feedparser/tests/wellformed/sanitize/style_text_align_left.xml deleted file mode 100644 index cc9b3e525..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_text_align_left.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="text-align: left;" -Expect: not bozo and entries[0]['description'] == '<span style="text-align: left;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="text-align: left;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_text_align_right.xml b/lib/feedparser/tests/wellformed/sanitize/style_text_align_right.xml deleted file mode 100644 index aaa3c7579..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_text_align_right.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="text-align: right;" -Expect: not bozo and entries[0]['description'] == '<span style="text-align: right;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="text-align: right;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_text_decoration_underline.xml b/lib/feedparser/tests/wellformed/sanitize/style_text_decoration_underline.xml deleted file mode 100644 index b2461ecdf..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_text_decoration_underline.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="text-decoration: underline;" -Expect: not bozo and entries[0]['description'] == '<span style="text-decoration: underline;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="text-decoration: underline;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_text_indent_0_5in.xml b/lib/feedparser/tests/wellformed/sanitize/style_text_indent_0_5in.xml deleted file mode 100644 index 87d1cacd2..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_text_indent_0_5in.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="TEXT-INDENT: 0.5in;" -Expect: not bozo and entries[0]['description'] == '<span style="TEXT-INDENT: 0.5in;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="TEXT-INDENT: 0.5in;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_vertical_align_bottom.xml b/lib/feedparser/tests/wellformed/sanitize/style_vertical_align_bottom.xml deleted file mode 100644 index 9c3da9f05..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_vertical_align_bottom.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="vertical-align: bottom;" -Expect: not bozo and entries[0]['description'] == '<span style="vertical-align: bottom;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="vertical-align: bottom;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_vertical_align_top.xml b/lib/feedparser/tests/wellformed/sanitize/style_vertical_align_top.xml deleted file mode 100644 index 55b45cc1a..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_vertical_align_top.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="vertical-align: top;" -Expect: not bozo and entries[0]['description'] == '<span style="vertical-align: top;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="vertical-align: top;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_white_space_nowrap.xml b/lib/feedparser/tests/wellformed/sanitize/style_white_space_nowrap.xml deleted file mode 100644 index 61e0c04dd..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_white_space_nowrap.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="white-space: nowrap;" -Expect: not bozo and entries[0]['description'] == '<span style="white-space: nowrap;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="white-space: nowrap;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_white_space_top.xml b/lib/feedparser/tests/wellformed/sanitize/style_white_space_top.xml deleted file mode 100644 index c48d32a8e..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_white_space_top.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="white-space: top;" -Expect: not bozo and entries[0]['description'] == '<span style="white-space: top;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="white-space: top;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/style_width_300px.xml b/lib/feedparser/tests/wellformed/sanitize/style_width_300px.xml deleted file mode 100644 index f7ae6d706..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/style_width_300px.xml +++ /dev/null @@ -1,11 +0,0 @@ -<!-- -Description: style="width: 300px;" -Expect: not bozo and entries[0]['description'] == '<span style="width: 300px;">Some text</span>' ---> -<rss version="2.0"> -<channel> -<item> -<description><span style="width: 300px;">Some text</span></description> -</item> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/sanitize/xml_declaration_unexpected_character.xml b/lib/feedparser/tests/wellformed/sanitize/xml_declaration_unexpected_character.xml deleted file mode 100644 index 089dceae5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/xml_declaration_unexpected_character.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: xml declaration unexpected character -Expect: not bozo and feed['title'] == u'<!DOCTYPE ~' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html"><!DOCTYPE ~</title> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/xml_malicious_comment.xml b/lib/feedparser/tests/wellformed/sanitize/xml_malicious_comment.xml deleted file mode 100644 index db79e86c5..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/xml_malicious_comment.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: malicious comment -Expect: not bozo and feed['title'] == u'safe' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html">sa<!-- -- nonwhitespace >fe<script>alert(1);</script></title> -</feed> diff --git a/lib/feedparser/tests/wellformed/sanitize/xml_unclosed_comment.xml b/lib/feedparser/tests/wellformed/sanitize/xml_unclosed_comment.xml deleted file mode 100644 index 75a642796..000000000 --- a/lib/feedparser/tests/wellformed/sanitize/xml_unclosed_comment.xml +++ /dev/null @@ -1,7 +0,0 @@ -<!-- -Description: unclosed comment -Expect: not bozo and feed['title'] == u'safe' ---> -<feed xmlns="http://www.w3.org/2005/Atom"> - <title type="html">safe<!--</title> -</feed> diff --git a/lib/feedparser/tests/wellformed/sgml/charref_uppercase_x.xml b/lib/feedparser/tests/wellformed/sgml/charref_uppercase_x.xml deleted file mode 100644 index 51a13b737..000000000 --- a/lib/feedparser/tests/wellformed/sgml/charref_uppercase_x.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: ensure an uppercase X in a hex charref doesn't crash feedparser -Expect: not bozo and entries[0]['summary'] == u'a' ---> -<rss version="2.0"> - <channel> - <item><description>&#X61;</description></item> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/xml/empty_xmlns_uri.xml b/lib/feedparser/tests/wellformed/xml/empty_xmlns_uri.xml deleted file mode 100644 index da68ece27..000000000 --- a/lib/feedparser/tests/wellformed/xml/empty_xmlns_uri.xml +++ /dev/null @@ -1,9 +0,0 @@ -<!-- -Description: empty xmlns uri -Expect: not bozo and feed['title'] == u'empty' ---> -<rss xmlns=""> - <channel> - <title>empty</title> - </channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/xml/escaped_apos.xml b/lib/feedparser/tests/wellformed/xml/escaped_apos.xml deleted file mode 100644 index 6340ca9bd..000000000 --- a/lib/feedparser/tests/wellformed/xml/escaped_apos.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -XXX - THIS TEST SHOULD BE UPDATED WHEN SGML AND XML OUTPUT IS IDENTICAL -Description: ensure apos is translated correctly -Expect: not bozo and feed['title'] == u'it's correct' or feed['title'] == u"it's correct" ---> -<rss> -<channel> - <title type="html">it&apos;s correct</title> -</channel> -</rss> diff --git a/lib/feedparser/tests/wellformed/xml/xlink_ns_no_prefix.xml b/lib/feedparser/tests/wellformed/xml/xlink_ns_no_prefix.xml deleted file mode 100644 index a0c376cd3..000000000 --- a/lib/feedparser/tests/wellformed/xml/xlink_ns_no_prefix.xml +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -Description: xmlns without prefix with xlink uri causes crash -Expect: not bozo and feed['title'] == u'xlink' ---> -<rss> - <bogus xmlns="http://www.w3.org/1999/xlink"/> - <channel> - <title>xlink</title> - </channel> -</rss> diff --git a/lib/feedparser/urls.py b/lib/feedparser/urls.py new file mode 100644 index 000000000..85b8fd1c4 --- /dev/null +++ b/lib/feedparser/urls.py @@ -0,0 +1,131 @@ +from __future__ import absolute_import, unicode_literals + +import re + +try: + import urllib.parse as urlparse +except ImportError: + import urlparse as urlparse + +from .html import _BaseHTMLProcessor + +# 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 = () + +_urifixer = re.compile('^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)') +def _urljoin(base, uri): + uri = _urifixer.sub(r'\1\3', uri) + try: + uri = urlparse.urljoin(base, uri) + except ValueError: + uri = '' + return uri + +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 = '' + 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 _makeSafeAbsoluteURI(base, rel=None): + # bail if ACCEPTABLE_URI_SCHEMES is empty + if not ACCEPTABLE_URI_SCHEMES: + return _urljoin(base, rel or '') + if not base: + return rel or '' + if not rel: + try: + scheme = urlparse.urlparse(base)[0] + except ValueError: + return '' + if not scheme or scheme in ACCEPTABLE_URI_SCHEMES: + return base + return '' + uri = _urljoin(base, rel) + if uri.strip().split(':', 1)[0] not in ACCEPTABLE_URI_SCHEMES: + return '' + return uri + +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() + diff --git a/lib/feedparser/util.py b/lib/feedparser/util.py new file mode 100644 index 000000000..f7c02c01e --- /dev/null +++ b/lib/feedparser/util.py @@ -0,0 +1,144 @@ +# Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org> +# Copyright 2002-2008 Mark Pilgrim +# All rights reserved. +# +# This file is a part of feedparser. +# +# 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. + +from __future__ import absolute_import, unicode_literals + +import warnings + +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']=='enclosure'] + elif key == 'license': + for link in dict.__getitem__(self, 'links'): + if link['rel']=='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) -- GitLab From 4f83679cd0ff6be0ca88a33cc9b502e31e959674 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 22:26:53 -0800 Subject: [PATCH 005/215] Code changes to support not using feedcache and new feedparser --- sickbeard/providers/generic.py | 2 +- sickbeard/rssfeeds.py | 56 +++++++++++++--------------------- sickbeard/tvcache.py | 5 ++- 3 files changed, 25 insertions(+), 38 deletions(-) diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 41fb6443c..dad863e31 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -557,7 +557,7 @@ class TorrentProvider(GenericProvider): self.providerType = GenericProvider.TORRENT def _get_title_and_url(self, item): - from feedparser.feedparser import FeedParserDict + from feedparser.util import FeedParserDict if isinstance(item, (dict, FeedParserDict)): title = item.get('title', '') download_url = item.get('url', '') diff --git a/sickbeard/rssfeeds.py b/sickbeard/rssfeeds.py index 5fb71ca83..3c7e84b75 100644 --- a/sickbeard/rssfeeds.py +++ b/sickbeard/rssfeeds.py @@ -1,43 +1,31 @@ +from six.moves import urllib -import os -import urllib - -import sickbeard +import urlparse +import re +from feedparser.api import parse from sickbeard import logger -from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex -from feedcache.cache import Cache - -from sqliteshelf import SQLiteShelf - - -class RSSFeeds: - def __init__(self, db_name='feeds'): - try: - db_name = ek(os.path.join, sickbeard.CACHE_DIR, 'rss', db_name) + '.db' - if not os.path.exists(os.path.dirname(db_name)): - sickbeard.helpers.makeDir(os.path.dirname(db_name)) - - self.rssDB = SQLiteShelf(db_name) - except Exception as e: - logger.log(u"FeedParser error: " + ex(e), logger.DEBUG) - - def clearCache(self, age=None): - try: - Cache(self.rssDB).purge(age) - finally: - self.rssDB.close() +def getFeed(url, post_data=None, request_headers=None, items=None, handlers=[]): + parsed = list(urlparse.urlparse(url)) + parsed[2] = re.sub("/{2,}", "/", parsed[2]) # replace two or more / with one - def getFeed(self, url, post_data=None, request_headers=None, items=None, handlers=[]): + if post_data: + url += urllib.parse.urlencode(post_data) - if post_data: - url += urllib.urlencode(post_data) + try: + feed = parse(url, False, False, request_headers, handlers=handlers) - try: - resp = Cache(self.rssDB, userAgent=sickbeard.common.USER_AGENT).fetch(url, force_update=True, request_headers=request_headers, handlers=handlers) - finally: - self.rssDB.close() + if feed: + if 'entries' in feed: + return feed + elif 'error' in feed.feed: + err_code = feed.feed['error']['code'] + err_desc = feed.feed['error']['description'] + logger.log(u'RSS ERROR:[%s] CODE:[%s]' % (err_desc, err_code), logger.DEBUG) + else: + logger.log(u'RSS error loading url: ' + url, logger.DEBUG) - return resp + except Exception as e: + logger.log(u'RSS error: ' + ex(e), logger.DEBUG) diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index 1103353ab..7b5a2f866 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -28,7 +28,7 @@ from sickbeard import db from sickbeard import logger from sickbeard.common import Quality from sickbeard import helpers -from sickbeard.rssfeeds import RSSFeeds +from sickbeard.rssfeeds import getFeed from name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickbeard import show_name_helpers from sickrage.helper.encoding import ss @@ -148,7 +148,7 @@ class TVCache(): elif 'Referer' in self.provider.headers: self.provider.headers.pop('Referer') - return RSSFeeds(self.providerID).getFeed( + return getFeed( self.provider.proxy._buildURL(url), post_data, self.provider.headers, @@ -392,4 +392,3 @@ class TVCache(): self.setLastSearch() return neededEps - -- GitLab From 21c75ee53d187b574aef8724aa08f7f684b67e86 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 22:59:35 -0800 Subject: [PATCH 006/215] Fix up code and build testing --- sickbeard/providers/animenzb.py | 2 +- sickbeard/providers/nyaatorrents.py | 21 +++++---------------- sickbeard/providers/shazbat.py | 5 ++--- sickbeard/rssfeeds.py | 12 +++++------- sickbeard/tvcache.py | 18 ++++++++---------- tests/feedparser_tests.py | 29 ----------------------------- 6 files changed, 21 insertions(+), 66 deletions(-) delete mode 100644 tests/feedparser_tests.py diff --git a/sickbeard/providers/animenzb.py b/sickbeard/providers/animenzb.py index 5a384a622..bed7f6872 100644 --- a/sickbeard/providers/animenzb.py +++ b/sickbeard/providers/animenzb.py @@ -71,7 +71,7 @@ class animenzb(generic.NZBProvider): searchURL = self.url + "rss?" + urllib.urlencode(params) logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) results = [] - for curItem in self.cache.getRSSFeed(searchURL, items=['entries'])['entries'] or []: + for curItem in self.cache.getRSSFeed(searchURL)['entries'] or []: (title, url) = self._get_title_and_url(curItem) if title and url: diff --git a/sickbeard/providers/nyaatorrents.py b/sickbeard/providers/nyaatorrents.py index d306e5952..ea6190849 100644 --- a/sickbeard/providers/nyaatorrents.py +++ b/sickbeard/providers/nyaatorrents.py @@ -19,13 +19,9 @@ import urllib import re -import generic - -from sickbeard import show_name_helpers from sickbeard import logger -from sickbeard.common import Quality from sickbeard import tvcache -from sickbeard import show_name_helpers +from sickbeard.providers import generic class NyaaProvider(generic.TorrentProvider): @@ -81,7 +77,7 @@ class NyaaProvider(generic.TorrentProvider): s = re.compile(summary_regex, re.DOTALL) results = [] - for curItem in self.cache.getRSSFeed(searchURL, items=['entries'])['entries'] or []: + for curItem in self.cache.getRSSFeed(searchURL)['entries'] or []: title = curItem['title'] download_url = curItem['link'] if not all([title, download_url]): @@ -113,15 +109,8 @@ class NyaaProvider(generic.TorrentProvider): return results - def _extract_name_from_filename(self, filename): - name_regex = '(.*?)\.?(\[.*]|\d+\.TPB)\.torrent$' - logger.log(u"Comparing %s against %s" % (name_regex, filename), logger.DEBUG) - match = re.match(name_regex, filename, re.I) - if match: - return match.group(1) - return None - - def _convertSize(self, size): + @staticmethod + def _convertSize(size): size, modifier = size.split(' ') size = float(size) if modifier in 'KiB': @@ -132,7 +121,7 @@ class NyaaProvider(generic.TorrentProvider): size = size * 1024**3 elif modifier in 'TiB': size = size * 1024**4 - return size + return int(size) def seedRatio(self): return self.ratio diff --git a/sickbeard/providers/shazbat.py b/sickbeard/providers/shazbat.py index 8fffb1dfd..4e0b5bfab 100644 --- a/sickbeard/providers/shazbat.py +++ b/sickbeard/providers/shazbat.py @@ -16,10 +16,9 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import generic - from sickbeard import logger from sickbeard import tvcache +from sickbeard.providers import generic from sickrage.helper.exceptions import AuthException @@ -74,7 +73,7 @@ class ShazbatCache(tvcache.TVCache): rss_url = self.provider.urls['base_url'] + 'rss/recent?passkey=' + provider.passkey + '&fname=true' logger.log(u"Cache update URL: %s" % rss_url, logger.DEBUG) - return self.getRSSFeed(rss_url, items=['entries', 'feed']) + return self.getRSSFeed(rss_url) def _checkAuth(self, data): return self.provider._checkAuthFromData(data) diff --git a/sickbeard/rssfeeds.py b/sickbeard/rssfeeds.py index 3c7e84b75..2e7fc26fc 100644 --- a/sickbeard/rssfeeds.py +++ b/sickbeard/rssfeeds.py @@ -1,19 +1,15 @@ -from six.moves import urllib - -import urlparse import re +import urlparse from feedparser.api import parse +from feedparser.util import FeedParserDict from sickbeard import logger from sickrage.helper.exceptions import ex -def getFeed(url, post_data=None, request_headers=None, items=None, handlers=[]): +def getFeed(url, request_headers=None, handlers=None): parsed = list(urlparse.urlparse(url)) parsed[2] = re.sub("/{2,}", "/", parsed[2]) # replace two or more / with one - if post_data: - url += urllib.parse.urlencode(post_data) - try: feed = parse(url, False, False, request_headers, handlers=handlers) @@ -29,3 +25,5 @@ def getFeed(url, post_data=None, request_headers=None, items=None, handlers=[]): except Exception as e: logger.log(u'RSS error: ' + ex(e), logger.DEBUG) + + return FeedParserDict() diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index 7b5a2f866..b6ef30229 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -23,16 +23,15 @@ import itertools import urllib2 import sickbeard - from sickbeard import db from sickbeard import logger -from sickbeard.common import Quality from sickbeard import helpers +from sickbeard.common import Quality from sickbeard.rssfeeds import getFeed -from name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickbeard import show_name_helpers from sickrage.helper.encoding import ss from sickrage.helper.exceptions import AuthException, ex +from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException class CacheDBConnection(db.DBConnection): @@ -74,7 +73,7 @@ class CacheDBConnection(db.DBConnection): raise -class TVCache(): +class TVCache(object): def __init__(self, provider): self.provider = provider self.providerID = self.provider.getID() @@ -134,7 +133,7 @@ class TVCache(): except Exception, e: logger.log(u"Error while searching " + self.provider.name + ", skipping: " + repr(e), logger.DEBUG) - def getRSSFeed(self, url, post_data=None, items=[]): + def getRSSFeed(self, url): handlers = [] if self.provider.proxy.isEnabled(): @@ -150,9 +149,7 @@ class TVCache(): return getFeed( self.provider.proxy._buildURL(url), - post_data, - self.provider.headers, - items, + request_headers=self.provider.headers, handlers=handlers) def _translateTitle(self, title): @@ -297,14 +294,15 @@ class TVCache(): neededEps = self.findNeededEpisodes(episode, manualSearch, downCurQuality) return neededEps[episode] if episode in neededEps else [] - def listPropers(self, date=None, delimiter="."): + def listPropers(self, date=None): myDB = self._getDB() sql = "SELECT * FROM [" + self.providerID + "] WHERE name LIKE '%.PROPER.%' OR name LIKE '%.REPACK.%'" if date != None: sql += " AND time >= " + str(int(time.mktime(date.timetuple()))) - return filter(lambda x: x['indexerid'] != 0, myDB.select(sql)) + propers_results = myDB.select(sql) + return [x for x in propers_results if x['indexerid']] def findNeededEpisodes(self, episode, manualSearch=False, downCurQuality=False): diff --git a/tests/feedparser_tests.py b/tests/feedparser_tests.py deleted file mode 100644 index 61603bbd5..000000000 --- a/tests/feedparser_tests.py +++ /dev/null @@ -1,29 +0,0 @@ -import sys, os.path - -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) -sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) - -import unittest -import test_lib as test - -from sickbeard.rssfeeds import RSSFeeds -from sickbeard.tvcache import TVCache -class FeedParserTests(unittest.TestCase): - def test_womble(self): - RSSFeeds().clearCache() - result = RSSFeeds().getFeed('https://newshost.co.za/rss/?sec=tv-sd&fr=false') - self.assertTrue('entries' in result) - self.assertTrue('feed' in result) - for item in result['entries']: - self.assertTrue(TVCache._parseItem(item)) - -if __name__ == "__main__": - print "==================" - print "STARTING - FEEDPARSER TESTS" - print "==================" - print "######################################################################" - suite = unittest.TestLoader().loadTestsFromTestCase(FeedParserTests) - testresults = unittest.TextTestRunner(verbosity=2).run(suite) - - # Return 0 if successful, 1 if there was a failure - sys.exit(not testresults.wasSuccessful()) -- GitLab From 18056a265f866fc0352761cccd1777e8287985ae Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 3 Nov 2015 23:29:37 -0800 Subject: [PATCH 007/215] Re-add womble feed parser test, and make it work Change womble from https to http --- sickbeard/providers/womble.py | 4 ++-- sickbeard/tvcache.py | 2 ++ tests/feedparser_tests.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 tests/feedparser_tests.py diff --git a/sickbeard/providers/womble.py b/sickbeard/providers/womble.py index 5a93315fc..89728b8a1 100644 --- a/sickbeard/providers/womble.py +++ b/sickbeard/providers/womble.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import generic +from sickbeard.providers import generic from sickbeard import logger from sickbeard import tvcache @@ -27,7 +27,7 @@ class WombleProvider(generic.NZBProvider): generic.NZBProvider.__init__(self, "Womble's Index") self.public = True self.cache = WombleCache(self) - self.urls = {'base_url': 'https://newshost.co.za/'} + self.urls = {'base_url': 'http://newshost.co.za/'} self.url = self.urls['base_url'] def isEnabled(self): diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index b6ef30229..bf7149e54 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -175,6 +175,8 @@ class TVCache(object): u"The data returned from the " + self.provider.name + " feed is incomplete, this result is unusable", logger.DEBUG) + return False + def _getLastUpdate(self): myDB = self._getDB() sqlResults = myDB.select("SELECT time FROM lastUpdate WHERE provider = ?", [self.providerID]) diff --git a/tests/feedparser_tests.py b/tests/feedparser_tests.py new file mode 100644 index 000000000..5ef68544a --- /dev/null +++ b/tests/feedparser_tests.py @@ -0,0 +1,29 @@ +import sys, os.path + +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +import unittest + +from sickbeard.providers.womble import provider as womble + +class FeedParserTests(unittest.TestCase): + # pylint: disable=W0212 + def test_womble(self): + result = womble.cache.getRSSFeed('http://newshost.co.za/rss/?sec=tv-sd&fr=false') + self.assertTrue('entries' in result) + self.assertTrue('feed' in result) + for item in result['entries'] or []: + title, url = womble._get_title_and_url(item) + self.assertTrue(title and url) + +if __name__ == "__main__": + print "==================" + print "STARTING - FEEDPARSER TESTS" + print "==================" + print "######################################################################" + suite = unittest.TestLoader().loadTestsFromTestCase(FeedParserTests) + testresults = unittest.TextTestRunner(verbosity=2).run(suite) + + # Return 0 if successful, 1 if there was a failure + sys.exit(not testresults.wasSuccessful()) -- GitLab From 68341f325689b286f8451dd254a2f10c824c85aa Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Wed, 4 Nov 2015 15:55:26 -0800 Subject: [PATCH 008/215] Dont try normal regexes when we know the show is anime (still might need to flip the order on line 87) Closes https://github.com/SiCKRAGETV/sickrage-issues/issues/2834 Closes https://github.com/SiCKRAGETV/sickrage-issues/issues/3562 Closes https://github.com/SiCKRAGETV/sickrage-issues/issues/946 --- sickbeard/name_parser/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index 2e77fe375..6c1a503a9 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -78,7 +78,7 @@ class NameParser(object): def _compile_regexes(self, regexMode): if regexMode == self.ANIME_REGEX: dbg_str = u"ANIME" - uncompiled_regex = [regexes.anime_regexes, regexes.normal_regexes] + uncompiled_regex = [regexes.anime_regexes] elif regexMode == self.NORMAL_REGEX: dbg_str = u"NORMAL" uncompiled_regex = [regexes.normal_regexes] -- GitLab From 3c825d9965d7939c9bbf1c69684989e4136211f5 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Wed, 4 Nov 2015 16:30:12 -0800 Subject: [PATCH 009/215] Fix Shomin Sample Fixes https://github.com/SiCKRAGETV/sickrage-issues/issues/3564 --- sickbeard/helpers.py | 2 +- sickbeard/show_name_helpers.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index e994d7171..b5c7a0c9e 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -237,7 +237,7 @@ def isMediaFile(filename): """ # ignore samples - if re.search(r'(^|[\W_])(sample\d*)[\W_]', filename, re.I): + if re.search(r'(^|[\W_])(?<!shomin.)(sample\d*)[\W_]', filename, re.I): return False # ignore RARBG release intro diff --git a/sickbeard/show_name_helpers.py b/sickbeard/show_name_helpers.py index 392d17af0..c1c522d66 100644 --- a/sickbeard/show_name_helpers.py +++ b/sickbeard/show_name_helpers.py @@ -34,8 +34,8 @@ from name_parser.parser import NameParser, InvalidNameException, InvalidShowExce resultFilters = [ "sub(bed|ed|pack|s)", - "(dir|sample|sub|nfo)fix", - "sample", + "(dir|sub|nfo)fix", + "(?<!shomin.)sample", "(dvd)?extras", "dub(bed)?" ] -- GitLab From f950c5c73b80b9541e7f7f2bf721e01a729497ea Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Wed, 4 Nov 2015 17:58:12 -0800 Subject: [PATCH 010/215] Update CPasbian URL Replaces #3080 --- sickbeard/providers/cpasbien.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py index 6baa067b4..7d80b003f 100644 --- a/sickbeard/providers/cpasbien.py +++ b/sickbeard/providers/cpasbien.py @@ -34,7 +34,7 @@ class CpasbienProvider(generic.TorrentProvider): self.supportsBacklog = True self.public = True self.ratio = None - self.url = "http://www.cpasbien.pw" + self.url = "http://www.cpasbien.io" self.proper_strings = ['PROPER', 'REPACK'] @@ -88,7 +88,7 @@ class CpasbienProvider(generic.TorrentProvider): #downloadTorrentLink = torrentSoup.find("a", title.startswith('Cliquer')) tmp = pageURL.split('/')[-1].replace('.html', '.torrent') - downloadTorrentLink = ('http://www.cpasbien.pw/telechargement/%s' % tmp) + downloadTorrentLink = ('http://www.cpasbien.io/telechargement/%s' % tmp) if downloadTorrentLink: download_url = downloadTorrentLink -- GitLab From be0d1a458ecafac46fc73417168813a5d0aaeb7a Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Wed, 4 Nov 2015 18:03:48 -0800 Subject: [PATCH 011/215] Allow bare anime results without release group if no black ir white list --- sickbeard/blackandwhitelist.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/sickbeard/blackandwhitelist.py b/sickbeard/blackandwhitelist.py index 1368ed23e..dd98667b8 100644 --- a/sickbeard/blackandwhitelist.py +++ b/sickbeard/blackandwhitelist.py @@ -38,7 +38,7 @@ class BlackAndWhiteList(object): logger.log(u'Building black and white list for ' + str(self.show_id), logger.DEBUG) self.blacklist = self._load_list('blacklist') self.whitelist = self._load_list('whitelist') - + def _add_keywords(self, table, values): """ DB: Adds keywords into database for current show @@ -48,7 +48,7 @@ class BlackAndWhiteList(object): """ myDB = db.DBConnection() for value in values: - myDB.action('INSERT INTO [' + table + '] (show_id, keyword) VALUES (?,?)', [self.show_id, value]) + myDB.action('INSERT INTO [' + table + '] (show_id, keyword) VALUES (?,?)', [self.show_id, value]) def set_black_keywords(self, values): """ @@ -70,7 +70,7 @@ class BlackAndWhiteList(object): self._del_all_keywords('whitelist') self._add_keywords('whitelist', values) self.whitelist = values - logger.log('Whitelist set to: %s' % self.whitelist, logger.DEBUG) + logger.log('Whitelist set to: %s' % self.whitelist, logger.DEBUG) def _del_all_keywords(self, table): """ @@ -79,8 +79,8 @@ class BlackAndWhiteList(object): :param table: SQL table remove keywords from """ myDB = db.DBConnection() - myDB.action('DELETE FROM [' + table + '] WHERE show_id = ?', [self.show_id]) - + myDB.action('DELETE FROM [' + table + '] WHERE show_id = ?', [self.show_id]) + def _load_list(self, table): """ DB: Fetch keywords for current show @@ -96,7 +96,7 @@ class BlackAndWhiteList(object): groups = [] for result in sqlResults: groups.append(result["keyword"]) - + logger.log('BWL: ' + str(self.show_id) + ' loaded keywords from ' + table + ': ' + str(groups), logger.DEBUG) return groups @@ -107,10 +107,11 @@ class BlackAndWhiteList(object): :param result: Result to analyse :return: False if result is not allowed in white/blacklist, True if it is """ - if not result.release_group: - logger.log('Failed to detect release group, invalid result', logger.DEBUG) - return False if self.whitelist or self.blacklist: + if not result.release_group: + logger.log('Failed to detect release group, invalid result', logger.DEBUG) + return False + if result.release_group.lower() in [x.lower() for x in self.whitelist]: white_result = True elif not self.whitelist: @@ -125,13 +126,13 @@ class BlackAndWhiteList(object): logger.log('Whitelist check passed: %s. Blacklist check passed: %s' % (white_result, black_result), logger.DEBUG) if white_result and black_result: - return True + return True else: - return False + return False else: logger.log('No Whitelist and Blacklist defined, check passed.', logger.DEBUG) - return True - + return True + class BlackWhitelistNoShowIDException(Exception): 'No show_id was given' @@ -150,7 +151,7 @@ def short_group_names(groups): group = sickbeard.ADBA_CONNECTION.group(gname=groupName) except AniDBCommandTimeoutError: logger.log(u"Timeout while loading group from AniDB. Trying next group", logger.DEBUG) - except: + except Exception: logger.log(u"Failed while loading group from AniDB. Trying next group", logger.DEBUG) else: for line in group.datalines: -- GitLab From f93a5a384d432425f9d46f8d88cb78d3b586f3e8 Mon Sep 17 00:00:00 2001 From: CristianBB <cristian.blazquez.bustos@gmail.com> Date: Wed, 4 Nov 2015 16:40:22 +0100 Subject: [PATCH 012/215] Added quality string --- sickbeard/providers/newpct.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/providers/newpct.py b/sickbeard/providers/newpct.py index 89f0563c3..842b8f311 100644 --- a/sickbeard/providers/newpct.py +++ b/sickbeard/providers/newpct.py @@ -163,6 +163,7 @@ class newpctProvider(generic.TorrentProvider): title = title.replace('[DVDRIP]', '[DVDrip x264]') title = title.replace('[DVD Rip]', '[DVDrip x264]') title = title.replace('[DVDrip]', '[DVDrip x264]') + title = title.replace('[DVDRIP-AC3.5.1]', '[DVDrip x264]') title = title.replace('[BLuRayRip]', '[720p BlueRay x264]') title = title.replace('[BRrip]', '[720p BlueRay x264]') title = title.replace('[BDrip]', '[720p BlueRay x264]') -- GitLab From eed661038b390693930974dafc78c44a0864b07c Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Tue, 3 Nov 2015 20:05:42 -0500 Subject: [PATCH 013/215] PEP8: comments should start with '# ' --- SickBeard.py | 10 +++--- sickbeard/__init__.py | 6 ++-- sickbeard/browser.py | 2 +- sickbeard/clients/transmission_client.py | 2 +- sickbeard/clients/utorrent_client.py | 4 +-- sickbeard/common.py | 4 +-- sickbeard/db.py | 4 +-- sickbeard/helpers.py | 8 ++--- sickbeard/image_cache.py | 2 +- sickbeard/indexers/indexer_config.py | 2 +- sickbeard/indexers/indexer_exceptions.py | 8 ++--- sickbeard/logger.py | 20 +++++------ sickbeard/metadata/kodi_12plus.py | 4 +-- sickbeard/notifiers/boxcar.py | 2 +- sickbeard/notifiers/boxcar2.py | 2 +- sickbeard/notifiers/growl.py | 8 ++--- sickbeard/notifiers/libnotify.py | 2 +- sickbeard/notifiers/nmj.py | 2 +- sickbeard/notifiers/nmjv2.py | 4 +-- sickbeard/notifiers/pushover.py | 2 +- sickbeard/notifiers/pytivo.py | 2 +- sickbeard/notifiers/synoindex.py | 4 +-- sickbeard/notifiers/synologynotifier.py | 2 +- sickbeard/notifiers/trakt.py | 2 +- sickbeard/notifiers/tweet.py | 8 ++--- sickbeard/nzbSplitter.py | 2 +- sickbeard/postProcessor.py | 2 +- sickbeard/processTV.py | 32 ++++++++--------- sickbeard/providers/__init__.py | 2 +- sickbeard/providers/alpharatio.py | 8 ++--- sickbeard/providers/animenzb.py | 2 +- sickbeard/providers/bitcannon.py | 8 ++--- sickbeard/providers/bitsoup.py | 8 ++--- sickbeard/providers/bluetigers.py | 8 ++--- sickbeard/providers/btdigg.py | 10 +++--- sickbeard/providers/btn.py | 2 +- sickbeard/providers/cpasbien.py | 8 ++--- sickbeard/providers/extratorrent.py | 4 +-- sickbeard/providers/fnt.py | 6 ++-- sickbeard/providers/frenchtorrentdb.py | 8 ++--- sickbeard/providers/freshontv.py | 20 +++++------ sickbeard/providers/generic.py | 2 +- sickbeard/providers/hdbits.py | 4 +-- sickbeard/providers/hdspace.py | 6 ++-- sickbeard/providers/hdtorrents.py | 4 +-- sickbeard/providers/hounddawgs.py | 14 ++++---- sickbeard/providers/iptorrents.py | 6 ++-- sickbeard/providers/kat.py | 8 ++--- sickbeard/providers/libertalia.py | 16 ++++----- sickbeard/providers/morethantv.py | 8 ++--- sickbeard/providers/newpct.py | 4 +-- sickbeard/providers/newznab.py | 2 +- sickbeard/providers/nextgen.py | 8 ++--- sickbeard/providers/pretome.py | 6 ++-- sickbeard/providers/rarbg.py | 4 +-- sickbeard/providers/scc.py | 6 ++-- sickbeard/providers/scenetime.py | 8 ++--- sickbeard/providers/speedcd.py | 6 ++-- sickbeard/providers/strike.py | 6 ++-- sickbeard/providers/t411.py | 4 +-- sickbeard/providers/thepiratebay.py | 10 +++--- sickbeard/providers/titansoftv.py | 10 +++--- sickbeard/providers/tntvillage.py | 8 ++--- sickbeard/providers/tokyotoshokan.py | 12 +++---- sickbeard/providers/torrentbytes.py | 8 ++--- sickbeard/providers/torrentday.py | 6 ++-- sickbeard/providers/torrentleech.py | 8 ++--- sickbeard/providers/torrentproject.py | 4 +-- sickbeard/providers/torrentz.py | 4 +-- sickbeard/providers/transmitthenet.py | 4 +-- sickbeard/providers/tvchaosuk.py | 10 +++--- sickbeard/providers/xthor.py | 8 ++--- sickbeard/scene_numbering.py | 2 +- sickbeard/scheduler.py | 2 +- sickbeard/search_queue.py | 2 +- sickbeard/show_name_helpers.py | 4 +-- sickbeard/show_queue.py | 20 +++++------ sickbeard/subtitles.py | 2 +- sickbeard/traktChecker.py | 6 ++-- sickbeard/tv.py | 46 ++++++++++++------------ sickbeard/ui.py | 2 +- sickbeard/versionChecker.py | 4 +-- sickbeard/webapi.py | 4 +-- sickbeard/webserve.py | 12 +++---- 84 files changed, 283 insertions(+), 283 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index fe5bb2c77..7954af972 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -175,7 +175,7 @@ class SickRage(object): reload(sys) if sys.platform == 'win32': - #pylint: disable=E1101 + # pylint: disable=E1101 if sys.getwindowsversion()[0] >= 6 and sys.stdout.encoding == 'cp65001': sickbeard.SYS_ENCODING = 'UTF-8' @@ -388,8 +388,8 @@ class SickRage(object): if sickbeard.USE_FAILED_DOWNLOADS: failed_history.trimHistory() - # Check for metadata indexer updates for shows (Disabled until we use api) - #sickbeard.showUpdateScheduler.forceRun() + # # Check for metadata indexer updates for shows (Disabled until we use api) + # sickbeard.showUpdateScheduler.forceRun() # Launch browser if sickbeard.LAUNCH_BROWSER and not (self.noLaunch or self.runAsDaemon): @@ -541,11 +541,11 @@ class SickRage(object): if '--nolaunch' not in popen_list: popen_list += ['--nolaunch'] logger.log(u"Restarting SickRage with " + str(popen_list)) - logger.shutdown() #shutdown the logger to make sure it's released the logfile BEFORE it restarts SR. + logger.shutdown() # shutdown the logger to make sure it's released the logfile BEFORE it restarts SR. subprocess.Popen(popen_list, cwd=os.getcwd()) # system exit - logger.shutdown() #Make sure the logger has stopped, just in case + logger.shutdown() # Make sure the logger has stopped, just in case # pylint: disable=W0212 os._exit(0) diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 18f99b6bb..73b06fd4c 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -550,7 +550,7 @@ CALENDAR_ICONS = False NO_RESTART = False TMDB_API_KEY = 'edc5f123313769de83a71e157758030b' -#TRAKT_API_KEY = 'd4161a7a106424551add171e5470112e4afdaf2438e6ef2fe0548edc75924868' +# TRAKT_API_KEY = 'd4161a7a106424551add171e5470112e4afdaf2438e6ef2fe0548edc75924868' TRAKT_API_KEY = '5c65f55e11d48c35385d9e8670615763a605fad28374c8ae553a7b7a50651ddd' TRAKT_API_SECRET = 'b53e32045ac122a445ef163e6d859403301ffe9b17fb8321d428531b69022a82' @@ -668,8 +668,8 @@ def initialize(consoleLogging=True): ACTUAL_LOG_DIR = check_setting_str(CFG, 'General', 'log_dir', 'Logs') LOG_DIR = os.path.normpath(os.path.join(DATA_DIR, ACTUAL_LOG_DIR)) - LOG_NR = check_setting_int(CFG, 'General', 'log_nr', 5) #Default to 5 backup file (sickrage.log.x) - LOG_SIZE = check_setting_int(CFG, 'General', 'log_size', 1048576) #Default to max 1MB per logfile + LOG_NR = check_setting_int(CFG, 'General', 'log_nr', 5) # Default to 5 backup file (sickrage.log.x) + LOG_SIZE = check_setting_int(CFG, 'General', 'log_size', 1048576) # Default to max 1MB per logfile fileLogging = True if not helpers.makeDir(LOG_DIR): sys.stderr.write("!!! No log folder, logging to screen only!\n") diff --git a/sickbeard/browser.py b/sickbeard/browser.py index 6d50b8587..127fbe9c1 100644 --- a/sickbeard/browser.py +++ b/sickbeard/browser.py @@ -31,7 +31,7 @@ def getWinDrives(): from ctypes import windll drives = [] - bitmask = windll.kernel32.GetLogicalDrives() #@UndefinedVariable + bitmask = windll.kernel32.GetLogicalDrives() # @UndefinedVariable for letter in string.uppercase: if bitmask & 1: drives.append(letter) diff --git a/sickbeard/clients/transmission_client.py b/sickbeard/clients/transmission_client.py index 06fc75a54..81e81b8a9 100644 --- a/sickbeard/clients/transmission_client.py +++ b/sickbeard/clients/transmission_client.py @@ -53,7 +53,7 @@ class TransmissionAPI(GenericClient): self.session.headers.update({'x-transmission-session-id': self.auth}) - #Validating Transmission authorization + # Validating Transmission authorization post_data = json.dumps({'arguments': {}, 'method': 'session-get', }) diff --git a/sickbeard/clients/utorrent_client.py b/sickbeard/clients/utorrent_client.py index c0462f8df..6a466b445 100644 --- a/sickbeard/clients/utorrent_client.py +++ b/sickbeard/clients/utorrent_client.py @@ -31,8 +31,8 @@ class uTorrentAPI(GenericClient): def _request(self, method='get', params={}, files=None): - #Workaround for uTorrent 2.2.1 - #Need a odict but only supported in 2.7+ and sickrage is 2.6+ + # Workaround for uTorrent 2.2.1 + # Need a odict but only supported in 2.7+ and sickrage is 2.6+ ordered_params = {'token': self.auth} for k,v in params.iteritems(): diff --git a/sickbeard/common.py b/sickbeard/common.py index 6000606f2..846488ff2 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -89,7 +89,7 @@ ARCHIVED = 6 # episodes that you don't have locally (counts toward download com IGNORED = 7 # episodes that you don't want included in your download stats SNATCHED_PROPER = 9 # qualified with quality SUBTITLED = 10 # qualified with quality -FAILED = 11 #episode downloaded or snatched we don't want +FAILED = 11 # episode downloaded or snatched we don't want SNATCHED_BEST = 12 # episode redownloaded using best quality NAMING_REPEAT = 1 @@ -221,7 +221,7 @@ class Quality: :return: Quality prefix """ - #Try Scene names first + # Try Scene names first quality = Quality.sceneQuality(name, anime) if quality != Quality.UNKNOWN: return quality diff --git a/sickbeard/db.py b/sickbeard/db.py index 1b03819a7..a82b8991b 100644 --- a/sickbeard/db.py +++ b/sickbeard/db.py @@ -169,7 +169,7 @@ class DBConnection(object): logger.log(u"Fatal error executing query: " + ex(e), logger.ERROR) raise - #time.sleep(0.02) + # time.sleep(0.02) return sqlResult @@ -214,7 +214,7 @@ class DBConnection(object): logger.log(u"Fatal error executing query: " + ex(e), logger.ERROR) raise - #time.sleep(0.02) + # time.sleep(0.02) return sqlResult diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index b5c7a0c9e..cd195401e 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -457,7 +457,7 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None): if not (seriesname and series_id): continue ShowObj = findCertainShow(sickbeard.showList, int(series_id)) - #Check if we can find the show in our list (if not, it's not the right show) + # Check if we can find the show in our list (if not, it's not the right show) if (indexer_id is None) and (ShowObj is not None) and (ShowObj.indexerid == int(series_id)): return (seriesname, i, int(series_id)) elif (indexer_id is not None) and (int(indexer_id) == int(series_id)): @@ -646,7 +646,7 @@ def rename_ep_file(cur_path, new_path, old_path_length=0): :param old_path_length: The length of media file path (old name) WITHOUT THE EXTENSION """ - #new_dest_dir, new_dest_name = os.path.split(new_path) # @UnusedVariable + # new_dest_dir, new_dest_name = os.path.split(new_path) # @UnusedVariable if old_path_length == 0 or old_path_length > len(cur_path): # approach from the right @@ -1220,12 +1220,12 @@ def get_show(name, tryIndexers=False): fromCache = True showObj = findCertainShow(sickbeard.showList, int(cache)) - #try indexers + # try indexers if not showObj and tryIndexers: showObj = findCertainShow(sickbeard.showList, searchIndexerForShowID(full_sanitizeSceneName(name), ui=classes.ShowListUI)[2]) - #try scene exceptions + # try scene exceptions if not showObj: ShowID = sickbeard.scene_exceptions.get_scene_exception_by_name(name)[0] if ShowID: diff --git a/sickbeard/image_cache.py b/sickbeard/image_cache.py index 0e576bd93..457998eeb 100644 --- a/sickbeard/image_cache.py +++ b/sickbeard/image_cache.py @@ -250,7 +250,7 @@ class ImageCache: return False # retrieve the image from indexer using the generic metadata class - #TODO: refactor + # TODO: refactor metadata_generator = GenericMetadata() img_data = metadata_generator._retrieve_show_image(img_type_name, show_obj) result = metadata_generator._write_image(img_data, dest_path) diff --git a/sickbeard/indexers/indexer_config.py b/sickbeard/indexers/indexer_config.py index ee1d77a95..6040d2325 100644 --- a/sickbeard/indexers/indexer_config.py +++ b/sickbeard/indexers/indexer_config.py @@ -3,7 +3,7 @@ import requests INDEXER_TVDB = 1 -#Must keep +# Must keep INDEXER_TVRAGE = 2 initConfig = {} diff --git a/sickbeard/indexers/indexer_exceptions.py b/sickbeard/indexers/indexer_exceptions.py index f8bd22218..32a90ffda 100644 --- a/sickbeard/indexers/indexer_exceptions.py +++ b/sickbeard/indexers/indexer_exceptions.py @@ -1,9 +1,9 @@ #!/usr/bin/env python2.7 # encoding:utf-8 -#author:echel0n -#project:indexer_api -#repository:http://github.com/echel0n/Sick-Beard -#license:unlicense (http://unlicense.org/) +# author:echel0n +# project:indexer_api +# repository:http://github.com/echel0n/Sick-Beard +# license:unlicense (http://unlicense.org/) """Custom exceptions used or raised by indexer_api""" diff --git a/sickbeard/logger.py b/sickbeard/logger.py index 5bfa36189..5cac491c4 100644 --- a/sickbeard/logger.py +++ b/sickbeard/logger.py @@ -147,11 +147,11 @@ class Logger(object): message = check level = WARNING - #Avoid open issues when user only need to clear cache to fix issue + # Avoid open issues when user only need to clear cache to fix issue if re.search(r"_mako\'$",message): - #'C__SickRage_gui_slick_views_schedule_mako' - #'_usr_local_sickrage_var_SickRage_gui_slick_views_schedule_mako' - #'_volume1___plugins_AppCentral_sickbeard_tvrage_SickBeard_TVRage_gui_slick_views_schedule_mako' + # 'C__SickRage_gui_slick_views_schedule_mako' + # '_usr_local_sickrage_var_SickRage_gui_slick_views_schedule_mako' + # '_volume1___plugins_AppCentral_sickbeard_tvrage_SickBeard_TVRage_gui_slick_views_schedule_mako' message = 'Please stop SickRage and delete \SickRage\cache\mako folder. You can see cache folder location in SickRage Help&Info menu' level = WARNING @@ -276,18 +276,18 @@ class Logger(object): reports = gh.get_organization(gh_org).get_repo(gh_repo).get_issues(state="all") def is_mako_error(title): - #[APP SUBMITTED]: Loaded module _home_pi_SickRage_gui_slick_views_home_mako not found in sys.modules - #[APP SUBMITTED]: Loaded module _opt_sickbeard_gui_slick_views_home_mako not found in sys.modules - #[APP SUBMITTED]: Loaded module D__TV_SickRage_gui_slick_views_home_mako not found in sys.modules + # [APP SUBMITTED]: Loaded module _home_pi_SickRage_gui_slick_views_home_mako not found in sys.modules + # [APP SUBMITTED]: Loaded module _opt_sickbeard_gui_slick_views_home_mako not found in sys.modules + # [APP SUBMITTED]: Loaded module D__TV_SickRage_gui_slick_views_home_mako not found in sys.modules return re.search(r".* Loaded module .* not found in sys\.modules", title) is not None def is_ascii_error(title): - #[APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) - #[APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> + # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) + # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search(r".* codec can't .*code .* in position .*:", title) is not None def is_malformed_error(title): - #[APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 + # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 re.search(r".* not well-formed \(invalid token\): line .* column .*", title) is not None mako_error = is_mako_error(title_Error) diff --git a/sickbeard/metadata/kodi_12plus.py b/sickbeard/metadata/kodi_12plus.py index cdd254333..5d61c52ba 100644 --- a/sickbeard/metadata/kodi_12plus.py +++ b/sickbeard/metadata/kodi_12plus.py @@ -305,8 +305,8 @@ class KODI_12PlusMetadata(generic.GenericMetadata): thumb = etree.SubElement(episode, "thumb") thumb.text = myEp['filename'].strip() - #watched = etree.SubElement(episode, "watched") - #watched.text = 'false' + # watched = etree.SubElement(episode, "watched") + # watched.text = 'false' if getattr(myEp, 'writer', None): credits = etree.SubElement(episode, "credits") diff --git a/sickbeard/notifiers/boxcar.py b/sickbeard/notifiers/boxcar.py index 40be70aa9..6de1752fb 100644 --- a/sickbeard/notifiers/boxcar.py +++ b/sickbeard/notifiers/boxcar.py @@ -92,7 +92,7 @@ class BoxcarNotifier: # i dont know if this is true or false ... its neither but i also dont know how we got here in the first place return False - #HTTP status 401 if the user doesn't have the service added + # HTTP status 401 if the user doesn't have the service added else: subscribeNote = self._sendBoxcar(msg, title, email, True) if subscribeNote: diff --git a/sickbeard/notifiers/boxcar2.py b/sickbeard/notifiers/boxcar2.py index b6e9f4680..9cb6dd88d 100644 --- a/sickbeard/notifiers/boxcar2.py +++ b/sickbeard/notifiers/boxcar2.py @@ -45,7 +45,7 @@ class Boxcar2Notifier: """ # build up the URL and parameters - #more info goes here - https://boxcar.uservoice.com/knowledgebase/articles/306788-how-to-send-your-boxcar-account-a-notification + # more info goes here - https://boxcar.uservoice.com/knowledgebase/articles/306788-how-to-send-your-boxcar-account-a-notification msg = msg.strip() curUrl = API_URL diff --git a/sickbeard/notifiers/growl.py b/sickbeard/notifiers/growl.py index 7b7d111db..93ee98684 100644 --- a/sickbeard/notifiers/growl.py +++ b/sickbeard/notifiers/growl.py @@ -52,10 +52,10 @@ class GrowlNotifier: def _send_growl(self, options, message=None): - #Send Notification + # Send Notification notice = gntp.GNTPNotice() - #Required + # Required notice.add_header('Application-Name', options['app']) notice.add_header('Notification-Name', options['name']) notice.add_header('Notification-Title', options['title']) @@ -63,7 +63,7 @@ class GrowlNotifier: if options['password']: notice.set_password(options['password']) - #Optional + # Optional if options['sticky']: notice.add_header('Notification-Sticky', options['sticky']) if options['priority']: @@ -169,7 +169,7 @@ class GrowlNotifier: opts['app'] = 'SickRage' opts['debug'] = False - #Send Registration + # Send Registration register = gntp.GNTPRegister() register.add_header('Application-Name', opts['app']) register.add_header('Application-Icon', self.sr_logo_url) diff --git a/sickbeard/notifiers/libnotify.py b/sickbeard/notifiers/libnotify.py index dc86055c7..402b99a1e 100644 --- a/sickbeard/notifiers/libnotify.py +++ b/sickbeard/notifiers/libnotify.py @@ -29,7 +29,7 @@ def diagnose(): user-readable message indicating possible issues. ''' try: - from gi.repository import Notify #@UnusedImport + from gi.repository import Notify # @UnusedImport except ImportError: return (u"<p>Error: gir-notify isn't installed. On Ubuntu/Debian, install the " u"<a href=\"apt:gir1.2-notify-0.7\">gir1.2-notify-0.7</a> or " diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py index e86b81be0..63a8b3625 100644 --- a/sickbeard/notifiers/nmj.py +++ b/sickbeard/notifiers/nmj.py @@ -87,7 +87,7 @@ class NMJNotifier: def notify_snatch(self, ep_name): return False - #Not implemented: Start the scanner when snatched does not make any sense + # Not implemented: Start the scanner when snatched does not make any sense def notify_download(self, ep_name): if sickbeard.USE_NMJ: diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py index 7c02bca11..c138580cd 100644 --- a/sickbeard/notifiers/nmjv2.py +++ b/sickbeard/notifiers/nmjv2.py @@ -33,7 +33,7 @@ except ImportError: class NMJv2Notifier: def notify_snatch(self, ep_name): return False - #Not implemented: Start the scanner when snatched does not make any sense + # Not implemented: Start the scanner when snatched does not make any sense def notify_download(self, ep_name): self._notifyNMJ() @@ -104,7 +104,7 @@ class NMJv2Notifier: Returns: True if the request succeeded, False otherwise """ - #if a host is provided then attempt to open a handle to that URL + # if a host is provided then attempt to open a handle to that URL try: url_scandir = "http://" + host + ":8008/metadata_database?arg0=update_scandir&arg1=" + sickbeard.NMJv2_DATABASE + "&arg2=&arg3=update_all" logger.log(u"NMJ scan update command sent to host: %s" % (host), logger.DEBUG) diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py index d21ba2043..44ce1614e 100644 --- a/sickbeard/notifiers/pushover.py +++ b/sickbeard/notifiers/pushover.py @@ -106,7 +106,7 @@ class PushoverNotifier: # For HTTP status code 401's, it is because you are passing in either an invalid token, or the user has not added your service. elif e.code == 401: - #HTTP status 401 if the user doesn't have the service added + # HTTP status 401 if the user doesn't have the service added subscribeNote = self._sendPushover(msg, title, sound=sound, userKey=userKey, apiKey=apiKey) if subscribeNote: logger.log("Subscription sent", logger.DEBUG) diff --git a/sickbeard/notifiers/pytivo.py b/sickbeard/notifiers/pytivo.py index 1fb2f631b..e7e9434df 100644 --- a/sickbeard/notifiers/pytivo.py +++ b/sickbeard/notifiers/pytivo.py @@ -90,7 +90,7 @@ class pyTivoNotifier: request = Request(requestUrl) try: - response = urlopen(request) #@UnusedVariable + response = urlopen(request) # @UnusedVariable except HTTPError , e: if hasattr(e, 'reason'): logger.log(u"pyTivo notification: Error, failed to reach a server - " + e.reason, logger.ERROR) diff --git a/sickbeard/notifiers/synoindex.py b/sickbeard/notifiers/synoindex.py index 95d3a14ed..854eb1e43 100644 --- a/sickbeard/notifiers/synoindex.py +++ b/sickbeard/notifiers/synoindex.py @@ -54,7 +54,7 @@ class synoIndexNotifier: try: p = subprocess.Popen(synoindex_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) - out, err = p.communicate() #@UnusedVariable + out, err = p.communicate() # @UnusedVariable logger.log(u"Script result: " + str(out), logger.DEBUG) except OSError, e: logger.log(u"Unable to run synoindex: " + ex(e), logger.ERROR) @@ -79,7 +79,7 @@ class synoIndexNotifier: try: p = subprocess.Popen(synoindex_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) - out, err = p.communicate() #@UnusedVariable + out, err = p.communicate() # @UnusedVariable logger.log(u"Script result: " + str(out), logger.DEBUG) except OSError, e: logger.log(u"Unable to run synoindex: " + ex(e), logger.ERROR) diff --git a/sickbeard/notifiers/synologynotifier.py b/sickbeard/notifiers/synologynotifier.py index 240c69fb2..ee0591f01 100644 --- a/sickbeard/notifiers/synologynotifier.py +++ b/sickbeard/notifiers/synologynotifier.py @@ -52,7 +52,7 @@ class synologyNotifier: try: p = subprocess.Popen(synodsmnotify_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) - out, err = p.communicate() #@UnusedVariable + out, err = p.communicate() # @UnusedVariable logger.log(u"Script result: " + str(out), logger.DEBUG) except OSError, e: logger.log(u"Unable to run synodsmnotify: " + ex(e)) diff --git a/sickbeard/notifiers/trakt.py b/sickbeard/notifiers/trakt.py index a7f7f2c1c..ab587637e 100644 --- a/sickbeard/notifiers/trakt.py +++ b/sickbeard/notifiers/trakt.py @@ -194,7 +194,7 @@ class TraktNotifier: if season not in uniqueSeasons: uniqueSeasons.append(season) - #build the query + # build the query seasonsList = [] for searchedSeason in uniqueSeasons: episodesList = [] diff --git a/sickbeard/notifiers/tweet.py b/sickbeard/notifiers/tweet.py index f905b31c3..76cb64efd 100644 --- a/sickbeard/notifiers/tweet.py +++ b/sickbeard/notifiers/tweet.py @@ -23,9 +23,9 @@ from sickrage.helper.exceptions import ex # parse_qsl moved to urlparse module in v2.6 try: - from urlparse import parse_qsl #@UnusedImport + from urlparse import parse_qsl # @UnusedImport except ImportError: - from cgi import parse_qsl #@Reimport + from cgi import parse_qsl # @Reimport import oauth2 as oauth import pythontwitter as twitter @@ -63,7 +63,7 @@ class TwitterNotifier: def _get_authorization(self): - signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() #@UnusedVariable + signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() # @UnusedVariable oauth_consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret) oauth_client = oauth.Client(oauth_consumer) @@ -93,7 +93,7 @@ class TwitterNotifier: logger.log('Generating and signing request for an access token using key ' + key, logger.DEBUG) - signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() #@UnusedVariable + signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() # @UnusedVariable oauth_consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret) logger.log('oauth_consumer: ' + str(oauth_consumer), logger.DEBUG) oauth_client = oauth.Client(oauth_consumer, token) diff --git a/sickbeard/nzbSplitter.py b/sickbeard/nzbSplitter.py index b9087c389..8c547270b 100644 --- a/sickbeard/nzbSplitter.py +++ b/sickbeard/nzbSplitter.py @@ -76,7 +76,7 @@ def getSeasonNZBs(name, urlData, season): xmlns = xmlnsMatch.group(1) match = re.search(regex, curFile.get("subject"), re.I) if not match: - #print curFile.get("subject"), "doesn't match", regex + # print curFile.get("subject"), "doesn't match", regex continue curEp = match.group(1) if curEp not in epFiles: diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index 3515aa1e6..34175cdac 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -1108,7 +1108,7 @@ class PostProcessor(object): # log it to history history.logDownload(ep_obj, self.file_path, new_ep_quality, self.release_group, new_ep_version) - #If any notification fails, don't stop postProcessor + # If any notification fails, don't stop postProcessor try: # send notifications notifiers.notify_download(ep_obj._format_pattern('%SN - %Sx%0E - %EN - %QN')) diff --git a/sickbeard/processTV.py b/sickbeard/processTV.py index 93832ae50..0ba1f8899 100644 --- a/sickbeard/processTV.py +++ b/sickbeard/processTV.py @@ -209,7 +209,7 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior result.result = True - #Don't Link media when the media is extracted from a rar in the same path + # Don't Link media when the media is extracted from a rar in the same path if process_method in ('hardlink', 'symlink') and videoInRar: process_media(path, videoInRar, nzbName, 'move', force, is_priority, result) delete_files(path, rarContent, result) @@ -229,7 +229,7 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior result.output += logHelper(u"Sync Files: " + str(SyncFiles) + " in path: " + path) result.missedfiles.append(path + " : Syncfiles found") - #Process Video File in all TV Subdir + # Process Video File in all TV Subdir for dir in [x for x in dirs if validateDir(path, x, nzbNameOriginal, failed, result)]: result.result = True @@ -257,7 +257,7 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior if notwantedFiles: result.output += logHelper(u"Found unwanted files: " + str(notwantedFiles), logger.DEBUG) - #Don't Link media when the media is extracted from a rar in the same path + # Don't Link media when the media is extracted from a rar in the same path if process_method in ('hardlink', 'symlink') and videoInRar: process_media(processPath, videoInRar, nzbName, 'move', force, is_priority, result) process_media(processPath, set(videoFiles) - set(videoInRar), nzbName, process_method, force, @@ -271,9 +271,9 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior else: process_media(processPath, videoFiles, nzbName, process_method, force, is_priority, result) - #Delete all file not needed + # Delete all file not needed if process_method != "move" or not result.result \ - or (type == "manual" and not delete_on): #Avoid to delete files if is Manual PostProcessing + or (type == "manual" and not delete_on): # Avoid to delete files if is Manual PostProcessing continue delete_files(processPath, notwantedFiles, result) @@ -367,7 +367,7 @@ def validateDir(path, dirName, nzbNameOriginal, failed, result): videoFiles = filter(helpers.isMediaFile, allFiles) allDirs.append(dirName) - #check if the dir have at least one tv video file + # check if the dir have at least one tv video file for video in videoFiles: try: NameParser().parse(video, cache_result=False) @@ -383,7 +383,7 @@ def validateDir(path, dirName, nzbNameOriginal, failed, result): pass if sickbeard.UNPACK: - #Search for packed release + # Search for packed release packedFiles = filter(helpers.isRarFile, allFiles) for packed in packedFiles: @@ -494,27 +494,27 @@ def already_postprocessed(dirName, videofile, force, result): myDB = db.DBConnection() sqlResult = myDB.select("SELECT * FROM tv_episodes WHERE release_name = ?", [dirName]) if sqlResult: - #result.output += logHelper(u"You're trying to post process a dir that's already been processed, skipping", logger.DEBUG) + # result.output += logHelper(u"You're trying to post process a dir that's already been processed, skipping", logger.DEBUG) return True else: sqlResult = myDB.select("SELECT * FROM tv_episodes WHERE release_name = ?", [videofile.rpartition('.')[0]]) if sqlResult: - #result.output += logHelper(u"You're trying to post process a video that's already been processed, skipping", logger.DEBUG) + # result.output += logHelper(u"You're trying to post process a video that's already been processed, skipping", logger.DEBUG) return True - #Needed if we have downloaded the same episode @ different quality - #But we need to make sure we check the history of the episode we're going to PP, and not others + # Needed if we have downloaded the same episode @ different quality + # But we need to make sure we check the history of the episode we're going to PP, and not others np = NameParser(dirName, tryIndexers=True) - try: #if it fails to find any info (because we're doing an unparsable folder (like the TV root dir) it will throw an exception, which we want to ignore + try: # if it fails to find any info (because we're doing an unparsable folder (like the TV root dir) it will throw an exception, which we want to ignore parse_result = np.parse(dirName) - except: #ignore the exception, because we kind of expected it, but create parse_result anyway so we can perform a check on it. + except: # ignore the exception, because we kind of expected it, but create parse_result anyway so we can perform a check on it. parse_result = False - search_sql = "SELECT tv_episodes.indexerid, history.resource FROM tv_episodes INNER JOIN history ON history.showid=tv_episodes.showid" #This part is always the same + search_sql = "SELECT tv_episodes.indexerid, history.resource FROM tv_episodes INNER JOIN history ON history.showid=tv_episodes.showid" # This part is always the same search_sql += " WHERE history.season=tv_episodes.season and history.episode=tv_episodes.episode" - #If we find a showid, a season number, and one or more episode numbers then we need to use those in the query + # If we find a showid, a season number, and one or more episode numbers then we need to use those in the query if parse_result and (parse_result.show.indexerid and parse_result.episode_numbers and parse_result.season_number): search_sql += " and tv_episodes.showid = '" + str(parse_result.show.indexerid) + "' and tv_episodes.season = '" + str(parse_result.season_number) + "' and tv_episodes.episode = '" + str(parse_result.episode_numbers[0]) + "'" @@ -522,7 +522,7 @@ def already_postprocessed(dirName, videofile, force, result): search_sql += " and history.resource LIKE ?" sqlResult = myDB.select(search_sql, [u'%' + videofile]) if sqlResult: - #result.output += logHelper(u"You're trying to post process a video that's already been processed, skipping", logger.DEBUG) + # result.output += logHelper(u"You're trying to post process a video that's already been processed, skipping", logger.DEBUG) return True return False diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 781f76169..8770dd8b4 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -228,7 +228,7 @@ def makeTorrentRssProvider(configString): def getDefaultNewznabProviders(): - #name|url|key|catIDs|enabled|search_mode|search_fallback|enable_daily|enable_backlog + # name|url|key|catIDs|enabled|search_mode|search_fallback|enable_daily|enable_backlog return 'NZB.Cat|https://nzb.cat/||5030,5040,5010|0|eponly|1|1|1!!!' + \ 'NZBGeek|https://api.nzbgeek.info/||5030,5040|0|eponly|0|0|0!!!' + \ 'NZBs.org|https://nzbs.org/||5030,5040|0|eponly|0|0|0!!!' + \ diff --git a/sickbeard/providers/alpharatio.py b/sickbeard/providers/alpharatio.py index c6d6a8d09..529bc5f74 100644 --- a/sickbeard/providers/alpharatio.py +++ b/sickbeard/providers/alpharatio.py @@ -101,7 +101,7 @@ class AlphaRatioProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'id': 'torrent_table'}) torrent_rows = torrent_table.find_all('tr') if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrent_rows) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -116,7 +116,7 @@ class AlphaRatioProvider(generic.TorrentProvider): download_url = self.urls['download'] % (url['href']) seeders = cells[len(cells)-2].contents[0] leechers = cells[len(cells)-1].contents[0] - #FIXME + # FIXME size = -1 except (AttributeError, TypeError): continue @@ -124,7 +124,7 @@ class AlphaRatioProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -139,7 +139,7 @@ class AlphaRatioProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.WARNING) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/animenzb.py b/sickbeard/providers/animenzb.py index bed7f6872..dfeece3eb 100644 --- a/sickbeard/providers/animenzb.py +++ b/sickbeard/providers/animenzb.py @@ -78,7 +78,7 @@ class animenzb(generic.NZBProvider): results.append(curItem) logger.log(u"Found result: %s " % title, logger.DEBUG) - #For each search mode sort all the items by seeders if available if available + # For each search mode sort all the items by seeders if available if available results.sort(key=lambda tup: tup[0], reverse=True) return results diff --git a/sickbeard/providers/bitcannon.py b/sickbeard/providers/bitcannon.py index d5feddffd..e6744d056 100644 --- a/sickbeard/providers/bitcannon.py +++ b/sickbeard/providers/bitcannon.py @@ -76,7 +76,7 @@ class BitCannonProvider(generic.TorrentProvider): leechers = swarm.get(u'Leechers', 0) size = item.get(u'Size', -1) - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -91,7 +91,7 @@ class BitCannonProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] @@ -112,7 +112,7 @@ class BitCannonCache(tvcache.TVCache): def _getRSSData(self): return {'entries': []} - #search_strings = {'RSS': ['']} - #return {'entries': self.provider._doSearch(search_strings)} + # search_strings = {'RSS': ['']} + # return {'entries': self.provider._doSearch(search_strings)} provider = BitCannonProvider() diff --git a/sickbeard/providers/bitsoup.py b/sickbeard/providers/bitsoup.py index 0867cacb0..c49849025 100644 --- a/sickbeard/providers/bitsoup.py +++ b/sickbeard/providers/bitsoup.py @@ -106,7 +106,7 @@ class BitSoupProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'class': 'koptekst'}) torrent_rows = torrent_table.find_all('tr') if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrent_rows) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -121,7 +121,7 @@ class BitSoupProvider(generic.TorrentProvider): title = link.getText() seeders = int(cells[10].getText()) leechers = int(cells[11].getText()) - #FIXME + # FIXME size = -1 except (AttributeError, TypeError): continue @@ -129,7 +129,7 @@ class BitSoupProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -144,7 +144,7 @@ class BitSoupProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.WARNING) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/bluetigers.py b/sickbeard/providers/bluetigers.py index 98039041a..e28361ffd 100644 --- a/sickbeard/providers/bluetigers.py +++ b/sickbeard/providers/bluetigers.py @@ -113,7 +113,7 @@ class BLUETIGERSProvider(generic.TorrentProvider): title = link.text download_url = self.urls['base_url'] + "/" + link['href'] download_url = download_url.replace("torrents-details", "download") - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -121,8 +121,8 @@ class BLUETIGERSProvider(generic.TorrentProvider): if not title or not download_url: continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -136,7 +136,7 @@ class BLUETIGERSProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/btdigg.py b/sickbeard/providers/btdigg.py index 648f8612c..21b7bab46 100644 --- a/sickbeard/providers/btdigg.py +++ b/sickbeard/providers/btdigg.py @@ -1,7 +1,7 @@ # Author: Jodi Jones <venom@gen-x.co.nz> # URL: http://code.google.com/p/sickbeard/ # -#Ported to sickrage by: matigonkas +# Ported to sickrage by: matigonkas # # This file is part of SickRage. # @@ -66,15 +66,15 @@ class BTDIGGProvider(generic.TorrentProvider): title = torrent['name'] download_url = torrent['magnet'] size = torrent['size'] - #FIXME + # FIXME seeders = 1 leechers = 0 if not all([title, download_url]): continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -85,7 +85,7 @@ class BTDIGGProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/btn.py b/sickbeard/providers/btn.py index 6647c3816..e055388d1 100644 --- a/sickbeard/providers/btn.py +++ b/sickbeard/providers/btn.py @@ -128,7 +128,7 @@ class BTNProvider(generic.TorrentProvider): logger.log(u"Found result: %s " % title, logger.DEBUG) results.append(torrent_info) - #FIXME SORT RESULTS + # FIXME SORT RESULTS return results def _api_call(self, apikey, params={}, results_per_page=1000, offset=0): diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py index 7d80b003f..794430e74 100644 --- a/sickbeard/providers/cpasbien.py +++ b/sickbeard/providers/cpasbien.py @@ -85,14 +85,14 @@ class CpasbienProvider(generic.TorrentProvider): title = link.text.lower().strip() pageURL = link['href'] - #downloadTorrentLink = torrentSoup.find("a", title.startswith('Cliquer')) + # downloadTorrentLink = torrentSoup.find("a", title.startswith('Cliquer')) tmp = pageURL.split('/')[-1].replace('.html', '.torrent') downloadTorrentLink = ('http://www.cpasbien.io/telechargement/%s' % tmp) if downloadTorrentLink: download_url = downloadTorrentLink - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -112,7 +112,7 @@ class CpasbienProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] @@ -130,7 +130,7 @@ class CpasbienCache(tvcache.TVCache): self.minTime = 30 def _getRSSData(self): - #search_strings = {'RSS': ['']} + # search_strings = {'RSS': ['']} return {'entries': {}} provider = CpasbienProvider() diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index e2a0b51de..f6aaa1c2b 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -101,7 +101,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -116,7 +116,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): except (AttributeError, TypeError, KeyError, ValueError): logger.log(u"Failed parsing provider. Traceback: %r" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/fnt.py b/sickbeard/providers/fnt.py index 4d1549643..ab676c581 100644 --- a/sickbeard/providers/fnt.py +++ b/sickbeard/providers/fnt.py @@ -127,7 +127,7 @@ class FNTProvider(generic.TorrentProvider): detailseedleech = link['mtcontent'] seeders = int(detailseedleech.split("<font color='#00b72e'>")[1].split("</font>")[0]) leechers = int(detailseedleech.split("<font color='red'>")[1].split("</font>")[0]) - #FIXME + # FIXME size = -1 except Exception: logger.log(u"Unable to parse torrent id & seeders & leechers. Traceback: %s " % traceback.format_exc(), logger.DEBUG) @@ -136,7 +136,7 @@ class FNTProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -151,7 +151,7 @@ class FNTProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/frenchtorrentdb.py b/sickbeard/providers/frenchtorrentdb.py index 90e1e2e00..9cf7c5882 100644 --- a/sickbeard/providers/frenchtorrentdb.py +++ b/sickbeard/providers/frenchtorrentdb.py @@ -152,7 +152,7 @@ class FrenchTorrentDBProvider(generic.TorrentProvider): for row in rows: link = row.find("a", title=True) title = link['title'] - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -166,8 +166,8 @@ class FrenchTorrentDBProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -178,7 +178,7 @@ class FrenchTorrentDBProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py index ec355f82f..c84907986 100644 --- a/sickbeard/providers/freshontv.py +++ b/sickbeard/providers/freshontv.py @@ -135,7 +135,7 @@ class FreshOnTVProvider(generic.TorrentProvider): try: with BS4Parser(init_html, features=["html5lib", "permissive"]) as init_soup: - #Check to see if there is more than 1 page of results + # Check to see if there is more than 1 page of results pager = init_soup.find('div', {'class': 'pager'}) if pager: page_links = pager.find_all('a', href=True) @@ -150,10 +150,10 @@ class FreshOnTVProvider(generic.TorrentProvider): if page_int > max_page_number: max_page_number = page_int - #limit page number to 15 just in case something goes wrong + # limit page number to 15 just in case something goes wrong if max_page_number > 15: max_page_number = 15 - #limit RSS search + # limit RSS search if max_page_number > 3 and mode is 'RSS': max_page_number = 3 except: @@ -163,13 +163,13 @@ class FreshOnTVProvider(generic.TorrentProvider): data_response_list = [] data_response_list.append(init_html) - #Freshon starts counting pages from zero, even though it displays numbers from 1 + # Freshon starts counting pages from zero, even though it displays numbers from 1 if max_page_number > 1: for i in range(1, max_page_number): time.sleep(1) page_searchURL = searchURL + '&page=' + str(i) - #'.log(u"Search string: " + page_searchURL, logger.DEBUG) + # '.log(u"Search string: " + page_searchURL, logger.DEBUG) page_html = self.getURL(page_searchURL) if not page_html: @@ -185,14 +185,14 @@ class FreshOnTVProvider(generic.TorrentProvider): torrent_rows = html.findAll("tr", {"class": re.compile('torrent_[0-9]*')}) - #Continue only if a Release is found + # Continue only if a Release is found if len(torrent_rows) == 0: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue for individual_torrent in torrent_rows: - #skip if torrent has been nuked due to poor quality + # skip if torrent has been nuked due to poor quality if individual_torrent.find('img', alt='Nuked') != None: continue @@ -208,7 +208,7 @@ class FreshOnTVProvider(generic.TorrentProvider): download_url = self.urls['download'] % (str(torrent_id)) seeders = tryInt(individual_torrent.find('td', {'class': 'table_seeders'}).find('span').text.strip(), 1) leechers = tryInt(individual_torrent.find('td', {'class': 'table_leechers'}).find('a').text.strip(), 0) - #FIXME + # FIXME size = -1 except Exception: continue @@ -216,7 +216,7 @@ class FreshOnTVProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -231,7 +231,7 @@ class FreshOnTVProvider(generic.TorrentProvider): except Exception as e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index cd37bc182..e6e076a82 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -604,7 +604,7 @@ class TorrentProvider(GenericProvider): elif ep_obj.show.anime: ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: - ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName.SXX + ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) # 1) showName.SXX search_string['Season'].append(ep_string.encode('utf-8').strip()) diff --git a/sickbeard/providers/hdbits.py b/sickbeard/providers/hdbits.py index a4eb0acf2..bbbdb2a80 100644 --- a/sickbeard/providers/hdbits.py +++ b/sickbeard/providers/hdbits.py @@ -87,7 +87,7 @@ class HDBitsProvider(generic.TorrentProvider): def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): - #FIXME + # FIXME results = [] logger.log(u"Search string: %s" % search_params, logger.DEBUG) @@ -107,7 +107,7 @@ class HDBitsProvider(generic.TorrentProvider): for item in items: results.append(item) - #FIXME SORTING + # FIXME SORTING return results def findPropers(self, search_date=None): diff --git a/sickbeard/providers/hdspace.py b/sickbeard/providers/hdspace.py index fe6d82b8b..d7da35202 100644 --- a/sickbeard/providers/hdspace.py +++ b/sickbeard/providers/hdspace.py @@ -133,7 +133,7 @@ class HDSpaceProvider(generic.TorrentProvider): # Skip column headers for result in torrents[1:]: if len(result.contents) < 10: - #skip extraneous rows at the end + # skip extraneous rows at the end continue try: @@ -147,7 +147,7 @@ class HDSpaceProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -162,7 +162,7 @@ class HDSpaceProvider(generic.TorrentProvider): except (AttributeError, TypeError, KeyError, ValueError): continue - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index 357e207e9..7eb9af279 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -179,7 +179,7 @@ class HDTorrentsProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -194,7 +194,7 @@ class HDTorrentsProvider(generic.TorrentProvider): except (AttributeError, TypeError, KeyError, ValueError): continue - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/hounddawgs.py b/sickbeard/providers/hounddawgs.py index 6c9f18c1a..24d0a1acb 100644 --- a/sickbeard/providers/hounddawgs.py +++ b/sickbeard/providers/hounddawgs.py @@ -132,10 +132,10 @@ class HoundDawgsProvider(generic.TorrentProvider): allAs = (torrent[1]).find_all('a') try: - #link = self.urls['base_url'] + allAs[2].attrs['href'] - #url = result.find('td', attrs={'class': 'quickdownload'}).find('a') + # link = self.urls['base_url'] + allAs[2].attrs['href'] + # url = result.find('td', attrs={'class': 'quickdownload'}).find('a') title = allAs[2].string - #Trimming title so accepted by scene check(Feature has been rewuestet i forum) + # Trimming title so accepted by scene check(Feature has been rewuestet i forum) title = title.replace("custom.", "") title = title.replace("CUSTOM.", "") title = title.replace("Custom.", "") @@ -147,7 +147,7 @@ class HoundDawgsProvider(generic.TorrentProvider): title = title.replace("Subs.", "") download_url = self.urls['base_url']+allAs[0].attrs['href'] - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -158,8 +158,8 @@ class HoundDawgsProvider(generic.TorrentProvider): if not title or not download_url: continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -173,7 +173,7 @@ class HoundDawgsProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index de5774886..b644a230e 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -119,7 +119,7 @@ class IPTorrentsProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'class': 'torrents'}) torrents = torrent_table.find_all('tr') if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrents) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -137,7 +137,7 @@ class IPTorrentsProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -152,7 +152,7 @@ class IPTorrentsProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Error: %r" % ex(e), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index eb76ff76a..af650aad2 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -89,7 +89,7 @@ class KATProvider(generic.TorrentProvider): searchURL = self.urls['search'] % url_fmt_string + '?' + urlencode(self.search_params) logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) - #data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) + # data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) if not data: logger.log("No data returned from provider", logger.DEBUG) continue @@ -130,7 +130,7 @@ class KATProvider(generic.TorrentProvider): size = int(item['torrent:contentLength']) info_hash = item['torrent:infoHash'] - #link = item['link'] + # link = item['link'] except (AttributeError, TypeError, KeyError): continue @@ -138,7 +138,7 @@ class KATProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -158,7 +158,7 @@ class KATProvider(generic.TorrentProvider): except Exception: logger.log(u"Failed parsing provider. Traceback: %r" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/libertalia.py b/sickbeard/providers/libertalia.py index 6a7a86898..549523a0f 100644 --- a/sickbeard/providers/libertalia.py +++ b/sickbeard/providers/libertalia.py @@ -105,16 +105,16 @@ class LibertaliaProvider(generic.TorrentProvider): rows = resultsTable.findAll("tr", {"class" : re.compile("torrent_row(.*)?")}) for row in rows: - #bypass first row because title only + # bypass first row because title only columns = row.find('td', {"class" : "torrent_name"}) - # isvfclass = row.find('td', {"class" : "sprite-vf"}) - #isvostfrclass = row.find('td', {"class" : "sprite-vostfr"}) + # isvfclass = row.find('td', {"class" : "sprite-vf"}) + # isvostfrclass = row.find('td', {"class" : "sprite-vostfr"}) link = columns.find("a", href=re.compile("torrents")) if link: title = link.text - #recherched = searchURL.replace(".", "(.*)").replace(" ", "(.*)").replace("'", "(.*)") + # recherched = searchURL.replace(".", "(.*)").replace(" ", "(.*)").replace("'", "(.*)") download_url = row.find("a", href=re.compile("torrent_pass"))['href'] - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -122,8 +122,8 @@ class LibertaliaProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -134,7 +134,7 @@ class LibertaliaProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/morethantv.py b/sickbeard/providers/morethantv.py index a4e55cbcd..d6034c8ef 100644 --- a/sickbeard/providers/morethantv.py +++ b/sickbeard/providers/morethantv.py @@ -125,7 +125,7 @@ class MoreThanTVProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'class': 'torrent_table'}) torrent_rows = torrent_table.findChildren('tr') if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrent_rows) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -135,7 +135,7 @@ class MoreThanTVProvider(generic.TorrentProvider): cells = result.findChildren('td') link = cells[1].find('a', attrs={'title': 'Download'}) - #skip if torrent has been nuked due to poor quality + # skip if torrent has been nuked due to poor quality if cells[1].find('img', alt='Nuked') != None: continue @@ -163,7 +163,7 @@ class MoreThanTVProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -178,7 +178,7 @@ class MoreThanTVProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/newpct.py b/sickbeard/providers/newpct.py index 842b8f311..dbc410f91 100644 --- a/sickbeard/providers/newpct.py +++ b/sickbeard/providers/newpct.py @@ -82,7 +82,7 @@ class newpctProvider(generic.TorrentProvider): lang_info = '' if not epObj or not epObj.show else epObj.show.lang - #Only search if user conditions are true + # Only search if user conditions are true if self.onlyspasearch and lang_info != 'es': logger.log(u"Show info is not spanish, skipping provider search", logger.DEBUG) return results @@ -156,7 +156,7 @@ class newpctProvider(generic.TorrentProvider): title = title.replace('Descargar ', '') - #Quality + # Quality title = title.replace('[HDTV]', '[720p HDTV x264]') title = title.replace('[HDTV 720p AC3 5.1]', '[720p HDTV x264]') title = title.replace('[HDTV 1080p AC3 5.1]', '[1080p HDTV x264]') diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index 6ba2e0474..feaf5e860 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -200,7 +200,7 @@ class NewznabProvider(generic.NZBProvider): if self.needs_auth and not self.key: logger.log(u"Invalid api key. Check your settings", logger.WARNING) - #raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.") + # raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.") return True diff --git a/sickbeard/providers/nextgen.py b/sickbeard/providers/nextgen.py index 55f6413a8..b9707cac4 100644 --- a/sickbeard/providers/nextgen.py +++ b/sickbeard/providers/nextgen.py @@ -148,8 +148,8 @@ class NextGenProvider(generic.TorrentProvider): entries = entries_std + entries_sticky - #Xirg STANDARD TORRENTS - #Continue only if one Release is found + # Xirg STANDARD TORRENTS + # Continue only if one Release is found if not entries: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -172,7 +172,7 @@ class NextGenProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -187,7 +187,7 @@ class NextGenProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/pretome.py b/sickbeard/providers/pretome.py index dda59e612..1ee425f28 100644 --- a/sickbeard/providers/pretome.py +++ b/sickbeard/providers/pretome.py @@ -106,7 +106,7 @@ class PretomeProvider(generic.TorrentProvider): try: with BS4Parser(data, features=["html5lib", "permissive"]) as html: - #Continue only if one Release is found + # Continue only if one Release is found empty = html.find('h2', text="No .torrents fit this filter criteria") if empty: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) @@ -149,7 +149,7 @@ class PretomeProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -164,7 +164,7 @@ class PretomeProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index 149f23519..a671b00d0 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -119,7 +119,7 @@ class RarbgProvider(generic.TorrentProvider): ep_indexerid = None ep_indexer = None - for mode in search_params.keys(): #Mode = RSS, Season, Episode + for mode in search_params.keys(): # Mode = RSS, Season, Episode logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: @@ -202,7 +202,7 @@ class RarbgProvider(generic.TorrentProvider): searchURL = searchURL.replace(u'https', 'http') continue - #No error found break + # No error found break break else: logger.log(u"Retried 3 times without getting results", logger.DEBUG) diff --git a/sickbeard/providers/scc.py b/sickbeard/providers/scc.py index f59d9fc71..2b0f4cda3 100644 --- a/sickbeard/providers/scc.py +++ b/sickbeard/providers/scc.py @@ -114,7 +114,7 @@ class SCCProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'id': 'torrents-table'}) torrent_rows = torrent_table.find_all('tr') if torrent_table else [] - #Continue only if at least one Release is found + # Continue only if at least one Release is found if len(torrent_rows) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -141,7 +141,7 @@ class SCCProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -153,7 +153,7 @@ class SCCProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/scenetime.py b/sickbeard/providers/scenetime.py index 3d50a0daa..2e89e7ee1 100644 --- a/sickbeard/providers/scenetime.py +++ b/sickbeard/providers/scenetime.py @@ -99,7 +99,7 @@ class SceneTimeProvider(generic.TorrentProvider): torrent_table = html.select("#torrenttable table") torrent_rows = torrent_table[0].select("tr") if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrent_rows) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -124,7 +124,7 @@ class SceneTimeProvider(generic.TorrentProvider): seeders = int(cells[labels.index('Seeders')].get_text()) leechers = int(cells[labels.index('Leechers')].get_text()) - #FIXME + # FIXME size = -1 except (AttributeError, TypeError): @@ -133,7 +133,7 @@ class SceneTimeProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -148,7 +148,7 @@ class SceneTimeProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index ca93eba6c..2483b2af4 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -109,13 +109,13 @@ class SpeedCDProvider(generic.TorrentProvider): download_url = self.urls['download'] % (torrent['id']) seeders = int(torrent['seed']) leechers = int(torrent['leech']) - #FIXME + # FIXME size = -1 if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -127,7 +127,7 @@ class SpeedCDProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py index 0ee96b147..c22442b47 100644 --- a/sickbeard/providers/strike.py +++ b/sickbeard/providers/strike.py @@ -40,7 +40,7 @@ class STRIKEProvider(generic.TorrentProvider): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - for mode in search_strings.keys(): #Mode = RSS, Season, Episode + for mode in search_strings.keys(): # Mode = RSS, Season, Episode logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: @@ -66,7 +66,7 @@ class STRIKEProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -78,7 +78,7 @@ class STRIKEProvider(generic.TorrentProvider): item = title, download_url, size, seeders, leechers items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py index e1f10c646..030f46279 100644 --- a/sickbeard/providers/t411.py +++ b/sickbeard/providers/t411.py @@ -130,7 +130,7 @@ class T411Provider(generic.TorrentProvider): leechers = int(torrent['leechers']) verified = bool(torrent['isVerified']) - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -154,7 +154,7 @@ class T411Provider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available if available + # For each search mode sort all the items by seeders if available if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index 6b90b5c5b..6eb4e10dc 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -84,7 +84,7 @@ class ThePirateBayProvider(generic.TorrentProvider): searchURL = self.urls[('search', 'rss')[mode == 'RSS']] + '?' + urlencode(self.search_params) logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) - #data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) + # data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) if not data: continue @@ -93,7 +93,7 @@ class ThePirateBayProvider(generic.TorrentProvider): for torrent in matches: title = torrent.group('title') download_url = torrent.group('url') - #id = int(torrent.group('id')) + # id = int(torrent.group('id')) size = self._convertSize(torrent.group('size')) seeders = int(torrent.group('seeders')) leechers = int(torrent.group('leechers')) @@ -101,13 +101,13 @@ class ThePirateBayProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue - #Accept Torrent only from Good People for every Episode Search + # Accept Torrent only from Good People for every Episode Search if self.confirmed and re.search(r'(VIP|Trusted|Helper|Moderator)', torrent.group(0)) is None: if mode != 'RSS': logger.log(u"Found result %s but that doesn't seem like a trusted result so I'm ignoring it" % title, logger.DEBUG) @@ -119,7 +119,7 @@ class ThePirateBayProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/titansoftv.py b/sickbeard/providers/titansoftv.py index 8e6d254c6..1ce3bd3a2 100644 --- a/sickbeard/providers/titansoftv.py +++ b/sickbeard/providers/titansoftv.py @@ -58,7 +58,7 @@ class TitansOfTVProvider(generic.TorrentProvider): return True def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): - #FIXME ADD MODE + # FIXME ADD MODE self._checkAuth() results = [] params = {} @@ -88,7 +88,7 @@ class TitansOfTVProvider(generic.TorrentProvider): title = parsedJSON['release_name'] id = parsedJSON['id'] download_url = self.download_url % (id, self.api_key) - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -96,8 +96,8 @@ class TitansOfTVProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -107,7 +107,7 @@ class TitansOfTVProvider(generic.TorrentProvider): logger.log(u"Found result: %s " % title, logger.DEBUG) results.append(result) - #FIXME SORTING + # FIXME SORTING return results diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index c62797543..9400508d0 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -322,7 +322,7 @@ class TNTVillageProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'class' : 'copyright'}) torrent_rows = torrent_table.find_all('tr') if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrent_rows) < 3: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) last_page = 1 @@ -341,7 +341,7 @@ class TNTVillageProvider(generic.TorrentProvider): leechers = int(leechers.strip('[]')) seeders = result.find_all('td')[3].find_all('td')[2].text seeders = int(seeders.strip('[]')) - #FIXME + # FIXME size = -1 except (AttributeError, TypeError): continue @@ -380,7 +380,7 @@ class TNTVillageProvider(generic.TorrentProvider): if self._is_season_pack(title): title = re.sub(r'([Ee][\d{1,2}\-?]+)', '', title) - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -395,7 +395,7 @@ class TNTVillageProvider(generic.TorrentProvider): except Exception: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available if available + # For each search mode sort all the items by seeders if available if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/tokyotoshokan.py b/sickbeard/providers/tokyotoshokan.py index d1d909528..2f53b6941 100644 --- a/sickbeard/providers/tokyotoshokan.py +++ b/sickbeard/providers/tokyotoshokan.py @@ -55,7 +55,7 @@ class TokyoToshokanProvider(generic.TorrentProvider): return [x.replace('.', ' ') for x in show_name_helpers.makeSceneSearchString(self.show, ep_obj)] def _doSearch(self, search_string, search_mode='eponly', epcount=0, age=0, epObj=None): - #FIXME ADD MODE + # FIXME ADD MODE if self.show and not self.show.is_anime: return [] @@ -63,7 +63,7 @@ class TokyoToshokanProvider(generic.TorrentProvider): params = { "terms": search_string.encode('utf-8'), - "type": 1, # get anime types + "type": 1, # get anime types } searchURL = self.url + 'search.php?' + urllib.urlencode(params) @@ -88,7 +88,7 @@ class TokyoToshokanProvider(generic.TorrentProvider): title = top.find('td', attrs={'class': 'desc-top'}).text title.lstrip() download_url = top.find('td', attrs={'class': 'desc-top'}).find('a')['href'] - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -96,8 +96,8 @@ class TokyoToshokanProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -109,7 +109,7 @@ class TokyoToshokanProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #FIXME SORTING + # FIXME SORTING return results diff --git a/sickbeard/providers/torrentbytes.py b/sickbeard/providers/torrentbytes.py index 48d4c5d5a..2bc38e29a 100644 --- a/sickbeard/providers/torrentbytes.py +++ b/sickbeard/providers/torrentbytes.py @@ -99,7 +99,7 @@ class TorrentBytesProvider(generic.TorrentProvider): try: with BS4Parser(data, features=["html5lib", "permissive"]) as html: - #Continue only if one Release is found + # Continue only if one Release is found empty = html.find('Nothing found!') if empty: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) @@ -116,7 +116,7 @@ class TorrentBytesProvider(generic.TorrentProvider): full_id = link['href'].replace('details.php?id=', '') torrent_id = full_id.split("&")[0] - #Free leech torrents are marked with green [F L] in the title (i.e. <font color=green>[F L]</font>) + # Free leech torrents are marked with green [F L] in the title (i.e. <font color=green>[F L]</font>) freeleechTag = cells[1].find('font', attrs={'color': 'green'}) if freeleechTag and freeleechTag.text == u'[F\xa0L]': isFreeleechTorrent = True @@ -148,7 +148,7 @@ class TorrentBytesProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -163,7 +163,7 @@ class TorrentBytesProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 82b2cf235..353f0673d 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -133,13 +133,13 @@ class TorrentDayProvider(generic.TorrentProvider): download_url = self.urls['download'] % ( torrent['id'], torrent['fname']) seeders = int(torrent['seed']) leechers = int(torrent['leech']) - #FIXME + # FIXME size = -1 if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -151,7 +151,7 @@ class TorrentDayProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available if available + # For each search mode sort all the items by seeders if available if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/torrentleech.py b/sickbeard/providers/torrentleech.py index f08df58bb..11d6dcaa1 100644 --- a/sickbeard/providers/torrentleech.py +++ b/sickbeard/providers/torrentleech.py @@ -104,7 +104,7 @@ class TorrentLeechProvider(generic.TorrentProvider): torrent_table = html.find('table', attrs={'id': 'torrenttable'}) torrent_rows = torrent_table.find_all('tr') if torrent_table else [] - #Continue only if one Release is found + # Continue only if one Release is found if len(torrent_rows) < 2: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue @@ -118,7 +118,7 @@ class TorrentLeechProvider(generic.TorrentProvider): download_url = self.urls['download'] % url['href'] seeders = int(result.find('td', attrs={'class': 'seeders'}).string) leechers = int(result.find('td', attrs={'class': 'leechers'}).string) - #FIXME + # FIXME size = -1 except (AttributeError, TypeError): continue @@ -126,7 +126,7 @@ class TorrentLeechProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -141,7 +141,7 @@ class TorrentLeechProvider(generic.TorrentProvider): except Exception, e: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py index 1aa69aa1d..184e23c27 100644 --- a/sickbeard/providers/torrentproject.py +++ b/sickbeard/providers/torrentproject.py @@ -47,7 +47,7 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - for mode in search_strings.keys(): #Mode = RSS, Season, Episode + for mode in search_strings.keys(): # Mode = RSS, Season, Episode logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: if mode != 'RSS': @@ -92,7 +92,7 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" logger.log("Result has less than 10 seeds but not using Dyn Magnet becouse its from RSS" + title, logger.DEBUG) else: - #logger.log("Torrent has more than 10 seeds using hard coded trackers", logger.DEBUG) + # logger.log("Torrent has more than 10 seeds using hard coded trackers", logger.DEBUG) download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index 6fb1ef3bb..10aafa1aa 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -113,7 +113,7 @@ class TORRENTZProvider(generic.TorrentProvider): download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" size, seeders, leechers = self._split_description(item.get('description', '')) - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -121,7 +121,7 @@ class TORRENTZProvider(generic.TorrentProvider): items[mode].append((title, download_url, size, seeders, leechers)) - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/transmitthenet.py b/sickbeard/providers/transmitthenet.py index 136cc1f54..f021f2b0b 100644 --- a/sickbeard/providers/transmitthenet.py +++ b/sickbeard/providers/transmitthenet.py @@ -128,13 +128,13 @@ class TransmitTheNetProvider(generic.TorrentProvider): seeders = int(torrent_row.findAll('a', {'title': 'Click here to view peers details'})[0].text.strip()) leechers = int(torrent_row.findAll('a', {'title': 'Click here to view peers details'})[1].text.strip()) download_url = self.urls['base_url'] + download_href - #FIXME + # FIXME size = -1 if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) diff --git a/sickbeard/providers/tvchaosuk.py b/sickbeard/providers/tvchaosuk.py index 30dbc2f9a..69de245fa 100644 --- a/sickbeard/providers/tvchaosuk.py +++ b/sickbeard/providers/tvchaosuk.py @@ -14,7 +14,7 @@ # along with SickRage. If not, see <http://www.gnu.org/licenses/>. import re -#from urllib import urlencode +# from urllib import urlencode import sickbeard from sickbeard import logger @@ -139,7 +139,7 @@ class TVChaosUKProvider(generic.TorrentProvider): self.search_params['keywords'] = search_string.strip() data = self.getURL(self.urls['search'], params=self.search_params) - #url_searched = self.urls['search'] + '?' + urlencode(self.search_params) + # url_searched = self.urls['search'] + '?' + urlencode(self.search_params) if not data: logger.log("No data returned from provider", logger.DEBUG) @@ -157,7 +157,7 @@ class TVChaosUKProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent + # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) @@ -175,7 +175,7 @@ class TVChaosUKProvider(generic.TorrentProvider): # Strip year from the end or we can't parse it! title = re.sub(r'[\. ]?\(\d{4}\)', '', title) - #FIXME + # FIXME size = -1 item = title, download_url, size, seeders, leechers @@ -187,7 +187,7 @@ class TVChaosUKProvider(generic.TorrentProvider): except Exception: continue - #For each search mode sort all the items by seeders if available + # For each search mode sort all the items by seeders if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/providers/xthor.py b/sickbeard/providers/xthor.py index 0b0623c34..a5f2dddc7 100644 --- a/sickbeard/providers/xthor.py +++ b/sickbeard/providers/xthor.py @@ -102,7 +102,7 @@ class XthorProvider(generic.TorrentProvider): if link: title = link.text download_url = self.url + '/' + row.find("a", href=re.compile("download.php"))['href'] - #FIXME + # FIXME size = -1 seeders = 1 leechers = 0 @@ -110,8 +110,8 @@ class XthorProvider(generic.TorrentProvider): if not all([title, download_url]): continue - #Filter unseeded torrent - #if seeders < self.minseed or leechers < self.minleech: + # Filter unseeded torrent + # if seeders < self.minseed or leechers < self.minleech: # if mode != 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue @@ -122,7 +122,7 @@ class XthorProvider(generic.TorrentProvider): items[mode].append(item) - #For each search mode sort all the items by seeders if available if available + # For each search mode sort all the items by seeders if available if available items[mode].sort(key=lambda tup: tup[3], reverse=True) results += items[mode] diff --git a/sickbeard/scene_numbering.py b/sickbeard/scene_numbering.py index 6ad0a15d3..ae3a70f44 100644 --- a/sickbeard/scene_numbering.py +++ b/sickbeard/scene_numbering.py @@ -218,7 +218,7 @@ def set_scene_numbering(indexer_id, indexer, season=None, episode=None, absolute "UPDATE scene_numbering SET scene_absolute_number = ? WHERE indexer = ? and indexer_id = ? and absolute_number = ?", [sceneAbsolute, indexer, indexer_id, absolute_number]) - #Reload data from DB so that cache and db are in sync + # Reload data from DB so that cache and db are in sync show = helpers.findCertainShow(sickbeard.showList, indexer_id) show.flushEpisodes() diff --git a/sickbeard/scheduler.py b/sickbeard/scheduler.py index b3068f54d..c30634e5b 100644 --- a/sickbeard/scheduler.py +++ b/sickbeard/scheduler.py @@ -82,7 +82,7 @@ class Scheduler(threading.Thread): if self.enable: current_time = datetime.datetime.now() should_run = False - #Is self.force enable + # Is self.force enable if self.force: should_run = True # check if interval has passed diff --git a/sickbeard/search_queue.py b/sickbeard/search_queue.py index 91a1cf197..48777c2e8 100644 --- a/sickbeard/search_queue.py +++ b/sickbeard/search_queue.py @@ -279,7 +279,7 @@ class FailedQueueItem(generic_queue.QueueItem): time.sleep(common.cpu_presets[sickbeard.CPU_PRESET]) else: pass - #logger.log(u"No valid episode found to retry for: [" + self.segment.prettyName() + "]") + # logger.log(u"No valid episode found to retry for: [" + self.segment.prettyName() + "]") except Exception: logger.log(traceback.format_exc(), logger.DEBUG) diff --git a/sickbeard/show_name_helpers.py b/sickbeard/show_name_helpers.py index c1c522d66..8e640b250 100644 --- a/sickbeard/show_name_helpers.py +++ b/sickbeard/show_name_helpers.py @@ -328,8 +328,8 @@ def allPossibleShowNames(show, season=-1): elif curName.endswith(' (' + curCountry + ')'): newShowNames.append(curName.replace(' (' + curCountry + ')', ' (' + country_list[curCountry] + ')')) - # if we have "Show Name (2013)" this will strip the (2013) show year from the show name - #newShowNames.append(re.sub('\(\d{4}\)','',curName)) + # # if we have "Show Name (2013)" this will strip the (2013) show year from the show name + # newShowNames.append(re.sub('\(\d{4}\)', '', curName)) showNames += newShowNames diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index 544cffa92..359a6210a 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -205,7 +205,7 @@ class ShowQueueItem(generic_queue.QueueItem): def isInQueue(self): return self in sickbeard.showQueueScheduler.action.queue + [ - sickbeard.showQueueScheduler.action.currentItem] #@UndefinedVariable + sickbeard.showQueueScheduler.action.currentItem] # @UndefinedVariable def _getName(self): return str(self.show.indexerid) @@ -306,8 +306,8 @@ class QueueItemAdd(ShowQueueItem): return except Exception, e: logger.log(u"Error while loading information from indexer %s. Error: %r" % (self.indexer_id,sickbeard.indexerApi(self.indexer).name, ex(e)),logger.ERROR) - #logger.log(u"Show name with ID %s doesn't exist on %s anymore. If you are using trakt, it will be removed from your TRAKT watchlist. If you are adding manually, try removing the nfo and adding again" % - # (self.indexer_id,sickbeard.indexerApi(self.indexer).name) , logger.WARNING) + # logger.log(u"Show name with ID %s doesn't exist on %s anymore. If you are using trakt, it will be removed from your TRAKT watchlist. If you are adding manually, try removing the nfo and adding again" % + # (self.indexer_id, sickbeard.indexerApi(self.indexer).name), logger.WARNING) ui.notifications.error("Unable to add show", "Unable to look up the show in " + self.showDir + " on " + str(sickbeard.indexerApi( @@ -365,13 +365,13 @@ class QueueItemAdd(ShowQueueItem): if self.whitelist: self.show.release_groups.set_white_keywords(self.whitelist) - # be smartish about this - #if self.show.genre and "talk show" in self.show.genre.lower(): - # self.show.air_by_date = 1 - #if self.show.genre and "documentary" in self.show.genre.lower(): - # self.show.air_by_date = 0 - #if self.show.classification and "sports" in self.show.classification.lower(): - # self.show.sports = 1 + # # be smartish about this + # if self.show.genre and "talk show" in self.show.genre.lower(): + # self.show.air_by_date = 1 + # if self.show.genre and "documentary" in self.show.genre.lower(): + # self.show.air_by_date = 0 + # if self.show.classification and "sports" in self.show.classification.lower(): + # self.show.sports = 1 except sickbeard.indexer_exception, e: logger.log( diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index a9e3000dc..06b708427 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -102,7 +102,7 @@ def sortedServiceList(): def getEnabledServiceList(): return [x['name'] for x in sortedServiceList() if x['enabled']] -#Hack around this for now. +# Hack around this for now. def fromietf(language): return Language.fromopensubtitles(language) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index b0754d6a1..beae78222 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -370,7 +370,7 @@ class TraktChecker(): indexer_id = int(str(show_el)) show = self.ShowWatchlist[trakt_id][show_el] - #logger.log(u"Checking Show: %s %s %s" % (trakt_id, indexer_id, show['title']),logger.DEBUG) + # logger.log(u"Checking Show: %s %s %s" % (trakt_id, indexer_id, show['title']),logger.DEBUG) if int(sickbeard.TRAKT_METHOD_ADD) != 2: self.addDefaultShow(indexer, indexer_id, show['title'], SKIPPED) else: @@ -470,7 +470,7 @@ class TraktChecker(): Check in the Watchlist or CollectionList for Show Is the Show, Season and Episode in the trakt_id list (tvdb / tvrage) """ - #logger.log(u"Checking Show: %s %s %s " % (trakt_id, showid, List),logger.DEBUG) + # logger.log(u"Checking Show: %s %s %s " % (trakt_id, showid, List),logger.DEBUG) if "Collection" == List: try: @@ -658,7 +658,7 @@ class TraktChecker(): if season not in uniqueSeasons[showid]: uniqueSeasons[showid].append(season) - #build the query + # build the query showList = [] seasonsList = {} for searchedShow in uniqueShows: diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 70b1572bd..956b2506f 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -277,7 +277,7 @@ class TVShow(object): if noCreate: return None - #logger.log(str(self.indexerid) + u": An object for episode S%02dE%02d didn't exist in the cache, trying to create it" % (season or 0, episode or 0), logger.DEBUG) + # logger.log(str(self.indexerid) + u": An object for episode S%02dE%02d didn't exist in the cache, trying to create it" % (season or 0, episode or 0), logger.DEBUG) if file: ep = TVEpisode(self, season, episode, file) @@ -483,8 +483,8 @@ class TVShow(object): if self.dvdorder != 0: lINDEXER_API_PARMS['dvdorder'] = True - #logger.log(u"lINDEXER_API_PARMS: " + str(lINDEXER_API_PARMS), logger.DEBUG) - #Spamming log + # logger.log(u"lINDEXER_API_PARMS: " + str(lINDEXER_API_PARMS), logger.DEBUG) + # Spamming log t = sickbeard.indexerApi(self.indexer).indexer(**lINDEXER_API_PARMS) cachedShow = t[self.indexerid] @@ -607,7 +607,7 @@ class TVShow(object): for cur_provider in sickbeard.metadata_provider_dict.values(): - #logger.log(u"Running metadata routines for " + cur_provider.name, logger.DEBUG) + # logger.log(u"Running metadata routines for " + cur_provider.name, logger.DEBUG) fanart_result = cur_provider.create_fanart(self) or fanart_result poster_result = cur_provider.create_poster(self) or poster_result @@ -1435,10 +1435,10 @@ class TVEpisode(object): logger.log(u"%s: Downloading subtitles for S%02dE%02d" % (self.show.indexerid, self.season or 0, self.episode or 0), logger.DEBUG) - #logging.getLogger('subliminal.api').addHandler(logging.StreamHandler()) - #logging.getLogger('subliminal.api').setLevel(logging.DEBUG) - #logging.getLogger('subliminal').addHandler(logging.StreamHandler()) - #logging.getLogger('subliminal').setLevel(logging.DEBUG) + # logging.getLogger('subliminal.api').addHandler(logging.StreamHandler()) + # logging.getLogger('subliminal.api').setLevel(logging.DEBUG) + # logging.getLogger('subliminal').addHandler(logging.StreamHandler()) + # logging.getLogger('subliminal').setLevel(logging.DEBUG) subtitles_info = {'location': self.location, 'subtitles': self.subtitles, 'show.indexerid': self.show.indexerid, 'season': self.season, 'episode': self.episode, 'name': self.name, 'show.name': self.show.name, 'status': self.status} @@ -1644,10 +1644,10 @@ class TVEpisode(object): if getattr(myEp, 'episodename', None) is None: logger.log(u"This episode %s - S%02dE%02d has no name on %s. Setting to an empty string" % (self.show.name, season or 0, episode or 0, sickbeard.indexerApi(self.indexer).name)) setattr(myEp, 'episodename', '') - # if I'm incomplete on TVDB but I once was complete then just delete myself from the DB for now - #if self.indexerid != -1: - # self.deleteEpisode() - #return False + # # if I'm incomplete on TVDB but I once was complete then just delete myself from the DB for now + # if self.indexerid != -1: + # self.deleteEpisode() + # return False if getattr(myEp, 'absolute_number', None) is None: logger.log(u"This episode %s - S%02dE%02d has no absolute number on %s" %(self.show.name, season or 0, episode or 0, sickbeard.indexerApi(self.indexer).name), logger.DEBUG) @@ -2114,18 +2114,18 @@ class TVEpisode(object): if encoder: logger.log(u"Found codec for '" + show_name + ": " + ep_name + "'.", logger.DEBUG) - #try to get the release group + # try to get the release group rel_grp = {} rel_grp["SiCKRAGE"] = 'SiCKRAGE' - if hasattr(self, 'location'): #from the location name + if hasattr(self, 'location'): # from the location name rel_grp['location'] = release_group(self.show, self.location) if not rel_grp['location']: del rel_grp['location'] - if hasattr(self, '_release_group'): #from the release group field in db + if hasattr(self, '_release_group'): # from the release group field in db rel_grp['database'] = self._release_group if not rel_grp['database']: del rel_grp['database'] - if hasattr(self, 'release_name'): #from the release name field in db + if hasattr(self, 'release_name'): # from the release name field in db rel_grp['release_name'] = release_group(self.show, self.release_name) if not rel_grp['release_name']: del rel_grp['release_name'] @@ -2216,10 +2216,10 @@ class TVEpisode(object): # if there's no release group in the db, let the user know we replaced it if not hasattr(self, '_release_group') and not replace_map['%RG'] == 'SiCKRAGE': logger.log(u"Episode has no release group, replacing it with '" + replace_map['%RG'] + "'", logger.DEBUG) - self._release_group = replace_map['%RG'] #if release_group is not in the db, put it there + self._release_group = replace_map['%RG'] # if release_group is not in the db, put it there elif not self._release_group and not replace_map['%RG'] == 'SiCKRAGE': logger.log(u"Episode has no release group, replacing it with '" + replace_map['%RG'] + "'", logger.DEBUG) - self._release_group = replace_map['%RG'] #if release_group is not in the db, put it there + self._release_group = replace_map['%RG'] # if release_group is not in the db, put it there # if there's no release name then replace it with a reasonable facsimile if not replace_map['%RN']: @@ -2236,7 +2236,7 @@ class TVEpisode(object): result_name = result_name.replace('%RN', '%S.N.S%0SE%0E.%E.N-' + replace_map['%RG']) result_name = result_name.replace('%rn', '%s.n.s%0se%0e.%e.n-' + replace_map['%RG'].lower()) - #logger.log(u"Episode has no release name, replacing it with a generic one: " + result_name, logger.DEBUG) + # logger.log(u"Episode has no release name, replacing it with a generic one: " + result_name, logger.DEBUG) if not replace_map['%RT']: result_name = re.sub('([ _.-]*)%RT([ _.-]*)', r'\2', result_name) @@ -2457,7 +2457,7 @@ class TVEpisode(object): related_files = postProcessor.PostProcessor(self.location).list_associated_files( self.location, base_name_only=True, subfolders=True) - #This is wrong. Cause of pp not moving subs. + # This is wrong. Cause of pp not moving subs. if self.show.subtitles and sickbeard.SUBTITLES_DIR != '': related_subs = postProcessor.PostProcessor(self.location).list_associated_files(sickbeard.SUBTITLES_DIR, subtitles_only=True, subfolders=True) @@ -2470,11 +2470,11 @@ class TVEpisode(object): # move related files for cur_related_file in related_files: - #We need to fix something here because related files can be in subfolders and the original code doesn't handle this (at all) + # We need to fix something here because related files can be in subfolders and the original code doesn't handle this (at all) cur_related_dir = ek(os.path.dirname, ek(os.path.abspath, cur_related_file)) subfolder = cur_related_dir.replace(ek(os.path.dirname, ek(os.path.abspath, self.location)), '') - #We now have a subfolder. We need to add that to the absolute_proper_path. - #First get the absolute proper-path dir + # We now have a subfolder. We need to add that to the absolute_proper_path. + # First get the absolute proper-path dir proper_related_dir = ek(os.path.dirname, ek(os.path.abspath, absolute_proper_path + file_ext)) proper_related_path = absolute_proper_path.replace(proper_related_dir, proper_related_dir + subfolder) diff --git a/sickbeard/ui.py b/sickbeard/ui.py index 43044c6cf..3d7c559bf 100644 --- a/sickbeard/ui.py +++ b/sickbeard/ui.py @@ -156,7 +156,7 @@ class QueueProgressIndicator(): return len([x for x in self.queueItemList if x.isInQueue()]) def nextName(self): - for curItem in [sickbeard.showQueueScheduler.action.currentItem]+sickbeard.showQueueScheduler.action.queue: #@UndefinedVariable + for curItem in [sickbeard.showQueueScheduler.action.currentItem]+sickbeard.showQueueScheduler.action.queue: # @UndefinedVariable if curItem in self.queueItemList: return curItem.name diff --git a/sickbeard/versionChecker.py b/sickbeard/versionChecker.py index 7ed739835..257525eed 100644 --- a/sickbeard/versionChecker.py +++ b/sickbeard/versionChecker.py @@ -621,7 +621,7 @@ class GitUpdateManager(UpdateManager): # remove untracked files and performs a hard reset on git branch to avoid update issues if sickbeard.GIT_RESET: - #self.clean() # This is removing user data and backups + # self.clean() # This is removing user data and backups self.reset() if self.branch == self._find_installed_branch(): @@ -857,7 +857,7 @@ class SourceUpdateManager(UpdateManager): # Avoid DLL access problem on WIN32/64 # These files needing to be updated manually - #or find a way to kill the access from memory + # or find a way to kill the access from memory if curfile in ('unrar.dll', 'unrar64.dll'): try: os.chmod(new_path, stat.S_IWRITE) diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index f2420e539..29e0534e0 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -96,8 +96,8 @@ class ApiHandler(RequestHandler): def __init__(self, *args, **kwargs): super(ApiHandler, self).__init__(*args, **kwargs) - #def set_default_headers(self): - #self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + # def set_default_headers(self): + # self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') def get(self, *args, **kwargs): kwargs = self.request.arguments diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 5b98cfd52..b0907c84e 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -158,8 +158,8 @@ class BaseHandler(RequestHandler): super(BaseHandler, self).__init__(*args, **kwargs) - #def set_default_headers(self): - #self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + # def set_default_headers(self): + # self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') def write_error(self, status_code, **kwargs): # handle 404 http errors @@ -393,7 +393,7 @@ class WebRoot(WebHandler): layout = 'poster' sickbeard.HOME_LAYOUT = layout - #Dont redirect to default page so user can see new layout + # Don't redirect to default page so user can see new layout return self.redirect("/home/") @staticmethod @@ -2653,7 +2653,7 @@ class HomeAddShows(Home): logger.log(u"Unable to create the folder " + show_dir + ", can't add the show", logger.ERROR) ui.notifications.error("Unable to add show", "Unable to create the folder " + show_dir + ", can't add the show") - #Dont redirect to default page because user wants to see the new show + # Don't redirect to default page because user wants to see the new show return self.redirect("/home/") else: helpers.chmodAsParent(show_dir) @@ -3708,8 +3708,8 @@ class ConfigGeneral(Config): sickbeard.PROXY_INDEXERS = config.checkbox_to_value(proxy_indexers) sickbeard.GIT_USERNAME = git_username sickbeard.GIT_PASSWORD = git_password - #sickbeard.GIT_RESET = config.checkbox_to_value(git_reset) - #Force GIT_RESET + # sickbeard.GIT_RESET = config.checkbox_to_value(git_reset) + # Force GIT_RESET sickbeard.GIT_RESET = 1 sickbeard.GIT_AUTOISSUES = config.checkbox_to_value(git_autoissues) sickbeard.GIT_PATH = git_path -- GitLab From 272eaf45776b6c6cdbbbaf72dcadaaddea85150c Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 03:46:58 -0500 Subject: [PATCH 014/215] PEP 8: Add blank lines for consistency --- sickbeard/blackandwhitelist.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sickbeard/blackandwhitelist.py b/sickbeard/blackandwhitelist.py index dd98667b8..d4d98d3dc 100644 --- a/sickbeard/blackandwhitelist.py +++ b/sickbeard/blackandwhitelist.py @@ -21,6 +21,7 @@ import sickbeard from sickbeard import db, logger, helpers from adba.aniDBerrors import AniDBCommandTimeoutError + class BlackAndWhiteList(object): blacklist = [] whitelist = [] @@ -133,9 +134,11 @@ class BlackAndWhiteList(object): logger.log('No Whitelist and Blacklist defined, check passed.', logger.DEBUG) return True + class BlackWhitelistNoShowIDException(Exception): 'No show_id was given' + def short_group_names(groups): """ Find AniDB short group names for release groups -- GitLab From c4cc2ea7d778030d7f13b485c2d8cc48adab60dd Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 03:47:46 -0500 Subject: [PATCH 015/215] PEP 8: Convert membership test from 'not x in y' to 'x not in y' --- sickbeard/blackandwhitelist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/blackandwhitelist.py b/sickbeard/blackandwhitelist.py index d4d98d3dc..71013208e 100644 --- a/sickbeard/blackandwhitelist.py +++ b/sickbeard/blackandwhitelist.py @@ -161,7 +161,7 @@ def short_group_names(groups): if line["shortname"]: shortGroupList.append(line["shortname"]) else: - if not groupName in shortGroupList: + if groupName not in shortGroupList: shortGroupList.append(groupName) else: shortGroupList = groups -- GitLab From 1ae38cec6ac9ec59a211a8bfd7d10ecbaa662596 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 03:53:59 -0500 Subject: [PATCH 016/215] PEP 257: Convert docstrings to triple quoted docstrings --- sickbeard/blackandwhitelist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/blackandwhitelist.py b/sickbeard/blackandwhitelist.py index 71013208e..06d8c2a07 100644 --- a/sickbeard/blackandwhitelist.py +++ b/sickbeard/blackandwhitelist.py @@ -136,7 +136,7 @@ class BlackAndWhiteList(object): class BlackWhitelistNoShowIDException(Exception): - 'No show_id was given' + """No show_id was given""" def short_group_names(groups): -- GitLab From 50ed65c979fa6a0558554e46732ffd137c712b58 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 03:55:35 -0500 Subject: [PATCH 017/215] PEP 263: Add encoding declaration --- sickbeard/blackandwhitelist.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/blackandwhitelist.py b/sickbeard/blackandwhitelist.py index 06d8c2a07..cc4efcd74 100644 --- a/sickbeard/blackandwhitelist.py +++ b/sickbeard/blackandwhitelist.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Dennis Lutter <lad1337@gmail.com> # URL: https://sickrage.tv/ # Git: https://github.com/SiCKRAGETV/SickRage.git -- GitLab From e6db3e3cdb12a29da0b19d6ab2689ebc088602ad Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 05:03:04 -0500 Subject: [PATCH 018/215] PEP 8: Add missing whitespace around operators and removed excess --- sickbeard/traktChecker.py | 66 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index beae78222..7446017c3 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -47,7 +47,7 @@ def setEpisodeToWanted(show, s, e): if epObj.status != SKIPPED or epObj.airdate == datetime.date.fromordinal(1): return - logger.log(u"Setting episode %s S%02dE%02d to wanted" %(show.name, s, e)) + logger.log(u"Setting episode %s S%02dE%02d to wanted" % (show.name, s, e)) # figure out what segment the episode is in and remember it so we can backlog it epObj.status = WANTED @@ -189,17 +189,17 @@ class TraktChecker(): logger.log(u"COLLECTION::REMOVE::START - Look for Episodes to Remove From Trakt Collection", logger.DEBUG) myDB = db.DBConnection() - sql_selection='select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode, tv_episodes.status, tv_episodes.location from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid' + sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode, tv_episodes.status, tv_episodes.location from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid' episodes = myDB.select(sql_selection) if episodes is not None: trakt_data = [] for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] - if self._checkInList(trakt_id,str(cur_episode["showid"]),str(cur_episode["season"]),str(cur_episode["episode"]), List='Collection'): + if self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"]), List='Collection'): if cur_episode["location"] == '': logger.log(u"Removing Episode %s S%02dE%02d from collection" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) - trakt_data.append((cur_episode["showid"],cur_episode["indexer"],cur_episode["show_name"],cur_episode["startyear"],cur_episode["season"], cur_episode["episode"])) + trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -217,16 +217,16 @@ class TraktChecker(): logger.log(u"COLLECTION::ADD::START - Look for Episodes to Add to Trakt Collection", logger.DEBUG) myDB = db.DBConnection() - sql_selection='select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid and tv_episodes.status in ('+','.join([str(x) for x in Quality.DOWNLOADED + [ARCHIVED]])+')' + sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid and tv_episodes.status in (' + ','.join([str(x) for x in Quality.DOWNLOADED + [ARCHIVED]]) + ')' episodes = myDB.select(sql_selection) if episodes is not None: trakt_data = [] for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] - if not self._checkInList(trakt_id,str(cur_episode["showid"]),str(cur_episode["season"]),str(cur_episode["episode"]), List='Collection'): + if not self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"]), List='Collection'): logger.log(u"Adding Episode %s S%02dE%02d to collection" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) - trakt_data.append((cur_episode["showid"],cur_episode["indexer"],cur_episode["show_name"],cur_episode["startyear"],cur_episode["season"], cur_episode["episode"])) + trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -259,17 +259,17 @@ class TraktChecker(): logger.log(u"WATCHLIST::REMOVE::START - Look for Episodes to Remove from Trakt Watchlist", logger.DEBUG) myDB = db.DBConnection() - sql_selection='select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode, tv_episodes.status from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid' + sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode, tv_episodes.status from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid' episodes = myDB.select(sql_selection) if episodes is not None: trakt_data = [] for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] - if self._checkInList(trakt_id,str(cur_episode["showid"]),str(cur_episode["season"]),str(cur_episode["episode"])): + if self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"])): if cur_episode["status"] not in Quality.SNATCHED + Quality.SNATCHED_PROPER + [UNKNOWN] + [WANTED]: logger.log(u"Removing Episode %s S%02dE%02d from watchlist" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) - trakt_data.append((cur_episode["showid"],cur_episode["indexer"],cur_episode["show_name"],cur_episode["startyear"],cur_episode["season"], cur_episode["episode"])) + trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -287,16 +287,16 @@ class TraktChecker(): logger.log(u"WATCHLIST::ADD::START - Look for Episodes to Add to Trakt Watchlist", logger.DEBUG) myDB = db.DBConnection() - sql_selection='select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid and tv_episodes.status in ('+','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER + [WANTED]])+')' + sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid and tv_episodes.status in (' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER + [WANTED]]) + ')' episodes = myDB.select(sql_selection) if episodes is not None: trakt_data = [] for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] - if not self._checkInList(trakt_id,str(cur_episode["showid"]),str(cur_episode["season"]),str(cur_episode["episode"])): + if not self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"])): logger.log(u"Adding Episode %s S%02dE%02d to watchlist" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) - trakt_data.append((cur_episode["showid"],cur_episode["indexer"],cur_episode["show_name"],cur_episode["startyear"],cur_episode["season"], + trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -318,8 +318,8 @@ class TraktChecker(): trakt_data = [] for show in sickbeard.showList: trakt_id = sickbeard.indexerApi(show.indexer).config['trakt_id'] - if not self._checkInList(trakt_id,str(show.indexerid),'0','0',List='Show'): - logger.log(u"Adding Show: Indexer %s %s - %s to Watchlist" % ( trakt_id,str(show.indexerid), show.name), logger.DEBUG) + if not self._checkInList(trakt_id, str(show.indexerid), '0', '0', List='Show'): + logger.log(u"Adding Show: Indexer %s %s - %s to Watchlist" % (trakt_id, str(show.indexerid), show.name), logger.DEBUG) show_el = {'title': show.name, 'year': show.startyear, 'ids': {}} if trakt_id == 'tvdb_id': show_el['ids']['tvdb'] = show.indexerid @@ -465,7 +465,7 @@ class TraktChecker(): self.todoWanted.remove(episode) setEpisodeToWanted(show, episode[1], episode[2]) - def _checkInList(self,trakt_id, showid, season, episode, List = None): + def _checkInList(self, trakt_id, showid, season, episode, List=None): """ Check in the Watchlist or CollectionList for Show Is the Show, Season and Episode in the trakt_id list (tvdb / tvrage) @@ -497,7 +497,7 @@ class TraktChecker(): """ try: - self.ShowWatchlist = { 'tvdb_id' : {}, 'tvrage_id': {} } + self.ShowWatchlist = {'tvdb_id': {}, 'tvrage_id': {}} TraktShowWatchlist = self.trakt_api.traktRequest("sync/watchlist/shows") tvdb_id = 'tvdb' tvrage_id = 'tvrage' @@ -515,10 +515,10 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) - self.ShowWatchlist[tvdb_id + '_id'][showid] = { 'id': showid , 'title' : title , 'year': year } + self.ShowWatchlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year} if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) - self.ShowWatchlist[tvrage_id + '_id'][showid] = { 'id': showid , 'title' : title , 'year': year } + self.ShowWatchlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year} except traktException as e: logger.log(u"Could not connect to trakt service, cannot download Show Watchlist: %s" % repr(e), logger.WARNING) @@ -532,7 +532,7 @@ class TraktChecker(): """ try: - self.EpisodeWatchlist = { 'tvdb_id' : {}, 'tvrage_id': {} } + self.EpisodeWatchlist = {'tvdb_id': {}, 'tvrage_id': {}} TraktEpisodeWatchlist = self.trakt_api.traktRequest("sync/watchlist/episodes") tvdb_id = 'tvdb' tvrage_id = 'tvrage' @@ -553,10 +553,10 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) if not showid in self.EpisodeWatchlist[tvdb_id + '_id'].keys(): - self.EpisodeWatchlist[tvdb_id + '_id'][showid] = { 'id': showid , 'title' : title , 'year': year , 'seasons' : {} } + self.EpisodeWatchlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} if not season in self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'].keys(): - self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season] = { 's': season , 'episodes' : {} } + self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} if not episode in self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode @@ -564,10 +564,10 @@ class TraktChecker(): if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) if not showid in self.EpisodeWatchlist[tvrage_id + '_id'].keys(): - self.EpisodeWatchlist[tvrage_id + '_id'][showid] = { 'id': showid , 'title' : title , 'year': year , 'seasons' : {} } + self.EpisodeWatchlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} if not season in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'].keys(): - self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season] = { 's': season , 'episodes' : {} } + self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} if not episode in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode @@ -585,7 +585,7 @@ class TraktChecker(): try: - self.Collectionlist = { 'tvdb_id' : {}, 'tvrage_id': {} } + self.Collectionlist = {'tvdb_id': {}, 'tvrage_id': {}} logger.log(u"Getting Show Collection", logger.DEBUG) TraktCollectionList = self.trakt_api.traktRequest("sync/collection/shows") tvdb_id = 'tvdb' @@ -611,10 +611,10 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) if not showid in self.Collectionlist[tvdb_id + '_id'].keys(): - self.Collectionlist[tvdb_id + '_id'][showid] = { 'id': showid , 'title' : title , 'year': year , 'seasons' : {} } + self.Collectionlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} if not season in self.Collectionlist[tvdb_id + '_id'][showid]['seasons'].keys(): - self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season] = { 's': season , 'episodes' : {} } + self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} if not episode in self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode @@ -622,10 +622,10 @@ class TraktChecker(): if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) if not showid in self.Collectionlist[tvrage_id + '_id'].keys(): - self.Collectionlist[tvrage_id + '_id'][showid] = { 'id': showid , 'title' : title , 'year': year , 'seasons' : {} } + self.Collectionlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} if not season in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'].keys(): - self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season] = { 's': season , 'episodes' : {} } + self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} if not episode in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode @@ -643,9 +643,9 @@ class TraktChecker(): uniqueShows = {} uniqueSeasons = {} - for showid,indexerid,show_name,startyear,season,episode in data: + for showid, indexerid, show_name, startyear, season, episode in data: if showid not in uniqueShows: - uniqueShows[showid] = {'title': show_name, 'year': startyear, 'ids': {},'seasons': []} + uniqueShows[showid] = {'title': show_name, 'year': startyear, 'ids': {}, 'seasons': []} trakt_id = sickbeard.indexerApi(indexerid).config['trakt_id'] if trakt_id == 'tvdb_id': uniqueShows[showid]['ids']["tvdb"] = showid @@ -654,7 +654,7 @@ class TraktChecker(): uniqueSeasons[showid] = [] # Get the unique seasons per Show - for showid,indexerid,show_name,startyear,season,episode in data: + for showid, indexerid, show_name, startyear, season, episode in data: if season not in uniqueSeasons[showid]: uniqueSeasons[showid].append(season) @@ -665,7 +665,7 @@ class TraktChecker(): seasonsList[searchedShow] = [] for searchedSeason in uniqueSeasons[searchedShow]: episodesList = [] - for showid,indexerid,show_name,startyear,season,episode in data: + for showid, indexerid, show_name, startyear, season, episode in data: if season == searchedSeason and showid == searchedShow: episodesList.append({'number': episode}) show = uniqueShows[searchedShow] -- GitLab From 53152773fbaa2b78b841a570151c23e937f0a927 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 05:15:46 -0500 Subject: [PATCH 019/215] PEP 8: Add and remove blank lines for consistency --- sickbeard/traktChecker.py | 59 ++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 7446017c3..e378bc20f 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -60,7 +60,6 @@ def setEpisodeToWanted(show, s, e): class TraktChecker(): - def __init__(self): self.trakt_api = TraktAPI(sickbeard.SSL_VERIFY, sickbeard.TRAKT_TIMEOUT) self.todoBacklog = [] @@ -71,7 +70,6 @@ class TraktChecker(): self.amActive = False def run(self, force=False): - self.amActive = True # add shows from trakt.tv watchlist @@ -128,6 +126,7 @@ class TraktChecker(): } ] } + if trakt_id == 'tvdb_id': data['shows'][0]['ids']['tvdb'] = show_obj.indexerid else: @@ -146,7 +145,6 @@ class TraktChecker(): show_obj: The TVShow object to add to trakt """ - data = {} if not self.findShow(show_obj.indexer, show_obj.indexerid): @@ -161,6 +159,7 @@ class TraktChecker(): } ] } + if trakt_id == 'tvdb_id': data['shows'][0]['ids']['tvdb'] = show_obj.indexerid else: @@ -191,10 +190,13 @@ class TraktChecker(): myDB = db.DBConnection() sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode, tv_episodes.status, tv_episodes.location from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid' episodes = myDB.select(sql_selection) + if episodes is not None: trakt_data = [] + for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] + if self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"]), List='Collection'): if cur_episode["location"] == '': logger.log(u"Removing Episode %s S%02dE%02d from collection" % @@ -202,7 +204,6 @@ class TraktChecker(): trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): - try: data = self.trakt_bulk_data_generate(trakt_data) self.trakt_api.traktRequest("sync/collection/remove", data, method='POST') @@ -219,17 +220,19 @@ class TraktChecker(): myDB = db.DBConnection() sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid and tv_episodes.status in (' + ','.join([str(x) for x in Quality.DOWNLOADED + [ARCHIVED]]) + ')' episodes = myDB.select(sql_selection) + if episodes is not None: trakt_data = [] + for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] + if not self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"]), List='Collection'): logger.log(u"Adding Episode %s S%02dE%02d to collection" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): - try: data = self.trakt_bulk_data_generate(trakt_data) self.trakt_api.traktRequest("sync/collection", data, method='POST') @@ -261,10 +264,13 @@ class TraktChecker(): myDB = db.DBConnection() sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode, tv_episodes.status from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid' episodes = myDB.select(sql_selection) + if episodes is not None: trakt_data = [] + for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] + if self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"])): if cur_episode["status"] not in Quality.SNATCHED + Quality.SNATCHED_PROPER + [UNKNOWN] + [WANTED]: logger.log(u"Removing Episode %s S%02dE%02d from watchlist" % @@ -272,7 +278,6 @@ class TraktChecker(): trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): - try: data = self.trakt_bulk_data_generate(trakt_data) self.trakt_api.traktRequest("sync/watchlist/remove", data, method='POST') @@ -289,10 +294,13 @@ class TraktChecker(): myDB = db.DBConnection() sql_selection = 'select tv_shows.indexer, tv_shows.startyear, showid, show_name, season, episode from tv_episodes,tv_shows where tv_shows.indexer_id = tv_episodes.showid and tv_episodes.status in (' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER + [WANTED]]) + ')' episodes = myDB.select(sql_selection) + if episodes is not None: trakt_data = [] + for cur_episode in episodes: trakt_id = sickbeard.indexerApi(cur_episode["indexer"]).config['trakt_id'] + if not self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"])): logger.log(u"Adding Episode %s S%02dE%02d to watchlist" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) @@ -300,7 +308,6 @@ class TraktChecker(): cur_episode["episode"])) if len(trakt_data): - try: data = self.trakt_bulk_data_generate(trakt_data) self.trakt_api.traktRequest("sync/watchlist", data, method='POST') @@ -316,8 +323,10 @@ class TraktChecker(): if sickbeard.showList is not None: trakt_data = [] + for show in sickbeard.showList: trakt_id = sickbeard.indexerApi(show.indexer).config['trakt_id'] + if not self._checkInList(trakt_id, str(show.indexerid), '0', '0', List='Show'): logger.log(u"Adding Show: Indexer %s %s - %s to Watchlist" % (trakt_id, str(show.indexerid), show.name), logger.DEBUG) show_el = {'title': show.name, 'year': show.startyear, 'ids': {}} @@ -328,7 +337,6 @@ class TraktChecker(): trakt_data.append(show_el) if len(trakt_data): - try: data = {'shows': trakt_data} self.trakt_api.traktRequest("sync/watchlist", data, method='POST') @@ -366,6 +374,7 @@ class TraktChecker(): indexer = int(sickbeard.TRAKT_DEFAULT_INDEXER) trakt_id = sickbeard.indexerApi(indexer).config['trakt_id'] + for show_el in self.ShowWatchlist[trakt_id]: indexer_id = int(str(show_el)) show = self.ShowWatchlist[trakt_id][show_el] @@ -378,6 +387,7 @@ class TraktChecker(): if int(sickbeard.TRAKT_METHOD_ADD) == 1: newShow = helpers.findCertainShow(sickbeard.showList, indexer_id) + if newShow is not None: setEpisodeToWanted(newShow, 1, 1) else: @@ -403,7 +413,6 @@ class TraktChecker(): indexer_id = int(show_el) show = self.EpisodeWatchlist[trakt_id][show_el] - newShow = helpers.findCertainShow(sickbeard.showList, indexer_id) try: @@ -411,14 +420,17 @@ class TraktChecker(): if indexer_id not in managed_show: self.addDefaultShow(indexer, indexer_id, show['title'], SKIPPED) managed_show.append(indexer_id) + for season_el in show['seasons']: season = int(season_el) + for episode_el in show['seasons'][season_el]['episodes']: self.todoWanted.append((indexer_id, season, int(episode_el))) else: if newShow.indexer == indexer: for season_el in show['seasons']: season = int(season_el) + for episode_el in show['seasons'][season_el]['episodes']: setEpisodeToWanted(newShow, season, int(episode_el)) except TypeError: @@ -441,6 +453,7 @@ class TraktChecker(): if location: showPath = ek(os.path.join, location, helpers.sanitizeFileName(name)) dir_exists = helpers.makeDir(showPath) + if not dir_exists: logger.log(u"Unable to create the folder %s , can't add the show" % showPath, logger.WARNING) return @@ -461,6 +474,7 @@ class TraktChecker(): def manageNewShow(self, show): logger.log(u"Checking if trakt watch list wants to search for episodes from new show " + show.name, logger.DEBUG) episodes = [i for i in self.todoWanted if i[0] == show.indexerid] + for episode in episodes: self.todoWanted.remove(episode) setEpisodeToWanted(show, episode[1], episode[2]) @@ -495,7 +509,6 @@ class TraktChecker(): """ Get Watchlist and parse once into addressable structure """ - try: self.ShowWatchlist = {'tvdb_id': {}, 'tvrage_id': {}} TraktShowWatchlist = self.trakt_api.traktRequest("sync/watchlist/shows") @@ -505,8 +518,10 @@ class TraktChecker(): for watchlist_el in TraktShowWatchlist: tvdb = False tvrage = False + if not watchlist_el['show']['ids']["tvdb"] is None: tvdb = True + if not watchlist_el['show']['ids']["tvrage"] is None: tvrage = True @@ -516,21 +531,19 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) self.ShowWatchlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year} + if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) self.ShowWatchlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year} - except traktException as e: logger.log(u"Could not connect to trakt service, cannot download Show Watchlist: %s" % repr(e), logger.WARNING) return False - return True def _getEpisodeWatchlist(self): """ Get Watchlist and parse once into addressable structure """ - try: self.EpisodeWatchlist = {'tvdb_id': {}, 'tvrage_id': {}} TraktEpisodeWatchlist = self.trakt_api.traktRequest("sync/watchlist/episodes") @@ -540,8 +553,10 @@ class TraktChecker(): for watchlist_el in TraktEpisodeWatchlist: tvdb = False tvrage = False + if not watchlist_el['show']['ids']["tvdb"] is None: tvdb = True + if not watchlist_el['show']['ids']["tvrage"] is None: tvrage = True @@ -552,6 +567,7 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) + if not showid in self.EpisodeWatchlist[tvdb_id + '_id'].keys(): self.EpisodeWatchlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} @@ -563,6 +579,7 @@ class TraktChecker(): if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) + if not showid in self.EpisodeWatchlist[tvrage_id + '_id'].keys(): self.EpisodeWatchlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} @@ -571,20 +588,16 @@ class TraktChecker(): if not episode in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode - except traktException as e: logger.log(u"Could not connect to trakt service, cannot download Episode Watchlist: %s" % repr(e), logger.WARNING) return False - return True def _getShowCollection(self): """ Get Collection and parse once into addressable structure """ - try: - self.Collectionlist = {'tvdb_id': {}, 'tvrage_id': {}} logger.log(u"Getting Show Collection", logger.DEBUG) TraktCollectionList = self.trakt_api.traktRequest("sync/collection/shows") @@ -594,8 +607,10 @@ class TraktChecker(): for watchlist_el in TraktCollectionList: tvdb = False tvrage = False + if not watchlist_el['show']['ids']["tvdb"] is None: tvdb = True + if not watchlist_el['show']['ids']["tvrage"] is None: tvrage = True @@ -610,6 +625,7 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) + if not showid in self.Collectionlist[tvdb_id + '_id'].keys(): self.Collectionlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} @@ -621,6 +637,7 @@ class TraktChecker(): if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) + if not showid in self.Collectionlist[tvrage_id + '_id'].keys(): self.Collectionlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} @@ -629,24 +646,23 @@ class TraktChecker(): if not episode in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode - except traktException as e: logger.log(u"Could not connect to trakt service, cannot download Show Collection: %s" % repr(e), logger.WARNING) return False - return True def trakt_bulk_data_generate(self, data): """ Build the JSON structure to send back to Trakt """ - uniqueShows = {} uniqueSeasons = {} + for showid, indexerid, show_name, startyear, season, episode in data: if showid not in uniqueShows: uniqueShows[showid] = {'title': show_name, 'year': startyear, 'ids': {}, 'seasons': []} trakt_id = sickbeard.indexerApi(indexerid).config['trakt_id'] + if trakt_id == 'tvdb_id': uniqueShows[showid]['ids']["tvdb"] = showid else: @@ -661,10 +677,13 @@ class TraktChecker(): # build the query showList = [] seasonsList = {} + for searchedShow in uniqueShows: seasonsList[searchedShow] = [] + for searchedSeason in uniqueSeasons[searchedShow]: episodesList = [] + for showid, indexerid, show_name, startyear, season, episode in data: if season == searchedSeason and showid == searchedShow: episodesList.append({'number': episode}) -- GitLab From b0f531cba0990be886cdb4ceb2fa96eb8f565ed0 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 05:18:04 -0500 Subject: [PATCH 020/215] PEP 8: Fix under-indented continuation lines --- sickbeard/traktChecker.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index e378bc20f..3247cdb3b 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -200,7 +200,7 @@ class TraktChecker(): if self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"]), List='Collection'): if cur_episode["location"] == '': logger.log(u"Removing Episode %s S%02dE%02d from collection" % - (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) + (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -229,7 +229,7 @@ class TraktChecker(): if not self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"]), List='Collection'): logger.log(u"Adding Episode %s S%02dE%02d to collection" % - (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) + (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -274,7 +274,7 @@ class TraktChecker(): if self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"])): if cur_episode["status"] not in Quality.SNATCHED + Quality.SNATCHED_PROPER + [UNKNOWN] + [WANTED]: logger.log(u"Removing Episode %s S%02dE%02d from watchlist" % - (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) + (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) if len(trakt_data): @@ -303,9 +303,9 @@ class TraktChecker(): if not self._checkInList(trakt_id, str(cur_episode["showid"]), str(cur_episode["season"]), str(cur_episode["episode"])): logger.log(u"Adding Episode %s S%02dE%02d to watchlist" % - (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) + (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], - cur_episode["episode"])) + cur_episode["episode"])) if len(trakt_data): try: -- GitLab From d7202f554a9fe0b32e190d2f9d7f057b7e479bc4 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 05:20:29 -0500 Subject: [PATCH 021/215] PEP 8: Convert membership test from 'not x in y' to 'x not in y' --- sickbeard/traktChecker.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 3247cdb3b..04699762f 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -568,25 +568,25 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) - if not showid in self.EpisodeWatchlist[tvdb_id + '_id'].keys(): + if showid not in self.EpisodeWatchlist[tvdb_id + '_id'].keys(): self.EpisodeWatchlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} - if not season in self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'].keys(): + if season not in self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'].keys(): self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} - if not episode in self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'].keys(): + if episode not in self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.EpisodeWatchlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) - if not showid in self.EpisodeWatchlist[tvrage_id + '_id'].keys(): + if showid not in self.EpisodeWatchlist[tvrage_id + '_id'].keys(): self.EpisodeWatchlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} - if not season in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'].keys(): + if season not in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'].keys(): self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} - if not episode in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): + if episode not in self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.EpisodeWatchlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode except traktException as e: logger.log(u"Could not connect to trakt service, cannot download Episode Watchlist: %s" % repr(e), logger.WARNING) @@ -626,25 +626,25 @@ class TraktChecker(): if tvdb: showid = str(watchlist_el['show']['ids'][tvdb_id]) - if not showid in self.Collectionlist[tvdb_id + '_id'].keys(): + if showid not in self.Collectionlist[tvdb_id + '_id'].keys(): self.Collectionlist[tvdb_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} - if not season in self.Collectionlist[tvdb_id + '_id'][showid]['seasons'].keys(): + if season not in self.Collectionlist[tvdb_id + '_id'][showid]['seasons'].keys(): self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} - if not episode in self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'].keys(): + if episode not in self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.Collectionlist[tvdb_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode if tvrage: showid = str(watchlist_el['show']['ids'][tvrage_id]) - if not showid in self.Collectionlist[tvrage_id + '_id'].keys(): + if showid not in self.Collectionlist[tvrage_id + '_id'].keys(): self.Collectionlist[tvrage_id + '_id'][showid] = {'id': showid, 'title': title, 'year': year, 'seasons': {}} - if not season in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'].keys(): + if season not in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'].keys(): self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season] = {'s': season, 'episodes': {}} - if not episode in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): + if episode not in self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'].keys(): self.Collectionlist[tvrage_id + '_id'][showid]['seasons'][season]['episodes'][episode] = episode except traktException as e: logger.log(u"Could not connect to trakt service, cannot download Show Collection: %s" % repr(e), logger.WARNING) -- GitLab From 5d7718603f83cb67097ca18c85130f10b28e05fd Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 05:36:55 -0500 Subject: [PATCH 022/215] PEP 263: Add encoding declaration --- sickbeard/traktChecker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 04699762f..2047ab45f 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Frank Fenton # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 792ff3bd9619254711192c3258631ee042f66ed8 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 08:53:51 -0500 Subject: [PATCH 023/215] Convert to new style classes --- sickbeard/traktChecker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 2047ab45f..5f81ed3ad 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -60,7 +60,7 @@ def setEpisodeToWanted(show, s, e): logger.log(u"Starting backlog search for %s S%02dE%02d because some episodes were set to wanted" % (show.name, s, e)) -class TraktChecker(): +class TraktChecker(object): def __init__(self): self.trakt_api = TraktAPI(sickbeard.SSL_VERIFY, sickbeard.TRAKT_TIMEOUT) self.todoBacklog = [] -- GitLab From 9a76b2559432cdafd4d5cbf19d84a47b609c1a5b Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Wed, 4 Nov 2015 02:58:41 -0500 Subject: [PATCH 024/215] PEP 8: Remove excess blank lines --- SickBeard.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index 7954af972..bcfabd2a0 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -92,7 +92,6 @@ class SickRage(object): self.log_dir = None self.consoleLogging = True - @staticmethod def help_message(): """ @@ -127,7 +126,6 @@ class SickRage(object): @staticmethod def fix_clients_nonsense(): - filenames = [ "sickbeard/clients/download_station.py", "sickbeard/clients/utorrent.py", @@ -140,11 +138,13 @@ class SickRage(object): for filename in filenames: filename = ek(os.path.join, sickbeard.PROG_DIR, filename) + try: if ek(os.path.exists, filename): ek(os.remove, filename) except Exception: pass + try: if ek(os.path.exists, filename + "c"): ek(os.remove, filename + "c") @@ -422,7 +422,6 @@ class SickRage(object): # Daemons traditionally run with umask 0 anyways and this should not have repercussions os.umask(0) - # Make the child a session-leader by detaching from the terminal try: pid = os.fork() # @UndefinedVariable - only available in UNIX @@ -436,6 +435,7 @@ class SickRage(object): if self.CREATEPID: pid = str(os.getpid()) logger.log(u"Writing PID: " + pid + " to " + str(self.PIDFILE)) + try: file(self.PIDFILE, 'w').write("%s\n" % pid) except IOError, e: @@ -460,7 +460,6 @@ class SickRage(object): try: if os.path.exists(PIDFILE): os.remove(PIDFILE) - except (IOError, OSError): return False @@ -471,7 +470,6 @@ class SickRage(object): """ Populates the showList with shows from the database """ - logger.log(u"Loading initial show list", logger.DEBUG) myDB = db.DBConnection() @@ -517,6 +515,7 @@ class SickRage(object): if self.webserver: logger.log("Shutting down Tornado") self.webserver.shutDown() + try: self.webserver.join(10) except Exception: -- GitLab From 941de3917da0d0bf304bc9b25fb1b54f5d3cff79 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 02:27:48 -0500 Subject: [PATCH 025/215] Streamline datetime call for backup file time-stamping --- SickBeard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SickBeard.py b/SickBeard.py index bcfabd2a0..6121919cc 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -495,7 +495,7 @@ class SickRage(object): for filename in filesList: srcFile = os.path.join(srcDir, filename) dstFile = os.path.join(dstDir, filename) - bakFile = os.path.join(dstDir, '{0}.bak-{1}'.format(filename, datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d_%H%M%S'))) + bakFile = os.path.join(dstDir, '{0}.bak-{1}'.format(filename, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'))) if os.path.isfile(dstFile): shutil.move(dstFile, bakFile) shutil.move(srcFile, dstFile) -- GitLab From cf725bad4b00e771326791e78142adc17dfc0448 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 02:30:03 -0500 Subject: [PATCH 026/215] PEP 263: Add encoding declaration --- SickBeard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/SickBeard.py b/SickBeard.py index 6121919cc..a87ac4946 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -1,4 +1,5 @@ #!/usr/bin/env python2.7 +# coding=utf-8 # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From ce124e5ea87e774d74a0c7fa37cef57cbb1e188e Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 09:25:44 -0500 Subject: [PATCH 027/215] Add comments for existing pylint codes --- SickBeard.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/SickBeard.py b/SickBeard.py index a87ac4946..a72addfdd 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -21,6 +21,7 @@ # Check needed software dependencies to nudge users to fix their setup # pylint: disable=W0703 +# Catching too general exception from __future__ import with_statement @@ -49,6 +50,7 @@ if sys.version_info < (2, 7): if sys.version_info >= (2, 7, 9): import ssl # pylint: disable=W0212 + # Access to a protected member of a client class ssl._create_default_https_context = ssl._create_unverified_context import locale @@ -72,6 +74,7 @@ signal.signal(signal.SIGTERM, sickbeard.sig_handler) class SickRage(object): # pylint: disable=R0902 + # Too many instance attributes def __init__(self): # system event callback for shutdown/restart sickbeard.events = Events(self.shutdown) @@ -153,6 +156,8 @@ class SickRage(object): pass # pylint: disable=R0912,R0915 + # Too many branches + # Too many statements def start(self): # do some preliminary stuff sickbeard.MY_FULLNAME = os.path.normpath(os.path.abspath(__file__)) @@ -177,11 +182,13 @@ class SickRage(object): if sys.platform == 'win32': # pylint: disable=E1101 + # An object is accessed for a non-existent member. if sys.getwindowsversion()[0] >= 6 and sys.stdout.encoding == 'cp65001': sickbeard.SYS_ENCODING = 'UTF-8' try: # pylint: disable=E1101 + # An object is accessed for a non-existent member. # On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError sys.setdefaultencoding(sickbeard.SYS_ENCODING) except Exception: @@ -196,6 +203,7 @@ class SickRage(object): try: # pylint: disable=W0612 + # Unused variable opts, args = getopt.getopt(sys.argv[1:], "hqdp::", ['help', 'quiet', 'nolaunch', 'daemon', 'pidfile=', 'port=', 'datadir=', 'config=', 'noresize']) # @UnusedVariable @@ -405,6 +413,8 @@ class SickRage(object): Fork off as a daemon """ # pylint: disable=E1101,W0212 + # An object is accessed for a non-existent member. + # Access to a protected member of a client class # Make a non-session-leader child process try: pid = os.fork() # @UndefinedVariable - only available in UNIX @@ -547,6 +557,7 @@ class SickRage(object): # system exit logger.shutdown() # Make sure the logger has stopped, just in case # pylint: disable=W0212 + # Access to a protected member of a client class os._exit(0) -- GitLab From b5333d881b008e9ae72cbf635b9b34fcb3caae5e Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Thu, 5 Nov 2015 07:02:30 -0500 Subject: [PATCH 028/215] PEP 8: Add missing whitespace around operators and removed excess --- sickbeard/helpers.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index cd195401e..473e50c80 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -87,18 +87,19 @@ def fixGlob(path): path = re.sub(r'\[', '[[]', path) return re.sub(r'(?<!\[)\]', '[]]', path) + def indentXML(elem, level=0): ''' Does our pretty printing, makes Matt very happy ''' - i = "\n" + level*" " + i = "\n" + level * " " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " if not elem.tail or not elem.tail.strip(): elem.tail = i for elem in elem: - indentXML(elem, level+1) + indentXML(elem, level + 1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: @@ -158,8 +159,8 @@ def remove_non_release_groups(name): r'^\[www\.Cpasbien\.pe\] ': 'searchre', r'^\[www\.Cpasbien\.com\] ': 'searchre', r'^\[ www\.Cpasbien\.pw \] ': 'searchre', - r'^\.www\.Cpasbien\.pw': 'searchre', - r'^\[www\.newpct1\.com\]': 'searchre', + r'^\.www\.Cpasbien\.pw': 'searchre', + r'^\[www\.newpct1\.com\]': 'searchre', r'^\[ www\.Cpasbien\.com \] ': 'searchre', r'- \{ www\.SceneTime\.com \}$': 'searchre', r'^\{ www\.SceneTime\.com \} - ': 'searchre', @@ -211,6 +212,7 @@ def notTorNZBFile(filename): return not (filename.endswith(".torrent") or filename.endswith(".nzb")) + def isSyncFile(filename): """ Returns true if filename is a syncfile, indicating filesystem may be in flux @@ -220,7 +222,7 @@ def isSyncFile(filename): """ extension = filename.rpartition(".")[2].lower() - #if extension == '!sync' or extension == 'lftp-pget-status' or extension == 'part' or extension == 'bts': + # if extension == '!sync' or extension == 'lftp-pget-status' or extension == 'part' or extension == 'bts': syncfiles = sickbeard.SYNC_FILES if extension in syncfiles.split(",") or filename.startswith('.syncthing'): return True @@ -306,7 +308,7 @@ def sanitizeFileName(name): # remove bad chars from the filename name = re.sub(r'[\\/\*]', '-', name) name = re.sub(r'[:"<>|?]', '', name) - name = re.sub(ur'\u2122', '', name) # Trade Mark Sign + name = re.sub(ur'\u2122', '', name) # Trade Mark Sign # remove leading/trailing periods and spaces name = name.strip(' .') @@ -352,6 +354,7 @@ def findCertainShow(showList, indexerid): elif len(results) > 1: raise MultipleShowObjectsException() + def makeDir(path): """ Make a directory on the filesystem @@ -468,6 +471,7 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None): return (None, None, None) + def listMediaFiles(path): """ Get a list of files possibly containing media in a path @@ -945,6 +949,7 @@ def arithmeticEval(s): return _eval(node.body) + def create_https_certificates(ssl_cert, ssl_key): """ Create self-signed HTTPS certificares and store in paths 'ssl_cert' and 'ssl_key' @@ -1117,6 +1122,7 @@ def get_lan_ip(): except Exception: return socket.gethostname() + def check_url(url): """ Check if a URL exists without downloading the whole file. @@ -1159,6 +1165,7 @@ To add a new encryption_version: # Key Generators unique_key1 = hex(uuid.getnode() ** 2) # Used in encryption v1 + # Encryption Functions def encrypt(data, encryption_version=0, _decrypt=False): # Version 1: Simple XOR encryption (this is not very secure, but works) @@ -1528,6 +1535,7 @@ def _getTempDir(): return os.path.join(tempfile.gettempdir(), "sickrage-%s" % (uid)) + def codeDescription(status_code): """ Returns the description of the URL error code @@ -1755,6 +1763,7 @@ def generateApiKey(): logger.log(u"New API generated") return m.hexdigest() + def pretty_filesize(file_bytes): """Return humanly formatted sizes from bytes""" for mod in ['B', 'KB', 'MB', 'GB', 'TB', 'PB']: @@ -1766,16 +1775,19 @@ if __name__ == '__main__': import doctest doctest.testmod() + def remove_article(text=''): """Remove the english articles from a text string""" return re.sub(r'(?i)^(?:(?:A(?!\s+to)n?)|The)\s(\w)', r'\1', text) + def generateCookieSecret(): """Generate a new cookie secret""" return base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes) + def verify_freespace(src, dest, oldfile=None): """ Checks if the target system has enough free space to copy or move a file. @@ -1840,6 +1852,7 @@ def verify_freespace(src, dest, oldfile=None): % (neededspace, pretty_filesize(neededspace), diskfree, pretty_filesize(diskfree)), logger.WARNING) return False + # https://gist.github.com/thatalextaylor/7408395 def pretty_time_delta(seconds): sign_string = '-' if seconds < 0 else '' @@ -1860,6 +1873,7 @@ def pretty_time_delta(seconds): return time_delta + def isFileLocked(checkfile, writeLockCheck=False): ''' Checks to see if a file is locked. Performs three checks @@ -1896,6 +1910,7 @@ def isFileLocked(checkfile, writeLockCheck=False): return False + def getDiskSpaceUsage(diskPath=None): ''' returns the free space in human readable bytes for a given path or False if no path given -- GitLab From 8cd170c077fe219e4326fe8d9f97f536374271b6 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 13:33:33 -0500 Subject: [PATCH 029/215] PEP 8: Fix indentation --- sickbeard/helpers.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 473e50c80..966e62d82 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -170,7 +170,7 @@ def remove_non_release_groups(name): r'\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre', r'- \[ www\.torrentday\.com \]$': 'searchre', r'^\[ www\.TorrentDay\.com \] - ': 'searchre', - } + } _name = name for remove_string, remove_type in removeWordsList.iteritems(): @@ -1813,8 +1813,7 @@ def verify_freespace(src, dest, oldfile=None): import sys def disk_usage(path): - _, total, free = ctypes.c_ulonglong(), ctypes.c_ulonglong(), \ - ctypes.c_ulonglong() + _, total, free = ctypes.c_ulonglong(), ctypes.c_ulonglong(), ctypes.c_ulonglong() if sys.version_info >= (3,) or isinstance(path, unicode): fun = ctypes.windll.kernel32.GetDiskFreeSpaceExW else: -- GitLab From 0fcb652db77ea3f9e8b7786f227e637505a8f7cc Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 14:03:04 -0500 Subject: [PATCH 030/215] PEP 257: Convert docstrings to triple double-quoted docstrings --- sickbeard/helpers.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 966e62d82..093d6f887 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -89,9 +89,9 @@ def fixGlob(path): def indentXML(elem, level=0): - ''' + """ Does our pretty printing, makes Matt very happy - ''' + """ i = "\n" + level * " " if len(elem): if not elem.text or not elem.text.strip(): @@ -1874,7 +1874,7 @@ def pretty_time_delta(seconds): def isFileLocked(checkfile, writeLockCheck=False): - ''' + """ Checks to see if a file is locked. Performs three checks 1. Checks if the file even exists 2. Attempts to open the file for reading. This will determine if the file has a write lock. @@ -1884,7 +1884,7 @@ def isFileLocked(checkfile, writeLockCheck=False): or deleted. :param file: the file being checked :param writeLockCheck: when true will check if the file is locked for writing (prevents move operations) - ''' + """ checkfile = ek(os.path.abspath, checkfile) @@ -1911,10 +1911,10 @@ def isFileLocked(checkfile, writeLockCheck=False): def getDiskSpaceUsage(diskPath=None): - ''' + """ returns the free space in human readable bytes for a given path or False if no path given :param diskPath: the filesystem path being checked - ''' + """ if diskPath and os.path.exists(diskPath): if platform.system() == 'Windows': free_bytes = ctypes.c_ulonglong(0) -- GitLab From 59db3d179b7c3a9433a9bcc0e72180d3e3e7cdf9 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 14:04:37 -0500 Subject: [PATCH 031/215] PEP 263: Add encoding declaration --- sickbeard/helpers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 093d6f887..b039cca90 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Nic Wolfe <nic@wolfeden.ca> # URL: https://sickrage.tv # Git: https://github.com/SiCKRAGETV/SickRage.git -- GitLab From 8d68fb947ddb20b7826f18698ca67c42088fc4d9 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 14:07:11 -0500 Subject: [PATCH 032/215] Remove redundant parentheses --- sickbeard/helpers.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index b039cca90..cf17110f8 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -463,14 +463,14 @@ def searchIndexerForShowID(regShowName, indexer=None, indexer_id=None, ui=None): ShowObj = findCertainShow(sickbeard.showList, int(series_id)) # Check if we can find the show in our list (if not, it's not the right show) if (indexer_id is None) and (ShowObj is not None) and (ShowObj.indexerid == int(series_id)): - return (seriesname, i, int(series_id)) + return seriesname, i, int(series_id) elif (indexer_id is not None) and (int(indexer_id) == int(series_id)): - return (seriesname, i, int(indexer_id)) + return seriesname, i, int(indexer_id) if indexer: break - return (None, None, None) + return None, None, None def listMediaFiles(path): @@ -820,7 +820,7 @@ def fixSetGroupID(childPath): try: ek(os.chown, childPath, -1, parentGID) # @UndefinedVariable - only available on UNIX - logger.log(u"Respecting the set-group-ID bit on the parent directory for %s" % (childPath), logger.DEBUG) + logger.log(u"Respecting the set-group-ID bit on the parent directory for %s" % childPath, logger.DEBUG) except OSError: logger.log( u"Failed to respect the set-group-ID bit on the parent directory for %s (setting group ID %i)" % ( @@ -886,7 +886,7 @@ def get_all_episodes_from_absolute_number(show, absolute_numbers, indexer_id=Non episodes.append(ep.episode) season = ep.season # this will always take the last found season so eps that cross the season border are not handeled well - return (season, episodes) + return season, episodes def sanitizeSceneName(name, anime=False): @@ -1534,7 +1534,7 @@ def _getTempDir(): except ImportError: return os.path.join(tempfile.gettempdir(), "sickrage") - return os.path.join(tempfile.gettempdir(), "sickrage-%s" % (uid)) + return os.path.join(tempfile.gettempdir(), "sickrage-%s" % uid) def codeDescription(status_code): -- GitLab From a6cb6255fcc66e6bc0f7b70fd377ae956bb7190d Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 14:00:39 -0500 Subject: [PATCH 033/215] Streamline datetime call for backup file time-stamping --- sickbeard/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index cf17110f8..c9d8cb948 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1421,7 +1421,7 @@ def restoreConfigZip(archive, targetDir): def path_leaf(path): head, tail = os.path.split(path) return tail or os.path.basename(head) - bakFilename = '{0}-{1}'.format(path_leaf(targetDir), datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d_%H%M%S')) + bakFilename = '{0}-{1}'.format(path_leaf(targetDir), datetime.datetime.now().strftime('%Y%m%d_%H%M%S')) shutil.move(targetDir, os.path.join(os.path.dirname(targetDir), bakFilename)) zip_file = zipfile.ZipFile(archive, 'r', allowZip64=True) -- GitLab From c12733b81fc3ef285267a071a0dacb12a0d77f39 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 09:51:34 -0500 Subject: [PATCH 034/215] PEP 8: Convert membership test from 'not x in y' to 'x not in y' --- sickbeard/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index c9d8cb948..96fbd39f5 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1562,7 +1562,7 @@ def _setUpSession(session, headers): session = CacheControl(sess=session, cache=caches.FileCache(os.path.join(cache_dir, 'sessions'), use_dir_lock=True), cache_etags=False) # request session clear residual referer - if 'Referer' in session.headers and not 'Referer' in headers: + if 'Referer' in session.headers and 'Referer' not in headers: session.headers.pop('Referer') # request session headers @@ -1573,7 +1573,7 @@ def _setUpSession(session, headers): session.verify = certifi.where() if sickbeard.SSL_VERIFY else False # request session proxies - if not 'Referer' in session.headers and sickbeard.PROXY_SETTING: + if 'Referer' not in session.headers and sickbeard.PROXY_SETTING: logger.log("Using proxy: " + sickbeard.PROXY_SETTING, logger.DEBUG) scheme, address = urllib2.splittype(sickbeard.PROXY_SETTING) address = sickbeard.PROXY_SETTING if scheme else 'http://' + sickbeard.PROXY_SETTING -- GitLab From a9ff03aae3077899d9e59499ad99527dfa5c1bae Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 13:54:15 -0500 Subject: [PATCH 035/215] PEP 8: Convert None comparisons from operators to 'is / is not None' --- sickbeard/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 96fbd39f5..a32f310f4 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1501,7 +1501,7 @@ def touchFile(fname, atime=None): :return: True on success, False on failure """ - if None != atime: + if atime is not None: try: with file(fname, 'a'): os.utime(fname, (atime, atime)) -- GitLab From 5d9cbdf7838544c49e2d674cf0961acbc5f37444 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 13:56:19 -0500 Subject: [PATCH 036/215] PEP 8: Convert lambda expression to a def --- sickbeard/helpers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index a32f310f4..3a639b59e 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1314,7 +1314,9 @@ def set_up_anidb_connection(): return False if not sickbeard.ADBA_CONNECTION: - anidb_logger = lambda x: logger.log("anidb: %s " % x, logger.DEBUG) + def anidb_logger(msg): + return logger.log("anidb: %s " % msg, logger.DEBUG) + try: sickbeard.ADBA_CONNECTION = adba.Connection(keepAlive=True, log=anidb_logger) except Exception as e: -- GitLab From 546812423a43dbb9417d1e1985fdf8eccf79e75f Mon Sep 17 00:00:00 2001 From: Alison Winters <alisonatwork@gmail.com> Date: Thu, 5 Nov 2015 21:34:59 +0100 Subject: [PATCH 037/215] make sure the caret is in the right place on -xs (mobile) layout --- gui/slick/views/layouts/main.mako | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index 54f227cd2..a9c233576 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -166,7 +166,7 @@ </li> <li id="NAVconfig" class="navbar-split dropdown${('', ' active')[topmenu == 'config']}"> - <a href="${srRoot}/config/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs">Config</span><img src="${srRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /> + <a href="${srRoot}/config/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs-inline">Config</span><img src="${srRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /> <b class="caret"></b> </a> <ul class="dropdown-menu"> @@ -203,7 +203,7 @@ toolsBadge = '' %> <li id="NAVsystem" class="navbar-split dropdown${('', ' active')[topmenu == 'system']}"> - <a href="${srRoot}/home/status/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs">Tools</span><img src="${srRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" />${toolsBadge} + <a href="${srRoot}/home/status/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs-inline">Tools</span><img src="${srRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" />${toolsBadge} <b class="caret"></b> </a> <ul class="dropdown-menu"> -- GitLab From 60fed92c90454ac6e0a03e1a3509e785a826d6a2 Mon Sep 17 00:00:00 2001 From: Fernando <fernandog@users.noreply.github.com> Date: Thu, 5 Nov 2015 19:35:54 -0200 Subject: [PATCH 038/215] Allow user to submit 'Unknown error code' message --- sickbeard/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index cd195401e..1d9b67a22 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1535,7 +1535,7 @@ def codeDescription(status_code): if status_code in clients.http_error_code: return clients.http_error_code[status_code] else: - logger.log(u"Unknown error code. Please submit an issue", logger.WARNING) + logger.log(u"Unknown error code: %s. Please submit an issue" % status_code , logger.ERROR) return 'unknown' -- GitLab From 0a8ec34a21fb649d790ae3d288594306ab49b418 Mon Sep 17 00:00:00 2001 From: Alison Winters <alisonatwork@gmail.com> Date: Thu, 5 Nov 2015 22:43:16 +0100 Subject: [PATCH 039/215] add aria-haspopup to force ie11/edge to emulate hover on these elements, also add superfluous span so that bootstrap-hover-dropdown correctly attaches the events --- gui/slick/views/layouts/main.mako | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index a9c233576..4dbb89fe3 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -109,7 +109,7 @@ <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> <li id="NAVhome" class="navbar-split dropdown${('', ' active')[topmenu == 'home']}"> - <a href="${srRoot}/home/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown">Shows + <a href="${srRoot}/home/" class="dropdown-toggle" aria-haspopup="true" data-toggle="dropdown" data-hover="dropdown"><span>Shows</span> <b class="caret"></b> </a> <ul class="dropdown-menu"> @@ -135,7 +135,7 @@ </li> <li id="NAVmanage" class="navbar-split dropdown${('', ' active')[topmenu == 'manage']}"> - <a href="${srRoot}/manage/episodeStatuses/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown">Manage + <a href="${srRoot}/manage/episodeStatuses/" class="dropdown-toggle" aria-haspopup="true" data-toggle="dropdown" data-hover="dropdown"><span>Manage</span> <b class="caret"></b> </a> <ul class="dropdown-menu"> @@ -166,7 +166,7 @@ </li> <li id="NAVconfig" class="navbar-split dropdown${('', ' active')[topmenu == 'config']}"> - <a href="${srRoot}/config/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs-inline">Config</span><img src="${srRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /> + <a href="${srRoot}/config/" class="dropdown-toggle" aria-haspopup="true" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs-inline">Config</span><img src="${srRoot}/images/menu/system18.png" class="navbaricon hidden-xs" /> <b class="caret"></b> </a> <ul class="dropdown-menu"> @@ -203,7 +203,7 @@ toolsBadge = '' %> <li id="NAVsystem" class="navbar-split dropdown${('', ' active')[topmenu == 'system']}"> - <a href="${srRoot}/home/status/" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs-inline">Tools</span><img src="${srRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" />${toolsBadge} + <a href="${srRoot}/home/status/" class="dropdown-toggle" aria-haspopup="true" data-toggle="dropdown" data-hover="dropdown"><span class="visible-xs-inline">Tools</span><img src="${srRoot}/images/menu/system18-2.png" class="navbaricon hidden-xs" />${toolsBadge} <b class="caret"></b> </a> <ul class="dropdown-menu"> -- GitLab From 59f703760e42dad4799c2d7ab0a185cff20ed2d8 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Thu, 5 Nov 2015 14:30:14 -0800 Subject: [PATCH 040/215] No spaces before commas. https://github.com/SiCKRAGETV/SickRage/pull/3097 --- sickbeard/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 1d9b67a22..be4c02f7e 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1535,7 +1535,7 @@ def codeDescription(status_code): if status_code in clients.http_error_code: return clients.http_error_code[status_code] else: - logger.log(u"Unknown error code: %s. Please submit an issue" % status_code , logger.ERROR) + logger.log(u"Unknown error code: %s. Please submit an issue" % status_code, logger.ERROR) return 'unknown' -- GitLab From 8f775f8049fa3520710013994b1d2bf4413842ee Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Thu, 5 Nov 2015 15:15:14 -0800 Subject: [PATCH 041/215] Fixes https://github.com/SiCKRAGETV/sickrage-issues/issues/3569 @MGaetan the inheritance chain is hella broken in webapi, we need some major changes --- sickbeard/webapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 29e0534e0..0023fe487 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -1512,7 +1512,7 @@ class CMD_SickBeardGetMessages(ApiCall): def run(self): messages = [] - for cur_notification in ui.notifications.get_notifications(self.request.remote_ip): + for cur_notification in ui.notifications.get_notifications(self.rh.request.remote_ip): messages.append({"title": cur_notification.title, "message": cur_notification.message, "type": cur_notification.type}) -- GitLab From 2d82a34d7ef442872ffac93e9c25597d40aa2732 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Thu, 5 Nov 2015 15:29:30 -0800 Subject: [PATCH 042/215] update kat to use a mirror --- sickbeard/providers/kat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index af650aad2..37039b73a 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -48,8 +48,8 @@ class KATProvider(generic.TorrentProvider): self.cache = KATCache(self) self.urls = { - 'base_url': 'https://kat.cr/', - 'search': 'https://kat.cr/%s/', + 'base_url': 'https://kickass.unblocked.la/', + 'search': base_url + '%s/', } self.url = self.urls['base_url'] -- GitLab From 0bfddc9faa87b78cb5f04f01eaf40d753d4c11c9 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Thu, 5 Nov 2015 16:03:33 -0800 Subject: [PATCH 043/215] oops --- sickbeard/providers/kat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 37039b73a..65fab5019 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -49,7 +49,7 @@ class KATProvider(generic.TorrentProvider): self.urls = { 'base_url': 'https://kickass.unblocked.la/', - 'search': base_url + '%s/', + 'search': 'https://kickass.unblocked.la/%s/', } self.url = self.urls['base_url'] -- GitLab From 93cd7013cf2dfddbde982c9e6fd7d7a59345c898 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 14:53:54 -0500 Subject: [PATCH 044/215] PEP 8: Add/remove lines and whitespace for consistency --- sickbeard/webserve.py | 108 ++++++++++++------------------------------ 1 file changed, 30 insertions(+), 78 deletions(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index b0907c84e..26f127da3 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -88,10 +88,11 @@ mako_lookup = None mako_cache = None mako_path = None + def get_lookup(): - global mako_lookup # pylint: disable=W0603 - global mako_cache # pylint: disable=W0603 - global mako_path # pylint: disable=W0603 + global mako_lookup # pylint: disable=W0603 + global mako_cache # pylint: disable=W0603 + global mako_path # pylint: disable=W0603 if mako_path is None: mako_path = os.path.join(sickbeard.PROG_DIR, "gui/" + sickbeard.GUI_NAME + "/views/") @@ -101,8 +102,8 @@ def get_lookup(): mako_lookup = TemplateLookup(directories=[mako_path], module_directory=mako_cache, format_exceptions=True) return mako_lookup -class PageTemplate(MakoTemplate): +class PageTemplate(MakoTemplate): def __init__(self, rh, filename): self.arguments = {} @@ -301,6 +302,7 @@ class LogoutHandler(BaseHandler): self.clear_cookie("sickrage_user") self.redirect('/login/') + class KeyHandler(RequestHandler): def __init__(self, *args, **kwargs): super(KeyHandler, self).__init__(*args, **kwargs) @@ -583,6 +585,7 @@ class CalendarHandler(BaseHandler): return ical + @route('/ui(/?.*)') class UI(WebRoot): def __init__(self, *args, **kwargs): @@ -681,10 +684,10 @@ class Home(WebRoot): myDB = db.DBConnection() today = str(datetime.date.today().toordinal()) - status_quality = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')' + status_quality = '(' + ','.join([str(x) for x in Quality.SNATCHED + Quality.SNATCHED_PROPER]) + ')' status_download = '(' + ','.join([str(x) for x in Quality.DOWNLOADED + Quality.ARCHIVED]) + ')' - sql_statement = 'SELECT showid, ' + sql_statement = 'SELECT showid, ' sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + status_quality + ') AS ep_snatched, ' sql_statement += '(SELECT COUNT(*) FROM tv_episodes WHERE showid=tv_eps.showid AND season > 0 AND episode > 0 AND airdate > 1 AND status IN ' + status_download + ') AS ep_downloaded, ' @@ -709,7 +712,6 @@ class Home(WebRoot): return show_stat, max_download_count - def is_alive(self, *args, **kwargs): if 'callback' in kwargs and '_' in kwargs: callback, _ = kwargs['callback'], kwargs['_'] @@ -741,9 +743,9 @@ class Home(WebRoot): @staticmethod def haveTORRENT(): - if sickbeard.USE_TORRENTS and sickbeard.TORRENT_METHOD != 'blackhole' \ - and (sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'https' - or not sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'http:'): + if sickbeard.USE_TORRENTS and sickbeard.TORRENT_METHOD != 'blackhole' and \ + (sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'https' or not + sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'http:'): return True else: return False @@ -810,7 +812,6 @@ class Home(WebRoot): else: return "Test prowl notice failed" - @staticmethod def testBoxcar(username=None): @@ -820,7 +821,6 @@ class Home(WebRoot): else: return "Error sending Boxcar notification" - @staticmethod def testBoxcar2(accesstoken=None): @@ -830,7 +830,6 @@ class Home(WebRoot): else: return "Error sending Boxcar2 notification" - @staticmethod def testPushover(userKey=None, apiKey=None): @@ -840,12 +839,10 @@ class Home(WebRoot): else: return "Error sending Pushover notification" - @staticmethod def twitterStep1(): return notifiers.twitter_notifier._get_authorization() - @staticmethod def twitterStep2(key): @@ -856,7 +853,6 @@ class Home(WebRoot): else: return "Unable to verify key" - @staticmethod def testTwitter(): @@ -866,7 +862,6 @@ class Home(WebRoot): else: return "Error sending tweet" - @staticmethod def testKODI(host=None, username=None, password=None): @@ -882,7 +877,6 @@ class Home(WebRoot): return finalResult - def testPMC(self, host=None, username=None, password=None): self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') @@ -1217,7 +1211,7 @@ class Home(WebRoot): else: submenu.append({'title': 'Pause', 'path': 'home/togglePause?show=%d' % showObj.indexerid, 'icon': 'ui-icon ui-icon-pause'}) - submenu.append({'title': 'Remove', 'path': 'home/deleteShow?show=%d' % showObj.indexerid, 'class':'removeshow', 'confirm': True, 'icon': 'ui-icon ui-icon-trash'}) + submenu.append({'title': 'Remove', 'path': 'home/deleteShow?show=%d' % showObj.indexerid, 'class': 'removeshow', 'confirm': True, 'icon': 'ui-icon ui-icon-trash'}) submenu.append({'title': 'Re-scan files', 'path': 'home/refreshShow?show=%d' % showObj.indexerid, 'icon': 'ui-icon ui-icon-refresh'}) submenu.append({'title': 'Force Full Update', 'path': 'home/updateShow?show=%d&force=1' % showObj.indexerid, 'icon': 'ui-icon ui-icon-transfer-e-w'}) submenu.append({'title': 'Update show in KODI', 'path': 'home/updateKODI?show=%d' % showObj.indexerid, 'requires': self.haveKODI(), 'icon': 'submenu-icon-kodi'}) @@ -1316,7 +1310,6 @@ class Home(WebRoot): out.append("S" + str(season) + ": " + ", ".join(names)) return "<br/>".join(out) - def editShow(self, show=None, location=None, anyQualities=[], bestQualities=[], exceptions_list=[], flatten_folders=None, paused=None, directCall=False, air_by_date=None, sports=None, dvdorder=None, indexerLang=None, subtitles=None, archive_firstmatch=None, rls_ignore_words=None, @@ -1372,7 +1365,7 @@ class Home(WebRoot): else: return t.render(show=show, scene_exceptions=scene_exceptions, title='Edit Show', header='Edit Show') - flatten_folders = not config.checkbox_to_value(flatten_folders) # UI inverts this value + flatten_folders = not config.checkbox_to_value(flatten_folders) # UI inverts this value dvdorder = config.checkbox_to_value(dvdorder) archive_firstmatch = config.checkbox_to_value(archive_firstmatch) paused = config.checkbox_to_value(paused) @@ -1601,7 +1594,6 @@ class Home(WebRoot): return self.redirect("/home/displayShow?show=" + str(showObj.indexerid)) - def updateKODI(self, show=None): showName = None showObj = None @@ -1716,12 +1708,12 @@ class Home(WebRoot): continue if int(status) in Quality.DOWNLOADED and epObj.status not in Quality.SNATCHED + \ - Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.DOWNLOADED + [IGNORED] and not ek(os.path.isfile, epObj.location): + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.DOWNLOADED + [IGNORED] and not ek(os.path.isfile, epObj.location): logger.log(u"Refusing to change status of " + curEp + " to DOWNLOADED because it's not SNATCHED/DOWNLOADED", logger.WARNING) continue if int(status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + \ - Quality.SNATCHED_BEST + Quality.DOWNLOADED + Quality.ARCHIVED: + Quality.SNATCHED_BEST + Quality.DOWNLOADED + Quality.ARCHIVED: logger.log(u"Refusing to change status of " + curEp + " to FAILED because it's not SNATCHED/DOWNLOADED", logger.WARNING) continue @@ -1794,7 +1786,6 @@ class Home(WebRoot): else: return self.redirect("/home/displayShow?show=" + show) - def testRename(self, show=None): if show is None: @@ -1838,9 +1829,7 @@ class Home(WebRoot): return t.render(submenu=submenu, ep_obj_list=ep_obj_rename_list, show=showObj, title='Preview Rename', header='Preview Rename') - def doRename(self, show=None, eps=None): - if show is None or eps is None: errMsg = "You must specify a show and at least one episode" return self._genericMessage("Error", errMsg) @@ -2057,7 +2046,8 @@ class Home(WebRoot): show = int(show) indexer = int(indexer) forAbsolute = int(forAbsolute) - if sceneAbsolute is not None: sceneAbsolute = int(sceneAbsolute) + if sceneAbsolute is not None: + sceneAbsolute = int(sceneAbsolute) set_scene_numbering(show, indexer, absolute_number=forAbsolute, sceneAbsolute=sceneAbsolute) else: @@ -2068,8 +2058,10 @@ class Home(WebRoot): indexer = int(indexer) forSeason = int(forSeason) forEpisode = int(forEpisode) - if sceneSeason is not None: sceneSeason = int(sceneSeason) - if sceneEpisode is not None: sceneEpisode = int(sceneEpisode) + if sceneSeason is not None: + sceneSeason = int(sceneSeason) + if sceneEpisode is not None: + sceneEpisode = int(sceneEpisode) set_scene_numbering(show, indexer, season=forSeason, episode=forEpisode, sceneSeason=sceneSeason, sceneEpisode=sceneEpisode) @@ -2089,9 +2081,7 @@ class Home(WebRoot): return json.dumps(result) - def retryEpisode(self, show, season, episode, downCurQuality): - # retrieve the episode object and fail if we can't get one ep_obj = self._getEpisode(show, season, episode) if isinstance(ep_obj, str): @@ -2120,6 +2110,7 @@ class Home(WebRoot): return json.dumps({'result': 'failure'}) + @route('/IRC(/?.*)') class HomeIRC(Home): def __init__(self, *args, **kwargs): @@ -2130,6 +2121,7 @@ class HomeIRC(Home): t = PageTemplate(rh=self, filename="IRC.mako") return t.render(topmenu="system", header="IRC", title="IRC") + @route('/news(/?.*)') class HomeNews(Home): def __init__(self, *args, **kwargs): @@ -2140,7 +2132,7 @@ class HomeNews(Home): news = sickbeard.versionCheckScheduler.action.check_for_new_news(force=True) except Exception: logger.log(u'Could not load news from repo, giving a link!', logger.DEBUG) - news = 'Could not load news from the repo. [Click here for news.md]('+sickbeard.NEWS_URL+')' + news = 'Could not load news from the repo. [Click here for news.md](' + sickbeard.NEWS_URL + ')' sickbeard.NEWS_LAST_READ = sickbeard.NEWS_LATEST sickbeard.NEWS_UNREAD = 0 @@ -2256,7 +2248,7 @@ class HomeAddShows(Home): for i, shows in results.iteritems(): final_results.extend([[sickbeard.indexerApi(i).name, i, sickbeard.indexerApi(i).config["show_url"], int(show['id']), - show['seriesname'], show['firstaired']] for show in shows]) + show['seriesname'], show['firstaired']] for show in shows]) # map(final_results.extend, # ([[sickbeard.indexerApi(id).name, id, sickbeard.indexerApi(id).config["show_url"], int(show['id']), @@ -2265,7 +2257,6 @@ class HomeAddShows(Home): lang_id = sickbeard.indexerApi().config['langabbv_to_id'][lang] return json.dumps({'results': final_results, 'langid': lang_id}) - def massAddTable(self, rootDir=None): t = PageTemplate(rh=self, filename="home_massAddTable.mako") @@ -2344,11 +2335,8 @@ class HomeAddShows(Home): if indexer_id and helpers.findCertainShow(sickbeard.showList, indexer_id): cur_dir['added_already'] = True - - return t.render(dirList=dir_list) - def newShow(self, show_to_add=None, other_shows=None, search_string=None): """ Display the new show page which collects a tvdb id, folder, and extra options and @@ -2501,7 +2489,6 @@ class HomeAddShows(Home): return t.render(blacklist=blacklist, trending_shows=trending_shows) - def popularShows(self): """ Fetches data from IMDB to show a list of popular shows. @@ -2516,9 +2503,7 @@ class HomeAddShows(Home): return t.render(title="Popular Shows", header="Popular Shows", popular_shows=popular_shows, imdb_exception=e, topmenu="home") - def addShowToBlacklist(self, indexer_id): - # URL parameters data = {'shows': [{'ids': {'tvdb': indexer_id}}]} @@ -2704,13 +2689,11 @@ class HomeAddShows(Home): return (indexer, show_dir, indexer_id, show_name) - def addExistingShows(self, shows_to_add=None, promptForSettings=None): """ Receives a dir list and add them. Adds the ones with given TVDB IDs first, then forwards along to the newShow page. """ - # grab a list of other shows to add, if provided if not shows_to_add: shows_to_add = [] @@ -2739,7 +2722,6 @@ class HomeAddShows(Home): indexer_id_given.append((int(indexer), show_dir, int(indexer_id), show_name)) - # if they want me to prompt for settings then I will just carry on to the newShow page if promptForSettings and shows_to_add: return self.newShow(shows_to_add[0], shows_to_add[1:]) @@ -2779,7 +2761,6 @@ class Manage(Home, WebRoot): def __init__(self, *args, **kwargs): super(Manage, self).__init__(*args, **kwargs) - def index(self): t = PageTemplate(rh=self, filename="manage.mako") return t.render(title='Mass Update', header='Mass Update', topmenu='manage') @@ -2807,7 +2788,6 @@ class Manage(Home, WebRoot): return json.dumps(result) - def episodeStatuses(self, whichStatus=None): if whichStatus: status_list = [int(whichStatus)] @@ -2850,9 +2830,7 @@ class Manage(Home, WebRoot): topmenu='manage', whichStatus=whichStatus, show_names=show_names, ep_counts=ep_counts, sorted_show_ids=sorted_show_ids) - def changeEpisodeStatuses(self, oldStatus, newStatus, *args, **kwargs): - status_list = [int(oldStatus)] if status_list[0] == SNATCHED: status_list = Quality.SNATCHED + Quality.SNATCHED_PROPER @@ -2918,9 +2896,7 @@ class Manage(Home, WebRoot): return json.dumps(result) - def subtitleMissed(self, whichSubs=None): - t = PageTemplate(rh=self, filename="manage_subtitleMissed.mako") if not whichSubs: @@ -2956,9 +2932,7 @@ class Manage(Home, WebRoot): return t.render(whichSubs=whichSubs, show_names=show_names, ep_counts=ep_counts, sorted_show_ids=sorted_show_ids, title='Missing Subtitles', header='Missing Subtitles', topmenu='manage') - def downloadSubtitleMissed(self, *args, **kwargs): - to_download = {} # make a list of all shows and their associated args @@ -2991,9 +2965,7 @@ class Manage(Home, WebRoot): return self.redirect('/manage/subtitleMissed/') - def backlogShow(self, indexer_id): - show_obj = helpers.findCertainShow(sickbeard.showList, int(indexer_id)) if show_obj: @@ -3001,9 +2973,7 @@ class Manage(Home, WebRoot): return self.redirect("/manage/backlogOverview/") - def backlogOverview(self): - t = PageTemplate(rh=self, filename="manage_backlogOverview.mako") showCounts = {} @@ -3039,9 +3009,7 @@ class Manage(Home, WebRoot): return t.render(showCounts=showCounts, showCats=showCats, showSQLResults=showSQLResults, title='Backlog Overview', header='Backlog Overview', topmenu='manage') - def massEdit(self, toEdit=None): - t = PageTemplate(rh=self, filename="manage_massEdit.mako") if not toEdit: @@ -3176,12 +3144,10 @@ class Manage(Home, WebRoot): quality_value=quality_value, subtitles_value=subtitles_value, scene_value=scene_value, sports_value=sports_value, air_by_date_value=air_by_date_value, root_dir_list=root_dir_list, title='Mass Edit', header='Mass Edit', topmenu='manage') - def massEditSubmit(self, archive_firstmatch=None, paused=None, default_ep_status=None, anime=None, sports=None, scene=None, flatten_folders=None, quality_preset=None, subtitles=None, air_by_date=None, anyQualities=[], bestQualities=[], toEdit=None, *args, **kwargs): - dir_map = {} for cur_arg in kwargs: if not cur_arg.startswith('orig_root_dir_'): @@ -3289,10 +3255,8 @@ class Manage(Home, WebRoot): return self.redirect("/manage/") - def massUpdate(self, toUpdate=None, toRefresh=None, toRename=None, toDelete=None, toRemove=None, toMetadata=None, toSubtitle=None): - if toUpdate is not None: toUpdate = toUpdate.split('|') else: @@ -3409,9 +3373,7 @@ class Manage(Home, WebRoot): return self.redirect("/manage/") - def manageTorrents(self): - t = PageTemplate(rh=self, filename="manage_torrents.mako") info_download_station = '' @@ -3439,9 +3401,7 @@ class Manage(Home, WebRoot): webui_url=webui_url, info_download_station=info_download_station, title='Manage Torrents', header='Manage Torrents', topmenu='manage') - def failedDownloads(self, limit=100, toRemove=None): - myDB = db.DBConnection('failed.db') if limit == "0": @@ -3495,9 +3455,7 @@ class ManageSearches(Manage): return self.redirect("/manage/manageSearches/") - def forceFindPropers(self): - # force it to run the next time it looks result = sickbeard.properFinderScheduler.forceRun() if result: @@ -3506,7 +3464,6 @@ class ManageSearches(Manage): return self.redirect("/manage/manageSearches/") - def pauseBacklog(self, paused=None): if paused == "1": sickbeard.searchQueueScheduler.action.pause_backlog() @@ -3575,8 +3532,8 @@ class History(WebRoot): t = PageTemplate(rh=self, filename="history.mako") submenu = [ - {'title': 'Clear History', 'path': 'history/clearHistory', 'icon': 'ui-icon ui-icon-trash', 'class': 'clearhistory', 'confirm':True}, - {'title': 'Trim History', 'path': 'history/trimHistory', 'icon': 'ui-icon ui-icon-trash', 'class': 'trimhistory', 'confirm':True}, + {'title': 'Clear History', 'path': 'history/clearHistory', 'icon': 'ui-icon ui-icon-trash', 'class': 'clearhistory', 'confirm': True}, + {'title': 'Trim History', 'path': 'history/trimHistory', 'icon': 'ui-icon ui-icon-trash', 'class': 'trimhistory', 'confirm': True}, ] return t.render(historyResults=data, compactResults=compact, limit=limit, submenu=submenu, title='History', header='History', topmenu="history") @@ -3753,7 +3710,6 @@ class ConfigGeneral(Config): sickbeard.TIMEZONE_DISPLAY = timezone_display - if not config.change_LOG_DIR(log_dir, web_log): results += ["Unable to create directory " + os.path.normpath(log_dir) + ", log directory not changed."] @@ -4302,9 +4258,7 @@ class ConfigProviders(Config): return '1' - def saveProviders(self, newznab_string='', torrentrss_string='', provider_order=None, **kwargs): - results = [] provider_str_list = provider_order.split() @@ -4980,8 +4934,8 @@ class ErrorLogs(WebRoot): def ErrorLogsMenu(self, level): menu = [ {'title': 'Clear Errors', 'path': 'errorlogs/clearerrors/', 'requires': self.haveErrors() and level == logger.ERROR, 'icon': 'ui-icon ui-icon-trash'}, - {'title': 'Clear Warnings', 'path': 'errorlogs/clearerrors/?level='+str(logger.WARNING), 'requires': self.haveWarnings() and level == logger.WARNING, 'icon': 'ui-icon ui-icon-trash'}, - {'title': 'Submit Errors', 'path': 'errorlogs/submit_errors/', 'requires': self.haveErrors() and level == logger.ERROR, 'class':'sumbiterrors', 'confirm': True, 'icon': 'ui-icon ui-icon-arrowreturnthick-1-n'}, + {'title': 'Clear Warnings', 'path': 'errorlogs/clearerrors/?level=' + str(logger.WARNING), 'requires': self.haveWarnings() and level == logger.WARNING, 'icon': 'ui-icon ui-icon-trash'}, + {'title': 'Submit Errors', 'path': 'errorlogs/submit_errors/', 'requires': self.haveErrors() and level == logger.ERROR, 'class': 'sumbiterrors', 'confirm': True, 'icon': 'ui-icon ui-icon-arrowreturnthick-1-n'}, ] return menu @@ -5052,8 +5006,6 @@ class ErrorLogs(WebRoot): finalData.append("AA" + x) numLines += 1 - - if numLines >= numToShow: return finalData -- GitLab From 6d8b748b9fad5d7182bcba1c65e126d96e9c1f3b Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 15:15:42 -0500 Subject: [PATCH 045/215] PEP 257: Convert docstrings to triple double-quoted docstrings --- sickbeard/webserve.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 26f127da3..466652b89 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -4156,11 +4156,11 @@ class ConfigProviders(Config): @staticmethod def getNewznabCategories(name, url, key): - ''' + """ Retrieves a list of possible categories with category id's Using the default url/api?cat http://yournewznaburl.com/api?t=caps&apikey=yourapikey - ''' + """ error = "" success = False -- GitLab From 296a833d5213cc96d1d4d6a89bea4426bd55c026 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 15:13:37 -0500 Subject: [PATCH 046/215] PEP 263: Add encoding declaration --- sickbeard/webserve.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 466652b89..a5e5f70ed 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 9e531684f6e0a51ee2af63fd18f97bb901205407 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 15:14:07 -0500 Subject: [PATCH 047/215] Remove redundant parentheses --- sickbeard/webserve.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index a5e5f70ed..aae49ecd8 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2677,18 +2677,18 @@ class HomeAddShows(Home): @staticmethod def split_extra_show(extra_show): if not extra_show: - return (None, None, None, None) + return None, None, None, None split_vals = extra_show.split('|') if len(split_vals) < 4: indexer = split_vals[0] show_dir = split_vals[1] - return (indexer, show_dir, None, None) + return indexer, show_dir, None, None indexer = split_vals[0] show_dir = split_vals[1] indexer_id = split_vals[2] show_name = '|'.join(split_vals[3:]) - return (indexer, show_dir, indexer_id, show_name) + return indexer, show_dir, indexer_id, show_name def addExistingShows(self, shows_to_add=None, promptForSettings=None): """ -- GitLab From 63f96e461b8d3158d02d3761a131527895c04587 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 14:58:31 -0500 Subject: [PATCH 048/215] PEP 8: Convert comparisons --- sickbeard/webserve.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index aae49ecd8..b00e7fcf6 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -1111,7 +1111,7 @@ class Home(WebRoot): checkversion = CheckVersion() backup = checkversion._runbackup() - if backup == True: + if backup is True: if sickbeard.versionCheckScheduler.action.update(): # do a hard restart @@ -2713,7 +2713,7 @@ class HomeAddShows(Home): split_vals = cur_dir.split('|') if len(split_vals) < 3: dirs_only.append(cur_dir) - if not '|' in cur_dir: + if '|' not in cur_dir: dirs_only.append(cur_dir) else: indexer, show_dir, indexer_id, show_name = self.split_extra_show(cur_dir) @@ -4172,7 +4172,7 @@ class ConfigProviders(Config): if not key: error += "\nNo Provider Api key specified" - if error <> "": + if error != "": return json.dumps({'success': False, 'error': error}) # Get list with Newznabproviders -- GitLab From ea5ffdeece4140e84e223f51437795b4c50ece7c Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 15:07:06 -0500 Subject: [PATCH 049/215] PEP 203: Replace assignment with augmented assignment --- sickbeard/webserve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index b00e7fcf6..5a15c504b 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -3391,7 +3391,7 @@ class Manage(Home, WebRoot): webui_url = '/'.join(s.strip('/') for s in (webui_url, 'gui/')) if sickbeard.TORRENT_METHOD == 'download_station': if helpers.check_url(webui_url + 'download/'): - webui_url = webui_url + 'download/' + webui_url += 'download/' else: info_download_station = '<p>To have a better experience please set the Download Station alias as <code>download</code>, you can check this setting in the Synology DSM <b>Control Panel</b> > <b>Application Portal</b>. Make sure you allow DSM to be embedded with iFrames too in <b>Control Panel</b> > <b>DSM Settings</b> > <b>Security</b>.</p><br/><p>There is more information about this available <a href="https://github.com/midgetspy/Sick-Beard/pull/338">here</a>.</p><br/>' -- GitLab From 9cb7474ae318084157092c15b01b35a059a1c520 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 15:13:10 -0500 Subject: [PATCH 050/215] Streamline dict and list creation --- sickbeard/webserve.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 5a15c504b..2ba745e3f 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2412,8 +2412,7 @@ class HomeAddShows(Home): library_shows = trakt_api.traktRequest("sync/collection/shows?extended=full") or [] for show_detail in shows: - show = {} - show['show'] = show_detail + show = {'show': show_detail} try: if not helpers.findCertainShow(sickbeard.showList, [int(show['show']['ids']['tvdb'])]): if show['show']['ids']['tvdb'] not in (lshow['show']['ids']['tvdb'] for lshow in library_shows): @@ -3761,9 +3760,9 @@ class ConfigBackupRestore(Config): finalResult = '' if backupDir: - source = [os.path.join(sickbeard.DATA_DIR, 'sickbeard.db'), sickbeard.CONFIG_FILE] - source.append(os.path.join(sickbeard.DATA_DIR, 'failed.db')) - source.append(os.path.join(sickbeard.DATA_DIR, 'cache.db')) + source = [os.path.join(sickbeard.DATA_DIR, 'sickbeard.db'), sickbeard.CONFIG_FILE, + os.path.join(sickbeard.DATA_DIR, 'failed.db'), + os.path.join(sickbeard.DATA_DIR, 'cache.db')] target = os.path.join(backupDir, 'sickrage-' + time.strftime('%Y%m%d%H%M%S') + '.zip') for (path, dirs, files) in os.walk(sickbeard.CACHE_DIR, topdown=True): -- GitLab From 955135b3ea99cbe7913c5151630802c544d35838 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Thu, 5 Nov 2015 20:23:05 -0500 Subject: [PATCH 051/215] Make sure we use .has_key() for statusStrings --- sickbeard/webserve.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 2ba745e3f..7a4fe2baa 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -1654,6 +1654,7 @@ class Home(WebRoot): else: return self._genericMessage("Error", errMsg) + # Use .has_key() since it is overridden for statusStrings in common.py if not statusStrings.has_key(int(status)): errMsg = "Invalid status" if direct: -- GitLab From 9ad7d4c5c4c871652228585312c3f53b1bb5f371 Mon Sep 17 00:00:00 2001 From: Fernando <fernandog@users.noreply.github.com> Date: Fri, 6 Nov 2015 09:58:16 -0200 Subject: [PATCH 052/215] Add missing CF error codes - fix SiCKRAGETV/sickrage-issues/issues/3577 https://support.cloudflare.com/hc/en-us/sections/200820298-Error-Pages --- sickbeard/clients/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sickbeard/clients/__init__.py b/sickbeard/clients/__init__.py index 7fe1f62f3..1d262205c 100644 --- a/sickbeard/clients/__init__.py +++ b/sickbeard/clients/__init__.py @@ -91,8 +91,13 @@ http_error_code = { 509: 'Bandwidth Limit Exceeded', 510: 'Not Extended', 511: 'Network Authentication Required', - 522: 'Cloudfare Connection timed out', - 524: 'Request to host timedout waiting for reply back', + 520: 'Cloudfare - Web server is returning an unknown error', + 521: 'Cloudfare - Web server is down', + 522: 'Cloudfare - Connection timed out', + 523: 'Cloudfare - Origin is unreachable', + 524: 'Cloudfare - A timeout occurred', + 525: 'Cloudfare - SSL handshake failed', + 526: 'Cloudfare - Invalid SSL certificate', 598: 'Network read timeout error', 599: 'Network connect timeout error ' } -- GitLab From ead4066b48c156ebefc5a774f1b729b3fa39f8b6 Mon Sep 17 00:00:00 2001 From: medariox <dariovizz@hotmail.it> Date: Fri, 6 Nov 2015 13:33:12 +0100 Subject: [PATCH 053/215] Updated subliminal (develop) to newest version --- lib/subliminal/api.py | 2 +- lib/subliminal/cli.py | 5 ++- lib/subliminal/exceptions.py | 5 +++ lib/subliminal/providers/addic7ed.py | 29 +++++++------ lib/subliminal/providers/napiprojekt.py | 5 ++- lib/subliminal/providers/opensubtitles.py | 19 +++++---- lib/subliminal/providers/podnapisi.py | 8 ++-- lib/subliminal/providers/thesubdb.py | 4 +- lib/subliminal/providers/tvsubtitles.py | 4 +- lib/subliminal/subtitle.py | 50 ++++++++++++++++++++--- lib/subliminal/video.py | 18 +++++--- 11 files changed, 103 insertions(+), 46 deletions(-) diff --git a/lib/subliminal/api.py b/lib/subliminal/api.py index 906b897c9..ee51940a9 100644 --- a/lib/subliminal/api.py +++ b/lib/subliminal/api.py @@ -363,7 +363,7 @@ def download_best_subtitles(videos, languages, min_score=0, hearing_impaired=Fal checked_videos = [] for video in videos: if not check_video(video, languages=languages, undefined=only_one): - logger.info('Skipping video %r') + logger.info('Skipping video %r', video) continue checked_videos.append(video) diff --git a/lib/subliminal/cli.py b/lib/subliminal/cli.py index c419ef46a..2c4f4c14f 100644 --- a/lib/subliminal/cli.py +++ b/lib/subliminal/cli.py @@ -307,7 +307,8 @@ def download(obj, provider, language, age, directory, encoding, single, force, h # directories if os.path.isdir(p): try: - scanned_videos = scan_videos(p, subtitles=not force, embedded_subtitles=not force) + scanned_videos = scan_videos(p, subtitles=not force, embedded_subtitles=not force, + subtitles_dir=directory) except: logger.exception('Unexpected error while collecting directory path %s', p) errored_paths.append(p) @@ -321,7 +322,7 @@ def download(obj, provider, language, age, directory, encoding, single, force, h # other inputs try: - video = scan_video(p, subtitles=not force, embedded_subtitles=not force) + video = scan_video(p, subtitles=not force, embedded_subtitles=not force, subtitles_dir=directory) except: logger.exception('Unexpected error while collecting path %s', p) errored_paths.append(p) diff --git a/lib/subliminal/exceptions.py b/lib/subliminal/exceptions.py index de2fabc0e..5f5c7a773 100644 --- a/lib/subliminal/exceptions.py +++ b/lib/subliminal/exceptions.py @@ -19,6 +19,11 @@ class AuthenticationError(ProviderError): pass +class TooManyRequests(ProviderError): + """Exception raised by providers when too many requests are made.""" + pass + + class DownloadLimitExceeded(ProviderError): """Exception raised by providers when download limit is exceeded.""" pass diff --git a/lib/subliminal/providers/addic7ed.py b/lib/subliminal/providers/addic7ed.py index 3edfe357a..c8b9ed2bc 100644 --- a/lib/subliminal/providers/addic7ed.py +++ b/lib/subliminal/providers/addic7ed.py @@ -8,14 +8,15 @@ from requests import Session from . import ParserBeautifulSoup, Provider, get_version from .. import __version__ from ..cache import SHOW_EXPIRATION_TIME, region -from ..exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded -from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_properties +from ..exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, TooManyRequests +from ..subtitle import (Subtitle, fix_line_ending, guess_matches, guess_properties, sanitize_string, + sanitized_string_equal) from ..video import Episode logger = logging.getLogger(__name__) language_converters.register('addic7ed = subliminal.converters.addic7ed:Addic7edConverter') -series_year_re = re.compile('^(?P<series>[ \w]+)(?: \((?P<year>\d{4})\))?$') +series_year_re = re.compile('^(?P<series>[ \w\'.:]+)(?: \((?P<year>\d{4})\))?$') class Addic7edSubtitle(Subtitle): @@ -40,7 +41,7 @@ class Addic7edSubtitle(Subtitle): matches = super(Addic7edSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired) # series - if video.series and self.series.lower() == video.series.lower(): + if video.series and sanitized_string_equal(self.series, video.series): matches.add('series') # season if video.season and self.season == video.season: @@ -49,7 +50,7 @@ class Addic7edSubtitle(Subtitle): if video.episode and self.episode == video.episode: matches.add('episode') # title - if video.title and self.title.lower() == video.title.lower(): + if video.title and sanitized_string_equal(self.title, video.title): matches.add('title') # year if video.year == self.year: @@ -130,7 +131,7 @@ class Addic7edProvider(Provider): # populate the show ids show_ids = {} for show in soup.select('td.version > h3 > a[href^="/show/"]'): - show_ids[show.text.lower().replace('\'', '')] = int(show['href'][6:]) + show_ids[sanitize_string(show.text).lower()] = int(show['href'][6:]) logger.debug('Found %d show ids', len(show_ids)) return show_ids @@ -147,8 +148,8 @@ class Addic7edProvider(Provider): """ # build the params - series_year = '%s (%d)' % (series, year) if year is not None else series - params = {'search': series_year, 'Submit': 'Search'} + series_year = '%s %d' % (series, year) if year is not None else series + params = {'search': sanitize_string(series_year, replacement=' '), 'Submit': 'Search'} # make the search logger.info('Searching show ids with %r', params) @@ -161,7 +162,7 @@ class Addic7edProvider(Provider): if not suggestion: logger.warning('Show id not found: no suggestion') return None - if not suggestion[0].i.text.lower() == series_year.lower(): + if not sanitized_string_equal(suggestion[0].i.text, series_year): logger.warning('Show id not found: suggestion does not match') return None show_id = int(suggestion[0]['href'][6:]) @@ -183,24 +184,24 @@ class Addic7edProvider(Provider): :rtype: int or None """ - series_clean = series.lower().replace('\'', '') + series_sanitized = sanitize_string(series).lower() show_ids = self._get_show_ids() show_id = None # attempt with country if not show_id and country_code: logger.debug('Getting show id with country') - show_id = show_ids.get('%s (%s)' % (series_clean, country_code.lower())) + show_id = show_ids.get('%s %s' % (series_sanitized, country_code.lower())) # attempt with year if not show_id and year: logger.debug('Getting show id with year') - show_id = show_ids.get('%s (%d)' % (series_clean, year)) + show_id = show_ids.get('%s %d' % (series_sanitized, year)) # attempt clean if not show_id: logger.debug('Getting show id') - show_id = show_ids.get(series_clean) + show_id = show_ids.get(series_sanitized) # search as last resort if not show_id: @@ -220,6 +221,8 @@ class Addic7edProvider(Provider): logger.info('Getting the page of show id %d, season %d', show_id, season) r = self.session.get(self.server_url + 'show/%d' % show_id, params={'season': season}, timeout=10) r.raise_for_status() + if r.status_code == 304: + raise TooManyRequests() soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser']) # loop over subtitle rows diff --git a/lib/subliminal/providers/napiprojekt.py b/lib/subliminal/providers/napiprojekt.py index c89db7fb6..ef64a7171 100644 --- a/lib/subliminal/providers/napiprojekt.py +++ b/lib/subliminal/providers/napiprojekt.py @@ -4,7 +4,8 @@ import logging from babelfish import Language from requests import Session -from . import Provider +from . import Provider, get_version +from .. import __version__ from ..subtitle import Subtitle logger = logging.getLogger(__name__) @@ -61,7 +62,7 @@ class NapiProjektProvider(Provider): server_url = 'http://napiprojekt.pl/unit_napisy/dl.php' def initialize(self): - self.session = Session() + self.session.headers = {'User-Agent': 'Subliminal/%s' % get_version(__version__)} def terminate(self): self.session.close() diff --git a/lib/subliminal/providers/opensubtitles.py b/lib/subliminal/providers/opensubtitles.py index 9698c11de..5a06a23b8 100644 --- a/lib/subliminal/providers/opensubtitles.py +++ b/lib/subliminal/providers/opensubtitles.py @@ -12,7 +12,7 @@ from six.moves.xmlrpc_client import ServerProxy from . import Provider, TimeoutSafeTransport, get_version from .. import __version__ from ..exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError -from ..subtitle import Subtitle, fix_line_ending, guess_matches +from ..subtitle import Subtitle, fix_line_ending, guess_matches, sanitized_string_equal from ..video import Episode, Movie logger = logging.getLogger(__name__) @@ -23,8 +23,8 @@ class OpenSubtitlesSubtitle(Subtitle): series_re = re.compile('^"(?P<series_name>.*)" (?P<series_title>.*)$') def __init__(self, language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind, hash, movie_name, - movie_release_name, movie_year, movie_imdb_id, series_season, series_episode): - super(OpenSubtitlesSubtitle, self).__init__(language, hearing_impaired, page_link) + movie_release_name, movie_year, movie_imdb_id, series_season, series_episode, encoding): + super(OpenSubtitlesSubtitle, self).__init__(language, hearing_impaired, page_link, encoding) self.subtitle_id = subtitle_id self.matched_by = matched_by self.movie_kind = movie_kind @@ -54,7 +54,7 @@ class OpenSubtitlesSubtitle(Subtitle): # episode if isinstance(video, Episode) and self.movie_kind == 'episode': # series - if video.series and self.series_name.lower() == video.series.lower(): + if video.series and sanitized_string_equal(self.series_name, video.series): matches.add('series') # season if video.season and self.series_season == video.season: @@ -63,14 +63,14 @@ class OpenSubtitlesSubtitle(Subtitle): if video.episode and self.series_episode == video.episode: matches.add('episode') # title - if video.title and self.series_title.lower() == video.title.lower(): + if video.title and sanitized_string_equal(self.series_title, video.title): matches.add('title') # guess matches |= guess_matches(video, guess_episode_info(self.movie_release_name + '.mkv')) # movie elif isinstance(video, Movie) and self.movie_kind == 'movie': # title - if video.title and self.movie_name.lower() == video.title.lower(): + if video.title and sanitized_string_equal(self.movie_name, video.title): matches.add('title') # year if video.year and self.movie_year == video.year: @@ -129,9 +129,9 @@ class OpenSubtitlesProvider(Provider): if imdb_id: criteria.append({'imdbid': imdb_id}) if query and season and episode: - criteria.append({'query': query, 'season': season, 'episode': episode}) + criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode}) elif query: - criteria.append({'query': query}) + criteria.append({'query': query.replace('\'', '')}) if not criteria: raise ValueError('Not enough information') @@ -165,10 +165,11 @@ class OpenSubtitlesProvider(Provider): movie_imdb_id = int(subtitle_item['IDMovieImdb']) series_season = int(subtitle_item['SeriesSeason']) if subtitle_item['SeriesSeason'] else None series_episode = int(subtitle_item['SeriesEpisode']) if subtitle_item['SeriesEpisode'] else None + encoding = subtitle_item.get('SubEncoding') or None subtitle = OpenSubtitlesSubtitle(language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind, hash, movie_name, movie_release_name, movie_year, movie_imdb_id, - series_season, series_episode) + series_season, series_episode, encoding) logger.debug('Found subtitle %r', subtitle) subtitles.append(subtitle) diff --git a/lib/subliminal/providers/podnapisi.py b/lib/subliminal/providers/podnapisi.py index 2790c6fa0..3a1455714 100644 --- a/lib/subliminal/providers/podnapisi.py +++ b/lib/subliminal/providers/podnapisi.py @@ -18,7 +18,7 @@ from zipfile import ZipFile from . import Provider, get_version from .. import __version__ from ..exceptions import ProviderError -from ..subtitle import Subtitle, fix_line_ending, guess_matches +from ..subtitle import Subtitle, fix_line_ending, guess_matches, sanitized_string_equal from ..video import Episode, Movie logger = logging.getLogger(__name__) @@ -47,7 +47,7 @@ class PodnapisiSubtitle(Subtitle): # episode if isinstance(video, Episode): # series - if video.series and self.title.lower() == video.series.lower(): + if video.series and sanitized_string_equal(self.title, video.series): matches.add('series') # season if video.season and self.season == video.season: @@ -61,7 +61,7 @@ class PodnapisiSubtitle(Subtitle): # movie elif isinstance(video, Movie): # title - if video.title and self.title.lower() == video.title.lower(): + if video.title and sanitized_string_equal(self.title, video.title): matches.add('title') # guess for release in self.releases: @@ -162,7 +162,7 @@ class PodnapisiProvider(Provider): def download_subtitle(self, subtitle): # download as a zip - logger.info('Downloading subtitle %r') + logger.info('Downloading subtitle %r', subtitle) r = self.session.get(self.server_url + subtitle.pid + '/download', params={'container': 'zip'}, timeout=10) r.raise_for_status() diff --git a/lib/subliminal/providers/thesubdb.py b/lib/subliminal/providers/thesubdb.py index 67d71a504..f7f1f2451 100644 --- a/lib/subliminal/providers/thesubdb.py +++ b/lib/subliminal/providers/thesubdb.py @@ -21,7 +21,7 @@ class TheSubDBSubtitle(Subtitle): @property def id(self): - return self.hash + return self.hash + '-' + str(self.language) def get_matches(self, video, hearing_impaired=False): matches = super(TheSubDBSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired) @@ -73,7 +73,7 @@ class TheSubDBProvider(Provider): return [s for s in self.query(video.hashes['thesubdb']) if s.language in languages] def download_subtitle(self, subtitle): - logger.info('Downloading subtitle %r') + logger.info('Downloading subtitle %r', subtitle) params = {'action': 'download', 'hash': subtitle.hash, 'language': subtitle.language.alpha2} r = self.session.get(self.server_url, params=params, timeout=10) r.raise_for_status() diff --git a/lib/subliminal/providers/tvsubtitles.py b/lib/subliminal/providers/tvsubtitles.py index 06fd878a9..6df1ad227 100644 --- a/lib/subliminal/providers/tvsubtitles.py +++ b/lib/subliminal/providers/tvsubtitles.py @@ -11,7 +11,7 @@ from . import ParserBeautifulSoup, Provider, get_version from .. import __version__ from ..cache import EPISODE_EXPIRATION_TIME, SHOW_EXPIRATION_TIME, region from ..exceptions import ProviderError -from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_properties +from ..subtitle import Subtitle, fix_line_ending, guess_matches, guess_properties, sanitized_string_equal from ..video import Episode logger = logging.getLogger(__name__) @@ -42,7 +42,7 @@ class TVsubtitlesSubtitle(Subtitle): matches = super(TVsubtitlesSubtitle, self).get_matches(video, hearing_impaired=hearing_impaired) # series - if video.series and self.series.lower() == video.series.lower(): + if video.series and sanitized_string_equal(self.series, video.series): matches.add('series') # season if video.season and self.season == video.season: diff --git a/lib/subliminal/subtitle.py b/lib/subliminal/subtitle.py index eeb840a80..5694af741 100644 --- a/lib/subliminal/subtitle.py +++ b/lib/subliminal/subtitle.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- import logging import os +import re import chardet from guessit.matchtree import MatchTree from guessit.plugins.transformers import get_transformer +from codecs import lookup import pysrt from .video import Episode, Movie @@ -25,7 +27,7 @@ class Subtitle(object): #: Name of the provider that returns that class of subtitle provider_name = '' - def __init__(self, language, hearing_impaired=False, page_link=None): + def __init__(self, language, hearing_impaired=False, page_link=None, encoding=None): #: Language of the subtitle self.language = language @@ -39,7 +41,15 @@ class Subtitle(object): self.content = None #: Encoding to decode with when accessing :attr:`text` - self.encoding = None + if encoding: + try: + # set encoding to canonical codec name + self.encoding = lookup(encoding).name + except (TypeError, LookupError): + logger.debug('Unsupported encoding "%s", setting to None', encoding) + self.encoding = None + else: + self.encoding = None @property def id(self): @@ -56,7 +66,11 @@ class Subtitle(object): if not self.content: return - return self.content.decode(self.encoding or self.guess_encoding(), errors='replace') + try: + return self.content.decode(self.encoding, errors='replace') + except (TypeError, LookupError): + # Failback to guess_encoding if empty or unknown encoding provided + return self.content.decode(self.guess_encoding(), errors='replace') def is_valid(self): """Check if a :attr:`text` is a valid SubRip format. @@ -219,6 +233,32 @@ def get_subtitle_path(video_path, language=None, extension='.srt'): return subtitle_root + extension +def sanitize_string(string, replacement=''): + """Replace any special characters from a string. + + :param str string: the string to sanitize. + :param str replacement: the replacement for special characters. + :return: the sanitized string. + :rtype: str + + """ + return re.sub('[^ a-zA-Z0-9]', replacement, string) + + +def sanitized_string_equal(string1, string2): + """Test two strings for equality case insensitively and ignoring special characters. + + :param str string1: the first string to compare. + :param str string2: the second string to compare. + :return: `True` if the two strings are equal, `False` otherwise. + :rtype: bool + + """ + valid_pattern = '[^a-zA-Z0-9]' + + return sanitize_string(string1).lower() == sanitize_string(string2).lower() + + def guess_matches(video, guess, partial=False): """Get matches between a `video` and a `guess`. @@ -236,7 +276,7 @@ def guess_matches(video, guess, partial=False): matches = set() if isinstance(video, Episode): # series - if video.series and 'series' in guess and guess['series'].lower() == video.series.lower(): + if video.series and 'series' in guess and sanitized_string_equal(guess['series'], video.series): matches.add('series') # season if video.season and 'season' in guess and guess['season'] == video.season: @@ -255,7 +295,7 @@ def guess_matches(video, guess, partial=False): if video.year and 'year' in guess and guess['year'] == video.year: matches.add('year') # title - if video.title and 'title' in guess and guess['title'].lower() == video.title.lower(): + if video.title and 'title' in guess and sanitized_string_equal(guess['title'], video.title): matches.add('title') # release_group if video.release_group and 'releaseGroup' in guess and guess['releaseGroup'].lower() == video.release_group.lower(): diff --git a/lib/subliminal/video.py b/lib/subliminal/video.py index cc916ed1b..11fbfcd90 100644 --- a/lib/subliminal/video.py +++ b/lib/subliminal/video.py @@ -235,10 +235,13 @@ class Movie(Video): return '<%s [%r, %d]>' % (self.__class__.__name__, self.title, self.year) -def search_external_subtitles(path): +def search_external_subtitles(path, directory=None): """Search for external subtitles from a video `path` and their associated language. + Unless `directory` is provided, search will be made in the same directory as the video file. + :param str path: path to the video. + :param str directory: directory to search for subtitles. :return: found subtitles with their languages. :rtype: dict @@ -247,7 +250,7 @@ def search_external_subtitles(path): dirpath = dirpath or '.' fileroot, fileext = os.path.splitext(filename) subtitles = {} - for p in os.listdir(dirpath): + for p in os.listdir(directory or dirpath): # keep only valid subtitle filenames if not p.startswith(fileroot) or not p.endswith(SUBTITLE_EXTENSIONS): continue @@ -272,12 +275,13 @@ def search_external_subtitles(path): return subtitles -def scan_video(path, subtitles=True, embedded_subtitles=True): +def scan_video(path, subtitles=True, embedded_subtitles=True, subtitles_dir=None): """Scan a video and its subtitle languages from a video `path`. :param str path: existing path to the video. :param bool subtitles: scan for subtitles with the same name. :param bool embedded_subtitles: scan for embedded subtitles. + :param str subtitles_dir: directory to search for subtitles. :return: the scanned video. :rtype: :class:`Video` @@ -309,7 +313,7 @@ def scan_video(path, subtitles=True, embedded_subtitles=True): # external subtitles if subtitles: - video.subtitle_languages |= set(search_external_subtitles(path).values()) + video.subtitle_languages |= set(search_external_subtitles(path, directory=subtitles_dir).values()) # video metadata with enzyme try: @@ -388,12 +392,13 @@ def scan_video(path, subtitles=True, embedded_subtitles=True): return video -def scan_videos(path, subtitles=True, embedded_subtitles=True): +def scan_videos(path, subtitles=True, embedded_subtitles=True, subtitles_dir=None): """Scan `path` for videos and their subtitles. :param str path: existing directory path to scan. :param bool subtitles: scan for subtitles with the same name. :param bool embedded_subtitles: scan for embedded subtitles. + :param str subtitles_dir: directory to search for subtitles. :return: the scanned videos. :rtype: list of :class:`Video` @@ -438,7 +443,8 @@ def scan_videos(path, subtitles=True, embedded_subtitles=True): # scan video try: - video = scan_video(filepath, subtitles=subtitles, embedded_subtitles=embedded_subtitles) + video = scan_video(filepath, subtitles=subtitles, embedded_subtitles=embedded_subtitles, + subtitles_dir=subtitles_dir) except ValueError: # pragma: no cover logger.exception('Error scanning video') continue -- GitLab From 39cbb85bcb060275af2feeb2a28888dfab255b5b Mon Sep 17 00:00:00 2001 From: kounch <kounch@mac.com> Date: Fri, 6 Nov 2015 15:51:17 +0100 Subject: [PATCH 054/215] Added MLDonkey basic client --- gui/slick/js/configSearch.js | 10 ++++++ gui/slick/views/config_search.mako | 4 +-- sickbeard/__init__.py | 2 +- sickbeard/clients/__init__.py | 6 ++-- sickbeard/clients/mlnet_client.py | 54 ++++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 sickbeard/clients/mlnet_client.py diff --git a/gui/slick/js/configSearch.js b/gui/slick/js/configSearch.js index 35dfd6b00..eca621cb5 100644 --- a/gui/slick/js/configSearch.js +++ b/gui/slick/js/configSearch.js @@ -166,6 +166,16 @@ $(document).ready(function(){ $(torrent_label_option).hide(); $(torrent_label_anime_option).hide(); $('#host_desc_torrent').text('URL to your qbittorrent client (e.g. http://localhost:8080)'); + } else if ('mlnet' == selectedProvider){ + client = 'mlnet'; + $(torrent_path_option).hide(); + $(torrent_label_option).hide(); + $(torrent_verify_cert_option).hide(); + $(torrent_verify_deluge).hide(); + $(torrent_verify_rtorrent).hide(); + $(torrent_label_anime_option).hide(); + $(torrent_paused_option).hide(); + $('#host_desc_torrent').text('URL to your MLDonkey (e.g. http://localhost:4080)'); } $('#host_title').text(client + host); $('#username_title').text(client + username); diff --git a/gui/slick/views/config_search.mako b/gui/slick/views/config_search.mako index 1733d42c8..d8b1e4914 100644 --- a/gui/slick/views/config_search.mako +++ b/gui/slick/views/config_search.mako @@ -453,8 +453,8 @@ <span class="component-title">Send .torrent files to:</span> <span class="component-desc"> <select name="torrent_method" id="torrent_method" class="form-control input-sm"> -<% torrent_method_text = {'blackhole': "Black hole", 'utorrent': "uTorrent", 'transmission': "Transmission", 'deluge': "Deluge (via WebUI)", 'deluged': "Deluge (via Daemon)", 'download_station': "Synology DS", 'rtorrent': "rTorrent", 'qbittorrent': "qbittorrent"} %> -% for curAction in ('blackhole', 'utorrent', 'transmission', 'deluge', 'deluged', 'download_station', 'rtorrent', 'qbittorrent'): +<% torrent_method_text = {'blackhole': "Black hole", 'utorrent': "uTorrent", 'transmission': "Transmission", 'deluge': "Deluge (via WebUI)", 'deluged': "Deluge (via Daemon)", 'download_station': "Synology DS", 'rtorrent': "rTorrent", 'qbittorrent': "qbittorrent", 'mlnet': "MLDonkey"} %> +% for curAction in ('blackhole', 'utorrent', 'transmission', 'deluge', 'deluged', 'download_station', 'rtorrent', 'qbittorrent', 'mlnet'): <option value="${curAction}" ${('', 'selected="selected"')[sickbeard.TORRENT_METHOD == curAction]}>${torrent_method_text[curAction]}</option> % endfor </select> diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 73b06fd4c..61a43f017 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -857,7 +857,7 @@ def initialize(consoleLogging=True): NZB_METHOD = 'blackhole' TORRENT_METHOD = check_setting_str(CFG, 'General', 'torrent_method', 'blackhole') - if TORRENT_METHOD not in ('blackhole', 'utorrent', 'transmission', 'deluge', 'deluged', 'download_station', 'rtorrent', 'qbittorrent'): + if TORRENT_METHOD not in ('blackhole', 'utorrent', 'transmission', 'deluge', 'deluged', 'download_station', 'rtorrent', 'qbittorrent', 'mlnet'): TORRENT_METHOD = 'blackhole' DOWNLOAD_PROPERS = bool(check_setting_int(CFG, 'General', 'download_propers', 1)) diff --git a/sickbeard/clients/__init__.py b/sickbeard/clients/__init__.py index 7fe1f62f3..2745ffaff 100644 --- a/sickbeard/clients/__init__.py +++ b/sickbeard/clients/__init__.py @@ -22,7 +22,8 @@ __all__ = ['utorrent', 'deluged', 'download_station', 'rtorrent', - 'qbittorrent' + 'qbittorrent', + 'mlnet' ] @@ -103,7 +104,8 @@ default_host = {'utorrent': 'http://localhost:8000', 'deluged': 'scgi://localhost:58846', 'download_station': 'http://localhost:5000', 'rtorrent': 'scgi://localhost:5000', - 'qbittorrent': 'http://localhost:8080' + 'qbittorrent': 'http://localhost:8080', + 'mlnet': 'http://localhost:4080' } diff --git a/sickbeard/clients/mlnet_client.py b/sickbeard/clients/mlnet_client.py new file mode 100644 index 000000000..3661ee5ca --- /dev/null +++ b/sickbeard/clients/mlnet_client.py @@ -0,0 +1,54 @@ +# Author: kounch +# URL: http://code.google.com/p/sickbeard/ +# +# This file is part of SickRage. +# +# SickRage is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# SickRage is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SickRage. If not, see <http://www.gnu.org/licenses/>. + +import sickbeard +from .generic import GenericClient +from requests.auth import HTTPDigestAuth + +class mlnetAPI(GenericClient): + def __init__(self, host=None, username=None, password=None): + + super(mlnetAPI, self).__init__('mlnet', host, username, password) + + self.url = self.host + #self.session.auth = HTTPDigestAuth(self.username, self.password); + + def _get_auth(self): + + try: + self.response = self.session.get(self.host, verify=False) + self.auth = self.response.content + except: + return None + + return self.auth if not self.response.status_code == 404 else None + + def _add_torrent_uri(self, result): + + self.url = self.host+'submit' + params = {'q': 'dllink ' + result.url} + return self._request(method='get', params=params) + + def _add_torrent_file(self, result): + + self.url = self.host+'submit' + params = {'q': 'dllink ' + result.url} + return self._request(method='get', params=params) + +api = mlnetAPI() + -- GitLab From 012c0be2b006696afc3b9ad2ba31f77f6a96049a Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Thu, 5 Nov 2015 20:57:53 -0800 Subject: [PATCH 055/215] Remove glype proxy support --- sickbeard/helpers.py | 98 +++++++++++++---------------- sickbeard/providers/extratorrent.py | 2 +- sickbeard/providers/generic.py | 65 ++----------------- sickbeard/providers/kat.py | 2 +- sickbeard/providers/rarbg.py | 4 -- sickbeard/providers/thepiratebay.py | 5 +- sickbeard/providers/torrentz.py | 2 +- sickbeard/tvcache.py | 6 +- 8 files changed, 56 insertions(+), 128 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 536bb76b5..afbcbd5b4 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -126,7 +126,6 @@ def remove_non_release_groups(name): """ Remove non release groups from name """ - if not name: return name @@ -134,44 +133,45 @@ def remove_non_release_groups(name): # Check your database for funky release_names and add them here, to improve failed handling, archiving, and history. # select release_name from tv_episodes WHERE LENGTH(release_name); # [eSc], [SSG], [GWC] are valid release groups for non-anime - removeWordsList = {r'\[rartv\]$': 'searchre', - r'\[rarbg\]$': 'searchre', - r'\[eztv\]$': 'searchre', - r'\[ettv\]$': 'searchre', - r'\[cttv\]$': 'searchre', - r'\[vtv\]$': 'searchre', - r'\[EtHD\]$': 'searchre', - r'\[GloDLS\]$': 'searchre', - r'\[silv4\]$': 'searchre', - r'\[Seedbox\]$': 'searchre', - r'\[PublicHD\]$': 'searchre', - r'\[AndroidTwoU\]$': 'searchre', - r'\.\[BT\]$': 'searchre', - r' \[1044\]$': 'searchre', - r'\.RiPSaLoT$': 'searchre', - r'\.GiuseppeTnT$': 'searchre', - r'\.Renc$': 'searchre', - r'-NZBGEEK$': 'searchre', - r'-Siklopentan$': 'searchre', - r'-\SpastikusTV\]$': 'searchre', - r'-RP$': 'searchre', - r'-20-40$': 'searchre', - r'\.\[www\.usabit\.com\]$': 'searchre', - r'^\[www\.Cpasbien\.pe\] ': 'searchre', - r'^\[www\.Cpasbien\.com\] ': 'searchre', - r'^\[ www\.Cpasbien\.pw \] ': 'searchre', - r'^\.www\.Cpasbien\.pw': 'searchre', - r'^\[www\.newpct1\.com\]': 'searchre', - r'^\[ www\.Cpasbien\.com \] ': 'searchre', - r'- \{ www\.SceneTime\.com \}$': 'searchre', - r'^\{ www\.SceneTime\.com \} - ': 'searchre', - r'^\[www\.frenchtorrentdb\.com\] ': 'searchre', - r'^\]\.\[www\.tensiontorrent.com\] - ': 'searchre', - r'^\]\.\[ www\.tensiontorrent.com \] - ': 'searchre', - r'\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre', - r'- \[ www\.torrentday\.com \]$': 'searchre', - r'^\[ www\.TorrentDay\.com \] - ': 'searchre', - } + removeWordsList = { + r'\[rartv\]$': 'searchre', + r'\[rarbg\]$': 'searchre', + r'\[eztv\]$': 'searchre', + r'\[ettv\]$': 'searchre', + r'\[cttv\]$': 'searchre', + r'\[vtv\]$': 'searchre', + r'\[EtHD\]$': 'searchre', + r'\[GloDLS\]$': 'searchre', + r'\[silv4\]$': 'searchre', + r'\[Seedbox\]$': 'searchre', + r'\[PublicHD\]$': 'searchre', + r'\[AndroidTwoU\]$': 'searchre', + r'\.\[BT\]$': 'searchre', + r' \[1044\]$': 'searchre', + r'\.RiPSaLoT$': 'searchre', + r'\.GiuseppeTnT$': 'searchre', + r'\.Renc$': 'searchre', + r'-NZBGEEK$': 'searchre', + r'-Siklopentan$': 'searchre', + r'-\[SpastikusTV\]$': 'searchre', + r'-RP$': 'searchre', + r'-20-40$': 'searchre', + r'\.\[www\.usabit\.com\]$': 'searchre', + r'^\[www\.Cpasbien\.pe\] ': 'searchre', + r'^\[www\.Cpasbien\.com\] ': 'searchre', + r'^\[ www\.Cpasbien\.pw \] ': 'searchre', + r'^\.www\.Cpasbien\.pw': 'searchre', + r'^\[www\.newpct1\.com\]': 'searchre', + r'^\[ www\.Cpasbien\.com \] ': 'searchre', + r'- \{ www\.SceneTime\.com \}$': 'searchre', + r'^\{ www\.SceneTime\.com \} - ': 'searchre', + r'^\[www\.frenchtorrentdb\.com\] ': 'searchre', + r'^\]\.\[www\.tensiontorrent.com\] - ': 'searchre', + r'^\]\.\[ www\.tensiontorrent.com \] - ': 'searchre', + r'- \[ www\.torrentday\.com \]$': 'searchre', + r'^\[ www\.TorrentDay\.com \] - ': 'searchre', + r'\[NO-RAR\] - \[ www\.torrentday\.com \]$': 'searchre', + } _name = name for remove_string, remove_type in removeWordsList.iteritems(): @@ -180,7 +180,7 @@ def remove_non_release_groups(name): elif remove_type == 'searchre': _name = re.sub(r'(?i)' + remove_string, '', _name) - return _name.strip('.- ') + return _name.strip('.- []{}') def replaceExtension(filename, newExt): @@ -1564,12 +1564,13 @@ def _setUpSession(session, headers): session = CacheControl(sess=session, cache=caches.FileCache(os.path.join(cache_dir, 'sessions'), use_dir_lock=True), cache_etags=False) # request session clear residual referer - if 'Referer' in session.headers and 'Referer' not in headers: + if 'Referer' in session.headers and 'Referer' not in headers or {}: session.headers.pop('Referer') # request session headers session.headers.update({'User-Agent': USER_AGENT, 'Accept-Encoding': 'gzip,deflate'}) - session.headers.update(headers) + if headers: + session.headers.update(headers) # request session ssl verify session.verify = certifi.where() if sickbeard.SSL_VERIFY else False @@ -1591,7 +1592,7 @@ def _setUpSession(session, headers): return session -def getURL(url, post_data=None, params={}, headers={}, timeout=30, session=None, json=False, proxyGlypeProxySSLwarning=None): +def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=None, json=False): """ Returns a byte-string retrieved from the url provider. """ @@ -1623,15 +1624,6 @@ def getURL(url, post_data=None, params={}, headers={}, timeout=30, session=None, % (url, resp.status_code, codeDescription(resp.status_code)), logger.DEBUG) return None - if proxyGlypeProxySSLwarning is not None: - if re.search('The site you are attempting to browse is on a secure connection', resp.text): - resp = session.get(proxyGlypeProxySSLwarning, timeout=timeout, allow_redirects=True, verify=session.verify) - - if not resp.ok: - logger.log(u"GlypeProxySSLwarning: Requested getURL %s returned status code is %s: %s" - % (url, resp.status_code, codeDescription(resp.status_code)), logger.DEBUG) - return None - except (SocketTimeout, TypeError) as e: logger.log(u"Connection timed out (sockets) accessing getURL %s Error: %r" % (url, ex(e)), logger.WARNING) return None @@ -1661,7 +1653,7 @@ def getURL(url, post_data=None, params={}, headers={}, timeout=30, session=None, return resp.content if not json else resp.json() -def download_file(url, filename, session=None, headers={}): +def download_file(url, filename, session=None, headers=None): """ Downloads a file specified diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index f6aaa1c2b..746df6eae 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -73,7 +73,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): continue if not data.startswith('<?xml'): - logger.log(u'Expected xml but got something else, is your proxy failing?', logger.INFO) + logger.log(u'Expected xml but got something else, is your mirror failing?', logger.INFO) continue try: diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index e6e076a82..6d511e064 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -50,8 +50,6 @@ class GenericProvider: self.providerType = None self.name = name - self.proxy = ProviderProxy() - self.proxyGlypeProxySSLwarning = None self.urls = {} self.url = '' @@ -141,16 +139,8 @@ class GenericProvider: for providers with special URL requirements (like cookies) """ - if self.proxy.isEnabled(): - self.headers.update({'Referer': self.proxy.getProxyURL()}) - self.proxyGlypeProxySSLwarning = self.proxy.getProxyURL() + 'includes/process.php?action=sslagree&submit=Continue anyway...' - else: - if 'Referer' in self.headers: - self.headers.pop('Referer') - self.proxyGlypeProxySSLwarning = None - - return helpers.getURL(self.proxy._buildURL(url), post_data=post_data, params=params, headers=self.headers, timeout=timeout, - session=self.session, json=json, proxyGlypeProxySSLwarning=self.proxyGlypeProxySSLwarning) + return helpers.getURL(url, post_data=post_data, params=params, headers=self.headers, timeout=timeout, + session=self.session, json=json) def _makeURL(self, result): @@ -200,17 +190,11 @@ class GenericProvider: urls, filename = self._makeURL(result) - if self.proxy.isEnabled(): - self.headers.update({'Referer': self.proxy.getProxyURL()}) - elif 'Referer' in self.headers: - self.headers.pop('Referer') - for url in urls: if 'NO_DOWNLOAD_NAME' in url: continue - if not self.proxy.isEnabled() and url.startswith('http'): - # Let's just set a referer for every .torrent/.nzb, should work as a cover-all without side-effects + if url.startswith('http'): self.headers.update({'Referer': '/'.join(url.split('/')[:3]) + '/'}) logger.log(u"Downloading a result from " + self.name + " at " + url) @@ -219,7 +203,7 @@ class GenericProvider: if url.endswith(GenericProvider.TORRENT) and filename.endswith(GenericProvider.NZB): filename = filename.rsplit('.', 1)[0] + '.' + GenericProvider.TORRENT - if helpers.download_file(self.proxy._buildURL(url), filename, session=self.session, headers=self.headers): + if helpers.download_file(url, filename, session=self.session, headers=self.headers): if self._verify_download(filename): logger.log(u"Saved result to " + filename, logger.INFO) return True @@ -662,44 +646,3 @@ class TorrentProvider(GenericProvider): results.append(classes.Proper(title, url, datetime.datetime.today(), show)) return results - -class ProviderProxy: - def __init__(self): - self.Type = 'GlypeProxy' - self.param = 'browse.php?u=' - self.option = '&b=32&f=norefer' - self.enabled = False - self.url = None - - self.urls = { - 'getprivate.eu (NL)': 'http://getprivate.eu/', - 'hideme.nl (NL)': 'http://hideme.nl/', - 'proxite.eu (DE)': 'http://proxite.eu/', - 'interproxy.net (EU)': 'http://interproxy.net/', - } - - def isEnabled(self): - """ Return True if we Choose to call TPB via Proxy """ - return self.enabled - - def getProxyURL(self): - """ Return the Proxy URL Choosen via Provider Setting """ - return str(self.url) - - def _buildURL(self, url): - """ Return the Proxyfied URL of the page """ - if self.isEnabled(): - url = self.getProxyURL() + self.param + urllib.quote_plus(url.encode('UTF-8')) + self.option - logger.log(u"Proxified URL: " + url, logger.DEBUG) - - return url - - def _buildRE(self, regx): - """ Return the Proxyfied RE string """ - if self.isEnabled(): - regx = re.sub('//1', self.option, regx).replace('&', '&') - logger.log(u"Proxified REGEX: " + regx, logger.DEBUG) - else: - regx = re.sub('//1', '', regx) - - return regx diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 65fab5019..e6cd39f9c 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -95,7 +95,7 @@ class KATProvider(generic.TorrentProvider): continue if not data.startswith('<?xml'): - logger.log(u'Expected xml but got something else, is your proxy failing?', logger.INFO) + logger.log(u'Expected xml but got something else, is your mirror failing?', logger.INFO) continue try: diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index a671b00d0..1e7042653 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -197,10 +197,6 @@ class RarbgProvider(generic.TorrentProvider): return results logger.log(u"Using new token", logger.DEBUG) continue - if re.search('<div id="error">.*</div>', data): - logger.log(u"Proxy %s does not support https" % self.proxy.getProxyURL(), logger.DEBUG) - searchURL = searchURL.replace(u'https', 'http') - continue # No error found break break diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index 6eb4e10dc..bd85cb814 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -62,7 +62,7 @@ class ThePirateBayProvider(generic.TorrentProvider): 'category': 200 } - self.re_title_url = r'/torrent/(?P<id>\d+)/(?P<title>.*?)//1".+?(?P<url>magnet.*?)//1".+?Size (?P<size>[\d\.]* [TGKMiB]{2,3}).+?(?P<seeders>\d+)</td>.+?(?P<leechers>\d+)</td>' + self.re_title_url = r'/torrent/(?P<id>\d+)/(?P<title>.*?)".+?(?P<url>magnet.*?)".+?Size (?P<size>[\d\.]* [TGKMiB]{2,3}).+?(?P<seeders>\d+)</td>.+?(?P<leechers>\d+)</td>' def isEnabled(self): return self.enabled @@ -88,8 +88,7 @@ class ThePirateBayProvider(generic.TorrentProvider): if not data: continue - re_title_url = self.proxy._buildRE(self.re_title_url).replace('&f=norefer', '') - matches = re.compile(re_title_url, re.DOTALL).finditer(data) + matches = re.compile(self.re_title_url, re.DOTALL).finditer(data) for torrent in matches: title = torrent.group('title') download_url = torrent.group('url') diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index 10aafa1aa..d36ece382 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -80,7 +80,7 @@ class TORRENTZProvider(generic.TorrentProvider): continue if not data.startswith('<?xml'): - logger.log(u'Expected xml but got something else, is your proxy failing?', logger.INFO) + logger.log(u'Expected xml but got something else, is your mirror failing?', logger.INFO) continue try: diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index bf7149e54..3c99eb36e 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -136,9 +136,7 @@ class TVCache(object): def getRSSFeed(self, url): handlers = [] - if self.provider.proxy.isEnabled(): - self.provider.headers.update({'Referer': self.provider.proxy.getProxyURL()}) - elif sickbeard.PROXY_SETTING: + if sickbeard.PROXY_SETTING: logger.log("Using proxy for url: " + url, logger.DEBUG) scheme, address = urllib2.splittype(sickbeard.PROXY_SETTING) address = sickbeard.PROXY_SETTING if scheme else 'http://' + sickbeard.PROXY_SETTING @@ -148,7 +146,7 @@ class TVCache(object): self.provider.headers.pop('Referer') return getFeed( - self.provider.proxy._buildURL(url), + url, request_headers=self.provider.headers, handlers=handlers) -- GitLab From 1ab3e86a875c3bdb5e00558fbddf38c1fc3380cf Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Thu, 5 Nov 2015 20:58:30 -0800 Subject: [PATCH 056/215] Add removewords unit test, to prepare for using a regex there --- tests/helpers_tests.py | 96 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 tests/helpers_tests.py diff --git a/tests/helpers_tests.py b/tests/helpers_tests.py new file mode 100755 index 000000000..b4ef164a2 --- /dev/null +++ b/tests/helpers_tests.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python2.7 +""" +Author: Dustyn Gibson <miigotu@gmail.com> +URL: http://github.com/SiCKRAGETV/SickRage + +This file is part of SickRage. + +SickRage is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +SickRage is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with SickRage. If not, see <http://www.gnu.org/licenses/>. +""" + +import sys +import os.path + +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +import unittest + +from sickbeard.helpers import remove_non_release_groups + +test_result = 'Show.Name.S01E01.HDTV.x264-RLSGROUP' +test_cases = { + 'removewords': [ + test_result, + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[cttv]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP.RiPSaLoT', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[GloDLS]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[EtHD]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP-20-40', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[NO-RAR] - [ www.torrentday.com ]', + '[www.frenchtorrentdb.com] Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[rarbg]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[Seedbox]', + '{ www.SceneTime.com } - Show.Name.S01E01.HDTV.x264-RLSGROUP', + '].[www.tensiontorrent.com] - Show.Name.S01E01.HDTV.x264-RLSGROUP', + '[ www.TorrentDay.com ] - Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[silv4]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[AndroidTwoU]', + '[www.newpct1.com]Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP-NZBGEEK', + '.www.Cpasbien.pwShow.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP [1044]', + '[ www.Cpasbien.pw ] Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP.[BT]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[vtv]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP.[www.usabit.com]', + '[www.Cpasbien.com] Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[ettv]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[rartv]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP-Siklopentan', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP-RP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[PublicHD]', + '[www.Cpasbien.pe] Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP[eztv]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP-[SpastikusTV]', + '].[ www.tensiontorrent.com ] - Show.Name.S01E01.HDTV.x264-RLSGROUP', + '[ www.Cpasbien.com ] Show.Name.S01E01.HDTV.x264-RLSGROUP', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP- { www.SceneTime.com }', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP- [ www.torrentday.com ]', + 'Show.Name.S01E01.HDTV.x264-RLSGROUP.Renc' + ] +} + +class HelpersTests(unittest.TestCase): + def __init__(self, *args, **kwargs): + super(HelpersTests, self).__init__(*args, **kwargs) + +def test_generator(test_strings): + def _test(self): + for test_string in test_strings: + self.assertEqual(remove_non_release_groups(test_string), test_result) + return _test + +if __name__ == '__main__': + print "==================" + print "STARTING - Helpers TESTS" + print "==================" + print "######################################################################" + for name, test_data in test_cases.items(): + test_name = 'test_%s' % name + test = test_generator(test_data) + setattr(HelpersTests, test_name, test) + + suite = unittest.TestLoader().loadTestsFromTestCase(HelpersTests) + unittest.TextTestRunner(verbosity=2).run(suite) -- GitLab From 0ccc55b22d5836d64f3a789f78d8b3808fcc0c05 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Fri, 6 Nov 2015 10:51:57 -0800 Subject: [PATCH 057/215] Fix TitansOfTV, it was totally broken, was adding entire result to the list instead of the created item Remove alt.binaries.boneless and alt.binaries.misc from binsearch. No need to parse nonsesns Split genericProvider.isActive into inheriting classes Make isEnabled just return self.enabled (no need to override), and removed it from individual clients rename helpers._remove_file_failed to helpers.remove_file_failed (access to a protected member) --- sickbeard/helpers.py | 16 +++++---- sickbeard/providers/__init__.py | 6 ++-- sickbeard/providers/alpharatio.py | 5 +-- sickbeard/providers/animenzb.py | 3 -- sickbeard/providers/binsearch.py | 14 ++++---- sickbeard/providers/bitcannon.py | 3 -- sickbeard/providers/bitsoup.py | 5 +-- sickbeard/providers/bluetigers.py | 3 -- sickbeard/providers/btdigg.py | 3 -- sickbeard/providers/btn.py | 3 -- sickbeard/providers/cpasbien.py | 3 -- sickbeard/providers/extratorrent.py | 3 -- sickbeard/providers/fnt.py | 3 -- sickbeard/providers/frenchtorrentdb.py | 3 -- sickbeard/providers/freshontv.py | 5 +-- sickbeard/providers/generic.py | 49 +++++++++++++++----------- sickbeard/providers/gftracker.py | 3 -- sickbeard/providers/hdbits.py | 3 -- sickbeard/providers/hdspace.py | 3 -- sickbeard/providers/hdtorrents.py | 4 --- sickbeard/providers/hounddawgs.py | 3 -- sickbeard/providers/iptorrents.py | 3 -- sickbeard/providers/kat.py | 3 -- sickbeard/providers/libertalia.py | 3 -- sickbeard/providers/morethantv.py | 3 -- sickbeard/providers/newpct.py | 4 --- sickbeard/providers/newznab.py | 3 -- sickbeard/providers/nextgen.py | 7 ++-- sickbeard/providers/nyaatorrents.py | 3 -- sickbeard/providers/omgwtfnzbs.py | 4 --- sickbeard/providers/pretome.py | 3 -- sickbeard/providers/rarbg.py | 3 -- sickbeard/providers/rsstorrent.py | 48 ++++++++++++------------- sickbeard/providers/scc.py | 3 -- sickbeard/providers/scenetime.py | 3 -- sickbeard/providers/shazbat.py | 3 -- sickbeard/providers/speedcd.py | 3 -- sickbeard/providers/strike.py | 3 -- sickbeard/providers/t411.py | 5 +-- sickbeard/providers/thepiratebay.py | 3 -- sickbeard/providers/titansoftv.py | 21 +++++------ sickbeard/providers/tntvillage.py | 4 --- sickbeard/providers/tokyotoshokan.py | 3 -- sickbeard/providers/torrentbytes.py | 3 -- sickbeard/providers/torrentday.py | 3 -- sickbeard/providers/torrentleech.py | 3 -- sickbeard/providers/torrentproject.py | 3 -- sickbeard/providers/torrentz.py | 3 -- sickbeard/providers/transmitthenet.py | 3 -- sickbeard/providers/tvchaosuk.py | 3 -- sickbeard/providers/womble.py | 3 -- sickbeard/providers/xthor.py | 3 -- 52 files changed, 84 insertions(+), 224 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index afbcbd5b4..b9e11c1e8 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -81,6 +81,8 @@ import shutil_custom shutil.copyfile = shutil_custom.copyfile_custom +# pylint: disable=W0212 +# Access to a protected member of a client class urllib._urlopener = classes.SickBeardURLopener() @@ -317,7 +319,7 @@ def sanitizeFileName(name): return name -def _remove_file_failed(failed_file): +def remove_file_failed(failed_file): """ Remove file from filesystem @@ -1686,27 +1688,27 @@ def download_file(url, filename, session=None, headers=None): logger.log(u"Problem setting permissions or writing file to: %s" % filename, logger.WARNING) except (SocketTimeout, TypeError) as e: - _remove_file_failed(filename) + remove_file_failed(filename) logger.log(u"Connection timed out (sockets) while loading download URL %s Error: %r" % (url, ex(e)), logger.WARNING) return None except requests.exceptions.HTTPError as e: - _remove_file_failed(filename) + remove_file_failed(filename) logger.log(u"HTTP error %r while loading download URL %s " % (ex(e), url), logger.WARNING) return False except requests.exceptions.ConnectionError as e: - _remove_file_failed(filename) + remove_file_failed(filename) logger.log(u"Connection error %r while loading download URL %s " % (ex(e), url), logger.WARNING) return False except requests.exceptions.Timeout as e: - _remove_file_failed(filename) + remove_file_failed(filename) logger.log(u"Connection timed out %r while loading download URL %s " % (ex(e), url), logger.WARNING) return False except EnvironmentError as e: - _remove_file_failed(filename) + remove_file_failed(filename) logger.log(u"Unable to save the file: %r " % ex(e), logger.WARNING) return False except Exception: - _remove_file_failed(filename) + remove_file_failed(filename) logger.log(u"Unknown exception while loading download URL %s : %r" % (url, traceback.format_exc()), logger.WARNING) return False diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 8770dd8b4..933cdf5d7 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -217,7 +217,7 @@ def makeTorrentRssProvider(configString): try: torrentRss = sys.modules['sickbeard.providers.rsstorrent'] - except: + except Exception: return newProvider = torrentRss.TorrentRssProvider(name, url, cookies, titleTAG, search_mode, search_fallback, enable_daily, @@ -243,10 +243,10 @@ def getProviderModule(name): raise Exception("Can't find " + prefix + name + " in " + "Providers") -def getProviderClass(id): +def getProviderClass(provider_id): providerMatch = [x for x in sickbeard.providerList + sickbeard.newznabProviderList + sickbeard.torrentRssProviderList if - x.getID() == id] + x.getID() == provider_id] if len(providerMatch) != 1: return None diff --git a/sickbeard/providers/alpharatio.py b/sickbeard/providers/alpharatio.py index 529bc5f74..9d73f9ee9 100644 --- a/sickbeard/providers/alpharatio.py +++ b/sickbeard/providers/alpharatio.py @@ -53,9 +53,6 @@ class AlphaRatioProvider(generic.TorrentProvider): self.cache = AlphaRatioCache(self) - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, 'password': self.password, @@ -136,7 +133,7 @@ class AlphaRatioProvider(generic.TorrentProvider): items[mode].append(item) - except Exception, e: + except Exception: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.WARNING) # For each search mode sort all the items by seeders if available diff --git a/sickbeard/providers/animenzb.py b/sickbeard/providers/animenzb.py index dfeece3eb..ae122eeb9 100644 --- a/sickbeard/providers/animenzb.py +++ b/sickbeard/providers/animenzb.py @@ -46,9 +46,6 @@ class animenzb(generic.NZBProvider): self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled - def _get_season_search_strings(self, ep_obj): return [x for x in show_name_helpers.makeSceneSeasonSearchString(self.show, ep_obj)] diff --git a/sickbeard/providers/binsearch.py b/sickbeard/providers/binsearch.py index f320fc6b6..c71d6e312 100644 --- a/sickbeard/providers/binsearch.py +++ b/sickbeard/providers/binsearch.py @@ -18,7 +18,7 @@ import urllib import re -import generic +from sickbeard.providers import generic from sickbeard import logger from sickbeard import tvcache @@ -32,8 +32,6 @@ class BinSearchProvider(generic.NZBProvider): self.urls = {'base_url': 'https://www.binsearch.info/'} self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled class BinSearchCache(tvcache.TVCache): def __init__(self, provider_obj): @@ -44,13 +42,13 @@ class BinSearchCache(tvcache.TVCache): # compile and save our regular expressions # this pulls the title from the URL in the description - self.descTitleStart = re.compile('^.*https?://www\.binsearch\.info/.b=') + self.descTitleStart = re.compile(r'^.*https?://www\.binsearch\.info/.b=') self.descTitleEnd = re.compile('&.*$') # these clean up the horrible mess of a title if the above fail self.titleCleaners = [ - re.compile('.?yEnc.?\(\d+/\d+\)$'), - re.compile(' \[\d+/\d+\] '), + re.compile(r'.?yEnc.?\(\d+/\d+\)$'), + re.compile(r' \[\d+/\d+\] '), ] def _get_title_and_url(self, item): @@ -94,9 +92,9 @@ class BinSearchCache(tvcache.TVCache): self.setLastUpdate() cl = [] - for group in ['alt.binaries.boneless','alt.binaries.misc','alt.binaries.hdtv','alt.binaries.hdtv.x264','alt.binaries.tv','alt.binaries.tvseries','alt.binaries.teevee']: + for group in ['alt.binaries.hdtv', 'alt.binaries.hdtv.x264', 'alt.binaries.tv', 'alt.binaries.tvseries', 'alt.binaries.teevee']: url = self.provider.url + 'rss.php?' - urlArgs = {'max': 1000,'g': group} + urlArgs = {'max': 1000, 'g': group} url += urllib.urlencode(urlArgs) diff --git a/sickbeard/providers/bitcannon.py b/sickbeard/providers/bitcannon.py index e6744d056..2de19044c 100644 --- a/sickbeard/providers/bitcannon.py +++ b/sickbeard/providers/bitcannon.py @@ -44,9 +44,6 @@ class BitCannonProvider(generic.TorrentProvider): 'trackers': self.url + 'stats', } - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} diff --git a/sickbeard/providers/bitsoup.py b/sickbeard/providers/bitsoup.py index c49849025..e25855c9d 100644 --- a/sickbeard/providers/bitsoup.py +++ b/sickbeard/providers/bitsoup.py @@ -52,9 +52,6 @@ class BitSoupProvider(generic.TorrentProvider): "c42": 1, "c45": 1, "c49": 1, "c7": 1 } - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: logger.log(u"Invalid username or password. Check your settings", logger.WARNING) @@ -141,7 +138,7 @@ class BitSoupProvider(generic.TorrentProvider): items[mode].append(item) - except Exception, e: + except Exception: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.WARNING) # For each search mode sort all the items by seeders if available diff --git a/sickbeard/providers/bluetigers.py b/sickbeard/providers/bluetigers.py index e28361ffd..a3416f3a7 100644 --- a/sickbeard/providers/bluetigers.py +++ b/sickbeard/providers/bluetigers.py @@ -56,9 +56,6 @@ class BLUETIGERSProvider(generic.TorrentProvider): self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled - def _doLogin(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True diff --git a/sickbeard/providers/btdigg.py b/sickbeard/providers/btdigg.py index 21b7bab46..fc97662bd 100644 --- a/sickbeard/providers/btdigg.py +++ b/sickbeard/providers/btdigg.py @@ -38,9 +38,6 @@ class BTDIGGProvider(generic.TorrentProvider): self.cache = BTDiggCache(self) - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/btn.py b/sickbeard/providers/btn.py index e055388d1..c3eb82621 100644 --- a/sickbeard/providers/btn.py +++ b/sickbeard/providers/btn.py @@ -52,9 +52,6 @@ class BTNProvider(generic.TorrentProvider): self.url = self.urls['website'] - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.api_key: logger.log(u"Invalid api key. Check your settings", logger.WARNING) diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py index 794430e74..e91160f8d 100644 --- a/sickbeard/providers/cpasbien.py +++ b/sickbeard/providers/cpasbien.py @@ -40,9 +40,6 @@ class CpasbienProvider(generic.TorrentProvider): self.cache = CpasbienCache(self) - def isEnabled(self): - return self.enabled - def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index 746df6eae..3578d58c3 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -50,9 +50,6 @@ class ExtraTorrentProvider(generic.TorrentProvider): self.headers.update({'User-Agent': USER_AGENT}) self.search_params = {'cid': 8} - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/fnt.py b/sickbeard/providers/fnt.py index ab676c581..78bc2d1ea 100644 --- a/sickbeard/providers/fnt.py +++ b/sickbeard/providers/fnt.py @@ -54,9 +54,6 @@ class FNTProvider(generic.TorrentProvider): "visible": 1, "freeleech": 0, "nuke": 1, "3D": 0, "sort": "size", "order": "desc" } - def isEnabled(self): - return self.enabled - def _doLogin(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): diff --git a/sickbeard/providers/frenchtorrentdb.py b/sickbeard/providers/frenchtorrentdb.py index 9cf7c5882..8e69b6179 100644 --- a/sickbeard/providers/frenchtorrentdb.py +++ b/sickbeard/providers/frenchtorrentdb.py @@ -58,9 +58,6 @@ class FrenchTorrentDBProvider(generic.TorrentProvider): self.minseed = None self.minleech = None - def isEnabled(self): - return self.enabled - def _doLogin(self): params = { diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py index c84907986..720064de9 100644 --- a/sickbeard/providers/freshontv.py +++ b/sickbeard/providers/freshontv.py @@ -57,9 +57,6 @@ class FreshOnTVProvider(generic.TorrentProvider): self.cookies = None - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: @@ -156,7 +153,7 @@ class FreshOnTVProvider(generic.TorrentProvider): # limit RSS search if max_page_number > 3 and mode is 'RSS': max_page_number = 3 - except: + except Exception: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) continue diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 6d511e064..7d6d5811d 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -22,7 +22,6 @@ import datetime import os import re import itertools -import urllib from random import shuffle from base64 import b16encode, b32decode @@ -40,7 +39,7 @@ from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex from sickbeard import show_name_helpers -class GenericProvider: +class GenericProvider(object): NZB = "nzb" TORRENT = "torrent" @@ -97,6 +96,8 @@ class GenericProvider: def imageName(self): return self.getID() + '.png' + # pylint: disable=R0201,W0612 + # Method could be a function, Unused variable def _checkAuth(self): return True @@ -104,18 +105,10 @@ class GenericProvider: return True def isActive(self): - if self.providerType == GenericProvider.NZB and sickbeard.USE_NZBS: - return self.isEnabled() - elif self.providerType == GenericProvider.TORRENT and sickbeard.USE_TORRENTS: - return self.isEnabled() - else: - return False + return False def isEnabled(self): - """ - This should be overridden and should return the config setting eg. sickbeard.MYPROVIDER - """ - return False + return self.enabled def getResult(self, episodes): """ @@ -152,7 +145,7 @@ class GenericProvider: try: torrent_name = re.findall('dn=([^&]+)', result.url)[0] - except: + except Exception: torrent_name = 'NO_DOWNLOAD_NAME' if len(torrent_hash) == 32: @@ -163,7 +156,7 @@ class GenericProvider: return urls, filename urls = [x.format(torrent_hash=torrent_hash, torrent_name=torrent_name) for x in self.btCacheURLS] - except: + except Exception: logger.log("Unable to extract torrent hash or name from magnet: " + ex(result.url), logger.ERROR) return urls, filename else: @@ -209,7 +202,7 @@ class GenericProvider: return True else: logger.log(u"Could not download %s" % url, logger.WARNING) - helpers._remove_file_failed(filename) + helpers.remove_file_failed(filename) if len(urls): logger.log(u"Failed to download any results", logger.WARNING) @@ -226,10 +219,12 @@ class GenericProvider: try: parser = createParser(file_name) if parser: + # pylint: disable=W0212 + # Access to a protected member of a client class mime_type = parser._getMimeType() try: parser.stream._input.close() - except: + except Exception: pass if mime_type == 'application/x-bittorrent': return True @@ -256,6 +251,8 @@ class GenericProvider: quality = Quality.sceneQuality(title, anime) return quality + # pylint: disable=R0201,W0613 + # Method could be a function, Unused argument def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): return [] @@ -389,9 +386,8 @@ class GenericProvider: u"This is supposed to be a season pack search but the result " + title + " is not a valid season pack, skipping it", logger.DEBUG) addCacheEntry = True - if len(parse_result.episode_numbers) and ( - parse_result.season_number not in set([ep.season for ep in episodes]) or not [ep for ep in episodes if - ep.scene_episode in parse_result.episode_numbers]): + if len(parse_result.episode_numbers) and (parse_result.season_number not in set([ep.season for ep in episodes]) + or not [ep for ep in episodes if ep.scene_episode in parse_result.episode_numbers]): logger.log( u"The result " + title + " doesn't seem to be a valid episode that we are trying to snatch, ignoring", logger.DEBUG) @@ -441,6 +437,8 @@ class GenericProvider: # add parsed result to cache for usage later on if addCacheEntry: logger.log(u"Adding item from search to cache: " + title, logger.DEBUG) + # pylint: disable=W0212 + # Access to a protected member of a client class ci = self.cache._addCacheEntry(title, url, parse_result=parse_result) if ci is not None: cl.append(ci) @@ -496,6 +494,8 @@ class GenericProvider: # check if we have items to add to cache if len(cl) > 0: + # pylint: disable=W0212 + # Access to a protected member of a client class myDB = self.cache._getDB() myDB.mass_action(cl) @@ -522,6 +522,9 @@ class NZBProvider(GenericProvider): self.providerType = GenericProvider.NZB + def isActive(self): + return sickbeard.USE_NZBS and self.isEnabled() + def _get_size(self, item): try: size = item.get('links')[1].get('length', -1) @@ -540,6 +543,9 @@ class TorrentProvider(GenericProvider): self.providerType = GenericProvider.TORRENT + def isActive(self): + return sickbeard.USE_TORRENTS and self.isEnabled() + def _get_title_and_url(self, item): from feedparser.util import FeedParserDict if isinstance(item, (dict, FeedParserDict)): @@ -611,7 +617,7 @@ class TorrentProvider(GenericProvider): ep_string += "%02d" % int(ep_obj.scene_absolute_number) else: ep_string += sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} + 'episodenumber': ep_obj.scene_episode} if add_string: ep_string = ep_string + ' %s' % add_string @@ -619,7 +625,8 @@ class TorrentProvider(GenericProvider): return [search_string] - def _clean_title_from_provider(self, title): + @staticmethod + def _clean_title_from_provider(title): return (title or '').replace(' ', '.') def findPropers(self, search_date=datetime.datetime.today()): diff --git a/sickbeard/providers/gftracker.py b/sickbeard/providers/gftracker.py index 58c7be006..14d6656cd 100644 --- a/sickbeard/providers/gftracker.py +++ b/sickbeard/providers/gftracker.py @@ -56,9 +56,6 @@ class GFTrackerProvider(generic.TorrentProvider): self.cache = GFTrackerCache(self) - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/hdbits.py b/sickbeard/providers/hdbits.py index bbbdb2a80..fe2f6b91f 100644 --- a/sickbeard/providers/hdbits.py +++ b/sickbeard/providers/hdbits.py @@ -49,9 +49,6 @@ class HDBitsProvider(generic.TorrentProvider): self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.passkey: diff --git a/sickbeard/providers/hdspace.py b/sickbeard/providers/hdspace.py index d7da35202..2e1fde63f 100644 --- a/sickbeard/providers/hdspace.py +++ b/sickbeard/providers/hdspace.py @@ -56,9 +56,6 @@ class HDSpaceProvider(generic.TorrentProvider): self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index 7eb9af279..d8f53f097 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -53,10 +53,6 @@ class HDTorrentsProvider(generic.TorrentProvider): self.cache = HDTorrentsCache(self) - - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/hounddawgs.py b/sickbeard/providers/hounddawgs.py index 24d0a1acb..704320e3e 100644 --- a/sickbeard/providers/hounddawgs.py +++ b/sickbeard/providers/hounddawgs.py @@ -62,9 +62,6 @@ class HoundDawgsProvider(generic.TorrentProvider): "searchtags": '' } - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index b644a230e..b441fbdd5 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -48,9 +48,6 @@ class IPTorrentsProvider(generic.TorrentProvider): self.categories = '73=&60=' - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index e6cd39f9c..2614558d3 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -63,9 +63,6 @@ class KATProvider(generic.TorrentProvider): 'category': 'tv' } - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} diff --git a/sickbeard/providers/libertalia.py b/sickbeard/providers/libertalia.py index 549523a0f..e9d364f17 100644 --- a/sickbeard/providers/libertalia.py +++ b/sickbeard/providers/libertalia.py @@ -52,9 +52,6 @@ class LibertaliaProvider(generic.TorrentProvider): self.cache = LibertaliaCache(self) - def isEnabled(self): - return self.enabled - def _doLogin(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): diff --git a/sickbeard/providers/morethantv.py b/sickbeard/providers/morethantv.py index d6034c8ef..e815b4146 100644 --- a/sickbeard/providers/morethantv.py +++ b/sickbeard/providers/morethantv.py @@ -62,9 +62,6 @@ class MoreThanTVProvider(generic.TorrentProvider): self.cache = MoreThanTVCache(self) - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/newpct.py b/sickbeard/providers/newpct.py index dbc410f91..ad1dd5412 100644 --- a/sickbeard/providers/newpct.py +++ b/sickbeard/providers/newpct.py @@ -71,10 +71,6 @@ class newpctProvider(generic.TorrentProvider): 'q': '' } - - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index feaf5e860..b3e960a64 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -88,9 +88,6 @@ class NewznabProvider(generic.NZBProvider): return self.getID() + '.png' return 'newznab.png' - def isEnabled(self): - return self.enabled - def _getURL(self, url, post_data=None, params=None, timeout=30, json=False): return self.getURL(url, post_data=post_data, params=params, timeout=timeout, json=json) diff --git a/sickbeard/providers/nextgen.py b/sickbeard/providers/nextgen.py index b9707cac4..5915ff6a5 100644 --- a/sickbeard/providers/nextgen.py +++ b/sickbeard/providers/nextgen.py @@ -57,9 +57,6 @@ class NextGenProvider(generic.TorrentProvider): self.minleech = 0 self.freeleech = True - def isEnabled(self): - return self.enabled - def getLoginParams(self): return { 'username': self.username, @@ -83,7 +80,7 @@ class NextGenProvider(generic.TorrentProvider): return True else: self.login_opener = None - except: + except Exception: self.login_opener = None if self.login_opener: @@ -105,7 +102,7 @@ class NextGenProvider(generic.TorrentProvider): return True error = 'unknown' - except: + except Exception: error = traceback.format_exc() self.login_opener = None diff --git a/sickbeard/providers/nyaatorrents.py b/sickbeard/providers/nyaatorrents.py index ea6190849..1b58081c1 100644 --- a/sickbeard/providers/nyaatorrents.py +++ b/sickbeard/providers/nyaatorrents.py @@ -45,9 +45,6 @@ class NyaaProvider(generic.TorrentProvider): self.minleech = 0 self.confirmed = False - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): if self.show and not self.show.is_anime: return [] diff --git a/sickbeard/providers/omgwtfnzbs.py b/sickbeard/providers/omgwtfnzbs.py index 90f0b362b..775061259 100644 --- a/sickbeard/providers/omgwtfnzbs.py +++ b/sickbeard/providers/omgwtfnzbs.py @@ -40,10 +40,6 @@ class OmgwtfnzbsProvider(generic.NZBProvider): self.supportsBacklog = True - - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.api_key: diff --git a/sickbeard/providers/pretome.py b/sickbeard/providers/pretome.py index 1ee425f28..30dbac2d2 100644 --- a/sickbeard/providers/pretome.py +++ b/sickbeard/providers/pretome.py @@ -55,9 +55,6 @@ class PretomeProvider(generic.TorrentProvider): self.cache = PretomeCache(self) - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password or not self.pin: diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index 1e7042653..62e60956e 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -79,9 +79,6 @@ class RarbgProvider(generic.TorrentProvider): self.cache = RarbgCache(self) - def isEnabled(self): - return self.enabled - def _doLogin(self): if self.token and self.tokenExpireDate and datetime.datetime.now() < self.tokenExpireDate: return True diff --git a/sickbeard/providers/rsstorrent.py b/sickbeard/providers/rsstorrent.py index 436e91c3f..070705eb3 100644 --- a/sickbeard/providers/rsstorrent.py +++ b/sickbeard/providers/rsstorrent.py @@ -17,19 +17,17 @@ import os import re +import requests +from bencode import bdecode import sickbeard -import generic - +from sickbeard.providers import generic from sickbeard import helpers from sickbeard import logger from sickbeard import tvcache from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex -import requests -from bencode import bdecode - class TorrentRssProvider(generic.TorrentProvider): def __init__(self, name, url, cookies='', titleTAG='title', search_mode='eponly', search_fallback=False, enable_daily=False, @@ -52,26 +50,23 @@ class TorrentRssProvider(generic.TorrentProvider): self.titleTAG = titleTAG def configStr(self): - return "%s|%s|%s|%s|%d|%s|%d|%d|%d" % (self.name or '', - self.url or '', - self.cookies or '', - self.titleTAG or '', - self.enabled, - self.search_mode or '', - self.search_fallback, - self.enable_daily, - self.enable_backlog) + return "%s|%s|%s|%s|%d|%s|%d|%d|%d" % ( + self.name or '', + self.url or '', + self.cookies or '', + self.titleTAG or '', + self.enabled, + self.search_mode or '', + self.search_fallback, + self.enable_daily, + self.enable_backlog + ) def imageName(self): - if ek(os.path.isfile, - ek(os.path.join, sickbeard.PROG_DIR, 'gui', sickbeard.GUI_NAME, 'images', 'providers', - self.getID() + '.png')): + if os.path.isfile(ek(os.path.join, sickbeard.PROG_DIR, 'gui', sickbeard.GUI_NAME, 'images', 'providers', self.getID() + '.png')): return self.getID() + '.png' return 'torrentrss.png' - def isEnabled(self): - return self.enabled - def _get_title_and_url(self, item): title = item.get(self.titleTAG) @@ -88,7 +83,7 @@ class TorrentRssProvider(generic.TorrentProvider): for cur_attempt in attempt_list: try: url = cur_attempt() - except: + except Exception: continue if title and url: @@ -100,10 +95,12 @@ class TorrentRssProvider(generic.TorrentProvider): try: if self.cookies: - cookie_validator = re.compile("^(\w+=\w+)(;\w+=\w+)*$") + cookie_validator = re.compile(r"^(\w+=\w+)(;\w+=\w+)*$") if not cookie_validator.match(self.cookies): return (False, 'Cookie is not correctly formatted: ' + self.cookies) + # pylint: disable=W0212 + # Access to a protected member of a client class data = self.cache._getRSSData()['entries'] if not data: return (False, 'No items found in the RSS feed ' + self.url) @@ -116,12 +113,12 @@ class TorrentRssProvider(generic.TorrentProvider): if not url: return (False, 'Unable to get torrent url from first item') - if url.startswith('magnet:') and re.search('urn:btih:([\w]{32,40})', url): + if url.startswith('magnet:') and re.search(r'urn:btih:([\w]{32,40})', url): return (True, 'RSS feed Parsed correctly') else: if self.cookies: requests.utils.add_dict_to_cookiejar(self.session.cookies, - dict(x.rsplit('=', 1) for x in (self.cookies.split(';')))) + dict(x.rsplit('=', 1) for x in self.cookies.split(';'))) torrent_file = self.getURL(url) try: bdecode(torrent_file) @@ -134,7 +131,8 @@ class TorrentRssProvider(generic.TorrentProvider): except Exception, e: return (False, 'Error when trying to load RSS: ' + ex(e)) - def dumpHTML(self, data): + @staticmethod + def dumpHTML(data): dumpName = ek(os.path.join, sickbeard.CACHE_DIR, 'custom_torrent.html') try: diff --git a/sickbeard/providers/scc.py b/sickbeard/providers/scc.py index 2b0f4cda3..c02ac02d5 100644 --- a/sickbeard/providers/scc.py +++ b/sickbeard/providers/scc.py @@ -56,9 +56,6 @@ class SCCProvider(generic.TorrentProvider): self.categories = { 'sponly': 'c26=26&c44=44&c45=45', # Archive, non-scene HD, non-scene SD; need to include non-scene because WEB-DL packs get added to those categories 'eponly': 'c27=27&c17=17&c44=44&c45=45&c33=33&c34=34'} # TV HD, TV SD, non-scene HD, non-scene SD, foreign XviD, foreign x264 - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, diff --git a/sickbeard/providers/scenetime.py b/sickbeard/providers/scenetime.py index 2e89e7ee1..c4136a07c 100644 --- a/sickbeard/providers/scenetime.py +++ b/sickbeard/providers/scenetime.py @@ -53,9 +53,6 @@ class SceneTimeProvider(generic.TorrentProvider): self.categories = "&c2=1&c43=13&c9=1&c63=1&c77=1&c79=1&c100=1&c101=1" - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, diff --git a/sickbeard/providers/shazbat.py b/sickbeard/providers/shazbat.py index 4e0b5bfab..95eb68edb 100644 --- a/sickbeard/providers/shazbat.py +++ b/sickbeard/providers/shazbat.py @@ -40,9 +40,6 @@ class ShazbatProvider(generic.TorrentProvider): 'website': u'http://www.shazbat.tv/login',} self.url = self.urls['website'] - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.passkey: raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.") diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index 2483b2af4..b5fe4feab 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -52,9 +52,6 @@ class SpeedCDProvider(generic.TorrentProvider): self.cache = SpeedCDCache(self) - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py index c22442b47..704b23d88 100644 --- a/sickbeard/providers/strike.py +++ b/sickbeard/providers/strike.py @@ -32,9 +32,6 @@ class STRIKEProvider(generic.TorrentProvider): self.cache = StrikeCache(self) self.minseed, self.minleech = 2 * [None] - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py index 030f46279..e96f1de5e 100644 --- a/sickbeard/providers/t411.py +++ b/sickbeard/providers/t411.py @@ -54,9 +54,6 @@ class T411Provider(generic.TorrentProvider): self.minleech = 0 self.confirmed = False - def isEnabled(self): - return self.enabled - def _doLogin(self): if self.token is not None: @@ -151,7 +148,7 @@ class T411Provider(generic.TorrentProvider): logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.DEBUG) continue - except Exception, e: + except Exception: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) # For each search mode sort all the items by seeders if available if available diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index bd85cb814..cf5eb3d57 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -64,9 +64,6 @@ class ThePirateBayProvider(generic.TorrentProvider): self.re_title_url = r'/torrent/(?P<id>\d+)/(?P<title>.*?)".+?(?P<url>magnet.*?)".+?Size (?P<size>[\d\.]* [TGKMiB]{2,3}).+?(?P<seeders>\d+)</td>.+?(?P<leechers>\d+)</td>' - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/titansoftv.py b/sickbeard/providers/titansoftv.py index 1ce3bd3a2..13b3b8a39 100644 --- a/sickbeard/providers/titansoftv.py +++ b/sickbeard/providers/titansoftv.py @@ -2,7 +2,7 @@ # URL: http://code.google.com/p/sickbeard # Originally written for SickGear # -# This file is part of SickRage. +# This file is part of SickRage. # # SickRage is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ import urllib -import generic +from sickbeard.providers import generic from sickbeard import logger from sickbeard import tvcache from sickbeard.helpers import mapIndexersToShow @@ -38,9 +38,6 @@ class TitansOfTVProvider(generic.TorrentProvider): self.url = 'http://titansof.tv/api/torrents' self.download_url = 'http://titansof.tv/api/torrents/%s/download?apikey=%s' - def isEnabled(self): - return self.enabled - def seedRatio(self): return self.ratio @@ -69,7 +66,7 @@ class TitansOfTVProvider(generic.TorrentProvider): searchURL = self.url + '?' + urllib.urlencode(params) logger.log(u"Search string: %s " % search_params, logger.DEBUG) - logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) + logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) parsedJSON = self.getURL(searchURL, json=True) # do search @@ -81,14 +78,14 @@ class TitansOfTVProvider(generic.TorrentProvider): try: found_torrents = parsedJSON['results'] - except: + except Exception: found_torrents = {} for result in found_torrents: - title = parsedJSON['release_name'] - id = parsedJSON['id'] - download_url = self.download_url % (id, self.api_key) - # FIXME + title = result.get('release_name', '') + tid = result.get('id', '') + download_url = self.download_url % (tid, self.api_key) + # FIXME size, seeders, leechers size = -1 seeders = 1 leechers = 0 @@ -105,7 +102,7 @@ class TitansOfTVProvider(generic.TorrentProvider): item = title, download_url, size, seeders, leechers logger.log(u"Found result: %s " % title, logger.DEBUG) - results.append(result) + results.append(item) # FIXME SORTING diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index 9400508d0..95d3f765a 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -112,10 +112,6 @@ class TNTVillageProvider(generic.TorrentProvider): self.cache = TNTVillageCache(self) - - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/tokyotoshokan.py b/sickbeard/providers/tokyotoshokan.py index 2f53b6941..6a078faa8 100644 --- a/sickbeard/providers/tokyotoshokan.py +++ b/sickbeard/providers/tokyotoshokan.py @@ -42,9 +42,6 @@ class TokyoToshokanProvider(generic.TorrentProvider): self.urls = {'base_url': 'http://tokyotosho.info/'} self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled - def seedRatio(self): return self.ratio diff --git a/sickbeard/providers/torrentbytes.py b/sickbeard/providers/torrentbytes.py index 2bc38e29a..0a0d3a68a 100644 --- a/sickbeard/providers/torrentbytes.py +++ b/sickbeard/providers/torrentbytes.py @@ -55,9 +55,6 @@ class TorrentBytesProvider(generic.TorrentProvider): self.cache = TorrentBytesCache(self) - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 353f0673d..5e8b150a7 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -53,9 +53,6 @@ class TorrentDayProvider(generic.TorrentProvider): self.categories = {'Season': {'c14': 1}, 'Episode': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1}, 'RSS': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1, 'c14': 1}} - def isEnabled(self): - return self.enabled - def _doLogin(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): diff --git a/sickbeard/providers/torrentleech.py b/sickbeard/providers/torrentleech.py index 11d6dcaa1..566c6b83f 100644 --- a/sickbeard/providers/torrentleech.py +++ b/sickbeard/providers/torrentleech.py @@ -55,9 +55,6 @@ class TorrentLeechProvider(generic.TorrentProvider): self.cache = TorrentLeechCache(self) - def isEnabled(self): - return self.enabled - def _doLogin(self): login_params = {'username': self.username, diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py index 184e23c27..a06513479 100644 --- a/sickbeard/providers/torrentproject.py +++ b/sickbeard/providers/torrentproject.py @@ -39,9 +39,6 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): self.minleech = None self.cache = TORRENTPROJECTCache(self) - def isEnabled(self): - return self.enabled - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): results = [] diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index d36ece382..2e12a02fc 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -48,9 +48,6 @@ class TORRENTZProvider(generic.TorrentProvider): 'base': 'https://torrentz.eu/'} self.url = self.urls['base'] - def isEnabled(self): - return self.enabled - def seedRatio(self): return self.ratio diff --git a/sickbeard/providers/transmitthenet.py b/sickbeard/providers/transmitthenet.py index f021f2b0b..52dcefb66 100644 --- a/sickbeard/providers/transmitthenet.py +++ b/sickbeard/providers/transmitthenet.py @@ -52,9 +52,6 @@ class TransmitTheNetProvider(generic.TorrentProvider): "active": 1 } - def isEnabled(self): - return self.enabled - def _checkAuth(self): if not self.username or not self.password: diff --git a/sickbeard/providers/tvchaosuk.py b/sickbeard/providers/tvchaosuk.py index 69de245fa..c7f9bd919 100644 --- a/sickbeard/providers/tvchaosuk.py +++ b/sickbeard/providers/tvchaosuk.py @@ -55,9 +55,6 @@ class TVChaosUKProvider(generic.TorrentProvider): 'include_dead_torrents': 'no', } - def isEnabled(self): - return self.enabled - def _checkAuth(self): if self.username and self.password: return True diff --git a/sickbeard/providers/womble.py b/sickbeard/providers/womble.py index 89728b8a1..136d649fc 100644 --- a/sickbeard/providers/womble.py +++ b/sickbeard/providers/womble.py @@ -30,9 +30,6 @@ class WombleProvider(generic.NZBProvider): self.urls = {'base_url': 'http://newshost.co.za/'} self.url = self.urls['base_url'] - def isEnabled(self): - return self.enabled - class WombleCache(tvcache.TVCache): def __init__(self, provider_obj): diff --git a/sickbeard/providers/xthor.py b/sickbeard/providers/xthor.py index a5f2dddc7..2805fbe5b 100644 --- a/sickbeard/providers/xthor.py +++ b/sickbeard/providers/xthor.py @@ -45,9 +45,6 @@ class XthorProvider(generic.TorrentProvider): self.password = None self.ratio = None - def isEnabled(self): - return self.enabled - def _doLogin(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): -- GitLab From 56b7f573cc1736fe31e4fd9aff6c053bdf43af0d Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Fri, 6 Nov 2015 11:08:33 -0800 Subject: [PATCH 058/215] Remove proxy setting from r/w of config, and in gui/webserve --- gui/slick/views/config_providers.mako | 27 --------------------------- sickbeard/__init__.py | 11 ----------- sickbeard/helpers.py | 2 +- sickbeard/tvcache.py | 2 +- sickbeard/webserve.py | 13 ------------- 5 files changed, 2 insertions(+), 53 deletions(-) diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index 6836522a7..d5478b073 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -482,33 +482,6 @@ $('#config-components').tabs(); </div> % endif - % if hasattr(curTorrentProvider, 'proxy'): - <div class="field-pair"> - <label for="${curTorrentProvider.getID()}_proxy"> - <span class="component-title">Access provider via proxy</span> - <span class="component-desc"> - <input type="checkbox" class="enabler" name="${curTorrentProvider.getID()}_proxy" id="${curTorrentProvider.getID()}_proxy" ${('', 'checked="checked"')[bool(curTorrentProvider.proxy.enabled)]}/> - <p>to bypass country blocking mechanisms</p> - </span> - </label> - </div> - - % if hasattr(curTorrentProvider.proxy, 'url'): - <div class="field-pair content_${curTorrentProvider.getID()}_proxy" id="content_${curTorrentProvider.getID()}_proxy"> - <label for="${curTorrentProvider.getID()}_proxy_url"> - <span class="component-title">Proxy URL:</span> - <span class="component-desc"> - <select name="${curTorrentProvider.getID()}_proxy_url" id="${curTorrentProvider.getID()}_proxy_url" class="form-control input-sm"> - % for i in curTorrentProvider.proxy.urls.keys(): - <option value="${curTorrentProvider.proxy.urls[i]}" ${('', 'selected="selected"')[curTorrentProvider.proxy.urls[i] == curTorrentProvider.proxy.url]}>${i}</option> - % endfor - </select> - </span> - </label> - </div> - % endif - % endif - % if hasattr(curTorrentProvider, 'freeleech'): <div class="field-pair"> <label for="${curTorrentProvider.getID()}_freeleech"> diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 73b06fd4c..74ceceea3 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -1248,11 +1248,6 @@ def initialize(consoleLogging=True): if hasattr(curTorrentProvider, 'pin'): curTorrentProvider.pin = check_setting_str(CFG, curTorrentProvider.getID().upper(), curTorrentProvider.getID() + '_pin', '', censor_log=True) - if hasattr(curTorrentProvider, 'proxy'): - curTorrentProvider.proxy.enabled = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(), curTorrentProvider.getID() + '_proxy', 0)) - if hasattr(curTorrentProvider.proxy, 'url'): - curTorrentProvider.proxy.url = check_setting_str(CFG, curTorrentProvider.getID().upper(), - curTorrentProvider.getID() + '_proxy_url', '') if hasattr(curTorrentProvider, 'confirmed'): curTorrentProvider.confirmed = bool(check_setting_int(CFG, curTorrentProvider.getID().upper(), curTorrentProvider.getID() + '_confirmed', 1)) @@ -1837,12 +1832,6 @@ def save_config(): if hasattr(curTorrentProvider, 'options'): new_config[curTorrentProvider.getID().upper()][ curTorrentProvider.getID() + '_options'] = curTorrentProvider.options - if hasattr(curTorrentProvider, 'proxy'): - new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_proxy'] = int( - curTorrentProvider.proxy.enabled) - if hasattr(curTorrentProvider.proxy, 'url'): - new_config[curTorrentProvider.getID().upper()][ - curTorrentProvider.getID() + '_proxy_url'] = curTorrentProvider.proxy.url if hasattr(curTorrentProvider, 'freeleech'): new_config[curTorrentProvider.getID().upper()][curTorrentProvider.getID() + '_freeleech'] = int( curTorrentProvider.freeleech) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index b9e11c1e8..567999849 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1579,7 +1579,7 @@ def _setUpSession(session, headers): # request session proxies if 'Referer' not in session.headers and sickbeard.PROXY_SETTING: - logger.log("Using proxy: " + sickbeard.PROXY_SETTING, logger.DEBUG) + logger.log("Using global proxy: " + sickbeard.PROXY_SETTING, logger.DEBUG) scheme, address = urllib2.splittype(sickbeard.PROXY_SETTING) address = sickbeard.PROXY_SETTING if scheme else 'http://' + sickbeard.PROXY_SETTING session.proxies = { diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index 3c99eb36e..a7380f1ef 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -137,7 +137,7 @@ class TVCache(object): handlers = [] if sickbeard.PROXY_SETTING: - logger.log("Using proxy for url: " + url, logger.DEBUG) + logger.log("Using global proxy for url: " + url, logger.DEBUG) scheme, address = urllib2.splittype(sickbeard.PROXY_SETTING) address = sickbeard.PROXY_SETTING if scheme else 'http://' + sickbeard.PROXY_SETTING handlers = [urllib2.ProxyHandler({'http': address, 'https': address})] diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 7a4fe2baa..75829966c 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -4482,19 +4482,6 @@ class ConfigProviders(Config): except Exception: curTorrentProvider.sorting = 'seeders' - if hasattr(curTorrentProvider, 'proxy'): - try: - curTorrentProvider.proxy.enabled = config.checkbox_to_value( - kwargs[curTorrentProvider.getID() + '_proxy']) - except Exception: - curTorrentProvider.proxy.enabled = 0 - - if hasattr(curTorrentProvider.proxy, 'url'): - try: - curTorrentProvider.proxy.url = str(kwargs[curTorrentProvider.getID() + '_proxy_url']).strip() - except Exception: - curTorrentProvider.proxy.url = None - if hasattr(curTorrentProvider, 'freeleech'): try: curTorrentProvider.freeleech = config.checkbox_to_value( -- GitLab From 7b289dacd04c9247eecfc10e4b08cdfd58310f46 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Fri, 6 Nov 2015 11:30:44 -0800 Subject: [PATCH 059/215] Remove unused lib/futures --- lib/feedparser/sgmllib3.py | 547 +++++++++++++++++++++++++++++++++++++ lib/futures/__init__.py | 24 -- lib/futures/process.py | 1 - lib/futures/thread.py | 1 - sickbeard/helpers.py | 2 + 5 files changed, 549 insertions(+), 26 deletions(-) create mode 100644 lib/feedparser/sgmllib3.py delete mode 100644 lib/futures/__init__.py delete mode 100644 lib/futures/process.py delete mode 100644 lib/futures/thread.py diff --git a/lib/feedparser/sgmllib3.py b/lib/feedparser/sgmllib3.py new file mode 100644 index 000000000..88a02a307 --- /dev/null +++ b/lib/feedparser/sgmllib3.py @@ -0,0 +1,547 @@ +"""A parser for SGML, using the derived class as a static DTD.""" + +# XXX This only supports those SGML features used by HTML. + +# XXX There should be a way to distinguish between PCDATA (parsed +# character data -- the normal case), RCDATA (replaceable character +# data -- only char and entity references and end tags are special) +# and CDATA (character data -- only end tags are special). RCDATA is +# not supported at all. + +import _markupbase +import re + +__all__ = ["SGMLParser", "SGMLParseError"] + +# Regular expressions used for parsing + +interesting = re.compile('[&<]') +incomplete = re.compile('&([a-zA-Z][a-zA-Z0-9]*|#[0-9]*)?|' + '<([a-zA-Z][^<>]*|' + '/([a-zA-Z][^<>]*)?|' + '![^<>]*)?') + +entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') +charref = re.compile('&#([0-9]+)[^0-9]') + +starttagopen = re.compile('<[>a-zA-Z]') +shorttagopen = re.compile('<[a-zA-Z][-.a-zA-Z0-9]*/') +shorttag = re.compile('<([a-zA-Z][-.a-zA-Z0-9]*)/([^/]*)/') +piclose = re.compile('>') +endbracket = re.compile('[<>]') +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./,:;+*%?!&$\(\)_#=~\'"@]*))?') + + +class SGMLParseError(RuntimeError): + """Exception raised for all parse errors.""" + pass + + +# SGML parser base class -- find tags and call handler functions. +# Usage: p = SGMLParser(); p.feed(data); ...; p.close(). +# The dtd is defined by deriving a class which defines methods +# with special names to handle tags: start_foo and end_foo to handle +# <foo> and </foo>, respectively, or do_foo to handle <foo> by itself. +# (Tags are converted to lower case for this purpose.) The data +# between tags is passed to the parser by calling self.handle_data() +# with some data as argument (the data may be split up in arbitrary +# chunks). Entity references are passed by calling +# self.handle_entityref() with the entity reference as argument. + +class SGMLParser(_markupbase.ParserBase): + # Definition of entities -- derived classes may override + entity_or_charref = re.compile('&(?:' + '([a-zA-Z][-.a-zA-Z0-9]*)|#([0-9]+)' + ')(;?)') + + def __init__(self, verbose=0): + """Initialize and reset this instance.""" + self.verbose = verbose + self.reset() + + def reset(self): + """Reset this instance. Loses all unprocessed data.""" + self.__starttag_text = None + self.rawdata = '' + self.stack = [] + self.lasttag = '???' + self.nomoretags = 0 + self.literal = 0 + _markupbase.ParserBase.reset(self) + + def setnomoretags(self): + """Enter literal mode (CDATA) till EOF. + + Intended for derived classes only. + """ + self.nomoretags = self.literal = 1 + + def setliteral(self, *args): + """Enter literal mode (CDATA). + + Intended for derived classes only. + """ + self.literal = 1 + + def feed(self, data): + """Feed some data to the parser. + + Call this as often as you want, with as little or as much text + as you want (may include '\n'). (This just saves the text, + all the processing is done by goahead().) + """ + + self.rawdata = self.rawdata + data + self.goahead(0) + + def close(self): + """Handle the remaining data.""" + self.goahead(1) + + def error(self, message): + raise SGMLParseError(message) + + # Internal -- handle data as far as reasonable. May leave state + # and data to be processed by a subsequent call. If 'end' is + # true, force handling all data as if followed by EOF marker. + def goahead(self, end): + rawdata = self.rawdata + i = 0 + n = len(rawdata) + while i < n: + if self.nomoretags: + self.handle_data(rawdata[i:n]) + i = n + break + match = interesting.search(rawdata, i) + if match: j = match.start() + else: j = n + if i < j: + self.handle_data(rawdata[i:j]) + i = j + if i == n: break + if rawdata[i] == '<': + if starttagopen.match(rawdata, i): + if self.literal: + self.handle_data(rawdata[i]) + i = i+1 + continue + k = self.parse_starttag(i) + if k < 0: break + i = k + continue + if rawdata.startswith("</", i): + k = self.parse_endtag(i) + if k < 0: break + i = k + self.literal = 0 + continue + if self.literal: + if n > (i + 1): + self.handle_data("<") + i = i+1 + else: + # incomplete + break + continue + if rawdata.startswith("<!--", i): + # Strictly speaking, a comment is --.*-- + # within a declaration tag <!...>. + # This should be removed, + # and comments handled only in parse_declaration. + k = self.parse_comment(i) + if k < 0: break + i = k + continue + if rawdata.startswith("<?", i): + k = self.parse_pi(i) + if k < 0: break + i = i+k + continue + if rawdata.startswith("<!", i): + # This is some sort of declaration; in "HTML as + # deployed," this should only be the document type + # declaration ("<!DOCTYPE html...>"). + k = self.parse_declaration(i) + if k < 0: break + i = k + continue + elif rawdata[i] == '&': + if self.literal: + self.handle_data(rawdata[i]) + i = i+1 + continue + match = charref.match(rawdata, i) + if match: + name = match.group(1) + self.handle_charref(name) + i = match.end(0) + if rawdata[i-1] != ';': i = i-1 + continue + match = entityref.match(rawdata, i) + if match: + name = match.group(1) + self.handle_entityref(name) + i = match.end(0) + if rawdata[i-1] != ';': i = i-1 + continue + else: + self.error('neither < nor & ??') + # We get here only if incomplete matches but + # nothing else + match = incomplete.match(rawdata, i) + if not match: + self.handle_data(rawdata[i]) + i = i+1 + continue + j = match.end(0) + if j == n: + break # Really incomplete + self.handle_data(rawdata[i:j]) + i = j + # end while + if end and i < n: + self.handle_data(rawdata[i:n]) + i = n + self.rawdata = rawdata[i:] + # XXX if end: check for empty stack + + # Extensions for the DOCTYPE scanner: + _decl_otherchars = '=' + + # Internal -- parse processing instr, return length or -1 if not terminated + def parse_pi(self, i): + rawdata = self.rawdata + if rawdata[i:i+2] != '<?': + self.error('unexpected call to parse_pi()') + match = piclose.search(rawdata, i+2) + if not match: + return -1 + j = match.start(0) + self.handle_pi(rawdata[i+2: j]) + j = match.end(0) + return j-i + + def get_starttag_text(self): + return self.__starttag_text + + # Internal -- handle starttag, return length or -1 if not terminated + def parse_starttag(self, i): + self.__starttag_text = None + start_pos = i + rawdata = self.rawdata + if shorttagopen.match(rawdata, i): + # SGML shorthand: <tag/data/ == <tag>data</tag> + # XXX Can data contain &... (entity or char refs)? + # XXX Can data contain < or > (tag characters)? + # XXX Can there be whitespace before the first /? + match = shorttag.match(rawdata, i) + if not match: + return -1 + tag, data = match.group(1, 2) + self.__starttag_text = '<%s/' % tag + tag = tag.lower() + k = match.end(0) + self.finish_shorttag(tag, data) + self.__starttag_text = rawdata[start_pos:match.end(1) + 1] + return k + # XXX The following should skip matching quotes (' or ") + # As a shortcut way to exit, this isn't so bad, but shouldn't + # be used to locate the actual end of the start tag since the + # < or > characters may be embedded in an attribute value. + match = endbracket.search(rawdata, i+1) + if not match: + return -1 + j = match.start(0) + # Now parse the data between i+1 and j into a tag and attrs + attrs = [] + if rawdata[i:i+2] == '<>': + # SGML shorthand: <> == <last open tag seen> + k = j + tag = self.lasttag + else: + match = tagfind.match(rawdata, i+1) + if not match: + self.error('unexpected call to parse_starttag') + k = match.end(0) + tag = rawdata[i+1:k].lower() + self.lasttag = tag + while k < j: + match = attrfind.match(rawdata, k) + if not match: break + attrname, rest, attrvalue = match.group(1, 2, 3) + if not rest: + attrvalue = attrname + else: + if (attrvalue[:1] == "'" == attrvalue[-1:] or + attrvalue[:1] == '"' == attrvalue[-1:]): + # strip quotes + attrvalue = attrvalue[1:-1] + attrvalue = self.entity_or_charref.sub( + self._convert_ref, attrvalue) + attrs.append((attrname.lower(), attrvalue)) + k = match.end(0) + if rawdata[j] == '>': + j = j+1 + self.__starttag_text = rawdata[start_pos:j] + self.finish_starttag(tag, attrs) + return j + + # Internal -- convert entity or character reference + def _convert_ref(self, match): + if match.group(2): + return self.convert_charref(match.group(2)) or \ + '&#%s%s' % match.groups()[1:] + elif match.group(3): + return self.convert_entityref(match.group(1)) or \ + '&%s;' % match.group(1) + else: + return '&%s' % match.group(1) + + # Internal -- parse endtag + def parse_endtag(self, i): + rawdata = self.rawdata + match = endbracket.search(rawdata, i+1) + if not match: + return -1 + j = match.start(0) + tag = rawdata[i+2:j].strip().lower() + if rawdata[j] == '>': + j = j+1 + self.finish_endtag(tag) + return j + + # Internal -- finish parsing of <tag/data/ (same as <tag>data</tag>) + def finish_shorttag(self, tag, data): + self.finish_starttag(tag, []) + self.handle_data(data) + self.finish_endtag(tag) + + # Internal -- finish processing of start tag + # Return -1 for unknown tag, 0 for open-only tag, 1 for balanced tag + def finish_starttag(self, tag, attrs): + try: + method = getattr(self, 'start_' + tag) + except AttributeError: + try: + method = getattr(self, 'do_' + tag) + except AttributeError: + self.unknown_starttag(tag, attrs) + return -1 + else: + self.handle_starttag(tag, method, attrs) + return 0 + else: + self.stack.append(tag) + self.handle_starttag(tag, method, attrs) + return 1 + + # Internal -- finish processing of end tag + def finish_endtag(self, tag): + if not tag: + found = len(self.stack) - 1 + if found < 0: + self.unknown_endtag(tag) + return + else: + if tag not in self.stack: + try: + method = getattr(self, 'end_' + tag) + except AttributeError: + self.unknown_endtag(tag) + else: + self.report_unbalanced(tag) + return + found = len(self.stack) + for i in range(found): + if self.stack[i] == tag: found = i + while len(self.stack) > found: + tag = self.stack[-1] + try: + method = getattr(self, 'end_' + tag) + except AttributeError: + method = None + if method: + self.handle_endtag(tag, method) + else: + self.unknown_endtag(tag) + del self.stack[-1] + + # Overridable -- handle start tag + def handle_starttag(self, tag, method, attrs): + method(attrs) + + # Overridable -- handle end tag + def handle_endtag(self, tag, method): + method() + + # Example -- report an unbalanced </...> tag. + def report_unbalanced(self, tag): + if self.verbose: + print('*** Unbalanced </' + tag + '>') + print('*** Stack:', self.stack) + + def convert_charref(self, name): + """Convert character reference, may be overridden.""" + try: + n = int(name) + except ValueError: + return + if not 0 <= n <= 127: + return + return self.convert_codepoint(n) + + def convert_codepoint(self, codepoint): + return chr(codepoint) + + def handle_charref(self, name): + """Handle character reference, no need to override.""" + replacement = self.convert_charref(name) + if replacement is None: + self.unknown_charref(name) + else: + self.handle_data(replacement) + + # Definition of entities -- derived classes may override + entitydefs = \ + {'lt': '<', 'gt': '>', 'amp': '&', 'quot': '"', 'apos': '\''} + + def convert_entityref(self, name): + """Convert entity references. + + As an alternative to overriding this method; one can tailor the + results by setting up the self.entitydefs mapping appropriately. + """ + table = self.entitydefs + if name in table: + return table[name] + else: + return + + def handle_entityref(self, name): + """Handle entity references, no need to override.""" + replacement = self.convert_entityref(name) + if replacement is None: + self.unknown_entityref(name) + else: + self.handle_data(replacement) + + # Example -- handle data, should be overridden + def handle_data(self, data): + pass + + # Example -- handle comment, could be overridden + def handle_comment(self, data): + pass + + # Example -- handle declaration, could be overridden + def handle_decl(self, decl): + pass + + # Example -- handle processing instruction, could be overridden + def handle_pi(self, data): + pass + + # To be overridden -- handlers for unknown objects + def unknown_starttag(self, tag, attrs): pass + def unknown_endtag(self, tag): pass + def unknown_charref(self, ref): pass + def unknown_entityref(self, ref): pass + + +class TestSGMLParser(SGMLParser): + + def __init__(self, verbose=0): + self.testdata = "" + SGMLParser.__init__(self, verbose) + + def handle_data(self, data): + self.testdata = self.testdata + data + if len(repr(self.testdata)) >= 70: + self.flush() + + def flush(self): + data = self.testdata + if data: + self.testdata = "" + print('data:', repr(data)) + + def handle_comment(self, data): + self.flush() + r = repr(data) + if len(r) > 68: + r = r[:32] + '...' + r[-32:] + print('comment:', r) + + def unknown_starttag(self, tag, attrs): + self.flush() + if not attrs: + print('start tag: <' + tag + '>') + else: + print('start tag: <' + tag, end=' ') + for name, value in attrs: + print(name + '=' + '"' + value + '"', end=' ') + print('>') + + def unknown_endtag(self, tag): + self.flush() + print('end tag: </' + tag + '>') + + def unknown_entityref(self, ref): + self.flush() + print('*** unknown entity ref: &' + ref + ';') + + def unknown_charref(self, ref): + self.flush() + print('*** unknown char ref: &#' + ref + ';') + + def unknown_decl(self, data): + self.flush() + print('*** unknown decl: [' + data + ']') + + def close(self): + SGMLParser.close(self) + self.flush() + + +def test(args = None): + import sys + + if args is None: + args = sys.argv[1:] + + if args and args[0] == '-s': + args = args[1:] + klass = SGMLParser + else: + klass = TestSGMLParser + + if args: + file = args[0] + else: + file = 'test.html' + + if file == '-': + f = sys.stdin + else: + try: + f = open(file, 'r') + except IOError as msg: + print(file, ":", msg) + sys.exit(1) + + data = f.read() + if f is not sys.stdin: + f.close() + + x = klass() + for c in data: + x.feed(c) + x.close() + + +if __name__ == '__main__': + test() diff --git a/lib/futures/__init__.py b/lib/futures/__init__.py deleted file mode 100644 index 8f8b23481..000000000 --- a/lib/futures/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2009 Brian Quinlan. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Execute computations asynchronously using threads or processes.""" - -import warnings - -from concurrent.futures import (FIRST_COMPLETED, - FIRST_EXCEPTION, - ALL_COMPLETED, - CancelledError, - TimeoutError, - Future, - Executor, - wait, - as_completed, - ProcessPoolExecutor, - ThreadPoolExecutor) - -__author__ = 'Brian Quinlan (brian@sweetapp.com)' - -warnings.warn('The futures package has been deprecated. ' - 'Use the concurrent.futures package instead.', - DeprecationWarning) diff --git a/lib/futures/process.py b/lib/futures/process.py deleted file mode 100644 index e9d37b16c..000000000 --- a/lib/futures/process.py +++ /dev/null @@ -1 +0,0 @@ -from concurrent.futures import ProcessPoolExecutor diff --git a/lib/futures/thread.py b/lib/futures/thread.py deleted file mode 100644 index f6bd05de6..000000000 --- a/lib/futures/thread.py +++ /dev/null @@ -1 +0,0 @@ -from concurrent.futures import ThreadPoolExecutor diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 567999849..640c6269d 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -982,6 +982,8 @@ def create_https_certificates(ssl_cert, ssl_key): # Save the key and certificate to disk try: + # pylint: disable=E1101 + # Module has no member open(ssl_key, 'w').write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) open(ssl_cert, 'w').write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) except Exception: -- GitLab From 73833be106d55a1f7ac89deb07c3d03e632b8129 Mon Sep 17 00:00:00 2001 From: supergonkas <duramato@users.noreply.github.com> Date: Sat, 7 Nov 2015 00:06:03 +0000 Subject: [PATCH 060/215] Fixes https://github.com/SiCKRAGETV/sickrage-issues/issues/3580 --- sickbeard/sab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/sab.py b/sickbeard/sab.py index f1c1d2194..70ee848d6 100644 --- a/sickbeard/sab.py +++ b/sickbeard/sab.py @@ -57,9 +57,9 @@ def sendNZB(nzb): # if it aired more than 7 days ago, override with the backlog category IDs for curEp in nzb.episodes: if datetime.date.today() - curEp.airdate > datetime.timedelta(days=7): - category = sickbeard.NZBGET_CATEGORY_BACKLOG + category = sickbeard.SAB_CATEGORY_BACKLOG if nzb.show.is_anime: - category = sickbeard.NZBGET_CATEGORY_ANIME_BACKLOG + category = sickbeard.SAB_CATEGORY_ANIME_BACKLOG if category != None: params['cat'] = category -- GitLab From 99d4707478e31c11d84dfea6baded9e525499f7c Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 2 Nov 2015 22:22:50 -0800 Subject: [PATCH 061/215] Remove the reload of sys and setdefaultencoding hack that is frowned upon and unpythonic Will probably cause encoding issues throughout SR that will need to be addressed as they arise (unless we are really lucky!) --- SickBeard.py | 43 ++++++------------- sickbeard/__init__.py | 2 +- sickbeard/blackandwhitelist.py | 12 +++--- sickbeard/clients/deluged_client.py | 2 +- sickbeard/clients/generic.py | 8 ++-- sickbeard/config.py | 60 ++++++++++++++------------- sickbeard/databases/mainDB.py | 8 ++-- sickbeard/helpers.py | 20 ++++----- sickbeard/logger.py | 46 ++++++++++---------- sickbeard/name_parser/parser.py | 2 +- sickbeard/naming.py | 2 +- sickbeard/notifiers/boxcar.py | 20 ++++----- sickbeard/notifiers/boxcar2.py | 14 +++---- sickbeard/notifiers/emailnotify.py | 30 +++++++------- sickbeard/notifiers/freemobile.py | 6 +-- sickbeard/notifiers/kodi.py | 2 +- sickbeard/notifiers/nma.py | 2 +- sickbeard/notifiers/nmj.py | 2 +- sickbeard/notifiers/nmjv2.py | 2 +- sickbeard/notifiers/prowl.py | 2 +- sickbeard/notifiers/pushover.py | 22 +++++----- sickbeard/notifiers/tweet.py | 22 +++++----- sickbeard/postProcessor.py | 2 +- sickbeard/properFinder.py | 4 +- sickbeard/providers/btdigg.py | 2 +- sickbeard/providers/btn.py | 2 +- sickbeard/providers/extratorrent.py | 2 +- sickbeard/providers/freshontv.py | 2 +- sickbeard/providers/generic.py | 4 +- sickbeard/providers/hdspace.py | 4 +- sickbeard/providers/hdtorrents.py | 4 +- sickbeard/providers/iptorrents.py | 2 +- sickbeard/providers/kat.py | 2 +- sickbeard/providers/newznab.py | 4 +- sickbeard/providers/rarbg.py | 2 +- sickbeard/providers/rsstorrent.py | 2 +- sickbeard/providers/strike.py | 2 +- sickbeard/providers/titansoftv.py | 2 +- sickbeard/providers/tntvillage.py | 2 +- sickbeard/providers/torrentday.py | 2 +- sickbeard/providers/torrentproject.py | 30 +++++--------- sickbeard/providers/torrentz.py | 4 +- sickbeard/providers/transmitthenet.py | 2 +- sickbeard/providers/tvchaosuk.py | 2 +- sickbeard/sab.py | 2 +- sickbeard/search.py | 2 +- sickbeard/search_queue.py | 16 +++---- sickbeard/showUpdater.py | 2 +- sickbeard/subtitles.py | 22 +++++----- sickbeard/tv.py | 20 ++++----- sickbeard/tvcache.py | 2 +- sickbeard/versionChecker.py | 2 +- sickbeard/webapi.py | 2 +- sickbeard/webserve.py | 18 ++++---- tests/issue_submitter_tests.py | 3 +- tests/test_lib.py | 1 - tests/torrent_tests.py | 1 - tests/xem_tests.py | 1 - 58 files changed, 240 insertions(+), 267 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index a72addfdd..ef0c9b552 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -23,8 +23,6 @@ # pylint: disable=W0703 # Catching too general exception -from __future__ import with_statement - import codecs codecs.register(lambda name: codecs.lookup('utf-8') if name == 'cp65001' else None) @@ -47,6 +45,7 @@ if sys.version_info < (2, 7): print "Sorry, requires Python 2.7.x" sys.exit(1) +# https://mail.python.org/pipermail/python-dev/2014-September/136300.html if sys.version_info >= (2, 7, 9): import ssl # pylint: disable=W0212 @@ -66,6 +65,7 @@ from sickbeard.event_queue import Events from configobj import ConfigObj from sickrage.helper.encoding import ek +# http://bugs.python.org/issue7980#msg221094 throwaway = datetime.datetime.strptime('20110101', '%Y%m%d') signal.signal(signal.SIGINT, sickbeard.sig_handler) @@ -165,48 +165,29 @@ class SickRage(object): sickbeard.PROG_DIR = os.path.dirname(sickbeard.MY_FULLNAME) sickbeard.DATA_DIR = sickbeard.PROG_DIR sickbeard.MY_ARGS = sys.argv[1:] - sickbeard.SYS_ENCODING = None try: locale.setlocale(locale.LC_ALL, "") sickbeard.SYS_ENCODING = locale.getpreferredencoding() except (locale.Error, IOError): - pass - - # For OSes that are poorly configured I'll just randomly force UTF-8 - if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'): sickbeard.SYS_ENCODING = 'UTF-8' - if not hasattr(sys, "setdefaultencoding"): - reload(sys) - - if sys.platform == 'win32': - # pylint: disable=E1101 - # An object is accessed for a non-existent member. - if sys.getwindowsversion()[0] >= 6 and sys.stdout.encoding == 'cp65001': - sickbeard.SYS_ENCODING = 'UTF-8' - - try: - # pylint: disable=E1101 - # An object is accessed for a non-existent member. - # On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError - sys.setdefaultencoding(sickbeard.SYS_ENCODING) - except Exception: - sys.exit("Sorry, you MUST add the SickRage folder to the PYTHONPATH environment variable\n" + - "or find another way to force Python to use " + sickbeard.SYS_ENCODING + " for string encoding.") + # pylint: disable=E1101 + if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING.lower() in ('ansi_x3.4-1968', 'us-ascii', 'ascii', 'charmap') or \ + (sys.platform.startswith('win') and sys.getwindowsversion()[0] >= 6 and str(sys.stdout.encoding).lower() in ('cp65001', 'charmap')): + sickbeard.SYS_ENCODING = 'UTF-8' # Need console logging for SickBeard.py and SickBeard-console.exe self.consoleLogging = (not hasattr(sys, "frozen")) or (sickbeard.MY_NAME.lower().find('-console') > 0) # Rename the main thread - threading.currentThread().name = "MAIN" + threading.currentThread().name = u"MAIN" try: - # pylint: disable=W0612 - # Unused variable - opts, args = getopt.getopt(sys.argv[1:], "hqdp::", - ['help', 'quiet', 'nolaunch', 'daemon', 'pidfile=', 'port=', - 'datadir=', 'config=', 'noresize']) # @UnusedVariable + opts, _ = getopt.getopt( + sys.argv[1:], "hqdp::", + ['help', 'quiet', 'nolaunch', 'daemon', 'pidfile=', 'port=', 'datadir=', 'config=', 'noresize'] + ) except getopt.GetoptError: sys.exit(self.help_message()) @@ -524,7 +505,7 @@ class SickRage(object): # shutdown web server if self.webserver: - logger.log("Shutting down Tornado") + logger.log(u"Shutting down Tornado") self.webserver.shutDown() try: diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index ed9d3b3e0..a8b83ec1e 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -683,7 +683,7 @@ def initialize(consoleLogging=True): gh = Github(user_agent="SiCKRAGE").get_organization(GIT_ORG).get_repo(GIT_REPO) except Exception as e: gh = None - logger.log('Unable to setup GitHub properly. GitHub will not be available. Error: %s' % ex(e), logger.WARNING) + logger.log(u'Unable to setup GitHub properly. GitHub will not be available. Error: %s' % ex(e), logger.WARNING) # git reset on update GIT_RESET = bool(check_setting_int(CFG, 'General', 'git_reset', 1)) diff --git a/sickbeard/blackandwhitelist.py b/sickbeard/blackandwhitelist.py index cc4efcd74..b6210797e 100644 --- a/sickbeard/blackandwhitelist.py +++ b/sickbeard/blackandwhitelist.py @@ -61,7 +61,7 @@ class BlackAndWhiteList(object): self._del_all_keywords('blacklist') self._add_keywords('blacklist', values) self.blacklist = values - logger.log('Blacklist set to: %s' % self.blacklist, logger.DEBUG) + logger.log(u'Blacklist set to: %s' % self.blacklist, logger.DEBUG) def set_white_keywords(self, values): """ @@ -72,7 +72,7 @@ class BlackAndWhiteList(object): self._del_all_keywords('whitelist') self._add_keywords('whitelist', values) self.whitelist = values - logger.log('Whitelist set to: %s' % self.whitelist, logger.DEBUG) + logger.log(u'Whitelist set to: %s' % self.whitelist, logger.DEBUG) def _del_all_keywords(self, table): """ @@ -99,7 +99,8 @@ class BlackAndWhiteList(object): for result in sqlResults: groups.append(result["keyword"]) - logger.log('BWL: ' + str(self.show_id) + ' loaded keywords from ' + table + ': ' + str(groups), logger.DEBUG) + logger.log(u'BWL: ' + str(self.show_id) + ' loaded keywords from ' + table + ': ' + str(groups), logger.DEBUG) + return groups def is_valid(self, result): @@ -109,6 +110,7 @@ class BlackAndWhiteList(object): :param result: Result to analyse :return: False if result is not allowed in white/blacklist, True if it is """ + if self.whitelist or self.blacklist: if not result.release_group: logger.log('Failed to detect release group, invalid result', logger.DEBUG) @@ -125,14 +127,14 @@ class BlackAndWhiteList(object): else: black_result = True - logger.log('Whitelist check passed: %s. Blacklist check passed: %s' % (white_result, black_result), logger.DEBUG) + logger.log(u'Whitelist check passed: %s. Blacklist check passed: %s' % (white_result, black_result), logger.DEBUG) if white_result and black_result: return True else: return False else: - logger.log('No Whitelist and Blacklist defined, check passed.', logger.DEBUG) + logger.log(u'No Whitelist and Blacklist defined, check passed.', logger.DEBUG) return True diff --git a/sickbeard/clients/deluged_client.py b/sickbeard/clients/deluged_client.py index 39b9a07dd..81c627382 100644 --- a/sickbeard/clients/deluged_client.py +++ b/sickbeard/clients/deluged_client.py @@ -238,7 +238,7 @@ class DelugeRPC(object): def _check_torrent(self, torrent_hash): torrent_id = self.client.core.get_torrent_status(torrent_hash, {}).get() if torrent_id['hash']: - logger.log('DelugeD: Torrent already exists in Deluge', logger.DEBUG) + logger.log(u'DelugeD: Torrent already exists in Deluge', logger.DEBUG) return torrent_hash return False diff --git a/sickbeard/clients/generic.py b/sickbeard/clients/generic.py index 18c066900..125400b50 100644 --- a/sickbeard/clients/generic.py +++ b/sickbeard/clients/generic.py @@ -148,19 +148,19 @@ class GenericClient(object): result.hash = b16encode(b32decode(result.hash)).lower() else: if not result.content: - logger.log('Torrent without content', logger.ERROR) + logger.log(u'Torrent without content', logger.ERROR) raise Exception('Torrent without content') try: torrent_bdecode = bdecode(result.content) except BTFailure as e: - logger.log('Unable to bdecode torrent', logger.ERROR) - logger.log('Torrent bencoded data: {0}'.format(str(result.content)), logger.DEBUG) + logger.log(u'Unable to bdecode torrent', logger.ERROR) + logger.log(u'Torrent bencoded data: {0}'.format(str(result.content)), logger.DEBUG) raise try: info = torrent_bdecode["info"] except Exception as e: - logger.log('Unable to find info field in torrent', logger.ERROR) + logger.log(u'Unable to find info field in torrent', logger.ERROR) raise result.hash = sha1(bencode(info)).hexdigest() diff --git a/sickbeard/config.py b/sickbeard/config.py index e956f9e50..78cdf8a3f 100644 --- a/sickbeard/config.py +++ b/sickbeard/config.py @@ -265,7 +265,7 @@ def change_SUBTITLES_FINDER_FREQUENCY(subtitles_finder_frequency): :param subtitles_finder_frequency: New frequency """ if subtitles_finder_frequency == '' or subtitles_finder_frequency is None: - subtitles_finder_frequency = 1 + subtitles_finder_frequency = 1 sickbeard.SUBTITLES_FINDER_FREQUENCY = to_int(subtitles_finder_frequency, 1) @@ -388,12 +388,12 @@ def change_PROCESS_AUTOMATICALLY(process_automatically): def CheckSection(CFG, sec): """ Check if INI section exists, if not create it """ - try: - CFG[sec] + + if sec in CFG: return True - except: - CFG[sec] = {} - return False + + CFG[sec] = {} + return False def checkbox_to_value(option, value_on=1, value_off=0): @@ -402,7 +402,7 @@ def checkbox_to_value(option, value_on=1, value_off=0): any other value returns value_off (0) """ - if type(option) is list: + if isinstance(option, list): option = option[-1] if option == 'on' or option == 'true': @@ -499,7 +499,7 @@ def to_int(val, default=0): try: val = int(val) - except: + except Exception: val = default return val @@ -536,11 +536,11 @@ def check_setting_int(config, cfg_name, item_name, def_val, silent=True): if str(my_val) == str(None): raise - except: + except Exception: my_val = def_val try: config[cfg_name][item_name] = my_val - except: + except Exception: config[cfg_name] = {} config[cfg_name][item_name] = my_val @@ -558,11 +558,11 @@ def check_setting_float(config, cfg_name, item_name, def_val, silent=True): my_val = float(config[cfg_name][item_name]) if str(my_val) == str(None): raise - except: + except Exception: my_val = def_val try: config[cfg_name][item_name] = my_val - except: + except Exception: config[cfg_name] = {} config[cfg_name][item_name] = my_val @@ -587,11 +587,11 @@ def check_setting_str(config, cfg_name, item_name, def_val, silent=True, censor_ my_val = helpers.decrypt(config[cfg_name][item_name], encryption_version) if str(my_val) == str(None): raise - except: + except Exception: my_val = def_val try: config[cfg_name][item_name] = helpers.encrypt(my_val, encryption_version) - except: + except Exception: config[cfg_name] = {} config[cfg_name][item_name] = helpers.encrypt(my_val, encryption_version) @@ -599,7 +599,7 @@ def check_setting_str(config, cfg_name, item_name, def_val, silent=True, censor_ logger.censoredItems[cfg_name, item_name] = my_val if not silent: - logger.log(item_name + " -> " + str(my_val), logger.DEBUG) + logger.log(item_name + " -> " + my_val, logger.DEBUG) return my_val @@ -615,13 +615,14 @@ class ConfigMigrator(): # check the version of the config self.config_version = check_setting_int(config_obj, 'General', 'config_version', sickbeard.CONFIG_VERSION) self.expected_config_version = sickbeard.CONFIG_VERSION - self.migration_names = {1: 'Custom naming', - 2: 'Sync backup number with version number', - 3: 'Rename omgwtfnzb variables', - 4: 'Add newznab catIDs', - 5: 'Metadata update', - 6: 'Convert from XBMC to new KODI variables', - 7: 'Use version 2 for password encryption' + self.migration_names = { + 1: 'Custom naming', + 2: 'Sync backup number with version number', + 3: 'Rename omgwtfnzb variables', + 4: 'Add newznab catIDs', + 5: 'Metadata update', + 6: 'Convert from XBMC to new KODI variables', + 7: 'Use version 2 for password encryption' } def migrate_config(self): @@ -630,10 +631,11 @@ class ConfigMigrator(): """ if self.config_version > self.expected_config_version: - logger.log_error_and_exit(u"Your config version (" + str( - self.config_version) + ") has been incremented past what this version of SickRage supports (" + str( - self.expected_config_version) + ").\n" + \ - "If you have used other forks or a newer version of SickRage, your config file may be unusable due to their modifications.") + logger.log_error_and_exit( + u"""Your config version (%i) has been incremented past what this version of SickRage supports (%i). + If you have used other forks or a newer version of SickRage, your config file may be unusable due to their modifications.""" % + (self.config_version, self.expected_config_version) + ) sickbeard.CONFIG_VERSION = self.config_version @@ -668,13 +670,13 @@ class ConfigMigrator(): """ sickbeard.NAMING_PATTERN = self._name_to_pattern() - logger.log("Based on your old settings I'm setting your new naming pattern to: " + sickbeard.NAMING_PATTERN) + logger.log(u"Based on your old settings I'm setting your new naming pattern to: " + sickbeard.NAMING_PATTERN) sickbeard.NAMING_CUSTOM_ABD = bool(check_setting_int(self.config_obj, 'General', 'naming_dates', 0)) if sickbeard.NAMING_CUSTOM_ABD: sickbeard.NAMING_ABD_PATTERN = self._name_to_pattern(True) - logger.log("Adding a custom air-by-date naming pattern to your config: " + sickbeard.NAMING_ABD_PATTERN) + logger.log(u"Adding a custom air-by-date naming pattern to your config: " + sickbeard.NAMING_ABD_PATTERN) else: sickbeard.NAMING_ABD_PATTERN = naming.name_abd_presets[0] @@ -765,7 +767,7 @@ class ConfigMigrator(): finalName += naming_sep_type[sep_type] + ep_quality if use_periods: - finalName = re.sub("\s+", ".", finalName) + finalName = re.sub(r"\s+", ".", finalName) return finalName diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index d405d30ce..7641677cc 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -111,7 +111,7 @@ class MainSanityCheck(db.DBSanityCheck): (tvrage_show['location'], duplicate[0]['location'], tvrage_show['location'], duplicate[0]['show_name']), logger.WARNING) continue - logger.log('Mapping %s to tvdb id %i' % (tvrage_show['show_name'], mapping[0]['mindexer_id'])) + logger.log(u'Mapping %s to tvdb id %i' % (tvrage_show['show_name'], mapping[0]['mindexer_id'])) self.connection.action( "UPDATE tv_shows SET indexer=%i, indexer_id=%i WHERE indexer_id=%i" % @@ -124,7 +124,7 @@ class MainSanityCheck(db.DBSanityCheck): (INDEXER_TVDB, mapping[0]['mindexer_id'], tvrage_show['indexer_id']) ) - logger.log('Please perform a full update on %s' % tvrage_show['show_name'], logger.WARNING) + logger.log(u'Please perform a full update on %s' % tvrage_show['show_name'], logger.WARNING) def fix_duplicate_shows(self, column='indexer_id'): @@ -275,12 +275,12 @@ class MainSanityCheck(db.DBSanityCheck): for sqlResult in sqlResults: langs = [] - logger.log("Checking subtitle codes for episode_id: %s, codes: %s" % + logger.log(u"Checking subtitle codes for episode_id: %s, codes: %s" % (sqlResult['episode_id'], sqlResult['subtitles']), logger.DEBUG) for subcode in sqlResult['subtitles'].split(','): if not len(subcode) is 3 or not subcode in validLanguages: - logger.log("Fixing subtitle codes for episode_id: %s, invalid code: %s" % + logger.log(u"Fixing subtitle codes for episode_id: %s, invalid code: %s" % (sqlResult['episode_id'], subcode), logger.DEBUG) continue diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 640c6269d..c9de23eb6 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -867,9 +867,9 @@ def get_absolute_number_from_season_and_episode(show, season, episode): if len(sqlResults) == 1: absolute_number = int(sqlResults[0]["absolute_number"]) - logger.log("Found absolute number %s for show %s S%02dE%02d" % (absolute_number, show.name, season, episode), logger.DEBUG) + logger.log(u"Found absolute number %s for show %s S%02dE%02d" % (absolute_number, show.name, season, episode), logger.DEBUG) else: - logger.log("No entries for absolute number for show %s S%02dE%02d" % (show.name, season, episode), logger.DEBUG) + logger.log(u"No entries for absolute number for show %s S%02dE%02d" % (show.name, season, episode), logger.DEBUG) return absolute_number @@ -1319,7 +1319,7 @@ def set_up_anidb_connection(): if not sickbeard.ADBA_CONNECTION: def anidb_logger(msg): - return logger.log("anidb: %s " % msg, logger.DEBUG) + return logger.log(u"anidb: %s " % msg, logger.DEBUG) try: sickbeard.ADBA_CONNECTION = adba.Connection(keepAlive=True, log=anidb_logger) @@ -1581,7 +1581,7 @@ def _setUpSession(session, headers): # request session proxies if 'Referer' not in session.headers and sickbeard.PROXY_SETTING: - logger.log("Using global proxy: " + sickbeard.PROXY_SETTING, logger.DEBUG) + logger.log(u"Using global proxy: " + sickbeard.PROXY_SETTING, logger.DEBUG) scheme, address = urllib2.splittype(sickbeard.PROXY_SETTING) address = sickbeard.PROXY_SETTING if scheme else 'http://' + sickbeard.PROXY_SETTING session.proxies = { @@ -1800,7 +1800,7 @@ def verify_freespace(src, dest, oldfile=None): if not isinstance(oldfile, list): oldfile = [oldfile] - logger.log("Trying to determine free space on destination drive", logger.DEBUG) + logger.log(u"Trying to determine free space on destination drive", logger.DEBUG) if hasattr(os, 'statvfs'): # POSIX def disk_usage(path): @@ -1819,21 +1819,21 @@ def verify_freespace(src, dest, oldfile=None): fun = ctypes.windll.kernel32.GetDiskFreeSpaceExA ret = fun(path, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free)) if ret == 0: - logger.log("Unable to determine free space, something went wrong", logger.WARNING) + logger.log(u"Unable to determine free space, something went wrong", logger.WARNING) raise ctypes.WinError() return free.value else: - logger.log("Unable to determine free space on your OS") + logger.log(u"Unable to determine free space on your OS") return True if not ek(os.path.isfile, src): - logger.log("A path to a file is required for the source. " + src + " is not a file.", logger.WARNING) + logger.log(u"A path to a file is required for the source. " + src + " is not a file.", logger.WARNING) return True try: diskfree = disk_usage(dest) except Exception: - logger.log("Unable to determine free space, so I will assume there is enough.", logger.WARNING) + logger.log(u"Unable to determine free space, so I will assume there is enough.", logger.WARNING) return True neededspace = ek(os.path.getsize, src) @@ -1846,7 +1846,7 @@ def verify_freespace(src, dest, oldfile=None): if diskfree > neededspace: return True else: - logger.log("Not enough free space: Needed: %s bytes ( %s ), found: %s bytes ( %s )" + logger.log(u"Not enough free space: Needed: %s bytes ( %s ), found: %s bytes ( %s )" % (neededspace, pretty_filesize(neededspace), diskfree, pretty_filesize(diskfree)), logger.WARNING) return False diff --git a/sickbeard/logger.py b/sickbeard/logger.py index 5cac491c4..c322c5ade 100644 --- a/sickbeard/logger.py +++ b/sickbeard/logger.py @@ -60,18 +60,24 @@ class NullHandler(logging.Handler): class CensoredFormatter(logging.Formatter, object): - def __init__(self, *args, **kwargs): - super(CensoredFormatter, self).__init__(*args, **kwargs) + def __init__(self, fmt=None, datefmt=None, encoding='utf-8'): + super(CensoredFormatter, self).__init__(fmt, datefmt) + self.encoding = encoding def format(self, record): """Strips censored items from string""" msg = super(CensoredFormatter, self).format(record) - # pylint: disable=W0612 - for k, v in censoredItems.iteritems(): - if v and len(v) > 0 and v in msg: - msg = msg.replace(v, len(v) * '*') + + if not isinstance(msg, unicode): + msg = msg.decode(self.encoding, 'replace') # Convert to unicode + + for _, v in censoredItems.iteritems(): + if not isinstance(v, unicode): + v = v.decode(self.encoding, 'replace') # Convert to unicode + msg = msg.replace(v, len(v) * u'*') + # Needed because Newznab apikey isn't stored as key=value in a section. - msg = re.sub(r'([&?]r|[&?]apikey|[&?]api_key)=[^&]*([&\w]?)', r'\1=**********\2', msg) + msg = re.sub(ur'([&?]r|[&?]apikey|[&?]api_key)=[^&]*([&\w]?)', ur'\1=**********\2', msg) return msg @@ -118,7 +124,7 @@ class Logger(object): # console log handler if self.consoleLogging: console = logging.StreamHandler() - console.setFormatter(CensoredFormatter(u'%(asctime)s %(levelname)s::%(message)s', '%H:%M:%S')) + console.setFormatter(CensoredFormatter(u'%(asctime)s %(levelname)s::%(message)s', '%H:%M:%S', encoding='utf-8')) console.setLevel(INFO if not self.debugLogging else DEBUG) for logger in self.loggers: @@ -127,8 +133,8 @@ class Logger(object): # rotating log file handler if self.fileLogging: rfh = logging.handlers.RotatingFileHandler(self.logFile, maxBytes=sickbeard.LOG_SIZE, backupCount=sickbeard.LOG_NR, encoding='utf-8') - rfh.setFormatter(CensoredFormatter(u'%(asctime)s %(levelname)-8s %(message)s', dateTimeFormat)) - rfh.setLevel(DEBUG) + rfh.setFormatter(CensoredFormatter(u'%(asctime)s %(levelname)-8s %(message)s', dateTimeFormat, encoding='utf-8')) + rfh.setLevel(INFO if not self.debugLogging else DEBUG) for logger in self.loggers: logger.addHandler(rfh) @@ -142,24 +148,17 @@ class Logger(object): message = meThread + u" :: " + msg # Change the SSL error to a warning with a link to information about how to fix it. - check = re.sub(r'error \[Errno 1\] _ssl.c:\d{3}: error:\d{8}:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error', 'See: http://git.io/vJrkM', message) + check = re.sub(ur'error \[Errno 1\] _ssl.c:\d{3}: error:\d{8}:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error', 'See: http://git.io/vJrkM', message) if check is not message: message = check level = WARNING - - # Avoid open issues when user only need to clear cache to fix issue - if re.search(r"_mako\'$",message): - # 'C__SickRage_gui_slick_views_schedule_mako' - # '_usr_local_sickrage_var_SickRage_gui_slick_views_schedule_mako' - # '_volume1___plugins_AppCentral_sickbeard_tvrage_SickBeard_TVRage_gui_slick_views_schedule_mako' - message = 'Please stop SickRage and delete \SickRage\cache\mako folder. You can see cache folder location in SickRage Help&Info menu' - level = WARNING - if level == ERROR: + if level in (ERROR, WARNING): self.logger.exception(message, *args, **kwargs) + + if level == ERROR: classes.ErrorViewer.add(classes.UIError(message)) elif level == WARNING: - self.logger.exception(message, *args, **kwargs) classes.WarningViewer.add(classes.UIError(message)) # if sickbeard.GIT_AUTOISSUES: @@ -288,7 +287,7 @@ class Logger(object): def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 - re.search(r".* not well-formed \(invalid token\): line .* column .*", title) is not None + return re.search(r".* not well-formed \(invalid token\): line .* column .*", title) is not None mako_error = is_mako_error(title_Error) ascii_error = is_ascii_error(title_Error) @@ -331,7 +330,8 @@ class Logger(object): issue_id = None finally: self.submitter_running = False - return submitter_result, issue_id + + return submitter_result, issue_id # pylint: disable=R0903 class Wrapper(object): diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index 6c1a503a9..cd5bc886d 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -595,7 +595,7 @@ class NameParserCache(object): def get(self, name): if name in self._previous_parsed: - logger.log("Using cached parse result for: " + name, logger.DEBUG) + logger.log(u"Using cached parse result for: " + name, logger.DEBUG) return self._previous_parsed[name] diff --git a/sickbeard/naming.py b/sickbeard/naming.py index 35bec1afc..3e64f17cc 100644 --- a/sickbeard/naming.py +++ b/sickbeard/naming.py @@ -222,7 +222,7 @@ def validate_name(pattern, multi=None, anime_type=None, file_only=False, abd=Fal logger.log(u"Unable to parse " + new_name + ", not valid", logger.DEBUG) return False - logger.log("The name " + new_name + " parsed into " + str(result), logger.DEBUG) + logger.log(u"The name " + new_name + " parsed into " + str(result), logger.DEBUG) if abd or sports: if result.air_date != ep.airdate: diff --git a/sickbeard/notifiers/boxcar.py b/sickbeard/notifiers/boxcar.py index 6de1752fb..90252e00a 100644 --- a/sickbeard/notifiers/boxcar.py +++ b/sickbeard/notifiers/boxcar.py @@ -73,14 +73,14 @@ class BoxcarNotifier: except urllib2.HTTPError, e: # if we get an error back that doesn't have an error code then who knows what's really happening if not hasattr(e, 'code'): - logger.log("Boxcar notification failed. Error code: " + ex(e), logger.ERROR) + logger.log(u"Boxcar notification failed. Error code: " + ex(e), logger.ERROR) return False else: - logger.log("Boxcar notification failed. Error code: " + str(e.code), logger.WARNING) + logger.log(u"Boxcar notification failed. Error code: " + str(e.code), logger.WARNING) # HTTP status 404 if the provided email address isn't a Boxcar user. if e.code == 404: - logger.log("Username is wrong/not a boxcar email. Boxcar will send an email to it", logger.WARNING) + logger.log(u"Username is wrong/not a boxcar email. Boxcar will send an email to it", logger.WARNING) return False # For HTTP status code 401's, it is because you are passing in either an invalid token, or the user has not added your service. @@ -88,7 +88,7 @@ class BoxcarNotifier: # If the user has already added your service, we'll return an HTTP status code of 401. if subscribe: - logger.log("Already subscribed to service", logger.ERROR) + logger.log(u"Already subscribed to service", logger.ERROR) # i dont know if this is true or false ... its neither but i also dont know how we got here in the first place return False @@ -96,18 +96,18 @@ class BoxcarNotifier: else: subscribeNote = self._sendBoxcar(msg, title, email, True) if subscribeNote: - logger.log("Subscription send", logger.DEBUG) + logger.log(u"Subscription send", logger.DEBUG) return True else: - logger.log("Subscription could not be send", logger.ERROR) + logger.log(u"Subscription could not be send", logger.ERROR) return False # If you receive an HTTP status code of 400, it is because you failed to send the proper parameters elif e.code == 400: - logger.log("Wrong data sent to boxcar", logger.ERROR) + logger.log(u"Wrong data sent to boxcar", logger.ERROR) return False - logger.log("Boxcar notification successful.", logger.INFO) + logger.log(u"Boxcar notification successful.", logger.INFO) return True def notify_snatch(self, ep_name, title=notifyStrings[NOTIFY_SNATCH]): @@ -140,14 +140,14 @@ class BoxcarNotifier: """ if not sickbeard.USE_BOXCAR and not force: - logger.log("Notification for Boxcar not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for Boxcar not enabled, skipping this notification", logger.DEBUG) return False # if no username was given then use the one from the config if not username: username = sickbeard.BOXCAR_USERNAME - logger.log("Sending notification for " + message, logger.DEBUG) + logger.log(u"Sending notification for " + message, logger.DEBUG) return self._sendBoxcar(message, title, username) diff --git a/sickbeard/notifiers/boxcar2.py b/sickbeard/notifiers/boxcar2.py index 9cb6dd88d..3dd4a9a5a 100644 --- a/sickbeard/notifiers/boxcar2.py +++ b/sickbeard/notifiers/boxcar2.py @@ -65,22 +65,22 @@ class Boxcar2Notifier: except Exception as e: # if we get an error back that doesn't have an error code then who knows what's really happening if not hasattr(e, 'code'): - logger.log("Boxcar2 notification failed." + ex(e), logger.ERROR) + logger.log(u"Boxcar2 notification failed." + ex(e), logger.ERROR) return False else: - logger.log("Boxcar2 notification failed. Error code: " + str(e.code), logger.WARNING) + logger.log(u"Boxcar2 notification failed. Error code: " + str(e.code), logger.WARNING) # HTTP status 404 if e.code == 404: - logger.log("Access token is invalid. Check it.", logger.WARNING) + logger.log(u"Access token is invalid. Check it.", logger.WARNING) return False # If you receive an HTTP status code of 400, it is because you failed to send the proper parameters elif e.code == 400: - logger.log("Wrong data send to boxcar2", logger.ERROR) + logger.log(u"Wrong data send to boxcar2", logger.ERROR) return False - logger.log("Boxcar2 notification successful.", logger.DEBUG) + logger.log(u"Boxcar2 notification successful.", logger.DEBUG) return True def notify_snatch(self, ep_name, title=notifyStrings[NOTIFY_SNATCH]): @@ -112,14 +112,14 @@ class Boxcar2Notifier: """ if not sickbeard.USE_BOXCAR2: - logger.log("Notification for Boxcar2 not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for Boxcar2 not enabled, skipping this notification", logger.DEBUG) return False # if no username was given then use the one from the config if not accesstoken: accesstoken = sickbeard.BOXCAR2_ACCESSTOKEN - logger.log("Sending notification for " + message, logger.DEBUG) + logger.log(u"Sending notification for " + message, logger.DEBUG) self._sendBoxcar2(message, title, accesstoken) return True diff --git a/sickbeard/notifiers/emailnotify.py b/sickbeard/notifiers/emailnotify.py index f6c963359..c63b03670 100644 --- a/sickbeard/notifiers/emailnotify.py +++ b/sickbeard/notifiers/emailnotify.py @@ -59,7 +59,7 @@ class EmailNotifier: show = self._parseEp(ep_name) to = self._generate_recipients(show) if len(to) == 0: - logger.log('Skipping email notify because there are no configured recipients', logger.WARNING) + logger.log(u'Skipping email notify because there are no configured recipients', logger.WARNING) else: try: msg = MIMEMultipart('alternative') @@ -81,9 +81,9 @@ class EmailNotifier: msg['Date'] = formatdate(localtime=True) if self._sendmail(sickbeard.EMAIL_HOST, sickbeard.EMAIL_PORT, sickbeard.EMAIL_FROM, sickbeard.EMAIL_TLS, sickbeard.EMAIL_USER, sickbeard.EMAIL_PASSWORD, to, msg): - logger.log("Snatch notification sent to [%s] for '%s'" % (to, ep_name), logger.DEBUG) + logger.log(u"Snatch notification sent to [%s] for '%s'" % (to, ep_name), logger.DEBUG) else: - logger.log("Snatch notification ERROR: %s" % self.last_err, logger.ERROR) + logger.log(u"Snatch notification ERROR: %s" % self.last_err, logger.ERROR) def notify_download(self, ep_name, title="Completed:"): """ @@ -98,7 +98,7 @@ class EmailNotifier: show = self._parseEp(ep_name) to = self._generate_recipients(show) if len(to) == 0: - logger.log('Skipping email notify because there are no configured recipients', logger.WARNING) + logger.log(u'Skipping email notify because there are no configured recipients', logger.WARNING) else: try: msg = MIMEMultipart('alternative') @@ -120,9 +120,9 @@ class EmailNotifier: msg['Date'] = formatdate(localtime=True) if self._sendmail(sickbeard.EMAIL_HOST, sickbeard.EMAIL_PORT, sickbeard.EMAIL_FROM, sickbeard.EMAIL_TLS, sickbeard.EMAIL_USER, sickbeard.EMAIL_PASSWORD, to, msg): - logger.log("Download notification sent to [%s] for '%s'" % (to, ep_name), logger.DEBUG) + logger.log(u"Download notification sent to [%s] for '%s'" % (to, ep_name), logger.DEBUG) else: - logger.log("Download notification ERROR: %s" % self.last_err, logger.ERROR) + logger.log(u"Download notification ERROR: %s" % self.last_err, logger.ERROR) def notify_subtitle_download(self, ep_name, lang, title="Downloaded subtitle:"): """ @@ -137,7 +137,7 @@ class EmailNotifier: show = self._parseEp(ep_name) to = self._generate_recipients(show) if len(to) == 0: - logger.log('Skipping email notify because there are no configured recipients', logger.WARNING) + logger.log(u'Skipping email notify because there are no configured recipients', logger.WARNING) else: try: msg = MIMEMultipart('alternative') @@ -158,9 +158,9 @@ class EmailNotifier: msg['To'] = ','.join(to) if self._sendmail(sickbeard.EMAIL_HOST, sickbeard.EMAIL_PORT, sickbeard.EMAIL_FROM, sickbeard.EMAIL_TLS, sickbeard.EMAIL_USER, sickbeard.EMAIL_PASSWORD, to, msg): - logger.log("Download notification sent to [%s] for '%s'" % (to, ep_name), logger.DEBUG) + logger.log(u"Download notification sent to [%s] for '%s'" % (to, ep_name), logger.DEBUG) else: - logger.log("Download notification ERROR: %s" % self.last_err, logger.ERROR) + logger.log(u"Download notification ERROR: %s" % self.last_err, logger.ERROR) def notify_git_update(self, new_version="??"): @@ -184,11 +184,11 @@ class EmailNotifier: addrs.append(addr) addrs = set(addrs) - logger.log('Notification recipients: %s' % addrs, logger.DEBUG) + logger.log(u'Notification recipients: %s' % addrs, logger.DEBUG) return addrs def _sendmail(self, host, port, smtp_from, use_tls, user, pwd, to, msg, smtpDebug=False): - logger.log('HOST: %s; PORT: %s; FROM: %s, TLS: %s, USER: %s, PWD: %s, TO: %s' % ( + logger.log(u'HOST: %s; PORT: %s; FROM: %s, TLS: %s, USER: %s, PWD: %s, TO: %s' % ( host, port, smtp_from, use_tls, user, pwd, to), logger.DEBUG) try: srv = smtplib.SMTP(host, int(port)) @@ -202,13 +202,13 @@ class EmailNotifier: try: if (use_tls == '1' or use_tls == True) or (len(user) > 0 and len(pwd) > 0): srv.ehlo() - logger.log('Sent initial EHLO command!', logger.DEBUG) + logger.log(u'Sent initial EHLO command!', logger.DEBUG) if use_tls == '1' or use_tls == True: srv.starttls() - logger.log('Sent STARTTLS command!', logger.DEBUG) + logger.log(u'Sent STARTTLS command!', logger.DEBUG) if len(user) > 0 and len(pwd) > 0: srv.login(user, pwd) - logger.log('Sent LOGIN command!', logger.DEBUG) + logger.log(u'Sent LOGIN command!', logger.DEBUG) srv.sendmail(smtp_from, to, msg.as_string()) srv.quit() return True @@ -222,7 +222,7 @@ class EmailNotifier: sep = " - " titles = ep_name.split(sep) titles.sort(key=len, reverse=True) - logger.log("TITLES: %s" % titles, logger.DEBUG) + logger.log(u"TITLES: %s" % titles, logger.DEBUG) return titles diff --git a/sickbeard/notifiers/freemobile.py b/sickbeard/notifiers/freemobile.py index e4dba3732..6d3c75b7d 100644 --- a/sickbeard/notifiers/freemobile.py +++ b/sickbeard/notifiers/freemobile.py @@ -43,7 +43,7 @@ class FreeMobileNotifier: if apiKey == None: apiKey = sickbeard.FREEMOBILE_APIKEY - logger.log("Free Mobile in use with API KEY: " + apiKey, logger.DEBUG) + logger.log(u"Free Mobile in use with API KEY: " + apiKey, logger.DEBUG) # build up the URL and parameters msg = msg.strip() @@ -115,10 +115,10 @@ class FreeMobileNotifier: """ if not sickbeard.USE_FREEMOBILE and not force: - logger.log("Notification for Free Mobile not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for Free Mobile not enabled, skipping this notification", logger.DEBUG) return False, "Disabled" - logger.log("Sending a SMS for " + message, logger.DEBUG) + logger.log(u"Sending a SMS for " + message, logger.DEBUG) return self._sendFreeMobileSMS(title, message, id, apiKey) diff --git a/sickbeard/notifiers/kodi.py b/sickbeard/notifiers/kodi.py index c3a875ccf..6466c9a3a 100644 --- a/sickbeard/notifiers/kodi.py +++ b/sickbeard/notifiers/kodi.py @@ -121,7 +121,7 @@ class KODINotifier: # suppress notifications if the notifier is disabled but the notify options are checked if not sickbeard.USE_KODI and not force: - logger.log("Notification for KODI not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for KODI not enabled, skipping this notification", logger.DEBUG) return False result = '' diff --git a/sickbeard/notifiers/nma.py b/sickbeard/notifiers/nma.py index f1dffcbe7..c0cb173f2 100644 --- a/sickbeard/notifiers/nma.py +++ b/sickbeard/notifiers/nma.py @@ -51,7 +51,7 @@ class NMA_Notifier: if len(keys) > 1: batch = True - logger.log("NMA: Sending notice with details: event=\"%s\", message=\"%s\", priority=%s, batch=%s" % (event, message, nma_priority, batch), logger.DEBUG) + logger.log(u"NMA: Sending notice with details: event=\"%s\", message=\"%s\", priority=%s, batch=%s" % (event, message, nma_priority, batch), logger.DEBUG) response = p.push(application=title, event=event, description=message, priority=nma_priority, batch_mode=batch) if not response[nma_api][u'code'] == u'200': diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py index 63a8b3625..313998de3 100644 --- a/sickbeard/notifiers/nmj.py +++ b/sickbeard/notifiers/nmj.py @@ -184,7 +184,7 @@ class NMJNotifier: force: If True then the notification will be sent even if NMJ is disabled in the config """ if not sickbeard.USE_NMJ and not force: - logger.log("Notification for NMJ scan update not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for NMJ scan update not enabled, skipping this notification", logger.DEBUG) return False # fill in omitted parameters diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py index c138580cd..24464b039 100644 --- a/sickbeard/notifiers/nmjv2.py +++ b/sickbeard/notifiers/nmjv2.py @@ -165,7 +165,7 @@ class NMJv2Notifier: force: If True then the notification will be sent even if NMJ is disabled in the config """ if not sickbeard.USE_NMJv2 and not force: - logger.log("Notification for NMJ scan update not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for NMJ scan update not enabled, skipping this notification", logger.DEBUG) return False # fill in omitted parameters diff --git a/sickbeard/notifiers/prowl.py b/sickbeard/notifiers/prowl.py index 93400e532..195631498 100644 --- a/sickbeard/notifiers/prowl.py +++ b/sickbeard/notifiers/prowl.py @@ -73,7 +73,7 @@ class ProwlNotifier: title = "SickRage" - logger.log("PROWL: Sending notice with details: event=\"%s\", message=\"%s\", priority=%s, api=%s" % (event, message, prowl_priority, prowl_api), logger.DEBUG) + logger.log(u"PROWL: Sending notice with details: event=\"%s\", message=\"%s\", priority=%s, api=%s" % (event, message, prowl_priority, prowl_api), logger.DEBUG) http_handler = HTTPSConnection("api.prowlapp.com") diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py index 44ce1614e..dbc422877 100644 --- a/sickbeard/notifiers/pushover.py +++ b/sickbeard/notifiers/pushover.py @@ -55,7 +55,7 @@ class PushoverNotifier: if sound == None: sound = sickbeard.PUSHOVER_SOUND - logger.log("Pushover API KEY in use: " + apiKey, logger.DEBUG) + logger.log(u"Pushover API KEY in use: " + apiKey, logger.DEBUG) # build up the URL and parameters msg = msg.strip() @@ -93,14 +93,14 @@ class PushoverNotifier: except urllib2.HTTPError, e: # if we get an error back that doesn't have an error code then who knows what's really happening if not hasattr(e, 'code'): - logger.log("Pushover notification failed." + ex(e), logger.ERROR) + logger.log(u"Pushover notification failed." + ex(e), logger.ERROR) return False else: - logger.log("Pushover notification failed. Error code: " + str(e.code), logger.ERROR) + logger.log(u"Pushover notification failed. Error code: " + str(e.code), logger.ERROR) # HTTP status 404 if the provided email address isn't a Pushover user. if e.code == 404: - logger.log("Username is wrong/not a pushover email. Pushover will send an email to it", logger.WARNING) + logger.log(u"Username is wrong/not a pushover email. Pushover will send an email to it", logger.WARNING) return False # For HTTP status code 401's, it is because you are passing in either an invalid token, or the user has not added your service. @@ -109,23 +109,23 @@ class PushoverNotifier: # HTTP status 401 if the user doesn't have the service added subscribeNote = self._sendPushover(msg, title, sound=sound, userKey=userKey, apiKey=apiKey) if subscribeNote: - logger.log("Subscription sent", logger.DEBUG) + logger.log(u"Subscription sent", logger.DEBUG) return True else: - logger.log("Subscription could not be sent", logger.ERROR) + logger.log(u"Subscription could not be sent", logger.ERROR) return False # If you receive an HTTP status code of 400, it is because you failed to send the proper parameters elif e.code == 400: - logger.log("Wrong data sent to pushover", logger.ERROR) + logger.log(u"Wrong data sent to pushover", logger.ERROR) return False # If you receive a HTTP status code of 429, it is because the message limit has been reached (free limit is 7,500) elif e.code == 429: - logger.log("Pushover API message limit reached - try a different API key", logger.ERROR) + logger.log(u"Pushover API message limit reached - try a different API key", logger.ERROR) return False - logger.log("Pushover notification successful.", logger.INFO) + logger.log(u"Pushover notification successful.", logger.INFO) return True def notify_snatch(self, ep_name, title=notifyStrings[NOTIFY_SNATCH]): @@ -160,10 +160,10 @@ class PushoverNotifier: """ if not sickbeard.USE_PUSHOVER and not force: - logger.log("Notification for Pushover not enabled, skipping this notification", logger.DEBUG) + logger.log(u"Notification for Pushover not enabled, skipping this notification", logger.DEBUG) return False - logger.log("Sending notification for " + message, logger.DEBUG) + logger.log(u"Sending notification for " + message, logger.DEBUG) return self._sendPushover(message, title, sound=sound, userKey=userKey, apiKey=apiKey) diff --git a/sickbeard/notifiers/tweet.py b/sickbeard/notifiers/tweet.py index 76cb64efd..de7aabbdc 100644 --- a/sickbeard/notifiers/tweet.py +++ b/sickbeard/notifiers/tweet.py @@ -67,12 +67,12 @@ class TwitterNotifier: oauth_consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret) oauth_client = oauth.Client(oauth_consumer) - logger.log('Requesting temp token from Twitter', logger.DEBUG) + logger.log(u'Requesting temp token from Twitter', logger.DEBUG) resp, content = oauth_client.request(self.REQUEST_TOKEN_URL, 'GET') if resp['status'] != '200': - logger.log('Invalid response from Twitter requesting temp token: %s' % resp['status'], logger.ERROR) + logger.log(u'Invalid response from Twitter requesting temp token: %s' % resp['status'], logger.ERROR) else: request_token = dict(parse_qsl(content)) @@ -91,26 +91,26 @@ class TwitterNotifier: token = oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret']) token.set_verifier(key) - logger.log('Generating and signing request for an access token using key ' + key, logger.DEBUG) + logger.log(u'Generating and signing request for an access token using key ' + key, logger.DEBUG) signature_method_hmac_sha1 = oauth.SignatureMethod_HMAC_SHA1() # @UnusedVariable oauth_consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret) - logger.log('oauth_consumer: ' + str(oauth_consumer), logger.DEBUG) + logger.log(u'oauth_consumer: ' + str(oauth_consumer), logger.DEBUG) oauth_client = oauth.Client(oauth_consumer, token) - logger.log('oauth_client: ' + str(oauth_client), logger.DEBUG) + logger.log(u'oauth_client: ' + str(oauth_client), logger.DEBUG) resp, content = oauth_client.request(self.ACCESS_TOKEN_URL, method='POST', body='oauth_verifier=%s' % key) - logger.log('resp, content: ' + str(resp) + ',' + str(content), logger.DEBUG) + logger.log(u'resp, content: ' + str(resp) + ',' + str(content), logger.DEBUG) access_token = dict(parse_qsl(content)) - logger.log('access_token: ' + str(access_token), logger.DEBUG) + logger.log(u'access_token: ' + str(access_token), logger.DEBUG) - logger.log('resp[status] = ' + str(resp['status']), logger.DEBUG) + logger.log(u'resp[status] = ' + str(resp['status']), logger.DEBUG) if resp['status'] != '200': - logger.log('The request for a token with did not succeed: ' + str(resp['status']), logger.ERROR) + logger.log(u'The request for a token with did not succeed: ' + str(resp['status']), logger.ERROR) return False else: - logger.log('Your Twitter Access Token key: %s' % access_token['oauth_token'], logger.DEBUG) - logger.log('Access Token secret: %s' % access_token['oauth_token_secret'], logger.DEBUG) + logger.log(u'Your Twitter Access Token key: %s' % access_token['oauth_token'], logger.DEBUG) + logger.log(u'Access Token secret: %s' % access_token['oauth_token_secret'], logger.DEBUG) sickbeard.TWITTER_USERNAME = access_token['oauth_token'] sickbeard.TWITTER_PASSWORD = access_token['oauth_token_secret'] return True diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index 34175cdac..ce47b847b 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -366,7 +366,7 @@ class PostProcessor(object): helpers.copyFile(cur_file_path, new_file_path) helpers.chmodAsParent(new_file_path) except (IOError, OSError), e: - logger.log("Unable to copy file " + cur_file_path + " to " + new_file_path + ": " + ex(e), logger.ERROR) + logger.log(u"Unable to copy file " + cur_file_path + " to " + new_file_path + ": " + ex(e), logger.ERROR) raise self._combined_file_operation(file_path, new_path, new_base_name, associated_files, action=_int_copy, diff --git a/sickbeard/properFinder.py b/sickbeard/properFinder.py index b12940d2a..6c1c06fe1 100644 --- a/sickbeard/properFinder.py +++ b/sickbeard/properFinder.py @@ -189,12 +189,12 @@ class ProperFinder: oldRelease_group = (sqlResults[0]["release_group"]) if oldVersion > -1 and oldVersion < bestResult.version: - logger.log("Found new anime v" + str(bestResult.version) + " to replace existing v" + str(oldVersion)) + logger.log(u"Found new anime v" + str(bestResult.version) + " to replace existing v" + str(oldVersion)) else: continue if oldRelease_group != bestResult.release_group: - logger.log("Skipping proper from release group: " + bestResult.release_group + ", does not match existing release group: " + oldRelease_group) + logger.log(u"Skipping proper from release group: " + bestResult.release_group + ", does not match existing release group: " + oldRelease_group) continue # if the show is in our list and there hasn't been a proper already added for that particular episode then add it to our list of propers diff --git a/sickbeard/providers/btdigg.py b/sickbeard/providers/btdigg.py index fc97662bd..19f2f12ba 100644 --- a/sickbeard/providers/btdigg.py +++ b/sickbeard/providers/btdigg.py @@ -55,7 +55,7 @@ class BTDIGGProvider(generic.TorrentProvider): jdata = self.getURL(searchURL, json=True) if not jdata: - logger.log("No data returned to be parsed!!!") + logger.log(u"No data returned to be parsed!!!") return [] for torrent in jdata: diff --git a/sickbeard/providers/btn.py b/sickbeard/providers/btn.py index c3eb82621..6b3b76728 100644 --- a/sickbeard/providers/btn.py +++ b/sickbeard/providers/btn.py @@ -88,7 +88,7 @@ class BTNProvider(generic.TorrentProvider): parsedJSON = self._api_call(apikey, params) if not parsedJSON: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) return results if self._checkAuthFromData(parsedJSON): diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index 3578d58c3..7f3faec90 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -66,7 +66,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): self.search_params.update({'type': ('search', 'rss')[mode == 'RSS'], 'search': search_string}) data = self.getURL(self.urls['rss'], params=self.search_params) if not data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue if not data.startswith('<?xml'): diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py index 720064de9..3ff1cf74b 100644 --- a/sickbeard/providers/freshontv.py +++ b/sickbeard/providers/freshontv.py @@ -126,7 +126,7 @@ class FreshOnTVProvider(generic.TorrentProvider): max_page_number = 0 if not init_html: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue try: diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 7d6d5811d..c3fb3f7d2 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -152,12 +152,12 @@ class GenericProvider(object): torrent_hash = b16encode(b32decode(torrent_hash)).upper() if not torrent_hash: - logger.log("Unable to extract torrent hash from magnet: " + ex(result.url), logger.ERROR) + logger.log(u"Unable to extract torrent hash from magnet: " + ex(result.url), logger.ERROR) return urls, filename urls = [x.format(torrent_hash=torrent_hash, torrent_name=torrent_name) for x in self.btCacheURLS] except Exception: - logger.log("Unable to extract torrent hash or name from magnet: " + ex(result.url), logger.ERROR) + logger.log(u"Unable to extract torrent hash or name from magnet: " + ex(result.url), logger.ERROR) return urls, filename else: urls = [result.url] diff --git a/sickbeard/providers/hdspace.py b/sickbeard/providers/hdspace.py index 2e1fde63f..a4b7e7369 100644 --- a/sickbeard/providers/hdspace.py +++ b/sickbeard/providers/hdspace.py @@ -105,7 +105,7 @@ class HDSpaceProvider(generic.TorrentProvider): data = self.getURL(searchURL) if not data or 'please try later' in data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue # Search result page contains some invalid html that prevents html parser from returning all data. @@ -120,7 +120,7 @@ class HDSpaceProvider(generic.TorrentProvider): html = BeautifulSoup(data[index:], 'html5lib') if not html: - logger.log("No html data parsed from provider", logger.DEBUG) + logger.log(u"No html data parsed from provider", logger.DEBUG) continue torrents = html.findAll('tr') diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index d8f53f097..4183f7026 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -103,7 +103,7 @@ class HDTorrentsProvider(generic.TorrentProvider): data = self.getURL(searchURL) if not data or 'please try later' in data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue # Search result page contains some invalid html that prevents html parser from returning all data. @@ -119,7 +119,7 @@ class HDTorrentsProvider(generic.TorrentProvider): with BS4Parser(data, features=["html5lib", "permissive"]) as html: if not html: - logger.log("No html data parsed from provider", logger.DEBUG) + logger.log(u"No html data parsed from provider", logger.DEBUG) continue empty = html.find('No torrents here') diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index b441fbdd5..bb0ffb90a 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -106,7 +106,7 @@ class IPTorrentsProvider(generic.TorrentProvider): data = re.sub(r'(?im)<button.+?<[\/]button>', '', data, 0) with BS4Parser(data, features=["html5lib", "permissive"]) as html: if not html: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue if html.find(text='No Torrents Found!'): diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 2614558d3..72c65f5fd 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -88,7 +88,7 @@ class KATProvider(generic.TorrentProvider): data = self.getURL(searchURL) # data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) if not data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue if not data.startswith('<?xml'): diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index b3e960a64..40d447e5b 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -297,7 +297,7 @@ class NewznabProvider(generic.NZBProvider): break if offset != params['offset']: - logger.log("Tell your newznab provider to fix their bloody newznab responses") + logger.log(u"Tell your newznab provider to fix their bloody newznab responses") break params['offset'] += params['limit'] @@ -368,7 +368,7 @@ class NewznabCache(tvcache.TVCache): while (datetime.datetime.now() - self.last_search).seconds < 5: time.sleep(1) - logger.log("Cache update URL: %s " % rss_url, logger.DEBUG) + logger.log(u"Cache update URL: %s " % rss_url, logger.DEBUG) data = self.getRSSFeed(rss_url) self.last_search = datetime.datetime.now() diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index 62e60956e..384412561 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -165,7 +165,7 @@ class RarbgProvider(generic.TorrentProvider): self.next_request = datetime.datetime.now() + datetime.timedelta(seconds=10) if not data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) raise GetOutOfLoop if re.search('ERROR', data): logger.log(u"Error returned from provider", logger.DEBUG) diff --git a/sickbeard/providers/rsstorrent.py b/sickbeard/providers/rsstorrent.py index 070705eb3..2bdaad283 100644 --- a/sickbeard/providers/rsstorrent.py +++ b/sickbeard/providers/rsstorrent.py @@ -141,7 +141,7 @@ class TorrentRssProvider(generic.TorrentProvider): fileOut.close() helpers.chmodAsParent(dumpName) except IOError, e: - logger.log("Unable to save the file: %s " % repr(e), logger.ERROR) + logger.log(u"Unable to save the file: %s " % repr(e), logger.ERROR) return False logger.log(u"Saved custom_torrent html dump %s " % dumpName, logger.INFO) return True diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py index 704b23d88..977433603 100644 --- a/sickbeard/providers/strike.py +++ b/sickbeard/providers/strike.py @@ -48,7 +48,7 @@ class STRIKEProvider(generic.TorrentProvider): logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) jdata = self.getURL(searchURL, json=True) if not jdata: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) return [] results = [] diff --git a/sickbeard/providers/titansoftv.py b/sickbeard/providers/titansoftv.py index 13b3b8a39..2f160ab29 100644 --- a/sickbeard/providers/titansoftv.py +++ b/sickbeard/providers/titansoftv.py @@ -71,7 +71,7 @@ class TitansOfTVProvider(generic.TorrentProvider): parsedJSON = self.getURL(searchURL, json=True) # do search if not parsedJSON: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) return results if self._checkAuthFromData(parsedJSON): diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index 95d3f765a..1213a1cf8 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -310,7 +310,7 @@ class TNTVillageProvider(generic.TorrentProvider): logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) if not data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue try: diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 5e8b150a7..62550dab1 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -115,7 +115,7 @@ class TorrentDayProvider(generic.TorrentProvider): parsedJSON = self.getURL(self.urls['search'], post_data=post_data, json=True) if not parsedJSON: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue try: diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py index a06513479..4ae53d802 100644 --- a/sickbeard/providers/torrentproject.py +++ b/sickbeard/providers/torrentproject.py @@ -68,31 +68,23 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): leechers = helpers.tryInt(torrents[i]["leechs"], 0) if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': - logger.log("Torrent doesn't meet minimum seeds & leechers not selecting : %s" % title, logger.DEBUG) + logger.log(u"Torrent doesn't meet minimum seeds & leechers not selecting : %s" % title, logger.DEBUG) continue t_hash = torrents[i]["torrent_hash"] size = int(torrents[i]["torrent_size"]) - if seeders < 10: - if mode != 'RSS': - logger.log("Torrent has less than 10 seeds getting dyn trackers: " + title, logger.DEBUG) - trackerUrl = self.urls['api'] + "" + t_hash + "/trackers_json" - jdata = self.getURL(trackerUrl, json=True) - if jdata == "maintenance": - download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" - logger.log("Tracker url is in " + jdata + " mode, using hardcoded one" , logger.INFO) - else: - download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "".join(["&tr=" + s for s in jdata]) - logger.log("Dyn Magnet: " + download_url, logger.DEBUG) - else: - download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" - logger.log("Result has less than 10 seeds but not using Dyn Magnet becouse its from RSS" + title, logger.DEBUG) - else: - # logger.log("Torrent has more than 10 seeds using hard coded trackers", logger.DEBUG) + try: + assert seeders < 10 + assert mode is not 'RSS' + logger.log(u"Torrent has less than 10 seeds getting dyn trackers: " + title, logger.DEBUG) + trackerUrl = self.urls['api'] + "" + t_hash + "/trackers_json" + jdata = self.getURL(trackerUrl, json=True) + assert jdata is not "maintenance" + download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "".join(["&tr=" + s for s in jdata]) + except (Exception, AssertionError): download_url = "magnet:?xt=urn:btih:" + t_hash + "&dn=" + title + "&tr=udp://tracker.openbittorrent.com:80&tr=udp://tracker.coppersurfer.tk:6969&tr=udp://open.demonii.com:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://exodus.desync.com:6969" - if not all([title, download_url]): continue @@ -122,7 +114,7 @@ class TORRENTPROJECTCache(tvcache.TVCache): self.minTime = 20 def _getRSSData(self): - + search_params = {'RSS': ['0day']} return {'entries': self.provider._doSearch(search_params)} diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index 2e12a02fc..ee3e7e587 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -69,11 +69,11 @@ class TORRENTZProvider(generic.TorrentProvider): logger.log(search_url) data = self.getURL(search_url) if not data: - logger.log('Seems to be down right now!') + logger.log(u'Seems to be down right now!') continue if not data.startswith("<?xml"): - logger.log('Wrong data returned from: ' + search_url, logger.DEBUG) + logger.log(u'Wrong data returned from: ' + search_url, logger.DEBUG) continue if not data.startswith('<?xml'): diff --git a/sickbeard/providers/transmitthenet.py b/sickbeard/providers/transmitthenet.py index 52dcefb66..2049b638d 100644 --- a/sickbeard/providers/transmitthenet.py +++ b/sickbeard/providers/transmitthenet.py @@ -98,7 +98,7 @@ class TransmitTheNetProvider(generic.TorrentProvider): logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) if not data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue try: diff --git a/sickbeard/providers/tvchaosuk.py b/sickbeard/providers/tvchaosuk.py index c7f9bd919..dee2176c4 100644 --- a/sickbeard/providers/tvchaosuk.py +++ b/sickbeard/providers/tvchaosuk.py @@ -139,7 +139,7 @@ class TVChaosUKProvider(generic.TorrentProvider): # url_searched = self.urls['search'] + '?' + urlencode(self.search_params) if not data: - logger.log("No data returned from provider", logger.DEBUG) + logger.log(u"No data returned from provider", logger.DEBUG) continue with BS4Parser(data) as html: diff --git a/sickbeard/sab.py b/sickbeard/sab.py index 70ee848d6..3c3067ddd 100644 --- a/sickbeard/sab.py +++ b/sickbeard/sab.py @@ -77,7 +77,7 @@ def sendNZB(nzb): if nzb.provider.getID() == 'newzbin': id = nzb.provider.getIDFromURL(nzb.url) if not id: - logger.log("Unable to send NZB to sab, can't find ID in URL " + str(nzb.url), logger.ERROR) + logger.log(u"Unable to send NZB to sab, can't find ID in URL " + str(nzb.url), logger.ERROR) return False params['mode'] = 'addid' params['name'] = id diff --git a/sickbeard/search.py b/sickbeard/search.py index 1eba3b0b7..8149563f2 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -215,7 +215,7 @@ def pickBestResult(results, show): if not show.release_groups.is_valid(cur_result): continue - logger.log("Quality of " + cur_result.name + " is " + Quality.qualityStrings[cur_result.quality]) + logger.log(u"Quality of " + cur_result.name + " is " + Quality.qualityStrings[cur_result.quality]) anyQualities, bestQualities = Quality.splitQuality(show.quality) diff --git a/sickbeard/search_queue.py b/sickbeard/search_queue.py index 48777c2e8..32738b930 100644 --- a/sickbeard/search_queue.py +++ b/sickbeard/search_queue.py @@ -126,13 +126,13 @@ class SearchQueue(generic_queue.GenericQueue): class DailySearchQueueItem(generic_queue.QueueItem): def __init__(self): self.success = None - generic_queue.QueueItem.__init__(self, 'Daily Search', DAILY_SEARCH) + generic_queue.QueueItem.__init__(self, u'Daily Search', DAILY_SEARCH) def run(self): generic_queue.QueueItem.run(self) try: - logger.log("Beginning daily search for new episodes") + logger.log(u"Beginning daily search for new episodes") foundResults = search.searchForNeededEpisodes() if not len(foundResults): @@ -158,7 +158,7 @@ class DailySearchQueueItem(generic_queue.QueueItem): class ManualSearchQueueItem(generic_queue.QueueItem): def __init__(self, show, segment, downCurQuality=False): - generic_queue.QueueItem.__init__(self, 'Manual Search', MANUAL_SEARCH) + generic_queue.QueueItem.__init__(self, u'Manual Search', MANUAL_SEARCH) self.priority = generic_queue.QueuePriorities.HIGH self.name = 'MANUAL-' + str(show.indexerid) self.success = None @@ -171,7 +171,7 @@ class ManualSearchQueueItem(generic_queue.QueueItem): generic_queue.QueueItem.run(self) try: - logger.log("Beginning manual search for: [" + self.segment.prettyName() + "]") + logger.log(u"Beginning manual search for: [" + self.segment.prettyName() + "]") self.started = True searchResult = search.searchProviders(self.show, [self.segment], True, self.downCurQuality) @@ -204,7 +204,7 @@ class ManualSearchQueueItem(generic_queue.QueueItem): class BacklogQueueItem(generic_queue.QueueItem): def __init__(self, show, segment): - generic_queue.QueueItem.__init__(self, 'Backlog', BACKLOG_SEARCH) + generic_queue.QueueItem.__init__(self, u'Backlog', BACKLOG_SEARCH) self.priority = generic_queue.QueuePriorities.LOW self.name = 'BACKLOG-' + str(show.indexerid) self.success = None @@ -216,7 +216,7 @@ class BacklogQueueItem(generic_queue.QueueItem): if not self.show.paused: try: - logger.log("Beginning backlog search for: [" + self.show.name + "]") + logger.log(u"Beginning backlog search for: [" + self.show.name + "]") searchResult = search.searchProviders(self.show, self.segment, False) if searchResult: @@ -237,7 +237,7 @@ class BacklogQueueItem(generic_queue.QueueItem): class FailedQueueItem(generic_queue.QueueItem): def __init__(self, show, segment, downCurQuality=False): - generic_queue.QueueItem.__init__(self, 'Retry', FAILED_SEARCH) + generic_queue.QueueItem.__init__(self, u'Retry', FAILED_SEARCH) self.priority = generic_queue.QueuePriorities.HIGH self.name = 'RETRY-' + str(show.indexerid) self.show = show @@ -263,7 +263,7 @@ class FailedQueueItem(generic_queue.QueueItem): history.logFailed(epObj, release, provider) failed_history.revertEpisode(epObj) - logger.log("Beginning failed download search for: [" + epObj.prettyName() + "]") + logger.log(u"Beginning failed download search for: [" + epObj.prettyName() + "]") # If it is wanted, self.downCurQuality doesnt matter # if it isnt wanted, we need to make sure to not overwrite the existing ep that we reverted to! diff --git a/sickbeard/showUpdater.py b/sickbeard/showUpdater.py index b55ab3dde..d6befb61a 100644 --- a/sickbeard/showUpdater.py +++ b/sickbeard/showUpdater.py @@ -75,7 +75,7 @@ class ShowUpdater: try: piList.append(sickbeard.showQueueScheduler.action.updateShow(curShow, True)) # @UndefinedVariable except CantUpdateShowException as e: - logger.log("Unable to update show: {0}".format(str(e)),logger.DEBUG) + logger.log(u"Unable to update show: {0}".format(str(e)),logger.DEBUG) else: logger.log( u"Not updating episodes for show " + curShow.name + " because it's marked as ended and last/next episode is not within the grace period.", diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 06b708427..248d63326 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -158,7 +158,7 @@ def downloadSubtitles(subtitles_info): new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) except Exception: - logger.log("Error occurred when downloading subtitles for: %s" % video_path) + logger.log(u"Error occurred when downloading subtitles for: %s" % video_path) logger.log(traceback.format_exc(), logger.ERROR) return (existing_subtitles, None) @@ -174,12 +174,12 @@ def save_subtitles(video, subtitles, single=False, directory=None): for subtitle in subtitles: # check content if subtitle.content is None: - logger.log("Skipping subtitle for %s: no content" % video.name, logger.DEBUG) + logger.log(u"Skipping subtitle for %s: no content" % video.name, logger.DEBUG) continue # check language if subtitle.language in set(s.language for s in saved_subtitles): - logger.log("Skipping subtitle for %s: language already saved" % video.name, logger.DEBUG) + logger.log(u"Skipping subtitle for %s: language already saved" % video.name, logger.DEBUG) continue # create subtitle path @@ -188,7 +188,7 @@ def save_subtitles(video, subtitles, single=False, directory=None): subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1]) # save content as is or in the specified encoding - logger.log("Saving subtitle for %s to %s" % (video.name, subtitle_path), logger.DEBUG) + logger.log(u"Saving subtitle for %s to %s" % (video.name, subtitle_path), logger.DEBUG) if subtitle.encoding: with io.open(subtitle_path, 'w', encoding=subtitle.encoding) as f: f.write(subtitle.text) @@ -300,20 +300,20 @@ def getEmbeddedLanguages(video_path): try: embedded_subtitle_languages.add(Language.fromalpha3b(st.language)) except BabelfishError: - logger.log('Embedded subtitle track is not a valid language', logger.DEBUG) + logger.log(u'Embedded subtitle track is not a valid language', logger.DEBUG) embedded_subtitle_languages.add(Language('und')) elif st.name: try: embedded_subtitle_languages.add(Language.fromname(st.name)) except BabelfishError: - logger.log('Embedded subtitle track is not a valid language', logger.DEBUG) + logger.log(u'Embedded subtitle track is not a valid language', logger.DEBUG) embedded_subtitle_languages.add(Language('und')) else: embedded_subtitle_languages.add(Language('und')) else: - logger.log('MKV has no subtitle track', logger.DEBUG) + logger.log(u'MKV has no subtitle track', logger.DEBUG) except MalformedMKVError: - logger.log('MKV seems to be malformed ( %s ), ignoring embedded subtitles' % video_path, logger.INFO) + logger.log(u'MKV seems to be malformed ( %s ), ignoring embedded subtitles' % video_path, logger.INFO) return embedded_subtitle_languages @@ -381,7 +381,7 @@ class SubtitlesFinder(): 'AND e.location != ""', [today, wantedLanguages(True)]) if len(sqlResults) == 0: - logger.log('No subtitles to download', logger.INFO) + logger.log(u'No subtitles to download', logger.INFO) return rules = self._getRules() @@ -389,7 +389,7 @@ class SubtitlesFinder(): for epToSub in sqlResults: if not ek(os.path.isfile, epToSub['location']): - logger.log('Episode file does not exist, cannot download subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) + logger.log(u'Episode file does not exist, cannot download subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) continue # Old shows rule @@ -398,7 +398,7 @@ class SubtitlesFinder(): # Recent shows rule (epToSub['airdate_daydiff'] <= 7 and epToSub['searchcount'] < 7 and now - datetime.datetime.strptime(epToSub['lastsearch'], dateTimeFormat) > datetime.timedelta(hours=rules['new'][epToSub['searchcount']]))): - logger.log('Downloading subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) + logger.log(u'Downloading subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(epToSub['showid'])) if not showObj: diff --git a/sickbeard/tv.py b/sickbeard/tv.py index be0e3b2ee..e7339448f 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -261,7 +261,7 @@ class TVShow(object): logger.log( "Found episode by absolute_number %s which is S%02dE%02d" % (absolute_number, season or 0, episode or 0), logger.DEBUG) elif len(sqlResults) > 1: - logger.log("Multiple entries for absolute number: " + str( + logger.log(u"Multiple entries for absolute number: " + str( absolute_number) + " in show: " + self.name + " found ", logger.ERROR) return None else: @@ -453,7 +453,7 @@ class TVShow(object): try: curEpisode.refreshSubtitles() except Exception: - logger.log("%s: Could not refresh subtitles" % self.indexerid, logger.ERROR) + logger.log(u"%s: Could not refresh subtitles" % self.indexerid, logger.ERROR) logger.log(traceback.format_exc(), logger.DEBUG) sql_l.append(curEpisode.get_sql()) @@ -573,7 +573,7 @@ class TVShow(object): if not ep: raise EpisodeNotFoundException except EpisodeNotFoundException: - logger.log("%s: %s object for S%02dE%02d is incomplete, skipping this episode" % (self.indexerid, sickbeard.indexerApi(self.indexer).name, season or 0, episode or 0)) + logger.log(u"%s: %s object for S%02dE%02d is incomplete, skipping this episode" % (self.indexerid, sickbeard.indexerApi(self.indexer).name, season or 0, episode or 0)) continue else: try: @@ -583,7 +583,7 @@ class TVShow(object): continue with ep.lock: - logger.log("%s: Loading info from %s for episode S%02dE%02d" % (self.indexerid, sickbeard.indexerApi(self.indexer).name, season or 0, episode or 0), logger.DEBUG) + logger.log(u"%s: Loading info from %s for episode S%02dE%02d" % (self.indexerid, sickbeard.indexerApi(self.indexer).name, season or 0, episode or 0), logger.DEBUG) ep.loadFromIndexer(season, episode, tvapi=t) sql_l.append(ep.get_sql()) @@ -640,7 +640,7 @@ class TVShow(object): return None if not len(parse_result.episode_numbers): - logger.log("parse_result: " + str(parse_result)) + logger.log(u"parse_result: " + str(parse_result)) logger.log(u"No episode number found in " + file + ", ignoring it", logger.WARNING) return None @@ -654,7 +654,7 @@ class TVShow(object): episode = int(curEpNum) - logger.log("%s: %s parsed to %s S%02dE%02d" % (self.indexerid, file, self.name, season or 0, episode or 0), logger.DEBUG) + logger.log(u"%s: %s parsed to %s S%02dE%02d" % (self.indexerid, file, self.name, season or 0, episode or 0), logger.DEBUG) checkQualityAgain = False same_file = False @@ -1021,7 +1021,7 @@ class TVShow(object): file_attribute = ek(os.stat, self.location)[0] if not file_attribute & stat.S_IWRITE: # File is read-only, so make it writeable - logger.log('Attempting to make writeable the read only folder %s' % self._location, logger.DEBUG) + logger.log(u'Attempting to make writeable the read only folder %s' % self._location, logger.DEBUG) try: ek(os.chmod, self.location, stat.S_IWRITE) except Exception: @@ -1125,19 +1125,19 @@ class TVShow(object): logger.log(str(self.indexerid) + ": Show dir doesn't exist, can't download subtitles", logger.DEBUG) return - logger.log("%s: Downloading subtitles" % self.indexerid, logger.DEBUG) + logger.log(u"%s: Downloading subtitles" % self.indexerid, logger.DEBUG) try: episodes = self.getAllEpisodes(has_location=True) if not episodes: - logger.log("%s: No episodes to download subtitles for %s" % (self.indexerid, self.name), logger.DEBUG) + logger.log(u"%s: No episodes to download subtitles for %s" % (self.indexerid, self.name), logger.DEBUG) return for episode in episodes: episode.downloadSubtitles(force=force) except Exception: - logger.log("%s: Error occurred when downloading subtitles for %s" % (self.indexerid, self.name), logger.DEBUG) + logger.log(u"%s: Error occurred when downloading subtitles for %s" % (self.indexerid, self.name), logger.DEBUG) logger.log(traceback.format_exc(), logger.ERROR) def saveToDB(self, forceSave=False): diff --git a/sickbeard/tvcache.py b/sickbeard/tvcache.py index a7380f1ef..6c6ce5677 100644 --- a/sickbeard/tvcache.py +++ b/sickbeard/tvcache.py @@ -137,7 +137,7 @@ class TVCache(object): handlers = [] if sickbeard.PROXY_SETTING: - logger.log("Using global proxy for url: " + url, logger.DEBUG) + logger.log(u"Using global proxy for url: " + url, logger.DEBUG) scheme, address = urllib2.splittype(sickbeard.PROXY_SETTING) address = sickbeard.PROXY_SETTING if scheme else 'http://' + sickbeard.PROXY_SETTING handlers = [urllib2.ProxyHandler({'http': address, 'https': address})] diff --git a/sickbeard/versionChecker.py b/sickbeard/versionChecker.py index 257525eed..b3dbf50cd 100644 --- a/sickbeard/versionChecker.py +++ b/sickbeard/versionChecker.py @@ -105,7 +105,7 @@ class CheckVersion(object): ui.notifications.message('Backup', 'Config backup failed, aborting update') return False except Exception as e: - logger.log('Update: Config backup failed. Error: %s' % ex(e), logger.ERROR) + logger.log(u'Update: Config backup failed. Error: %s' % ex(e), logger.ERROR) ui.notifications.message('Backup', 'Config backup failed, aborting update') return False diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 0023fe487..96a3c1259 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -2777,7 +2777,7 @@ class CMD_ShowUpdate(ApiCall): sickbeard.showQueueScheduler.action.updateShow(showObj, True) # @UndefinedVariable return _responds(RESULT_SUCCESS, msg=str(showObj.name) + " has queued to be updated") except CantUpdateShowException as e: - logger.log("API::Unable to update show: {0}".format(str(e)), logger.DEBUG) + logger.log(u"API::Unable to update show: {0}".format(str(e)), logger.DEBUG) return _responds(RESULT_FAILURE, msg="Unable to update " + str(showObj.name)) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 75829966c..782c460ea 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -247,7 +247,7 @@ class WebHandler(BaseHandler): self.finish(results) except Exception: - logger.log('Failed doing webui request "%s": %s' % (route, traceback.format_exc()), logger.DEBUG) + logger.log(u'Failed doing webui request "%s": %s' % (route, traceback.format_exc()), logger.DEBUG) raise HTTPError(404) @run_on_executor @@ -261,7 +261,7 @@ class WebHandler(BaseHandler): result = function(**kwargs) return result except Exception: - logger.log('Failed doing webui callback: %s' % (traceback.format_exc()), logger.ERROR) + logger.log(u'Failed doing webui callback: %s' % (traceback.format_exc()), logger.ERROR) raise # post uses get method @@ -291,9 +291,9 @@ class LoginHandler(BaseHandler): if api_key: remember_me = int(self.get_argument('remember_me', default=0) or 0) self.set_secure_cookie('sickrage_user', api_key, expires_days=30 if remember_me > 0 else None) - logger.log('User logged into the SickRage web interface', logger.INFO) + logger.log(u'User logged into the SickRage web interface', logger.INFO) else: - logger.log('User attempted a failed login to the SickRage web interface from IP: ' + self.request.remote_ip, logger.WARNING) + logger.log(u'User attempted a failed login to the SickRage web interface from IP: ' + self.request.remote_ip, logger.WARNING) self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') @@ -321,7 +321,7 @@ class KeyHandler(RequestHandler): self.finish({'success': api_key is not None, 'api_key': api_key}) except Exception: - logger.log('Failed doing key request: %s' % (traceback.format_exc()), logger.ERROR) + logger.log(u'Failed doing key request: %s' % (traceback.format_exc()), logger.ERROR) self.finish({'success': False, 'error': 'Failed returning results'}) @@ -1354,7 +1354,7 @@ class Home(WebRoot): except Exception as e: anidb_failed = True ui.notifications.error('Unable to retreive Fansub Groups from AniDB.') - logger.log('Unable to retreive Fansub Groups from AniDB. Error is {0}'.format(str(e)), logger.DEBUG) + logger.log(u'Unable to retreive Fansub Groups from AniDB. Error is {0}'.format(str(e)), logger.DEBUG) with showObj.lock: show = showObj @@ -1906,7 +1906,7 @@ class Home(WebRoot): showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(searchThread.show.indexerid)) if not showObj: - logger.log('No Show Object found for show with indexerID: ' + str(searchThread.show.indexerid), logger.ERROR) + logger.log(u'No Show Object found for show with indexerID: ' + str(searchThread.show.indexerid), logger.ERROR) return results if isinstance(searchThread, sickbeard.search_queue.ManualSearchQueueItem): @@ -2240,7 +2240,7 @@ class HomeAddShows(Home): lINDEXER_API_PARMS['custom_ui'] = classes.AllShowsListUI t = sickbeard.indexerApi(indexer).indexer(**lINDEXER_API_PARMS) - logger.log("Searching for Show with searchterm: %s on Indexer: %s" % ( + logger.log(u"Searching for Show with searchterm: %s on Indexer: %s" % ( search_term, sickbeard.indexerApi(indexer).name), logger.DEBUG) try: # add search results @@ -2601,7 +2601,7 @@ class HomeAddShows(Home): series_pieces = whichSeries.split('|') if (whichSeries and rootDir) or (whichSeries and fullShowPath and len(series_pieces) > 1): if len(series_pieces) < 6: - logger.log("Unable to add show due to show selection. Not anough arguments: %s" % (repr(series_pieces)), + logger.log(u"Unable to add show due to show selection. Not anough arguments: %s" % (repr(series_pieces)), logger.ERROR) ui.notifications.error("Unknown error. Unable to add show due to problem with show selection.") return self.redirect('/home/addShows/existingShows/') diff --git a/tests/issue_submitter_tests.py b/tests/issue_submitter_tests.py index cd318f404..ea8a7a495 100644 --- a/tests/issue_submitter_tests.py +++ b/tests/issue_submitter_tests.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -from __future__ import with_statement import sys, os.path @@ -33,7 +32,7 @@ def error(): try: raise Exception('FAKE EXCEPTION') except Exception as e: - logger.log("FAKE ERROR: " + ex(e), logger.ERROR) + logger.log(u"FAKE ERROR: " + ex(e), logger.ERROR) logger.submit_errors() raise diff --git a/tests/test_lib.py b/tests/test_lib.py index 0fc43d5b8..dd28942dc 100644 --- a/tests/test_lib.py +++ b/tests/test_lib.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -from __future__ import with_statement import sys, os.path sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) diff --git a/tests/torrent_tests.py b/tests/torrent_tests.py index 73b6ff289..23a60edd6 100644 --- a/tests/torrent_tests.py +++ b/tests/torrent_tests.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -from __future__ import with_statement import sys, os.path sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) diff --git a/tests/xem_tests.py b/tests/xem_tests.py index 0aa22c1b4..97fa2d425 100644 --- a/tests/xem_tests.py +++ b/tests/xem_tests.py @@ -17,7 +17,6 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -from __future__ import with_statement import sys, os.path sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) -- GitLab From 86f0c80f3e92df1aedbbbc2e1983d594aa5dfc92 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Fri, 6 Nov 2015 22:34:33 -0800 Subject: [PATCH 062/215] Replace all mode != 'RSS' with mode is not 'RSS', etc now getURL returns the unicode instead of content Remove hacky escaping in kat, ettv, torrentz Remove post request gunzipping (since glype is gone) --- sickbeard/helpers.py | 21 +-------------------- sickbeard/network_timezones.py | 2 +- sickbeard/providers/alpharatio.py | 6 +++--- sickbeard/providers/bitcannon.py | 4 ++-- sickbeard/providers/bitsoup.py | 6 +++--- sickbeard/providers/bluetigers.py | 6 +++--- sickbeard/providers/btdigg.py | 6 +++--- sickbeard/providers/cpasbien.py | 4 ++-- sickbeard/providers/extratorrent.py | 10 +++++----- sickbeard/providers/fnt.py | 6 +++--- sickbeard/providers/frenchtorrentdb.py | 6 +++--- sickbeard/providers/freshontv.py | 6 +++--- sickbeard/providers/gftracker.py | 6 +++--- sickbeard/providers/hdspace.py | 8 ++++---- sickbeard/providers/hdtorrents.py | 8 ++++---- sickbeard/providers/hounddawgs.py | 6 +++--- sickbeard/providers/iptorrents.py | 8 ++++---- sickbeard/providers/kat.py | 23 +++++++++++------------ sickbeard/providers/libertalia.py | 6 +++--- sickbeard/providers/morethantv.py | 6 +++--- sickbeard/providers/nextgen.py | 6 +++--- sickbeard/providers/nyaatorrents.py | 10 +++++----- sickbeard/providers/pretome.py | 6 +++--- sickbeard/providers/rarbg.py | 6 +++--- sickbeard/providers/scc.py | 8 ++++---- sickbeard/providers/scenetime.py | 6 +++--- sickbeard/providers/speedcd.py | 6 +++--- sickbeard/providers/strike.py | 6 +++--- sickbeard/providers/t411.py | 16 ++++++++-------- sickbeard/providers/thepiratebay.py | 12 ++++++------ sickbeard/providers/titansoftv.py | 2 +- sickbeard/providers/tntvillage.py | 10 +++++----- sickbeard/providers/tokyotoshokan.py | 2 +- sickbeard/providers/torrentbytes.py | 6 +++--- sickbeard/providers/torrentday.py | 6 +++--- sickbeard/providers/torrentleech.py | 6 +++--- sickbeard/providers/torrentproject.py | 6 +++--- sickbeard/providers/torrentz.py | 6 +++--- sickbeard/providers/transmitthenet.py | 6 +++--- sickbeard/providers/tvchaosuk.py | 6 +++--- sickbeard/providers/xthor.py | 6 +++--- 41 files changed, 139 insertions(+), 159 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index c9de23eb6..e29c7ecca 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -48,20 +48,6 @@ import certifi from contextlib import closing from socket import timeout as SocketTimeout - -try: - from io import BytesIO as _StringIO -except ImportError: - try: - from cStringIO import StringIO as _StringIO - except ImportError: - from StringIO import StringIO as _StringIO - -try: - import gzip -except ImportError: - gzip = None - from sickbeard import logger, classes from sickbeard.common import USER_AGENT from sickbeard.common import mediaExtensions @@ -1649,12 +1635,7 @@ def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=N logger.log(traceback.format_exc(), logger.WARNING) return None - attempts = 0 - while gzip and len(resp.content) > 1 and resp.content[0] == '\x1f' and resp.content[1] == '\x8b' and attempts < 3: - attempts += 1 - resp._content = gzip.GzipFile(fileobj=_StringIO(resp.content)).read() - - return resp.content if not json else resp.json() + return resp.text if not json else resp.json() def download_file(url, filename, session=None, headers=None): diff --git a/sickbeard/network_timezones.py b/sickbeard/network_timezones.py index 78511be8d..312ea3127 100644 --- a/sickbeard/network_timezones.py +++ b/sickbeard/network_timezones.py @@ -53,7 +53,7 @@ def update_network_dict(): d = {} try: for line in url_data.splitlines(): - (key, val) = line.decode('utf-8').strip().rsplit(u':', 1) + (key, val) = line.strip().rsplit(u':', 1) if key is None or val is None: continue d[key] = val diff --git a/sickbeard/providers/alpharatio.py b/sickbeard/providers/alpharatio.py index 9d73f9ee9..cd67e4c9e 100644 --- a/sickbeard/providers/alpharatio.py +++ b/sickbeard/providers/alpharatio.py @@ -83,7 +83,7 @@ class AlphaRatioProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (search_string, self.catagories) @@ -123,12 +123,12 @@ class AlphaRatioProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/bitcannon.py b/sickbeard/providers/bitcannon.py index 2de19044c..29f4c0525 100644 --- a/sickbeard/providers/bitcannon.py +++ b/sickbeard/providers/bitcannon.py @@ -75,7 +75,7 @@ class BitCannonProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue @@ -83,7 +83,7 @@ class BitCannonProvider(generic.TorrentProvider): download_url = 'magnet:?xt=urn:btih:%s&dn=%s&tr=%s' % (info_hash, quote_plus(title.encode('utf-8')), u'&tr='.join([quote_plus(x.encode('utf-8')) for x in trackers])) item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/bitsoup.py b/sickbeard/providers/bitsoup.py index e25855c9d..162f7b3bc 100644 --- a/sickbeard/providers/bitsoup.py +++ b/sickbeard/providers/bitsoup.py @@ -89,7 +89,7 @@ class BitSoupProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) self.search_params['search'] = search_string @@ -128,12 +128,12 @@ class BitSoupProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/bluetigers.py b/sickbeard/providers/bluetigers.py index a3416f3a7..4c431edac 100644 --- a/sickbeard/providers/bluetigers.py +++ b/sickbeard/providers/bluetigers.py @@ -88,7 +88,7 @@ class BLUETIGERSProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) self.search_params['search'] = search_string @@ -120,12 +120,12 @@ class BLUETIGERSProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/btdigg.py b/sickbeard/providers/btdigg.py index 19f2f12ba..70ee530ed 100644 --- a/sickbeard/providers/btdigg.py +++ b/sickbeard/providers/btdigg.py @@ -47,7 +47,7 @@ class BTDIGGProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s" % search_string, logger.DEBUG) searchURL = self.urls['api'] + "api/private-341ada3245790954/s02?q=" + search_string + "&p=0&order=1" @@ -72,12 +72,12 @@ class BTDIGGProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s" % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py index e91160f8d..67641af00 100644 --- a/sickbeard/providers/cpasbien.py +++ b/sickbeard/providers/cpasbien.py @@ -49,7 +49,7 @@ class CpasbienProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.url + '/recherche/'+search_string.replace('.', '-') + '.html' @@ -101,7 +101,7 @@ class CpasbienProvider(generic.TorrentProvider): continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index 7f3faec90..dff4f2baf 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -59,11 +59,11 @@ class ExtraTorrentProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) try: - self.search_params.update({'type': ('search', 'rss')[mode == 'RSS'], 'search': search_string}) + self.search_params.update({'type': ('search', 'rss')[mode is 'RSS'], 'search': search_string}) data = self.getURL(self.urls['rss'], params=self.search_params) if not data: logger.log(u"No data returned from provider", logger.DEBUG) @@ -74,7 +74,7 @@ class ExtraTorrentProvider(generic.TorrentProvider): continue try: - data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data.encode('utf-8')).decode('utf-8').replace('&', '&')) + data = xmltodict.parse(data) except ExpatError: logger.log(u"Failed parsing provider. Traceback: %r\n%r" % (traceback.format_exc(), data), logger.ERROR) continue @@ -100,12 +100,12 @@ class ExtraTorrentProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/fnt.py b/sickbeard/providers/fnt.py index 78bc2d1ea..52f83e8a3 100644 --- a/sickbeard/providers/fnt.py +++ b/sickbeard/providers/fnt.py @@ -90,7 +90,7 @@ class FNTProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) self.search_params['recherche'] = search_string @@ -135,12 +135,12 @@ class FNTProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/frenchtorrentdb.py b/sickbeard/providers/frenchtorrentdb.py index 8e69b6179..0f120b54f 100644 --- a/sickbeard/providers/frenchtorrentdb.py +++ b/sickbeard/providers/frenchtorrentdb.py @@ -134,7 +134,7 @@ class FrenchTorrentDBProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) self.search_params['name'] = search_string @@ -165,12 +165,12 @@ class FrenchTorrentDBProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py index 3ff1cf74b..611d5c66a 100644 --- a/sickbeard/providers/freshontv.py +++ b/sickbeard/providers/freshontv.py @@ -117,7 +117,7 @@ class FreshOnTVProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (freeleech, search_string) @@ -215,12 +215,12 @@ class FreshOnTVProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/gftracker.py b/sickbeard/providers/gftracker.py index 14d6656cd..826e42ccf 100644 --- a/sickbeard/providers/gftracker.py +++ b/sickbeard/providers/gftracker.py @@ -94,7 +94,7 @@ class GFTrackerProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (self.categories, search_string) @@ -146,12 +146,12 @@ class GFTrackerProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/hdspace.py b/sickbeard/providers/hdspace.py index a4b7e7369..a06c291ee 100644 --- a/sickbeard/providers/hdspace.py +++ b/sickbeard/providers/hdspace.py @@ -94,13 +94,13 @@ class HDSpaceProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': searchURL = self.urls['search'] % (urllib.quote_plus(search_string.replace('.', ' ')),) else: searchURL = self.urls['search'] % '' logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s" % search_string, logger.DEBUG) data = self.getURL(searchURL) @@ -146,12 +146,12 @@ class HDSpaceProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index 4183f7026..e2708f3cd 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -92,13 +92,13 @@ class HDTorrentsProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': searchURL = self.urls['search'] % (urllib.quote_plus(search_string), self.categories) else: searchURL = self.urls['rss'] % self.categories logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s" % search_string, logger.DEBUG) data = self.getURL(searchURL) @@ -177,12 +177,12 @@ class HDTorrentsProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/hounddawgs.py b/sickbeard/providers/hounddawgs.py index 704320e3e..3736bfcb4 100644 --- a/sickbeard/providers/hounddawgs.py +++ b/sickbeard/providers/hounddawgs.py @@ -95,7 +95,7 @@ class HoundDawgsProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) self.search_params['searchstr'] = search_string @@ -157,12 +157,12 @@ class HoundDawgsProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index bb0ffb90a..1fd44e609 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -90,12 +90,12 @@ class IPTorrentsProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) # URL with 50 tv-show results, or max 150 if adjusted in IPTorrents profile searchURL = self.urls['search'] % (self.categories, freeleech, search_string) - searchURL += ';o=seeders' if mode != 'RSS' else '' + searchURL += ';o=seeders' if mode is not 'RSS' else '' logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) @@ -136,12 +136,12 @@ class IPTorrentsProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 72c65f5fd..0168c1322 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -23,7 +23,6 @@ import traceback from urllib import urlencode import xmltodict -import HTMLParser import sickbeard from sickbeard import logger @@ -75,18 +74,18 @@ class KATProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - self.search_params['q'] = search_string.encode('utf-8') if mode != 'RSS' else '' - self.search_params['field'] = 'seeders' if mode != 'RSS' else 'time_add' + self.search_params['q'] = search_string.encode('utf-8') if mode is not 'RSS' else '' + self.search_params['field'] = 'seeders' if mode is not 'RSS' else 'time_add' - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s" % search_string, logger.DEBUG) - url_fmt_string = 'usearch' if mode != 'RSS' else search_string + url_fmt_string = 'usearch' if mode is not 'RSS' else search_string try: searchURL = self.urls['search'] % url_fmt_string + '?' + urlencode(self.search_params) logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) - # data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) + # data = self.getURL(self.urls[('search', 'rss')[mode is 'RSS']], params=self.search_params) if not data: logger.log(u"No data returned from provider", logger.DEBUG) continue @@ -96,7 +95,7 @@ class KATProvider(generic.TorrentProvider): continue try: - data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data.encode('utf-8')).decode('utf-8').replace('&', '&')) + data = xmltodict.parse(data) except ExpatError: logger.log(u"Failed parsing provider. Traceback: %r\n%r" % (traceback.format_exc(), data), logger.ERROR) continue @@ -111,8 +110,8 @@ class KATProvider(generic.TorrentProvider): for item in entries: try: - title = item['title'].decode('utf-8') - + title = item['title'] + assert isinstance(title, unicode) # Use the torcache link kat provides, # unless it is not torcache or we are not using blackhole # because we want to use magnets if connecting direct to client @@ -137,17 +136,17 @@ class KATProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue if self.confirmed and not verified: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result " + title + " but that doesn't seem like a verified result so I'm ignoring it", logger.DEBUG) continue item = title, download_url, size, seeders, leechers, info_hash - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/libertalia.py b/sickbeard/providers/libertalia.py index e9d364f17..4a4b9b6b4 100644 --- a/sickbeard/providers/libertalia.py +++ b/sickbeard/providers/libertalia.py @@ -87,7 +87,7 @@ class LibertaliaProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urlsearch % (urllib.quote(search_string), self.categories) @@ -121,12 +121,12 @@ class LibertaliaProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/morethantv.py b/sickbeard/providers/morethantv.py index e815b4146..c89b22540 100644 --- a/sickbeard/providers/morethantv.py +++ b/sickbeard/providers/morethantv.py @@ -106,7 +106,7 @@ class MoreThanTVProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (search_string.replace('(', '').replace(')', '')) @@ -162,12 +162,12 @@ class MoreThanTVProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/nextgen.py b/sickbeard/providers/nextgen.py index 5915ff6a5..08e575da4 100644 --- a/sickbeard/providers/nextgen.py +++ b/sickbeard/providers/nextgen.py @@ -122,7 +122,7 @@ class NextGenProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (urllib.quote(search_string.encode('utf-8')), self.categories) @@ -171,12 +171,12 @@ class NextGenProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/nyaatorrents.py b/sickbeard/providers/nyaatorrents.py index 1b58081c1..ee7ef5634 100644 --- a/sickbeard/providers/nyaatorrents.py +++ b/sickbeard/providers/nyaatorrents.py @@ -55,7 +55,7 @@ class NyaaProvider(generic.TorrentProvider): for mode in search_strings.keys(): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s" % search_string, logger.DEBUG) params = { @@ -64,7 +64,7 @@ class NyaaProvider(generic.TorrentProvider): "sort": 2, # Sort Descending By Seeders "order": 1 } - if mode != 'RSS': + if mode is not 'RSS': params["term"] = search_string.encode('utf-8') searchURL = self.url + '?' + urllib.urlencode(params) @@ -85,16 +85,16 @@ class NyaaProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue - if self.confirmed and not verified and mode != 'RSS': + if self.confirmed and not verified and mode is not 'RSS': logger.log(u"Found result " + title + " but that doesn't seem like a verified result so I'm ignoring it", logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/pretome.py b/sickbeard/providers/pretome.py index 30dbac2d2..f165135dd 100644 --- a/sickbeard/providers/pretome.py +++ b/sickbeard/providers/pretome.py @@ -91,7 +91,7 @@ class PretomeProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (urllib.quote(search_string.encode('utf-8')), self.categories) @@ -148,12 +148,12 @@ class PretomeProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index 384412561..dbf2c95b3 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -120,10 +120,10 @@ class RarbgProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) - if mode == 'RSS': + if mode is 'RSS': searchURL = self.urls['listing'] + self.defaultOptions elif mode == 'Season': if ep_indexer == INDEXER_TVDB: @@ -228,7 +228,7 @@ class RarbgProvider(generic.TorrentProvider): continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/scc.py b/sickbeard/providers/scc.py index c02ac02d5..67159e3e5 100644 --- a/sickbeard/providers/scc.py +++ b/sickbeard/providers/scc.py @@ -89,10 +89,10 @@ class SCCProvider(generic.TorrentProvider): items = {'Season': [], 'Episode': [], 'RSS': []} for mode in search_strings.keys(): - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (urllib.quote(search_string), self.categories[search_mode]) @@ -140,12 +140,12 @@ class SCCProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/scenetime.py b/sickbeard/providers/scenetime.py index c4136a07c..92dabe2a0 100644 --- a/sickbeard/providers/scenetime.py +++ b/sickbeard/providers/scenetime.py @@ -81,7 +81,7 @@ class SceneTimeProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (urllib.quote(search_string), self.categories) @@ -132,12 +132,12 @@ class SceneTimeProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index b5fe4feab..a3c5377a8 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -80,7 +80,7 @@ class SpeedCDProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) search_string = '+'.join(search_string.split()) @@ -114,12 +114,12 @@ class SpeedCDProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py index 977433603..b585bec71 100644 --- a/sickbeard/providers/strike.py +++ b/sickbeard/providers/strike.py @@ -41,7 +41,7 @@ class STRIKEProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: " + search_string.strip(), logger.DEBUG) searchURL = self.url + "api/v2/torrents/search/?category=TV&phrase=" + search_string @@ -65,11 +65,11 @@ class STRIKEProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) item = title, download_url, size, seeders, leechers diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py index e96f1de5e..bdb946703 100644 --- a/sickbeard/providers/t411.py +++ b/sickbeard/providers/t411.py @@ -90,10 +90,10 @@ class T411Provider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) - searchURLS = ([self.urls['search'] % (search_string, u) for u in self.subcategories], [self.urls['rss']])[mode == 'RSS'] + searchURLS = ([self.urls['search'] % (search_string, u) for u in self.subcategories], [self.urls['rss']])[mode is 'RSS'] for searchURL in searchURLS: logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL, json=True) @@ -101,18 +101,18 @@ class T411Provider(generic.TorrentProvider): continue try: - if 'torrents' not in data and mode != 'RSS': + if 'torrents' not in data and mode is not 'RSS': logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue - torrents = data['torrents'] if mode != 'RSS' else data + torrents = data['torrents'] if mode is not 'RSS' else data if not torrents: logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) continue for torrent in torrents: - if mode == 'RSS' and int(torrent['category']) not in self.subcategories: + if mode is 'RSS' and int(torrent['category']) not in self.subcategories: continue try: @@ -129,16 +129,16 @@ class T411Provider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue - if self.confirmed and not verified and mode != 'RSS': + if self.confirmed and not verified and mode is not 'RSS': logger.log(u"Found result " + title + " but that doesn't seem like a verified result so I'm ignoring it", logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index cf5eb3d57..c9dd88e03 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -75,13 +75,13 @@ class ThePirateBayProvider(generic.TorrentProvider): self.search_params.update({'q': search_string.strip()}) - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: " + search_string, logger.DEBUG) - searchURL = self.urls[('search', 'rss')[mode == 'RSS']] + '?' + urlencode(self.search_params) + searchURL = self.urls[('search', 'rss')[mode is 'RSS']] + '?' + urlencode(self.search_params) logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) - # data = self.getURL(self.urls[('search', 'rss')[mode == 'RSS']], params=self.search_params) + # data = self.getURL(self.urls[('search', 'rss')[mode is 'RSS']], params=self.search_params) if not data: continue @@ -99,18 +99,18 @@ class ThePirateBayProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue # Accept Torrent only from Good People for every Episode Search if self.confirmed and re.search(r'(VIP|Trusted|Helper|Moderator)', torrent.group(0)) is None: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result %s but that doesn't seem like a trusted result so I'm ignoring it" % title, logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/titansoftv.py b/sickbeard/providers/titansoftv.py index 2f160ab29..c94ba6ef5 100644 --- a/sickbeard/providers/titansoftv.py +++ b/sickbeard/providers/titansoftv.py @@ -95,7 +95,7 @@ class TitansOfTVProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index 1213a1cf8..a41cd093b 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -283,7 +283,7 @@ class TNTVillageProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode == 'RSS': + if mode is 'RSS': self.page = 2 last_page = 0 @@ -299,12 +299,12 @@ class TNTVillageProvider(generic.TorrentProvider): if last_page: break - if mode != 'RSS': + if mode is not 'RSS': searchURL = (self.urls['search_page'] + '&filter={2}').format(z, self.categories, search_string) else: searchURL = self.urls['search_page'].format(z, self.categories) - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) @@ -378,12 +378,12 @@ class TNTVillageProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/tokyotoshokan.py b/sickbeard/providers/tokyotoshokan.py index 6a078faa8..ed7acce2a 100644 --- a/sickbeard/providers/tokyotoshokan.py +++ b/sickbeard/providers/tokyotoshokan.py @@ -95,7 +95,7 @@ class TokyoToshokanProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue diff --git a/sickbeard/providers/torrentbytes.py b/sickbeard/providers/torrentbytes.py index 0a0d3a68a..30711eda2 100644 --- a/sickbeard/providers/torrentbytes.py +++ b/sickbeard/providers/torrentbytes.py @@ -84,7 +84,7 @@ class TorrentBytesProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urls['search'] % (urllib.quote(search_string.encode('utf-8')), self.categories) @@ -147,12 +147,12 @@ class TorrentBytesProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 62550dab1..1d8444538 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -102,7 +102,7 @@ class TorrentDayProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) search_string = '+'.join(search_string.split()) @@ -138,12 +138,12 @@ class TorrentDayProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/torrentleech.py b/sickbeard/providers/torrentleech.py index 566c6b83f..2ab8987dc 100644 --- a/sickbeard/providers/torrentleech.py +++ b/sickbeard/providers/torrentleech.py @@ -85,7 +85,7 @@ class TorrentLeechProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode == 'RSS': + if mode is 'RSS': searchURL = self.urls['index'] % self.categories else: searchURL = self.urls['search'] % (urllib.quote_plus(search_string.encode('utf-8')), self.categories) @@ -125,12 +125,12 @@ class TorrentLeechProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py index 4ae53d802..d4dbd1c12 100644 --- a/sickbeard/providers/torrentproject.py +++ b/sickbeard/providers/torrentproject.py @@ -47,7 +47,7 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): for mode in search_strings.keys(): # Mode = RSS, Season, Episode logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) @@ -67,7 +67,7 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): seeders = helpers.tryInt(torrents[i]["seeds"], 1) leechers = helpers.tryInt(torrents[i]["leechs"], 0) if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Torrent doesn't meet minimum seeds & leechers not selecting : %s" % title, logger.DEBUG) continue @@ -90,7 +90,7 @@ class TORRENTPROJECTProvider(generic.TorrentProvider): item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s" % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index ee3e7e587..15c172b14 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -63,7 +63,7 @@ class TORRENTZProvider(generic.TorrentProvider): for mode in search_strings: for search_string in search_strings[mode]: search_url = self.urls['verified'] if self.confirmed else self.urls['feed'] - if mode != 'RSS': + if mode is not 'RSS': search_url += '?q=' + urllib.parse.quote_plus(search_string) logger.log(search_url) @@ -81,7 +81,7 @@ class TORRENTZProvider(generic.TorrentProvider): continue try: - data = xmltodict.parse(HTMLParser.HTMLParser().unescape(data.encode('utf-8')).decode('utf-8').replace('&', '&')) + data = xmltodict.parse(data) except ExpatError: logger.log(u"Failed parsing provider. Traceback: %r\n%r" % (traceback.format_exc(), data), logger.ERROR) continue @@ -112,7 +112,7 @@ class TORRENTZProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue diff --git a/sickbeard/providers/transmitthenet.py b/sickbeard/providers/transmitthenet.py index 2049b638d..e4e5b30e7 100644 --- a/sickbeard/providers/transmitthenet.py +++ b/sickbeard/providers/transmitthenet.py @@ -90,7 +90,7 @@ class TransmitTheNetProvider(generic.TorrentProvider): for mode in search_strings.keys(): for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) data = self.getURL(self.urls['index'], params=self.search_params) @@ -133,12 +133,12 @@ class TransmitTheNetProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/tvchaosuk.py b/sickbeard/providers/tvchaosuk.py index dee2176c4..49aab0007 100644 --- a/sickbeard/providers/tvchaosuk.py +++ b/sickbeard/providers/tvchaosuk.py @@ -131,7 +131,7 @@ class TVChaosUKProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_strings[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) self.search_params['keywords'] = search_string.strip() @@ -156,7 +156,7 @@ class TVChaosUKProvider(generic.TorrentProvider): # Filter unseeded torrent if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) continue @@ -176,7 +176,7 @@ class TVChaosUKProvider(generic.TorrentProvider): size = -1 item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) diff --git a/sickbeard/providers/xthor.py b/sickbeard/providers/xthor.py index 2805fbe5b..71cf973b5 100644 --- a/sickbeard/providers/xthor.py +++ b/sickbeard/providers/xthor.py @@ -80,7 +80,7 @@ class XthorProvider(generic.TorrentProvider): logger.log(u"Search Mode: %s" % mode, logger.DEBUG) for search_string in search_params[mode]: - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) searchURL = self.urlsearch % (urllib.quote(search_string), self.categories) @@ -109,12 +109,12 @@ class XthorProvider(generic.TorrentProvider): # Filter unseeded torrent # if seeders < self.minseed or leechers < self.minleech: - # if mode != 'RSS': + # if mode is not 'RSS': # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) # continue item = title, download_url, size, seeders, leechers - if mode != 'RSS': + if mode is not 'RSS': logger.log(u"Found result: %s " % title, logger.DEBUG) items[mode].append(item) -- GitLab From 5acef4058934adbd3456dcf9a729fbe72ae3c5e7 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Fri, 6 Nov 2015 23:33:28 -0800 Subject: [PATCH 063/215] Flake sickbeard module, lint clients --- sickbeard/__init__.py | 4 +- sickbeard/clients/deluge_client.py | 74 ++++++++++---------- sickbeard/clients/deluged_client.py | 32 ++++----- sickbeard/clients/download_station_client.py | 32 +++++---- sickbeard/clients/generic.py | 23 +++--- sickbeard/clients/mlnet_client.py | 7 +- sickbeard/clients/qbittorrent_client.py | 8 +-- sickbeard/clients/rtorrent_client.py | 8 +-- sickbeard/clients/transmission_client.py | 45 ++++++------ sickbeard/clients/utorrent_client.py | 38 +++++----- sickbeard/config.py | 1 - sickbeard/dailysearcher.py | 2 +- sickbeard/db.py | 4 +- sickbeard/notifiers/freemobile.py | 2 +- sickbeard/providers/extratorrent.py | 1 - sickbeard/providers/freshontv.py | 2 +- sickbeard/providers/hdspace.py | 1 - sickbeard/providers/rarbg.py | 5 +- sickbeard/providers/t411.py | 2 +- sickbeard/providers/torrentz.py | 1 - sickbeard/show_queue.py | 2 +- sickbeard/subtitles.py | 23 +++--- sickbeard/traktChecker.py | 1 - sickbeard/tv.py | 1 - sickbeard/webserve.py | 1 - 25 files changed, 155 insertions(+), 165 deletions(-) diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index a8b83ec1e..888de22b0 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -48,7 +48,7 @@ from sickbeard import show_queue from sickbeard import logger from sickbeard import naming from sickbeard import dailysearcher -from sickbeard.indexers.indexer_api import indexerApi +from sickbeard.indexers import indexer_api from sickbeard.indexers.indexer_exceptions import indexer_shownotfound, indexer_showincomplete, indexer_exception, indexer_error, \ indexer_episodenotfound, indexer_attributenotfound, indexer_seasonnotfound, indexer_userabort, indexerExcepts from sickbeard.common import SD @@ -63,6 +63,8 @@ from configobj import ConfigObj import requests requests.packages.urllib3.disable_warnings() +indexerApi = indexer_api.indexerApi + PID = None CFG = None diff --git a/sickbeard/clients/deluge_client.py b/sickbeard/clients/deluge_client.py index 3303ce896..5b338c50f 100644 --- a/sickbeard/clients/deluge_client.py +++ b/sickbeard/clients/deluge_client.py @@ -21,7 +21,7 @@ from base64 import b64encode import sickbeard from sickbeard import logger -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient class DelugeAPI(GenericClient): @@ -35,22 +35,22 @@ class DelugeAPI(GenericClient): post_data = json.dumps({"method": "auth.login", "params": [self.password], - "id": 1 - }) + "id": 1}) + try: self.response = self.session.post(self.url, data=post_data.encode('utf-8'), verify=sickbeard.TORRENT_VERIFY_CERT) - except: + except Exception: return None self.auth = self.response.json()["result"] post_data = json.dumps({"method": "web.connected", "params": [], - "id": 10 - }) + "id": 10}) + try: self.response = self.session.post(self.url, data=post_data.encode('utf-8'), verify=sickbeard.TORRENT_VERIFY_CERT) - except: + except Exception: return None connected = self.response.json()['result'] @@ -58,12 +58,12 @@ class DelugeAPI(GenericClient): if not connected: post_data = json.dumps({"method": "web.get_hosts", "params": [], - "id": 11 - }) + "id": 11}) try: self.response = self.session.post(self.url, data=post_data.encode('utf-8'), verify=sickbeard.TORRENT_VERIFY_CERT) - except: + except Exception: return None + hosts = self.response.json()['result'] if len(hosts) == 0: logger.log(self.name + u': WebUI does not contain daemons', logger.ERROR) @@ -71,20 +71,20 @@ class DelugeAPI(GenericClient): post_data = json.dumps({"method": "web.connect", "params": [hosts[0][0]], - "id": 11 - }) + "id": 11}) + try: self.response = self.session.post(self.url, data=post_data.encode('utf-8'), verify=sickbeard.TORRENT_VERIFY_CERT) - except: + except Exception: return None post_data = json.dumps({"method": "web.connected", "params": [], - "id": 10 - }) + "id": 10}) + try: self.response = self.session.post(self.url, data=post_data.encode('utf-8'), verify=sickbeard.TORRENT_VERIFY_CERT) - except: + except Exception: return None connected = self.response.json()['result'] @@ -98,8 +98,8 @@ class DelugeAPI(GenericClient): post_data = json.dumps({"method": "core.add_torrent_magnet", "params": [result.url, {}], - "id": 2 - }) + "id": 2}) + self._request(method='post', data=post_data) result.hash = self.response.json()['result'] @@ -110,8 +110,8 @@ class DelugeAPI(GenericClient): post_data = json.dumps({"method": "core.add_torrent_file", "params": [result.name + '.torrent', b64encode(result.content), {}], - "id": 2 - }) + "id": 2}) + self._request(method='post', data=post_data) result.hash = self.response.json()['result'] @@ -131,8 +131,8 @@ class DelugeAPI(GenericClient): # check if label already exists and create it if not post_data = json.dumps({"method": 'label.get_labels', "params": [], - "id": 3 - }) + "id": 3}) + self._request(method='post', data=post_data) labels = self.response.json()['result'] @@ -142,16 +142,16 @@ class DelugeAPI(GenericClient): logger.DEBUG) post_data = json.dumps({"method": 'label.add', "params": [label], - "id": 4 - }) + "id": 4}) + self._request(method='post', data=post_data) logger.log(self.name + ': ' + label + u" label added to Deluge", logger.DEBUG) - # add label to torrent + # add label to torrent post_data = json.dumps({"method": 'label.set_torrent', "params": [result.hash, label], - "id": 5 - }) + "id": 5}) + self._request(method='post', data=post_data) logger.log(self.name + ': ' + label + u" label added to torrent", logger.DEBUG) else: @@ -170,14 +170,14 @@ class DelugeAPI(GenericClient): if ratio: post_data = json.dumps({"method": "core.set_torrent_stop_at_ratio", "params": [result.hash, True], - "id": 5 - }) + "id": 5}) + self._request(method='post', data=post_data) post_data = json.dumps({"method": "core.set_torrent_stop_ratio", "params": [result.hash, float(ratio)], - "id": 6 - }) + "id": 6}) + self._request(method='post', data=post_data) return not self.response.json()['error'] @@ -189,14 +189,14 @@ class DelugeAPI(GenericClient): if sickbeard.TORRENT_PATH: post_data = json.dumps({"method": "core.set_torrent_move_completed", "params": [result.hash, True], - "id": 7 - }) + "id": 7}) + self._request(method='post', data=post_data) post_data = json.dumps({"method": "core.set_torrent_move_completed_path", "params": [result.hash, sickbeard.TORRENT_PATH], - "id": 8 - }) + "id": 8}) + self._request(method='post', data=post_data) return not self.response.json()['error'] @@ -208,8 +208,8 @@ class DelugeAPI(GenericClient): if sickbeard.TORRENT_PAUSED: post_data = json.dumps({"method": "core.pause_torrent", "params": [[result.hash]], - "id": 9 - }) + "id": 9}) + self._request(method='post', data=post_data) return not self.response.json()['error'] diff --git a/sickbeard/clients/deluged_client.py b/sickbeard/clients/deluged_client.py index 81c627382..e2ade8041 100644 --- a/sickbeard/clients/deluged_client.py +++ b/sickbeard/clients/deluged_client.py @@ -8,7 +8,7 @@ from base64 import b64encode import sickbeard from sickbeard import logger -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient from synchronousdeluge import DelugeClient class DelugeDAPI(GenericClient): @@ -24,18 +24,18 @@ class DelugeDAPI(GenericClient): return True - def connect(self, reconnect = False): + def connect(self, reconnect=False): hostname = self.host.replace("/", "").split(':') if not self.drpc or reconnect: - self.drpc = DelugeRPC(hostname[1], port = hostname[2], username = self.username, password = self.password) + self.drpc = DelugeRPC(hostname[1], port=hostname[2], username=self.username, password=self.password) return self.drpc def _add_torrent_uri(self, result): - label = sickbeard.TORRENT_LABEL - if result.show.is_anime: - label = sickbeard.TORRENT_LABEL_ANIME + # label = sickbeard.TORRENT_LABEL + # if result.show.is_anime: + # label = sickbeard.TORRENT_LABEL_ANIME options = { 'add_paused': sickbeard.TORRENT_PAUSED @@ -51,9 +51,9 @@ class DelugeDAPI(GenericClient): return remote_torrent def _add_torrent_file(self, result): - label = sickbeard.TORRENT_LABEL - if result.show.is_anime: - label = sickbeard.TORRENT_LABEL_ANIME + # label = sickbeard.TORRENT_LABEL + # if result.show.is_anime: + # label = sickbeard.TORRENT_LABEL_ANIME if not result.content: result.content = {} @@ -125,7 +125,7 @@ class DelugeRPC(object): password = None client = None - def __init__(self, host = 'localhost', port = 58846, username = None, password = None): + def __init__(self, host='localhost', port=58846, username=None, password=None): super(DelugeRPC, self).__init__() self.host = host @@ -140,7 +140,7 @@ class DelugeRPC(object): def test(self): try: self.connect() - except: + except Exception: return False return True @@ -151,7 +151,7 @@ class DelugeRPC(object): torrent_id = self.client.core.add_torrent_magnet(torrent, options).get() if not torrent_id: torrent_id = self._check_torrent(torrent_hash) - except Exception as err: + except Exception: return False finally: if self.client: @@ -166,7 +166,7 @@ class DelugeRPC(object): torrent_id = self.client.core.add_torrent_file(filename, b64encode(torrent), options).get() if not torrent_id: torrent_id = self._check_torrent(torrent_hash) - except Exception as err: + except Exception: return False finally: if self.client: @@ -178,7 +178,7 @@ class DelugeRPC(object): try: self.connect() self.client.label.set_torrent(torrent_id, label).get() - except Exception as err: + except Exception: return False finally: if self.client: @@ -190,7 +190,7 @@ class DelugeRPC(object): self.connect() self.client.core.set_torrent_move_completed_path(torrent_id, path).get() self.client.core.set_torrent_move_completed(torrent_id, 1).get() - except Exception as err: + except Exception: return False finally: if self.client: @@ -225,7 +225,7 @@ class DelugeRPC(object): try: self.connect() self.client.core.pause_torrent(torrent_ids).get() - except Exception as err: + except Exception: return False finally: if self.client: diff --git a/sickbeard/clients/download_station_client.py b/sickbeard/clients/download_station_client.py index bbbd4e86f..5db4dc2e6 100644 --- a/sickbeard/clients/download_station_client.py +++ b/sickbeard/clients/download_station_client.py @@ -21,7 +21,7 @@ # Uses the Synology Download Station API: http://download.synology.com/download/Document/DeveloperGuide/Synology_Download_Station_Web_API.pdf import sickbeard -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient class DownloadStationAPI(GenericClient): @@ -38,19 +38,21 @@ class DownloadStationAPI(GenericClient): try: self.response = self.session.get(auth_url, verify=False) self.auth = self.response.json()['data']['sid'] - except: + except Exception: return None return self.auth def _add_torrent_uri(self, result): - data = {'api':'SYNO.DownloadStation.Task', - 'version':'1', 'method':'create', - 'session':'DownloadStation', - '_sid':self.auth, - 'uri':result.url - } + data = { + 'api':'SYNO.DownloadStation.Task', + 'version':'1', 'method':'create', + 'session':'DownloadStation', + '_sid':self.auth, + 'uri':result.url + } + if sickbeard.TORRENT_PATH: data['destination'] = sickbeard.TORRENT_PATH self._request(method='post', data=data) @@ -59,12 +61,14 @@ class DownloadStationAPI(GenericClient): def _add_torrent_file(self, result): - data = {'api':'SYNO.DownloadStation.Task', - 'version':'1', - 'method':'create', - 'session':'DownloadStation', - '_sid':self.auth - } + data = { + 'api':'SYNO.DownloadStation.Task', + 'version':'1', + 'method':'create', + 'session':'DownloadStation', + '_sid':self.auth + } + if sickbeard.TORRENT_PATH: data['destination'] = sickbeard.TORRENT_PATH files = {'file':(result.name + '.torrent', result.content)} diff --git a/sickbeard/clients/generic.py b/sickbeard/clients/generic.py index 125400b50..4603d3ba2 100644 --- a/sickbeard/clients/generic.py +++ b/sickbeard/clients/generic.py @@ -5,7 +5,7 @@ from base64 import b16encode, b32decode import sickbeard from sickbeard import logger -from . import http_error_code +from sickbeard.clients import http_error_code from bencode import bencode, bdecode import requests from bencode.BTL import BTFailure @@ -26,22 +26,15 @@ class GenericClient(object): self.session = requests.Session() self.session.auth = (self.username, self.password) - def _request(self, method='get', params={}, data=None, files=None): + def _request(self, method='get', params=None, data=None, files=None): if time.time() > self.last_time + 1800 or not self.auth: self.last_time = time.time() self._get_auth() logger.log( - self.name + u': Requested a ' + method.upper() + ' connection to url ' + self.url + ' with Params= ' + str( - params) + ' Data=' + str(data if data else 'None')[0:99] + ( - '...' if len(data if data else 'None') > 200 else ''), logger.DEBUG) - - logger.log( - self.name + u': Requested a ' + method.upper() + ' connection to url ' + self.url + ' with Params= ' + str( - params) + ( - (' Data=' + str(data)[0:100] + ('...' if len(data) > 100 else '')) if data is not None else ""), - logger.DEBUG) + self.name + u': Requested a ' + method.upper() + ' connection to url ' + self.url + + ' with Params: ' + str(params) + ' Data: ' + str(data)[0:99] + ('...' if len(str(data)) > 200 else ''), logger.DEBUG) if not self.auth: logger.log(self.name + u': Authentication Failed', logger.WARNING) @@ -143,7 +136,7 @@ class GenericClient(object): def _get_torrent_hash(self, result): if result.url.startswith('magnet'): - result.hash = re.findall('urn:btih:([\w]{32,40})', result.url)[0] + result.hash = re.findall(r'urn:btih:([\w]{32,40})', result.url)[0] if len(result.hash) == 32: result.hash = b16encode(b32decode(result.hash)).lower() else: @@ -153,13 +146,13 @@ class GenericClient(object): try: torrent_bdecode = bdecode(result.content) - except BTFailure as e: + except BTFailure: logger.log(u'Unable to bdecode torrent', logger.ERROR) logger.log(u'Torrent bencoded data: {0}'.format(str(result.content)), logger.DEBUG) raise try: info = torrent_bdecode["info"] - except Exception as e: + except Exception: logger.log(u'Unable to find info field in torrent', logger.ERROR) raise result.hash = sha1(bencode(info)).hexdigest() @@ -221,7 +214,7 @@ class GenericClient(object): try: self.response = self.session.get(self.url, timeout=120, verify=False) - except requests.exceptions.ConnectionError, e: + except requests.exceptions.ConnectionError: return False, 'Error: ' + self.name + ' Connection Error' except (requests.exceptions.MissingSchema, requests.exceptions.InvalidURL): return False, 'Error: Invalid ' + self.name + ' host' diff --git a/sickbeard/clients/mlnet_client.py b/sickbeard/clients/mlnet_client.py index 3661ee5ca..4db6d0115 100644 --- a/sickbeard/clients/mlnet_client.py +++ b/sickbeard/clients/mlnet_client.py @@ -16,9 +16,7 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import sickbeard -from .generic import GenericClient -from requests.auth import HTTPDigestAuth +from sickbeard.clients.generic import GenericClient class mlnetAPI(GenericClient): def __init__(self, host=None, username=None, password=None): @@ -33,7 +31,7 @@ class mlnetAPI(GenericClient): try: self.response = self.session.get(self.host, verify=False) self.auth = self.response.content - except: + except Exception: return None return self.auth if not self.response.status_code == 404 else None @@ -51,4 +49,3 @@ class mlnetAPI(GenericClient): return self._request(method='get', params=params) api = mlnetAPI() - diff --git a/sickbeard/clients/qbittorrent_client.py b/sickbeard/clients/qbittorrent_client.py index 7b39a3f09..c78b6b6b0 100644 --- a/sickbeard/clients/qbittorrent_client.py +++ b/sickbeard/clients/qbittorrent_client.py @@ -17,7 +17,7 @@ # along with SickRage. If not, see <http://www.gnu.org/licenses/>. import sickbeard -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient from requests.auth import HTTPDigestAuth class qbittorrentAPI(GenericClient): @@ -26,14 +26,14 @@ class qbittorrentAPI(GenericClient): super(qbittorrentAPI, self).__init__('qbittorrent', host, username, password) self.url = self.host - self.session.auth = HTTPDigestAuth(self.username, self.password); + self.session.auth = HTTPDigestAuth(self.username, self.password) def _get_auth(self): try: self.response = self.session.get(self.host, verify=False) self.auth = self.response.content - except: + except Exception: return None return self.auth if not self.response.status_code == 404 else None @@ -60,7 +60,7 @@ class qbittorrentAPI(GenericClient): return self._request(method='post', data=data) def _set_torrent_pause(self, result): - + self.url = self.host+'command/resume' if sickbeard.TORRENT_PAUSED: self.url = self.host+'command/pause' diff --git a/sickbeard/clients/rtorrent_client.py b/sickbeard/clients/rtorrent_client.py index 867599cee..5e21e79b5 100644 --- a/sickbeard/clients/rtorrent_client.py +++ b/sickbeard/clients/rtorrent_client.py @@ -20,7 +20,7 @@ import traceback import sickbeard from sickbeard import logger -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient from rtorrent import RTorrent @@ -52,7 +52,6 @@ class rTorrentAPI(GenericClient): return self.auth def _add_torrent_uri(self, result): - filedata = None if not self.auth: return False @@ -82,12 +81,11 @@ class rTorrentAPI(GenericClient): return True - except Exception as e: + except Exception: logger.log(traceback.format_exc(), logger.DEBUG) return False def _add_torrent_file(self, result): - filedata = None if not self.auth: return False @@ -125,7 +123,7 @@ class rTorrentAPI(GenericClient): return True - except Exception as e: + except Exception: logger.log(traceback.format_exc(), logger.DEBUG) return False diff --git a/sickbeard/clients/transmission_client.py b/sickbeard/clients/transmission_client.py index 81e81b8a9..608eb479e 100644 --- a/sickbeard/clients/transmission_client.py +++ b/sickbeard/clients/transmission_client.py @@ -21,7 +21,7 @@ import json from base64 import b64encode import sickbeard -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient class TransmissionAPI(GenericClient): @@ -47,16 +47,16 @@ class TransmissionAPI(GenericClient): try: self.response = self.session.post(self.url, data=post_data.encode('utf-8'), timeout=120, verify=sickbeard.TORRENT_VERIFY_CERT) - self.auth = re.search('X-Transmission-Session-Id:\s*(\w+)', self.response.text).group(1) - except: + self.auth = re.search(r'X-Transmission-Session-Id:\s*(\w+)', self.response.text).group(1) + except Exception: return None self.session.headers.update({'x-transmission-session-id': self.auth}) # Validating Transmission authorization post_data = json.dumps({'arguments': {}, - 'method': 'session-get', - }) + 'method': 'session-get'}) + self._request(method='post', data=post_data) return self.auth @@ -65,11 +65,11 @@ class TransmissionAPI(GenericClient): arguments = {'filename': result.url, 'paused': 1 if sickbeard.TORRENT_PAUSED else 0, - 'download-dir': sickbeard.TORRENT_PATH - } + 'download-dir': sickbeard.TORRENT_PATH} + post_data = json.dumps({'arguments': arguments, - 'method': 'torrent-add', - }) + 'method': 'torrent-add'}) + self._request(method='post', data=post_data) return self.response.json()['result'] == "success" @@ -78,11 +78,11 @@ class TransmissionAPI(GenericClient): arguments = {'metainfo': b64encode(result.content), 'paused': 1 if sickbeard.TORRENT_PAUSED else 0, - 'download-dir': sickbeard.TORRENT_PATH - } + 'download-dir': sickbeard.TORRENT_PATH} + post_data = json.dumps({'arguments': arguments, - 'method': 'torrent-add', - }) + 'method': 'torrent-add'}) + self._request(method='post', data=post_data) return self.response.json()['result'] == "success" @@ -104,11 +104,11 @@ class TransmissionAPI(GenericClient): arguments = {'ids': [result.hash], 'seedRatioLimit': ratio, - 'seedRatioMode': mode - } + 'seedRatioMode': mode} + post_data = json.dumps({'arguments': arguments, - 'method': 'torrent-set', - }) + 'method': 'torrent-set'}) + self._request(method='post', data=post_data) return self.response.json()['result'] == "success" @@ -119,12 +119,11 @@ class TransmissionAPI(GenericClient): time = int(60 * float(sickbeard.TORRENT_SEED_TIME)) arguments = {'ids': [result.hash], 'seedIdleLimit': time, - 'seedIdleMode': 1 - } + 'seedIdleMode': 1} post_data = json.dumps({'arguments': arguments, - 'method': 'torrent-set', - }) + 'method': 'torrent-set'}) + self._request(method='post', data=post_data) return self.response.json()['result'] == "success" @@ -148,8 +147,8 @@ class TransmissionAPI(GenericClient): arguments['priority-normal'] = [] post_data = json.dumps({'arguments': arguments, - 'method': 'torrent-set', - }) + 'method': 'torrent-set'}) + self._request(method='post', data=post_data) return self.response.json()['result'] == "success" diff --git a/sickbeard/clients/utorrent_client.py b/sickbeard/clients/utorrent_client.py index 6a466b445..5bc010aed 100644 --- a/sickbeard/clients/utorrent_client.py +++ b/sickbeard/clients/utorrent_client.py @@ -19,7 +19,7 @@ import re import sickbeard -from .generic import GenericClient +from sickbeard.clients.generic import GenericClient class uTorrentAPI(GenericClient): @@ -29,23 +29,23 @@ class uTorrentAPI(GenericClient): self.url = self.host + 'gui/' - def _request(self, method='get', params={}, files=None): + def _request(self, method='get', params=None, data=None, files=None): # Workaround for uTorrent 2.2.1 # Need a odict but only supported in 2.7+ and sickrage is 2.6+ ordered_params = {'token': self.auth} - for k,v in params.iteritems(): + for k, v in params.iteritems() or {}: ordered_params.update({k: v}) - return super(uTorrentAPI, self)._request(method=method, params=ordered_params, files=files) + return super(uTorrentAPI, self)._request(method=method, params=ordered_params, data=data, files=files) def _get_auth(self): try: self.response = self.session.get(self.url + 'token.html', verify=False) self.auth = re.findall("<div.*?>(.*?)</", self.response.text)[0] - except: + except Exception: return None return self.auth if not self.response.status_code == 404 else None @@ -70,8 +70,8 @@ class uTorrentAPI(GenericClient): params = {'action': 'setprops', 'hash': result.hash, 's': 'label', - 'v': label - } + 'v': label} + return self._request(params=params) def _set_torrent_ratio(self, result): @@ -84,14 +84,14 @@ class uTorrentAPI(GenericClient): params = {'action': 'setprops', 'hash': result.hash, 's': 'seed_override', - 'v': '1' - } + 'v': '1'} + if self._request(params=params): params = {'action': 'setprops', 'hash': result.hash, 's': 'seed_ratio', - 'v': float(ratio) * 10 - } + 'v': float(ratio) * 10} + return self._request(params=params) else: return False @@ -105,27 +105,27 @@ class uTorrentAPI(GenericClient): params = {'action': 'setprops', 'hash': result.hash, 's': 'seed_override', - 'v': '1' - } + 'v': '1'} + if self._request(params=params): params = {'action': 'setprops', 'hash': result.hash, 's': 'seed_time', - 'v': time - } + 'v': time} + return self._request(params=params) else: return False else: - return True - + return True + def _set_torrent_priority(self, result): if result.priority == 1: params = {'action': 'queuetop', 'hash': result.hash} return self._request(params=params) else: - return True + return True def _set_torrent_pause(self, result): @@ -137,4 +137,4 @@ class uTorrentAPI(GenericClient): return self._request(params=params) -api = uTorrentAPI() +api = uTorrentAPI() diff --git a/sickbeard/config.py b/sickbeard/config.py index 78cdf8a3f..b8c0ec6aa 100644 --- a/sickbeard/config.py +++ b/sickbeard/config.py @@ -578,7 +578,6 @@ def check_setting_float(config, cfg_name, item_name, def_val, silent=True): def check_setting_str(config, cfg_name, item_name, def_val, silent=True, censor_log=False): # For passwords you must include the word `password` in the item_name and add `helpers.encrypt(ITEM_NAME, ENCRYPTION_VERSION)` in save_config() if bool(item_name.find('password') + 1): - log = False encryption_version = sickbeard.ENCRYPTION_VERSION else: encryption_version = 0 diff --git a/sickbeard/dailysearcher.py b/sickbeard/dailysearcher.py index 02c7950d0..55e7bc8f8 100644 --- a/sickbeard/dailysearcher.py +++ b/sickbeard/dailysearcher.py @@ -26,7 +26,7 @@ from sickbeard import logger from sickbeard import db from sickbeard import common from sickbeard import helpers -from sickbeard import sbdatetime, network_timezones +from sickbeard import network_timezones from sickrage.helper.exceptions import MultipleShowObjectsException diff --git a/sickbeard/db.py b/sickbeard/db.py index a82b8991b..9d525fa4a 100644 --- a/sickbeard/db.py +++ b/sickbeard/db.py @@ -77,7 +77,7 @@ class DBConnection(object): if not args: return self.connection.cursor().execute(query) return self.connection.cursor().execute(query, args) - except Exception as e: + except Exception: raise def execute(self, query, args=None, fetchall=False, fetchone=False): @@ -97,7 +97,7 @@ class DBConnection(object): return self._execute(query, args).fetchone() else: return self._execute(query, args) - except Exception as e: + except Exception: raise def checkDBVersion(self): diff --git a/sickbeard/notifiers/freemobile.py b/sickbeard/notifiers/freemobile.py index 6d3c75b7d..ab203bcba 100644 --- a/sickbeard/notifiers/freemobile.py +++ b/sickbeard/notifiers/freemobile.py @@ -53,7 +53,7 @@ class FreeMobileNotifier: req = urllib2.Request(URL) # send the request to Free Mobile try: - reponse = urllib2.urlopen(req) + urllib2.urlopen(req) except IOError, e: if hasattr(e,'code'): if e.code == 400: diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index dff4f2baf..543736f00 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -19,7 +19,6 @@ import re import traceback import xmltodict -import HTMLParser from xml.parsers.expat import ExpatError from sickbeard import logger diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py index 611d5c66a..3c5b7688d 100644 --- a/sickbeard/providers/freshontv.py +++ b/sickbeard/providers/freshontv.py @@ -225,7 +225,7 @@ class FreshOnTVProvider(generic.TorrentProvider): items[mode].append(item) - except Exception as e: + except Exception: logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) # For each search mode sort all the items by seeders if available diff --git a/sickbeard/providers/hdspace.py b/sickbeard/providers/hdspace.py index a06c291ee..48eec48a7 100644 --- a/sickbeard/providers/hdspace.py +++ b/sickbeard/providers/hdspace.py @@ -21,7 +21,6 @@ import re import urllib import requests -import traceback from bs4 import BeautifulSoup from sickbeard import logger diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index dbf2c95b3..cfd171f83 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -83,7 +83,6 @@ class RarbgProvider(generic.TorrentProvider): if self.token and self.tokenExpireDate and datetime.datetime.now() < self.tokenExpireDate: return True - resp_json = None response = self.getURL(self.urls['token'], timeout=30, json=True) if not response: @@ -209,7 +208,7 @@ class RarbgProvider(generic.TorrentProvider): data_json = json.loads(data.group()) else: data_json = {} - except Exception as e: + except Exception: logger.log(u"JSON load failed: %s" % traceback.format_exc(), logger.ERROR) logger.log(u"JSON load failed. Data dump: %s" % data, logger.DEBUG) continue @@ -222,7 +221,7 @@ class RarbgProvider(generic.TorrentProvider): size = item['size'] seeders = item['seeders'] leechers = item['leechers'] - pubdate = item['pubdate'] + # pubdate = item['pubdate'] if not all([title, download_url]): continue diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py index bdb946703..4a1d4d2f9 100644 --- a/sickbeard/providers/t411.py +++ b/sickbeard/providers/t411.py @@ -143,7 +143,7 @@ class T411Provider(generic.TorrentProvider): items[mode].append(item) - except Exception as e: + except Exception: logger.log(u"Invalid torrent data, skipping result: %s" % torrent, logger.DEBUG) logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.DEBUG) continue diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index 15c172b14..2741708db 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -21,7 +21,6 @@ import re import time import traceback import xmltodict -import HTMLParser from six.moves import urllib from xml.parsers.expat import ExpatError diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index 359a6210a..b8342b151 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -516,7 +516,7 @@ class QueueItemRename(ShowQueueItem): logger.log(u"Performing rename on " + self.show.name) try: - show_loc = self.show.location + self.show.location except ShowDirectoryNotFoundException: logger.log(u"Can't perform rename on " + self.show.name + " when the show dir is missing.", logger.WARNING) return diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index 248d63326..ab84da88b 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -57,6 +57,8 @@ entry_points = { ] } +# pylint: disable=W0212 +# Access to a protected member of a client class distribution._ep_map = pkg_resources.EntryPoint.parse_map(entry_points, distribution) pkg_resources.working_set.add(distribution) @@ -341,7 +343,7 @@ def subtitleLanguageFilter(): def subtitleCodeFilter(): return [Language.fromopensubtitles(language).opensubtitles for language in language_converters['opensubtitles'].codes if len(language) == 3] -class SubtitlesFinder(): +class SubtitlesFinder(object): """ The SubtitlesFinder will be executed every hour but will not necessarly search and download subtitles. Only if the defined rule is true @@ -373,7 +375,8 @@ class SubtitlesFinder(): # you have 5 minutes to understand that one. Good luck myDB = db.DBConnection() - sqlResults = myDB.select('SELECT s.show_name, e.showid, e.season, e.episode, e.status, e.subtitles, ' + + sqlResults = myDB.select( + 'SELECT s.show_name, e.showid, e.season, e.episode, e.status, e.subtitles, ' + 'e.subtitles_searchcount AS searchcount, e.subtitles_lastsearch AS lastsearch, e.location, (? - e.airdate) AS airdate_daydiff ' + 'FROM tv_episodes AS e INNER JOIN tv_shows AS s ON (e.showid = s.indexer_id) ' + 'WHERE s.subtitles = 1 AND e.subtitles NOT LIKE (?) ' + @@ -392,11 +395,12 @@ class SubtitlesFinder(): logger.log(u'Episode file does not exist, cannot download subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) continue - # Old shows rule - throwaway = datetime.datetime.strptime('20110101', '%Y%m%d') + # http://bugs.python.org/issue7980#msg221094 + # I dont think this needs done here, but keeping to be safe + datetime.datetime.strptime('20110101', '%Y%m%d') if ((epToSub['airdate_daydiff'] > 7 and epToSub['searchcount'] < 2 and now - datetime.datetime.strptime(epToSub['lastsearch'], dateTimeFormat) > datetime.timedelta(hours=rules['old'][epToSub['searchcount']])) or # Recent shows rule - (epToSub['airdate_daydiff'] <= 7 and epToSub['searchcount'] < 7 and now - datetime.datetime.strptime(epToSub['lastsearch'], dateTimeFormat) > datetime.timedelta(hours=rules['new'][epToSub['searchcount']]))): + (epToSub['airdate_daydiff'] <= 7 and epToSub['searchcount'] < 7 and now - datetime.datetime.strptime(epToSub['lastsearch'], dateTimeFormat) > datetime.timedelta(hours=rules['new'][epToSub['searchcount']]))): logger.log(u'Downloading subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) @@ -425,7 +429,8 @@ class SubtitlesFinder(): self.amActive = False - def _getRules(self): + @staticmethod + def _getRules(): """ Define the hours to wait between 2 subtitles search depending on: - the episode: new or old @@ -450,14 +455,14 @@ def run_subs_extra_scripts(epObj, foundSubs): subpath = ek(os.path.join, ek(os.path.dirname, subpath), sickbeard.SUBTITLES_DIR, ek(os.path.basename, subpath)) inner_cmd = script_cmd + [video.name, subpath, sub.language.opensubtitles, epObj['show.name'], - str(epObj['season']), str(epObj['episode']), epObj['name'], str(epObj['show.indexerid'])] + str(epObj['season']), str(epObj['episode']), epObj['name'], str(epObj['show.indexerid'])] # use subprocess to run the command and capture output logger.log(u"Executing command: %s" % inner_cmd) try: p = subprocess.Popen(inner_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) - out, err = p.communicate() # @UnusedVariable + stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) + out, _ = p.communicate() # @UnusedVariable logger.log(u"Script result: %s" % out, logger.DEBUG) except Exception as e: diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 5f81ed3ad..42efb9394 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -31,7 +31,6 @@ from sickbeard.common import SKIPPED from sickbeard.common import UNKNOWN from sickbeard.common import WANTED from sickrage.helper.encoding import ek -from sickrage.helper.exceptions import ex from common import Quality from libtrakt import * from libtrakt.exceptions import traktException diff --git a/sickbeard/tv.py b/sickbeard/tv.py index e7339448f..d668f76d5 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -45,7 +45,6 @@ from sickbeard import notifiers from sickbeard import postProcessor from sickbeard import subtitles from sickbeard.blackandwhitelist import BlackAndWhiteList -from sickbeard import sbdatetime from sickbeard import network_timezones from sickbeard.indexers.indexer_config import INDEXER_TVRAGE from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 782c460ea..a00506ddd 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -3697,7 +3697,6 @@ class ConfigGeneral(Config): if date_preset: sickbeard.DATE_PRESET = date_preset - discarded_na_data = date_preset_na if indexer_default: sickbeard.INDEXER_DEFAULT = config.to_int(indexer_default) -- GitLab From 73e32034fe9746089aafac917308d539ca3d8605 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 10:56:15 -0500 Subject: [PATCH 064/215] PEP 263: Add encoding declaration --- sickbeard/providers/tntvillage.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index a41cd093b..6d00619ec 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Giovanni Borri # Modified by gborri, https://github.com/gborri for TNTVillage # -- GitLab From ea44a79e618e68a71f71c91b57c1c8345517c005 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 10:37:07 -0500 Subject: [PATCH 065/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/providers/tntvillage.py | 89 +++++++++++++++---------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index 6d00619ec..1483df349 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -29,35 +29,35 @@ from sickbeard.bs4_parser import BS4Parser from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickrage.helper.exceptions import AuthException -category_excluded = {'Sport' : 22, - 'Teatro' : 23, - 'Video Musicali' : 21, - 'Film' : 4, - 'Musica' : 2, - 'Students Releases' : 13, - 'E Books' : 3, - 'Linux' : 6, - 'Macintosh' : 9, - 'Windows Software' : 10, - 'Pc Game' : 11, - 'Playstation 2' : 12, - 'Wrestling' : 24, - 'Varie' : 25, - 'Xbox' : 26, - 'Immagini sfondi' : 27, - 'Altri Giochi' : 28, - 'Fumetteria' : 30, - 'Trash' : 31, - 'PlayStation 1' : 32, - 'PSP Portable' : 33, - 'A Book' : 34, - 'Podcast' : 35, - 'Edicola' : 36, - 'Mobile' : 37} +category_excluded = {'Sport': 22, + 'Teatro': 23, + 'Video Musicali': 21, + 'Film': 4, + 'Musica': 2, + 'Students Releases': 13, + 'E Books': 3, + 'Linux': 6, + 'Macintosh': 9, + 'Windows Software': 10, + 'Pc Game': 11, + 'Playstation 2': 12, + 'Wrestling': 24, + 'Varie': 25, + 'Xbox': 26, + 'Immagini sfondi': 27, + 'Altri Giochi': 28, + 'Fumetteria': 30, + 'Trash': 31, + 'PlayStation 1': 32, + 'PSP Portable': 33, + 'A Book': 34, + 'Podcast': 35, + 'Edicola': 36, + 'Mobile': 37} + class TNTVillageProvider(generic.TorrentProvider): def __init__(self): - generic.TorrentProvider.__init__(self, "TNTVillage") self.supportsBacklog = True @@ -87,19 +87,19 @@ class TNTVillageProvider(generic.TorrentProvider): ' 720p HEVC', ' 720p'] - self.category_dict = {'Serie TV' : 29, - 'Cartoni' : 8, - 'Anime' : 7, - 'Programmi e Film TV' : 1, - 'Documentari' : 14, - 'All' : 0} + self.category_dict = {'Serie TV': 29, + 'Cartoni': 8, + 'Anime': 7, + 'Programmi e Film TV': 1, + 'Documentari': 14, + 'All': 0} - self.urls = {'base_url' : 'http://forum.tntvillage.scambioetico.org', - 'login' : 'http://forum.tntvillage.scambioetico.org/index.php?act=Login&CODE=01', - 'detail' : 'http://forum.tntvillage.scambioetico.org/index.php?showtopic=%s', - 'search' : 'http://forum.tntvillage.scambioetico.org/?act=allreleases&%s', - 'search_page' : 'http://forum.tntvillage.scambioetico.org/?act=allreleases&st={0}&{1}', - 'download' : 'http://forum.tntvillage.scambioetico.org/index.php?act=Attach&type=post&id=%s'} + self.urls = {'base_url': 'http://forum.tntvillage.scambioetico.org', + 'login': 'http://forum.tntvillage.scambioetico.org/index.php?act=Login&CODE=01', + 'detail': 'http://forum.tntvillage.scambioetico.org/index.php?showtopic=%s', + 'search': 'http://forum.tntvillage.scambioetico.org/?act=allreleases&%s', + 'search_page': 'http://forum.tntvillage.scambioetico.org/?act=allreleases&st={0}&{1}', + 'download': 'http://forum.tntvillage.scambioetico.org/index.php?act=Attach&type=post&id=%s'} self.url = self.urls['base_url'] @@ -132,8 +132,7 @@ class TNTVillageProvider(generic.TorrentProvider): logger.log(u"Unable to connect to provider", logger.WARNING) return False - if re.search('Sono stati riscontrati i seguenti errori', response) \ - or re.search('<title>Connettiti</title>', response): + if re.search('Sono stati riscontrati i seguenti errori', response) or re.search('<title>Connettiti</title>', response): logger.log(u"Invalid username or password. Check your settings", logger.WARNING) return False @@ -296,7 +295,7 @@ class TNTVillageProvider(generic.TorrentProvider): search_string = str(search_string).replace('.', ' ') for x in range(0, y): - z = x*20 + z = x * 20 if last_page: break @@ -308,7 +307,7 @@ class TNTVillageProvider(generic.TorrentProvider): if mode is not 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) - logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) + logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) data = self.getURL(searchURL) if not data: logger.log(u"No data returned from provider", logger.DEBUG) @@ -316,7 +315,7 @@ class TNTVillageProvider(generic.TorrentProvider): try: with BS4Parser(data, features=["html5lib", "permissive"]) as html: - torrent_table = html.find('table', attrs={'class' : 'copyright'}) + torrent_table = html.find('table', attrs={'class': 'copyright'}) torrent_rows = torrent_table.find_all('tr') if torrent_table else [] # Continue only if one Release is found @@ -354,11 +353,11 @@ class TNTVillageProvider(generic.TorrentProvider): title += filename_qt if not self._is_italian(result) and not self.subtitle: - logger.log(u"Torrent is subtitled, skipping: %s " % title, logger.DEBUG) + logger.log(u"Torrent is subtitled, skipping: %s " % title, logger.DEBUG) continue if self.engrelease and not self._is_english(result): - logger.log(u"Torrent isnt english audio/subtitled , skipping: %s " % title, logger.DEBUG) + logger.log(u"Torrent isnt english audio/subtitled , skipping: %s " % title, logger.DEBUG) continue search_show = re.split(r'([Ss][\d{1,2}]+)', search_string)[0] -- GitLab From f273b45e5673fa3adefccb504d9739852d4fcc99 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 10:54:32 -0500 Subject: [PATCH 066/215] PEP 8: Convert lambda expression to a def --- sickbeard/providers/tntvillage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index 1483df349..5b4fc5d4f 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -182,7 +182,8 @@ class TNTVillageProvider(generic.TorrentProvider): file_quality = (torrent_rows.find_all('td'))[1].get_text() logger.log(u"Episode quality: %s" % file_quality, logger.DEBUG) - checkName = lambda list, func: func([re.search(x, file_quality, re.I) for x in list]) + def checkName(options, func): + return func([re.search(option, file_quality, re.I) for option in options]) dvdOptions = checkName(["dvd", "dvdrip", "dvdmux", "DVD9", "DVD5"], any) bluRayOptions = checkName(["BD", "BDmux", "BDrip", "BRrip", "Bluray"], any) -- GitLab From b0ba95e57d7565badb033c245021e3d95bbbf5a3 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:02:53 -0500 Subject: [PATCH 067/215] PEP 8: Fix indentation and remove excess blank lines --- sickbeard/clients/__init__.py | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/sickbeard/clients/__init__.py b/sickbeard/clients/__init__.py index be0201d36..2c67dff7f 100644 --- a/sickbeard/clients/__init__.py +++ b/sickbeard/clients/__init__.py @@ -16,18 +16,17 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -__all__ = ['utorrent', - 'transmission', - 'deluge', - 'deluged', - 'download_station', - 'rtorrent', - 'qbittorrent', - 'mlnet' +__all__ = [ + 'utorrent', + 'transmission', + 'deluge', + 'deluged', + 'download_station', + 'rtorrent', + 'qbittorrent', + 'mlnet' ] - - # Mapping error status codes to official W3C names http_error_code = { 300: 'Multiple Choices', @@ -103,14 +102,15 @@ http_error_code = { 599: 'Network connect timeout error ' } -default_host = {'utorrent': 'http://localhost:8000', - 'transmission': 'http://localhost:9091', - 'deluge': 'http://localhost:8112', - 'deluged': 'scgi://localhost:58846', - 'download_station': 'http://localhost:5000', - 'rtorrent': 'scgi://localhost:5000', - 'qbittorrent': 'http://localhost:8080', - 'mlnet': 'http://localhost:4080' +default_host = { + 'utorrent': 'http://localhost:8000', + 'transmission': 'http://localhost:9091', + 'deluge': 'http://localhost:8112', + 'deluged': 'scgi://localhost:58846', + 'download_station': 'http://localhost:5000', + 'rtorrent': 'scgi://localhost:5000', + 'qbittorrent': 'http://localhost:8080', + 'mlnet': 'http://localhost:4080' } -- GitLab From 9f88c26cec1e841e2487eb1c9291a547d6354944 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:03:08 -0500 Subject: [PATCH 068/215] PEP 263: Add encoding declaration --- sickbeard/clients/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/__init__.py b/sickbeard/clients/__init__.py index 2c67dff7f..094b2ec67 100644 --- a/sickbeard/clients/__init__.py +++ b/sickbeard/clients/__init__.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 93990f09aae60eb765093a179e69703ee7711b5f Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:15:58 -0500 Subject: [PATCH 069/215] Add a todo for handling duplicate http error codes in dict --- sickbeard/clients/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/__init__.py b/sickbeard/clients/__init__.py index 094b2ec67..ddc11114a 100644 --- a/sickbeard/clients/__init__.py +++ b/sickbeard/clients/__init__.py @@ -30,6 +30,7 @@ __all__ = [ # Mapping error status codes to official W3C names http_error_code = { + # todo: Handle error codes with duplicates (e.g. 451, 499) 300: 'Multiple Choices', 301: 'Moved Permanently', 302: 'Found', -- GitLab From 3fdb89e29ce8261c22af93958a15ba1d7970b116 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:35:41 -0500 Subject: [PATCH 070/215] PEP 263: Add encoding declaration --- sickbeard/clients/deluge_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/deluge_client.py b/sickbeard/clients/deluge_client.py index 5b338c50f..1812c66c8 100644 --- a/sickbeard/clients/deluge_client.py +++ b/sickbeard/clients/deluge_client.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Mr_Orange <mr_orange@hotmail.it> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 13794b2edfa7060df2f3e7730cefa9edbf541209 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:31:55 -0500 Subject: [PATCH 071/215] PEP 8: Remove blank lines for consistency --- sickbeard/clients/deluge_client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sickbeard/clients/deluge_client.py b/sickbeard/clients/deluge_client.py index 1812c66c8..a42a41aa8 100644 --- a/sickbeard/clients/deluge_client.py +++ b/sickbeard/clients/deluge_client.py @@ -161,7 +161,6 @@ class DelugeAPI(GenericClient): return not self.response.json()['error'] - def _set_torrent_ratio(self, result): ratio = None -- GitLab From ca2b8a07a1ab92ea48cf11b2a400c4361b6074c0 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:34:14 -0500 Subject: [PATCH 072/215] PEP 8: Convert None comparisons from operators to 'is / is not None' --- sickbeard/clients/deluge_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/clients/deluge_client.py b/sickbeard/clients/deluge_client.py index a42a41aa8..6e6a92a14 100644 --- a/sickbeard/clients/deluge_client.py +++ b/sickbeard/clients/deluge_client.py @@ -137,7 +137,7 @@ class DelugeAPI(GenericClient): self._request(method='post', data=post_data) labels = self.response.json()['result'] - if labels != None: + if labels is not None: if label not in labels: logger.log(self.name + ': ' + label + u" label does not exist in Deluge we must add it", logger.DEBUG) -- GitLab From fc62243ff54e4320fd08e954028364ac83e0ce72 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:56:58 -0500 Subject: [PATCH 073/215] Combine duplicate conditional check --- sickbeard/clients/deluged_client.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sickbeard/clients/deluged_client.py b/sickbeard/clients/deluged_client.py index e2ade8041..e252c91af 100644 --- a/sickbeard/clients/deluged_client.py +++ b/sickbeard/clients/deluged_client.py @@ -55,9 +55,8 @@ class DelugeDAPI(GenericClient): # if result.show.is_anime: # label = sickbeard.TORRENT_LABEL_ANIME - if not result.content: result.content = {} - if not result.content: + result.content = {} return None options = { -- GitLab From 306e128c6c526756669314183ce95c0b78acb313 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:49:56 -0500 Subject: [PATCH 074/215] PEP 8: Add and remove blank lines for consistency --- sickbeard/clients/deluged_client.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sickbeard/clients/deluged_client.py b/sickbeard/clients/deluged_client.py index e252c91af..26a93931a 100644 --- a/sickbeard/clients/deluged_client.py +++ b/sickbeard/clients/deluged_client.py @@ -11,6 +11,7 @@ from sickbeard import logger from sickbeard.clients.generic import GenericClient from synchronousdeluge import DelugeClient + class DelugeDAPI(GenericClient): drpc = None @@ -85,7 +86,6 @@ class DelugeDAPI(GenericClient): return self.drpc.set_torrent_label(result.hash, label) return True - def _set_torrent_ratio(self, result): if result.ratio: ratio = float(result.ratio) @@ -116,6 +116,7 @@ class DelugeDAPI(GenericClient): else: return False, 'Error: Unable to Authenticate! Please check your config!' + class DelugeRPC(object): host = 'localhost' -- GitLab From 3020f6c285127089e6cfe2d9b52880650f2727f6 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 12:57:28 -0500 Subject: [PATCH 075/215] PEP 263: Add encoding declaration --- sickbeard/clients/deluged_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/deluged_client.py b/sickbeard/clients/deluged_client.py index 26a93931a..1c956e867 100644 --- a/sickbeard/clients/deluged_client.py +++ b/sickbeard/clients/deluged_client.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Author: Paul Wollaston # Contributions: Luke Mullan # -- GitLab From 2984dc51f6d7e1c01187308899cdf2e3576a396f Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 04:42:49 +1030 Subject: [PATCH 076/215] add base .jshintrc for js linting --- .jshintrc | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .jshintrc diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 000000000..a0611d71d --- /dev/null +++ b/.jshintrc @@ -0,0 +1,30 @@ +{ + "bitwise": true, + "browser": true, + "camelcase": true, + "curly": true, + "devel": true, + "eqeqeq": true, + "forin": true, + "freeze": true, + "indent": 4, + "jquery": true, + "latedef": true, + "maxerr": 2, + "noarg": true, + "noempty": true, + "nonbsp": true, + "undef": true, + "unused": true, + "node": true, + "globals": { + "srRoot": true, + "themeSpinner": true, + "metaToBool": true, + "getMeta": true, + "isMeta": true, + "generate_bwlist": true, + "_": true, + "bootbox": true + } +} -- GitLab From ae5b8b5da3dbd8861969c1ce88f42f7d6aaaf03a Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 04:46:11 +1030 Subject: [PATCH 077/215] lint new/*.js --- gui/slick/js/new/config_general.js | 113 +++++++++ gui/slick/js/new/config_notifications.js | 2 +- gui/slick/js/new/core.js | 4 +- gui/slick/js/new/displayShow.js | 252 ++++++++++++++++++++- gui/slick/js/new/editShow.js | 40 ++-- gui/slick/js/new/home.js | 14 +- gui/slick/js/new/home_recommendedShows.js | 4 +- gui/slick/js/new/home_trendingShows.js | 2 +- gui/slick/js/new/manage_failedDownloads.js | 3 +- gui/slick/js/new/parsers.js | 24 +- gui/slick/js/new/recommendedShows.js | 4 +- gui/slick/js/new/trendingShows.js | 2 +- gui/slick/js/new/viewlogs.js | 2 +- 13 files changed, 411 insertions(+), 55 deletions(-) diff --git a/gui/slick/js/new/config_general.js b/gui/slick/js/new/config_general.js index 98b5a603c..9e6c079ba 100644 --- a/gui/slick/js/new/config_general.js +++ b/gui/slick/js/new/config_general.js @@ -1,3 +1,18 @@ +function configSuccess(){ + $('.config_submitter').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + }); + $('.config_submitter_refresh').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + window.location.href = srRoot + '/config/providers/'; + }); + $('#email_show').trigger('notify'); +} + $(document).ready(function(){ if ($("input[name='proxy_setting']").val().length === 0) { $("input[id='proxy_indexers']").prop('checked', false); @@ -15,4 +30,102 @@ $(document).ready(function(){ $('#log_dir').fileBrowser({ title: 'Select log file folder location' }); $('#config-components').tabs(); + + $(".enabler").each(function(){ + if (!$(this).prop('checked')) { $('#content_'+$(this).attr('id')).hide(); } + }); + + $(".enabler").click(function() { + if ($(this).prop('checked')){ + $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); + } else { + $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); + } + }); + + $(".viewIf").click(function() { + if ($(this).prop('checked')) { + $('.hide_if_'+$(this).attr('id')).css('display','none'); + $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear"); + } else { + $('.show_if_'+$(this).attr('id')).css('display','none'); + $('.hide_if_'+$(this).attr('id')).fadeIn("fast", "linear"); + } + }); + + $(".datePresets").click(function() { + var def = $('#date_presets').val(); + if ($(this).prop('checked') && '%x' === def) { + def = '%a, %b %d, %Y'; + $('#date_use_system_default').html('1'); + } else if (!$(this).prop('checked') && '1' === $('#date_use_system_default').html()){ + def = '%x'; + } + + $('#date_presets').attr('name', 'date_preset_old'); + $('#date_presets').attr('id', 'date_presets_old'); + + $('#date_presets_na').attr('name', 'date_preset'); + $('#date_presets_na').attr('id', 'date_presets'); + + $('#date_presets_old').attr('name', 'date_preset_na'); + $('#date_presets_old').attr('id', 'date_presets_na'); + + if (def) { $('#date_presets').val(def); } + }); + + // bind 'myForm' and provide a simple callback function + $('#configForm').ajaxForm({ + beforeSubmit: function(){ + $('.config_submitter .config_submitter_refresh').each(function(){ + $(this).attr("disabled", "disabled"); + $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); + $(this).hide(); + }); + }, + success: function(){ + setTimeout(function () { + "use strict"; + configSuccess(); + }, 2000); + } + }); + + $('#api_key').click(function(){ + $('#api_key').select(); + }); + + $("#generate_new_apikey").click(function(){ + $.get(srRoot + '/config/general/generateApiKey', + function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + $('#api_key').val(data); + }); + }); + + $('#branchCheckout').click(function() { + var url = srRoot + '/home/branchCheckout?branch=' + $("#branchVersion").val(); + var checkDBversion = srRoot + "/home/getDBcompare"; + $.getJSON(checkDBversion, function(data){ + if (data.status === "success") { + if (data.message === "equal") { + //Checkout Branch + window.location.href = url; + } + if (data.message === "upgrade") { + if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { + //Checkout Branch + window.location.href = url; + } + } + if (data.message === "downgrade") { + alert("Can't switch branch as this will result in a database downgrade."); + } + } + }); + }); + }); diff --git a/gui/slick/js/new/config_notifications.js b/gui/slick/js/new/config_notifications.js index c9762b042..072fca9a2 100644 --- a/gui/slick/js/new/config_notifications.js +++ b/gui/slick/js/new/config_notifications.js @@ -1,3 +1,3 @@ -$(document).load(function(){ +$(document).ready(function(){ $('#config-components').tabs(); }); diff --git a/gui/slick/js/new/core.js b/gui/slick/js/new/core.js index 69215279d..cb6889de6 100644 --- a/gui/slick/js/new/core.js +++ b/gui/slick/js/new/core.js @@ -9,9 +9,9 @@ $(document).ready(function () { var lastOpenedPanel = $(this).data("lastOpenedPanel"), selected = $(this).tabs('option', 'selected'); - if (!lastOpenedPanel) lastOpenedPanel = $(ui.oldPanel); + if (!lastOpenedPanel) { lastOpenedPanel = $(ui.oldPanel); } - if (!$(this).data("topPositionTab")) $(this).data("topPositionTab", $(ui.newPanel).position().top); + if (!$(this).data("topPositionTab")) { $(this).data("topPositionTab", $(ui.newPanel).position().top); } //Dont use the builtin fx effects. This will fade in/out both tabs, we dont want that //Fadein the new tab yourself diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js index 17344f7c6..413404fcb 100644 --- a/gui/slick/js/new/displayShow.js +++ b/gui/slick/js/new/displayShow.js @@ -1,4 +1,246 @@ $(document).ready(function(){ + + $('#srRoot').ajaxEpSearch({'colorRow': true}); + + $('#srRoot').ajaxEpSubtitlesSearch(); + + $('#seasonJump').on('change', function(){ + var id = $('#seasonJump option:selected').val(); + if (id && id !== 'jump') { + var season = $('#seasonJump option:selected').data('season'); + $('html,body').animate({scrollTop: $('[name ="' + id.substring(1) + '"]').offset().top - 50}, 'slow'); + $('#collapseSeason-' + season).collapse('show'); + location.hash = id; + } + $(this).val('jump'); + }); + + $("#prevShow").on('click', function(){ + $('#pickShow option:selected').prev('option').prop('selected', 'selected'); + $("#pickShow").change(); + }); + + $("#nextShow").on('click', function(){ + $('#pickShow option:selected').next('option').prop('selected', 'selected'); + $("#pickShow").change(); + }); + + $('#changeStatus').on('click', function(){ + var srRoot = $('#srRoot').val(); + var epArr = []; + + $('.epCheck').each(function () { + if (this.checked === true) { + epArr.push($(this).attr('id')); + } + }); + + if (epArr.length === 0) { return false; } + + window.location.href = srRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val(); + }); + + $('.seasonCheck').on('click', function(){ + var seasCheck = this; + var seasNo = $(seasCheck).attr('id'); + + $('#collapseSeason-' + seasNo).collapse('show'); + $('.epCheck:visible').each(function () { + var epParts = $(this).attr('id').split('x'); + if (epParts[0] === seasNo) { + this.checked = seasCheck.checked; + } + }); + }); + + var lastCheck = null; + $('.epCheck').on('click', function (event) { + + if (!lastCheck || !event.shiftKey) { + lastCheck = this; + return; + } + + var check = this; + var found = 0; + + $('.epCheck').each(function() { + switch (found) { + case 2: + return false; + case 1: + this.checked = lastCheck.checked; + } + + if (this === check || this === lastCheck) { + found++; + } + }); + }); + + // selects all visible episode checkboxes. + $('.seriesCheck').on('click', function () { + $('.epCheck:visible').each(function () { + this.checked = true; + }); + $('.seasonCheck:visible').each(function () { + this.checked = true; + }); + }); + + // clears all visible episode checkboxes and the season selectors + $('.clearAll').on('click', function () { + $('.epCheck:visible').each(function () { + this.checked = false; + }); + $('.seasonCheck:visible').each(function () { + this.checked = false; + }); + }); + + // handle the show selection dropbox + $('#pickShow').on('change', function () { + var srRoot = $('#srRoot').val(); + var val = $(this).val(); + if (val === 0) { + return; + } + window.location.href = srRoot + '/home/displayShow?show=' + val; + }); + + // show/hide different types of rows when the checkboxes are changed + $("#checkboxControls input").change(function () { + var whichClass = $(this).attr('id'); + $(this).showHideRows(whichClass); + }); + + // initially show/hide all the rows according to the checkboxes + $("#checkboxControls input").each(function() { + $("tr." + $(this).attr('id')).each(function() { + if(this.checked) { + $(this).show(); + } else { + $(this).hide(); + } + }); + }); + + $.fn.showHideRows = function(whichClass) { + var status = $('#checkboxControls > input, #' + whichClass).prop('checked'); + $("tr." + whichClass).each(function() { + if (status) { + $(this).show(); + } else { + $(this).hide(); + } + }); + + // hide season headers with no episodes under them + $('tr.seasonheader').each(function () { + var numRows = 0; + var seasonNo = $(this).attr('id'); + $('tr.' + seasonNo + ' :visible').each(function () { + numRows++; + }); + if (numRows === 0) { + $(this).hide(); + $('#' + seasonNo + '-cols').hide(); + } else { + $(this).show(); + $('#' + seasonNo + '-cols').show(); + } + }); + }; + + function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) { + var srRoot = $('#srRoot').val(); + var showId = $('#showID').val(); + var indexer = $('#indexer').val(); + + if (sceneSeason === '') { sceneSeason = null; } + if (sceneEpisode === '') { sceneEpisode = null; } + + $.getJSON(srRoot + '/home/setSceneNumbering',{ + 'show': showId, + 'indexer': indexer, + 'forSeason': forSeason, + 'forEpisode': forEpisode, + 'sceneSeason': sceneSeason, + 'sceneEpisode': sceneEpisode + }, function(data) { + // Set the values we get back + if (data.sceneSeason === null || data.sceneEpisode === null) { + $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(''); + } else { + $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode); + } + if (!data.success) { + if (data.errorMessage) { + alert(data.errorMessage); + } else { + alert('Update failed.'); + } + } + }); + } + + function setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) { + var srRoot = $('#srRoot').val(); + var showId = $('#showID').val(); + var indexer = $('#indexer').val(); + + if (sceneAbsolute === '') { sceneAbsolute = null; } + + $.getJSON(srRoot + '/home/setSceneNumbering', { + 'show': showId, + 'indexer': indexer, + 'forAbsolute': forAbsolute, + 'sceneAbsolute': sceneAbsolute + }, + function(data) { + // Set the values we get back + if (data.sceneAbsolute === null) { + $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(''); + } else { + $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(data.sceneAbsolute); + } + if (!data.success) { + if (data.errorMessage) { + alert(data.errorMessage); + } else { + alert('Update failed.'); + } + } + }); + } + + $('.sceneSeasonXEpisode').on('change', function() { + // Strip non-numeric characters + $(this).val($(this).val().replace(/[^0-9xX]*/g, '')); + var forSeason = $(this).attr('data-for-season'); + var forEpisode = $(this).attr('data-for-episode'); + var m = $(this).val().match(/^(\d+)x(\d+)$/i); + var sceneSeason = null, sceneEpisode = null; + if (m) { + sceneSeason = m[1]; + sceneEpisode = m[2]; + } + setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode); + }); + + $('.sceneAbsolute').on('change', function() { + // Strip non-numeric characters + $(this).val($(this).val().replace(/[^0-9xX]*/g, '')); + var forAbsolute = $(this).attr('data-for-absolute'); + + var m = $(this).val().match(/^(\d{1,3})$/i); + var sceneAbsolute = null; + if (m) { + sceneAbsolute = m[1]; + } + setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute); + }); + $('.addQTip').each(function () { $(this).css({'cursor':'help', 'text-shadow':'0px 0px 0.5px #666'}); $(this).qtip({ @@ -16,11 +258,11 @@ $(document).ready(function(){ $("#showTable, #animeTable").tablesorter({ widgets: ['saveSort', 'stickyHeaders', 'columnSelector'], widgetOptions : { - columnSelector_saveColumns: true, - columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>', - columnSelector_mediaquery: false, - columnSelector_cssChecked : 'checked' - }, + columnSelector_saveColumns: true, // jshint ignore:line + columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>', // jshint ignore:line + columnSelector_mediaquery: false, // jshint ignore:line + columnSelector_cssChecked : 'checked' // jshint ignore:line + } }); $('#popover').popover({ diff --git a/gui/slick/js/new/editShow.js b/gui/slick/js/new/editShow.js index 3b5665479..73789ef0d 100644 --- a/gui/slick/js/new/editShow.js +++ b/gui/slick/js/new/editShow.js @@ -1,56 +1,56 @@ -var all_exceptions = []; +var allExceptions = []; $('#location').fileBrowser({ title: 'Select Show Location' }); -$('#submit').click(function(){ - all_exceptions = []; +$('#submit').click(function() { + var allExceptions = []; - $("#exceptions_list option").each ( function() { - all_exceptions.push( $(this).val() ); + $("#exceptions_list option").each(function() { + allExceptions.push( $(this).val() ); }); - $("#exceptions_list").val(all_exceptions); + $("#exceptions_list").val(allExceptions); - if(metaToBool('show.is_anime')) generate_bwlist(); + if(metaToBool('show.is_anime')) { generate_bwlist(); } }); $('#addSceneName').click(function() { - var scene_ex = $('#SceneName').val(); + var sceneEx = $('#SceneName').val(); var option = $("<option>"); - all_exceptions = []; + allExceptions = []; - $("#exceptions_list option").each ( function() { - all_exceptions.push($(this).val()); + $("#exceptions_list option").each(function() { + allExceptions.push($(this).val()); }); $('#SceneName').val(''); - if ($.inArray(scene_ex, all_exceptions) > -1 || (scene_ex === '')) return; + if ($.inArray(sceneEx, allExceptions) > -1 || (sceneEx === '')) { return; } $("#SceneException").show(); - option.attr("value",scene_ex); - option.html(scene_ex); + option.attr("value",sceneEx); + option.html(sceneEx); return option.appendTo('#exceptions_list'); }); $('#removeSceneName').click(function() { $('#exceptions_list option:selected').remove(); - $(this).toggle_SceneException(); + $(this).toggleSceneException(); }); -$.fn.toggle_SceneException = function() { - all_exceptions = []; +$.fn.toggleSceneException = function() { + allExceptions = []; $("#exceptions_list option").each ( function() { - all_exceptions.push( $(this).val() ); + allExceptions.push( $(this).val() ); }); - if (all_exceptions === ''){ + if (allExceptions === ''){ $("#SceneException").hide(); } else { $("#SceneException").show(); } }; -$(this).toggle_SceneException(); +$(this).toggleSceneException(); diff --git a/gui/slick/js/new/home.js b/gui/slick/js/new/home.js index f4f09593a..1df0a5edb 100644 --- a/gui/slick/js/new/home.js +++ b/gui/slick/js/new/home.js @@ -8,9 +8,11 @@ $(document).ready(function(){ $('.progressbar').each(function(progressbar){ var showId = $(this).data('show-id'); var percentage = $(this).data('progress-percentage'); - var classToAdd = percentage == 100 ? 100 : percentage > 80 ? 80 : percentage > 60 ? 60 : percentage > 40 ? 40 : 20; + var classToAdd = percentage === 100 ? 100 : percentage > 80 ? 80 : percentage > 60 ? 60 : percentage > 40 ? 40 : 20; $(this).progressbar({ value: percentage }); - if($(this).data('progress-text')) $(this).append('<div class="progressbarText" title="' + $(this).data('progress-tip') + '">' + $(this).data('progress-text') + '</div>'); + if($(this).data('progress-text')) { + $(this).append('<div class="progressbarText" title="' + $(this).data('progress-tip') + '">' + $(this).data('progress-text') + '</div>'); + } $(this).find('.ui-progressbar-value').addClass('progress-' + classToAdd); }); @@ -53,10 +55,10 @@ $(document).ready(function(){ widgetOptions: (function(){ if(metaToBool('sickbeard.FILTER_ROW')){ return { - filter_columnFilters: true, - filter_hideFilters : true, - filter_saveFilters : true, - filter_functions : { + filter_columnFilters: true, // jshint ignore:line + filter_hideFilters : true, // jshint ignore:line + filter_saveFilters : true, // jshint ignore:line + filter_functions : { // jshint ignore:line 5:function(e, n, f, i, r, c) { var test = false; var pct = Math.floor((n % 1) * 1000); diff --git a/gui/slick/js/new/home_recommendedShows.js b/gui/slick/js/new/home_recommendedShows.js index 31d953523..fa82ab85c 100644 --- a/gui/slick/js/new/home_recommendedShows.js +++ b/gui/slick/js/new/home_recommendedShows.js @@ -9,7 +9,7 @@ $(document).ready(function(){ $('#showsortdirection').val('asc'); var $container = [$('#container')]; - $.each($container, function (j) { + $.each($container, function() { this.isotope({ itemSelector: '.trakt_show', sortBy: 'original-order', @@ -52,6 +52,6 @@ $(document).ready(function(){ }); $('#showsortdirection').on( 'change', function() { - $('#container').isotope({sortAscending: ('asc' == this.value)}); + $('#container').isotope({sortAscending: ('asc' === this.value)}); }); }); diff --git a/gui/slick/js/new/home_trendingShows.js b/gui/slick/js/new/home_trendingShows.js index 51e1e49b1..3f21b696a 100644 --- a/gui/slick/js/new/home_trendingShows.js +++ b/gui/slick/js/new/home_trendingShows.js @@ -49,6 +49,6 @@ $(document).ready(function(){ }); $('#showsortdirection').on( 'change', function() { - $('#container').isotope({sortAscending: ('asc' == this.value)}); + $('#container').isotope({sortAscending: ('asc' === this.value)}); }); }); diff --git a/gui/slick/js/new/manage_failedDownloads.js b/gui/slick/js/new/manage_failedDownloads.js index 9186bac81..9184a54f8 100644 --- a/gui/slick/js/new/manage_failedDownloads.js +++ b/gui/slick/js/new/manage_failedDownloads.js @@ -5,7 +5,6 @@ $(document).ready(function(){ headers: { 3: { sorter: false } } }); $('#limit').change(function(){ - url = srRoot + '/manage/failedDownloads/?limit='+$(this).val(); - window.location.href = url; + window.location.href = srRoot + '/manage/failedDownloads/?limit='+$(this).val();; }); }); diff --git a/gui/slick/js/new/parsers.js b/gui/slick/js/new/parsers.js index 5c4646571..b7be826ea 100644 --- a/gui/slick/js/new/parsers.js +++ b/gui/slick/js/new/parsers.js @@ -1,6 +1,6 @@ $.tablesorter.addParser({ id: 'loadingNames', - is: function(s) { + is: function() { return false; }, format: function(s) { @@ -14,7 +14,7 @@ $.tablesorter.addParser({ }); $.tablesorter.addParser({ id: 'quality', - is: function(s) { + is: function() { return false; }, format: function(s) { @@ -24,7 +24,7 @@ $.tablesorter.addParser({ }); $.tablesorter.addParser({ id: 'realISODate', - is: function(s) { + is: function() { return false; }, format: function(s) { @@ -35,7 +35,7 @@ $.tablesorter.addParser({ $.tablesorter.addParser({ id: 'cDate', - is: function(s) { + is: function() { return false; }, format: function(s) { @@ -45,27 +45,27 @@ $.tablesorter.addParser({ }); $.tablesorter.addParser({ id: 'eps', - is: function(s) { + is: function() { return false; }, format: function(s) { - match = s.match(/^(.*)/); + var match = s.match(/^(.*)/); - if (match === null || match[1] == "?") return -10; + if (match === null || match[1] === "?") { return -10; } var nums = match[1].split(" / "); - if (nums[0].indexOf("+") != -1) { - var num_parts = nums[0].split("+"); - nums[0] = num_parts[0]; + if (nums[0].indexOf("+") !== -1) { + var numParts = nums[0].split("+"); + nums[0] = numParts[0]; } nums[0] = parseInt(nums[0]); nums[1] = parseInt(nums[1]); - if (nums[0] === 0) return nums[1]; + if (nums[0] === 0) { return nums[1]; } var finalNum = parseInt((getMeta('max_download_count'))*nums[0]/nums[1]); var pct = Math.round((nums[0]/nums[1])*100) / 1000; - if (finalNum > 0) finalNum += nums[0]; + if (finalNum > 0) { finalNum += nums[0]; } return finalNum + pct; }, diff --git a/gui/slick/js/new/recommendedShows.js b/gui/slick/js/new/recommendedShows.js index 17a78a464..c64be8e6f 100644 --- a/gui/slick/js/new/recommendedShows.js +++ b/gui/slick/js/new/recommendedShows.js @@ -1,7 +1,7 @@ $.fn.loadContent = function(path, loadingTxt, errorTxt) { $(this).html('<img id="searchingAnim" src="' + srRoot + '/images/loading32' + themeSpinner + '.gif" height="32" width="32" /> ' + loadingTxt); - $(this).load(srRoot + path + ' #container', function(response, status, xhr) { - if (status == "error") $(this).empty().html(errorTxt); + $(this).load(srRoot + path + ' #container', function(response, status) { + if (status === "error") { $(this).empty().html(errorTxt); } }); }; diff --git a/gui/slick/js/new/trendingShows.js b/gui/slick/js/new/trendingShows.js index b65df539d..b60a5068f 100644 --- a/gui/slick/js/new/trendingShows.js +++ b/gui/slick/js/new/trendingShows.js @@ -4,7 +4,7 @@ $(document).ready(function(){ $('#showsortdirection').val('asc'); var $container = [$('#container')]; - $.each($container, function (j) { + $.each($container, function () { this.isotope({ itemSelector: '.trakt_show', sortBy: 'original-order', diff --git a/gui/slick/js/new/viewlogs.js b/gui/slick/js/new/viewlogs.js index d0ed8eee1..d8437eebf 100644 --- a/gui/slick/js/new/viewlogs.js +++ b/gui/slick/js/new/viewlogs.js @@ -7,7 +7,7 @@ $(document).ready(function(){ $('#minLevel').prop('disabled', true); $('#logFilter').prop('disabled', true); document.body.style.cursor='wait'; - url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); + var url = srRoot + '/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val(); $.get(url, function(data){ history.pushState('data', '', url); $('pre').html($(data).find('pre').html()); -- GitLab From 32bad593424746caa92489a735b36845e16e8114 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 04:46:34 +1030 Subject: [PATCH 078/215] lint old *.js && update views --- gui/slick/js/config.js | 115 ------------ gui/slick/js/configSubtitles.js | 11 +- gui/slick/js/displayShow.js | 244 ------------------------- gui/slick/js/failedDownloads.js | 7 +- gui/slick/js/manageSubtitleMissed.js | 24 +-- gui/slick/js/massEdit.js | 28 +-- gui/slick/js/massUpdate.js | 110 +++++------ gui/slick/js/plotTooltip.js | 4 +- gui/slick/js/qualityChooser.js | 4 +- gui/slick/js/ratingTooltip.js | 2 +- gui/slick/js/restart.js | 6 +- gui/slick/js/rootDirs.js | 84 +++++---- gui/slick/js/sceneExceptionsTooltip.js | 4 +- gui/slick/js/testRename.js | 7 +- gui/slick/views/config_anime.mako | 1 - gui/slick/views/displayShow.mako | 3 +- 16 files changed, 143 insertions(+), 511 deletions(-) diff --git a/gui/slick/js/config.js b/gui/slick/js/config.js index 7c852360b..e69de29bb 100644 --- a/gui/slick/js/config.js +++ b/gui/slick/js/config.js @@ -1,115 +0,0 @@ -$(document).ready(function(){ - $(".enabler").each(function(){ - if (!$(this).prop('checked')) $('#content_'+$(this).attr('id')).hide(); - }); - - $(".enabler").click(function() { - if ($(this).prop('checked')){ - $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); - } else { - $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); - } - }); - - $(".viewIf").click(function() { - if ($(this).prop('checked')) { - $('.hide_if_'+$(this).attr('id')).css('display','none'); - $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear"); - } else { - $('.show_if_'+$(this).attr('id')).css('display','none'); - $('.hide_if_'+$(this).attr('id')).fadeIn("fast", "linear"); - } - }); - - $(".datePresets").click(function() { - var def = $('#date_presets').val(); - if ($(this).prop('checked') && '%x' == def) { - def = '%a, %b %d, %Y'; - $('#date_use_system_default').html('1'); - } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html()){ - def = '%x'; - } - - $('#date_presets').attr('name', 'date_preset_old'); - $('#date_presets').attr('id', 'date_presets_old'); - - $('#date_presets_na').attr('name', 'date_preset'); - $('#date_presets_na').attr('id', 'date_presets'); - - $('#date_presets_old').attr('name', 'date_preset_na'); - $('#date_presets_old').attr('id', 'date_presets_na'); - - if (def) $('#date_presets').val(def); - }); - - // bind 'myForm' and provide a simple callback function - $('#configForm').ajaxForm({ - beforeSubmit: function(){ - $('.config_submitter .config_submitter_refresh').each(function(){ - $(this).attr("disabled", "disabled"); - $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); - $(this).hide(); - }); - }, - success: function(){ - setTimeout(function () { - "use strict"; - config_success(); - }, 2000); - } - }); - - $('#api_key').click(function(){ - $('#api_key').select(); - }); - - $("#generate_new_apikey").click(function(){ - $.get(srRoot + '/config/general/generateApiKey', - function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - $('#api_key').val(data); - }); - }); - - $('#branchCheckout').click(function() { - var url = srRoot+'/home/branchCheckout?branch='+$("#branchVersion").val(); - var checkDBversion = srRoot + "/home/getDBcompare"; - $.getJSON(checkDBversion, function(data){ - if (data.status == "success") { - if (data.message == "equal") { - //Checkout Branch - window.location.href = url; - } - if (data.message == "upgrade") { - if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { - //Checkout Branch - window.location.href = url; - } - } - if (data.message == "downgrade") { - alert("Can't switch branch as this will result in a database downgrade."); - } - } - }); - }); - -}); - -function config_success(){ - $('.config_submitter').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - }); - $('.config_submitter_refresh').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - url = srRoot+'/config/providers/'; - window.location.href = url; - }); - $('#email_show').trigger('notify'); -} diff --git a/gui/slick/js/configSubtitles.js b/gui/slick/js/configSubtitles.js index 05974d6df..8414d8e9b 100644 --- a/gui/slick/js/configSubtitles.js +++ b/gui/slick/js/configSubtitles.js @@ -1,11 +1,10 @@ $(document).ready(function(){ - $.fn.showHideServices = function() { $('.serviceDiv').each(function(){ var serviceName = $(this).attr('id'); var selectedService = $('#editAService :selected').val(); - if (selectedService+'Div' == serviceName){ + if (selectedService+'Div' === serviceName){ $(this).show(); } else { $(this).hide(); @@ -14,7 +13,7 @@ $(document).ready(function(){ }; $.fn.addService = function (id, name, url, key, isDefault, showService) { - if (url.match('/$') === null) url = url + '/'; + if (url.match('/$') === null) { url = url + '/'; } var newData = [isDefault, [name, url, key]]; @@ -34,10 +33,9 @@ $(document).ready(function(){ var idArr = $("#service_order_list").sortable('toArray'); var finalArr = []; $.each(idArr, function(key, val) { - var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; - finalArr.push(val + ':' + checked); + var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; + finalArr.push(val + ':' + checked); }); - $("#service_order").val(finalArr.join(' ')); }; @@ -51,7 +49,6 @@ $(document).ready(function(){ // initialization stuff - $(this).showHideServices(); $("#service_order_list").sortable({ diff --git a/gui/slick/js/displayShow.js b/gui/slick/js/displayShow.js index 138abad49..a01c02b14 100644 --- a/gui/slick/js/displayShow.js +++ b/gui/slick/js/displayShow.js @@ -1,247 +1,3 @@ $(document).ready(function () { - $('#srRoot').ajaxEpSearch({'colorRow': true}); - - $('#srRoot').ajaxEpSubtitlesSearch(); - - $('#seasonJump').on('change', function(){ - var id = $('#seasonJump option:selected').val(); - if (id && id != 'jump') { - var season = $('#seasonJump option:selected').data('season'); - $('html,body').animate({scrollTop: $('[name ="' + id.substring(1) + '"]').offset().top - 50}, 'slow'); - $('#collapseSeason-' + season).collapse('show'); - location.hash = id; - } - $(this).val('jump'); - }); - - $("#prevShow").on('click', function(){ - $('#pickShow option:selected').prev('option').prop('selected', 'selected'); - $("#pickShow").change(); - }); - - $("#nextShow").on('click', function(){ - $('#pickShow option:selected').next('option').prop('selected', 'selected'); - $("#pickShow").change(); - }); - - $('#changeStatus').on('click', function(){ - var srRoot = $('#srRoot').val(); - var epArr = []; - - $('.epCheck').each(function () { - if (this.checked === true) epArr.push($(this).attr('id')); - }); - - if (epArr.length === 0) return false; - - url = srRoot + '/home/setStatus?show=' + $('#showID').attr('value') + '&eps=' + epArr.join('|') + '&status=' + $('#statusSelect').val(); - window.location.href = url; - }); - - $('.seasonCheck').on('click', function(){ - var seasCheck = this; - var seasNo = $(seasCheck).attr('id'); - - $('#collapseSeason-' + seasNo).collapse('show'); - $('.epCheck:visible').each(function () { - var epParts = $(this).attr('id').split('x'); - if (epParts[0] == seasNo) this.checked = seasCheck.checked; - }); - }); - - var lastCheck = null; - $('.epCheck').on('click', function (event) { - - if (!lastCheck || !event.shiftKey) { - lastCheck = this; - return; - } - - var check = this; - var found = 0; - - $('.epCheck').each(function() { - switch (found) { - case 2: - return false; - case 1: - this.checked = lastCheck.checked; - } - - if (this == check || this == lastCheck) - found++; - }); - - lastClick = this; - }); - - // selects all visible episode checkboxes. - $('.seriesCheck').on('click', function () { - $('.epCheck:visible').each(function () { - this.checked = true; - }); - $('.seasonCheck:visible').each(function () { - this.checked = true; - }); - }); - - // clears all visible episode checkboxes and the season selectors - $('.clearAll').on('click', function () { - $('.epCheck:visible').each(function () { - this.checked = false; - }); - $('.seasonCheck:visible').each(function () { - this.checked = false; - }); - }); - - // handle the show selection dropbox - $('#pickShow').on('change', function () { - var srRoot = $('#srRoot').val(); - var val = $(this).val(); - if (val === 0) return; - url = srRoot + '/home/displayShow?show=' + val; - window.location.href = url; - }); - - // show/hide different types of rows when the checkboxes are changed - $("#checkboxControls input").change(function (e) { - var whichClass = $(this).attr('id'); - $(this).showHideRows(whichClass); - }); - - // initially show/hide all the rows according to the checkboxes - $("#checkboxControls input").each(function (e) { - var status = this.checked; - $("tr." + $(this).attr('id')).each(function (e) { - if (status) { - $(this).show(); - } else { - $(this).hide(); - } - }); - }); - - $.fn.showHideRows = function(whichClass) { - var status = $('#checkboxControls > input, #' + whichClass).prop('checked'); - $("tr." + whichClass).each(function (e) { - if (status) { - $(this).show(); - } else { - $(this).hide(); - } - }); - - // hide season headers with no episodes under them - $('tr.seasonheader').each(function () { - var numRows = 0; - var seasonNo = $(this).attr('id'); - $('tr.' + seasonNo + ' :visible').each(function () { - numRows++; - }); - if (numRows === 0) { - $(this).hide(); - $('#' + seasonNo + '-cols').hide(); - } else { - $(this).show(); - $('#' + seasonNo + '-cols').show(); - } - }); - }; - - function setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode) { - var srRoot = $('#srRoot').val(); - var showId = $('#showID').val(); - var indexer = $('#indexer').val(); - - if (sceneSeason === '') sceneSeason = null; - if (sceneEpisode === '') sceneEpisode = null; - - $.getJSON(srRoot + '/home/setSceneNumbering',{ - 'show': showId, - 'indexer': indexer, - 'forSeason': forSeason, - 'forEpisode': forEpisode, - 'sceneSeason': sceneSeason, - 'sceneEpisode': sceneEpisode - }, function(data) { - // Set the values we get back - if (data.sceneSeason === null || data.sceneEpisode === null) { - $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(''); - } else { - $('#sceneSeasonXEpisode_' + showId + '_' + forSeason + '_' + forEpisode).val(data.sceneSeason + 'x' + data.sceneEpisode); - } - if (!data.success) { - if (data.errorMessage) { - alert(data.errorMessage); - } else { - alert('Update failed.'); - } - } - }); - } - - function setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute) { - var srRoot = $('#srRoot').val(); - var showId = $('#showID').val(); - var indexer = $('#indexer').val(); - - if (sceneAbsolute === '') sceneAbsolute = null; - - $.getJSON(srRoot + '/home/setSceneNumbering', { - 'show': showId, - 'indexer': indexer, - 'forAbsolute': forAbsolute, - 'sceneAbsolute': sceneAbsolute - }, - function(data) { - // Set the values we get back - if (data.sceneAbsolute === null) { - $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(''); - } else { - $('#sceneAbsolute_' + showId + '_' + forAbsolute).val(data.sceneAbsolute); - } - if (!data.success) { - if (data.errorMessage) { - alert(data.errorMessage); - } else { - alert('Update failed.'); - } - } - }); - } - - $('.sceneSeasonXEpisode').on('change', function() { - // Strip non-numeric characters - $(this).val($(this).val().replace(/[^0-9xX]*/g, '')); - var forSeason = $(this).attr('data-for-season'); - var forEpisode = $(this).attr('data-for-episode'); - var showId = $('#showID').val(); - var indexer = $('#indexer').val(); - - //var sceneEpisode = $('#sceneEpisode_' + showId + '_' + forSeason +'_' + forEpisode).val(); - var m = $(this).val().match(/^(\d+)x(\d+)$/i); - var sceneSeason = null, sceneEpisode = null; - if (m) { - sceneSeason = m[1]; - sceneEpisode = m[2]; - } - setEpisodeSceneNumbering(forSeason, forEpisode, sceneSeason, sceneEpisode); - }); - - $('.sceneAbsolute').on('change', function() { - // Strip non-numeric characters - $(this).val($(this).val().replace(/[^0-9xX]*/g, '')); - var forAbsolute = $(this).attr('data-for-absolute'); - var showId = $('#showID').val(); - var indexer = $('#indexer').val(); - - var m = $(this).val().match(/^(\d{1,3})$/i); - var sceneAbsolute = null; - if (m) { - sceneAbsolute = m[1]; - } - setAbsoluteSceneNumbering(forAbsolute, sceneAbsolute); - }); }); diff --git a/gui/slick/js/failedDownloads.js b/gui/slick/js/failedDownloads.js index 62b2fea48..4b991fc2a 100644 --- a/gui/slick/js/failedDownloads.js +++ b/gui/slick/js/failedDownloads.js @@ -8,10 +8,9 @@ $(document).ready(function(){ } }); - if (removeArr.length === 0) return false; + if (removeArr.length === 0) { return false; } - url = srRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|'); - window.location.href = url; + window.location.href = srRoot + '/manage/failedDownloads?toRemove='+removeArr.join('|'); }); $('.bulkCheck').on('click', function(){ @@ -41,7 +40,7 @@ $(document).ready(function(){ this.checked = lastCheck.checked; } - if (this == check || this == lastCheck) found++; + if (this === check || this === lastCheck) { found++; } }); }); }); diff --git a/gui/slick/js/manageSubtitleMissed.js b/gui/slick/js/manageSubtitleMissed.js index 228b3f171..2f6d65c2b 100644 --- a/gui/slick/js/manageSubtitleMissed.js +++ b/gui/slick/js/manageSubtitleMissed.js @@ -1,11 +1,11 @@ $(document).ready(function() { - function make_row(indexer_id, season, episode, name, subtitles, checked) { + function makeRow(indexerId, season, episode, name, subtitles, checked) { checked = checked ? ' checked' : ''; var row = ''; - row += ' <tr class="good show-' + indexer_id + '">'; - row += ' <td align="center"><input type="checkbox" class="'+indexer_id+'-epcheck" name="'+indexer_id+'-'+season+'x'+episode+'"'+checked+'></td>'; + row += ' <tr class="good show-' + indexerId + '">'; + row += ' <td align="center"><input type="checkbox" class="'+indexerId+'-epcheck" name="'+indexerId+'-'+season+'x'+episode+'"'+checked+'></td>'; row += ' <td style="width: 1%;">'+season+'x'+episode+'</td>'; row += ' <td>'+name+'</td>'; row += ' </tr>'; @@ -14,26 +14,26 @@ $(document).ready(function() { } $('.allCheck').click(function(){ - var indexer_id = $(this).attr('id').split('-')[1]; - $('.'+indexer_id+'-epcheck').prop('checked', $(this).prop('checked')); + var indexerId = $(this).attr('id').split('-')[1]; + $('.'+indexerId+'-epcheck').prop('checked', $(this).prop('checked')); }); $('.get_more_eps').click(function(){ - var cur_indexer_id = $(this).attr('id'); - var checked = $('#allCheck-'+cur_indexer_id).prop('checked'); - var last_row = $('tr#'+cur_indexer_id); + var indexerId = $(this).attr('id'); + var checked = $('#allCheck-'+indexerId).prop('checked'); + var lastRow = $('tr#'+indexerId); var clicked = $(this).attr('data-clicked'); var action = $(this).attr('value'); if (!clicked) { $.getJSON(srRoot + '/manage/showSubtitleMissed', { - indexer_id: cur_indexer_id, + indexer_id: indexerId, // jshint ignore:line whichSubs: $('#selectSubLang').val() }, function(data) { $.each(data, function(season, eps) { $.each(eps, function(episode, data) { //alert(season+'x'+episode+': '+name); - last_row.after(make_row(cur_indexer_id, season, episode, data.name, data.subtitles, checked)); + lastRow.after(makeRow(indexerId, season, episode, data.name, data.subtitles, checked)); }); }); }); @@ -41,10 +41,10 @@ $(document).ready(function() { $(this).prop('value', 'Collapse'); } else { if (action === 'Collapse') { - $('table tr').filter('.show-' + cur_indexer_id).hide(); + $('table tr').filter('.show-' + indexerId).hide(); $(this).prop('value', 'Expand'); } else if (action === 'Expand') { - $('table tr').filter('.show-' + cur_indexer_id).show(); + $('table tr').filter('.show-' + indexerId).show(); $(this).prop('value', 'Collapse'); } } diff --git a/gui/slick/js/massEdit.js b/gui/slick/js/massEdit.js index 116792887..1a8c7b334 100644 --- a/gui/slick/js/massEdit.js +++ b/gui/slick/js/massEdit.js @@ -1,28 +1,28 @@ $(document).ready(function(){ - function find_dir_index(which){ - var dir_parts = which.split('_'); - return dir_parts[dir_parts.length-1]; + function findDirIndex(which){ + var dirParts = which.split('_'); + return dirParts[dirParts.length-1]; } - function edit_root_dir(path, options){ - $('#new_root_dir_'+options.which_id).val(path); - $('#new_root_dir_'+options.which_id).change(); + function editRootDir(path, options){ + $('#new_root_dir_'+options.whichId).val(path); + $('#new_root_dir_'+options.whichId).change(); } $('.new_root_dir').change(function(){ - var cur_index = find_dir_index($(this).attr('id')); - $('#display_new_root_dir_'+cur_index).html('<b>'+$(this).val()+'</b>'); + var curIndex = findDirIndex($(this).attr('id')); + $('#display_new_root_dir_'+curIndex).html('<b>'+$(this).val()+'</b>'); }); $('.edit_root_dir').click(function(){ - var cur_id = find_dir_index($(this).attr('id')); - var initial_dir = $("#new_root_dir_"+cur_id).val(); - $(this).nFileBrowser(edit_root_dir, {initialDir: initial_dir, which_id: cur_id}); + var curIndex = findDirIndex($(this).attr('id')); + var initialDir = $("#new_root_dir_"+curIndex).val(); + $(this).nFileBrowser(editRootDir, {initialDir: initialDir, whichId: curIndex}); }); $('.delete_root_dir').click(function(){ - var cur_id = find_dir_index($(this).attr('id')); - $('#new_root_dir_'+cur_id).val(null); - $('#display_new_root_dir_'+cur_id).html('<b>DELETED</b>'); + var curIndex = findDirIndex($(this).attr('id')); + $('#new_root_dir_'+curIndex).val(null); + $('#display_new_root_dir_'+curIndex).html('<b>DELETED</b>'); }); }); diff --git a/gui/slick/js/massUpdate.js b/gui/slick/js/massUpdate.js index 3d390c9cc..b539e1ef6 100644 --- a/gui/slick/js/massUpdate.js +++ b/gui/slick/js/massUpdate.js @@ -3,85 +3,74 @@ $(document).ready(function(){ var editArr = []; $('.editCheck').each(function() { - if(this.checked === true) editArr.push($(this).attr('id').split('-')[1]); + if(this.checked === true) { editArr.push($(this).attr('id').split('-')[1]); } }); - if(editArr.length === 0) return; + if(editArr.length === 0) { return; } - url = 'massEdit?toEdit='+editArr.join('|'); - window.location.href = url; + window.location.href = 'massEdit?toEdit='+editArr.join('|'); }); $('#submitMassUpdate').on('click', function(){ + var updateArr = []; + var refreshArr = []; + var renameArr = []; + var subtitleArr = []; + var deleteArr = []; + var removeArr = []; + var metadataArr = []; + + $('.updateCheck').each(function() { + if(this.checked === true) { updateArr.push($(this).attr('id').split('-')[1]); } + }); - var updateArr = []; - var refreshArr = []; - var renameArr = []; - var subtitleArr = []; - var deleteArr = []; - var removeArr = []; - var metadataArr = []; - - $('.updateCheck').each(function() { - if(this.checked === true) updateArr.push($(this).attr('id').split('-')[1]); - }); + $('.refreshCheck').each(function() { + if(this.checked === true) { refreshArr.push($(this).attr('id').split('-')[1]); } + }); - $('.refreshCheck').each(function() { - if(this.checked === true) refreshArr.push($(this).attr('id').split('-')[1]); - }); + $('.renameCheck').each(function() { + if(this.checked === true) { renameArr.push($(this).attr('id').split('-')[1]); } + }); - $('.renameCheck').each(function() { - if(this.checked === true) renameArr.push($(this).attr('id').split('-')[1]); - }); + $('.subtitleCheck').each(function() { + if(this.checked === true) { subtitleArr.push($(this).attr('id').split('-')[1]); } + }); - $('.subtitleCheck').each(function() { - if(this.checked === true) subtitleArr.push($(this).attr('id').split('-')[1]); - }); + $('.removeCheck').each(function() { + if(this.checked === true) { removeArr.push($(this).attr('id').split('-')[1]); } + }); - $('.removeCheck').each(function() { - if(this.checked === true) removeArr.push($(this).attr('id').split('-')[1]); - }); + var deleteCount = 0; - var deleteCount = 0; + $('.deleteCheck').each(function() { + if(this.checked === true) { deleteCount++; } + }); - $('.deleteCheck').each(function() { - if(this.checked === true) deleteCount++; - }); + if(deleteCount >= 1) { + bootbox.confirm("You have selected to delete " + deleteCount + " show(s). Are you sure you wish to continue? All files will be removed from your system.", function(result) { + if(result) { + $('.deleteCheck').each(function() { + if(this.checked === true) { + deleteArr.push($(this).attr('id').split('-')[1]); + } + }); + } + if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) { return false; } - if(deleteCount >= 1) { - bootbox.confirm("You have selected to delete " + deleteCount + " show(s). Are you sure you wish to continue? All files will be removed from your system.", function(result) { - if(result) { - $('.deleteCheck').each(function() { - if(this.checked === true) { - deleteArr.push($(this).attr('id').split('-')[1]); - } - }); - } - if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false; - url = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|'); - window.location.href = url; - }); - } else { - if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) return false; - url = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|'); - window.location.href = url; - } -/* - $('.metadataCheck').each(function() { - if(this.checked == true) { - metadataArr.push($(this).attr('id').split('-')[1]) - } + window.location.href = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|'); + }); + } else { + if(updateArr.length+refreshArr.length+renameArr.length+subtitleArr.length+deleteArr.length+removeArr.length+metadataArr.length === 0) { return false; } + window.location.href = 'massUpdate?toUpdate='+updateArr.join('|')+'&toRefresh='+refreshArr.join('|')+'&toRename='+renameArr.join('|')+'&toSubtitle='+subtitleArr.join('|')+'&toDelete='+deleteArr.join('|')+'&toRemove='+removeArr.join('|')+'&toMetadata='+metadataArr.join('|'); + } }); -*/ - - }); $('.bulkCheck').on('click', function(){ var bulkCheck = this; var whichBulkCheck = $(bulkCheck).attr('id'); $('.'+whichBulkCheck).each(function(){ - if(!this.disabled) this.checked = !this.checked; + if(!this.disabled) { this.checked = !this.checked; } }); }); @@ -101,11 +90,10 @@ $(document).ready(function(){ switch (found) { case 2: return false; case 1: - if(!this.disabled) this.checked = lastCheck.checked; + if(!this.disabled) { this.checked = lastCheck.checked; } } - if(this == check || this == lastCheck) found++; + if(this === check || this === lastCheck) { found++; } }); - lastClick = this; }); }); }); diff --git a/gui/slick/js/plotTooltip.js b/gui/slick/js/plotTooltip.js index a29e5f869..57e7b94cd 100644 --- a/gui/slick/js/plotTooltip.js +++ b/gui/slick/js/plotTooltip.js @@ -1,6 +1,6 @@ $(function () { $('.plotInfo').each(function () { - match = $(this).attr("id").match(/^plot_info_(\d+)_(\d+)_(\d+)$/); + var match = $(this).attr("id").match(/^plot_info_(\d+)_(\d+)_(\d+)$/); $(this).qtip({ content: { text: 'Loading...', @@ -12,7 +12,7 @@ $(function () { episode: match[3], season: match[2] }, - success: function (data, status) { + success: function (data) { this.set('content.text', data); } } diff --git a/gui/slick/js/qualityChooser.js b/gui/slick/js/qualityChooser.js index 8cf90a5d3..7242113d7 100644 --- a/gui/slick/js/qualityChooser.js +++ b/gui/slick/js/qualityChooser.js @@ -8,7 +8,7 @@ $(document).ready(function() { } $('#anyQualities option').each(function(i) { - var result = preset & $(this).val(); + var result = preset & $(this).val(); // I have no clue what the & does here if (result > 0) { $(this).attr('selected', 'selected'); } else { @@ -17,7 +17,7 @@ $(document).ready(function() { }); $('#bestQualities option').each(function(i) { - var result = preset & ($(this).val() << 16); + var result = preset & ($(this).val() << 16); // I have no clue what the & does here if (result > 0) { $(this).attr('selected', 'selected'); } else { diff --git a/gui/slick/js/ratingTooltip.js b/gui/slick/js/ratingTooltip.js index 5c106db24..4d9352e96 100644 --- a/gui/slick/js/ratingTooltip.js +++ b/gui/slick/js/ratingTooltip.js @@ -1,7 +1,7 @@ $(function () { $('.imdbstars').qtip({ content: { - text: function(event, api) { + text: function() { // Retrieve content from custom attribute of the $('.selector') elements. return $(this).attr('qtip-content'); } diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js index 7e6fd4b7a..8fec86c0b 100644 --- a/gui/slick/js/restart.js +++ b/gui/slick/js/restart.js @@ -1,7 +1,7 @@ $(document).ready(function() { - window.console_debug = false; - window.console_prefix = 'Restart: '; - window.current_pid = ''; + window.console_debug = false; // jshint ignore:line + window.console_prefix = 'Restart: '; // jshint ignore:line + window.current_pid = ''; // jshint ignore:line var is_alive_url = srRoot + '/home/is_alive/'; diff --git a/gui/slick/js/rootDirs.js b/gui/slick/js/rootDirs.js index d9e0e52df..0d1d516cf 100644 --- a/gui/slick/js/rootDirs.js +++ b/gui/slick/js/rootDirs.js @@ -22,41 +22,43 @@ }()); $(document).ready(function() { - function addRootDir(path) { - - if (!path.length) + if (!path.length){ return; + } // check if it's the first one - var is_default = false; - if (!$('#whichDefaultRootDir').val().length) - is_default = true; + var isDefault = false; + if (!$('#whichDefaultRootDir').val().length){ + isDefault = true; + } $('#rootDirs').append('<option value="'+path+'">'+path+'</option>'); syncOptionIDs(); - if (is_default) + if (isDefault) { setDefault($('#rootDirs option').attr('id')); + } refreshRootDirs(); $.get(srRoot+'/config/general/saveRootDirs', { rootDirString: $('#rootDirText').val() }); } function editRootDir(path) { - - if (!path.length) + if (!path.length){ return; + } // as long as something is selected if ($("#rootDirs option:selected").length) { // update the selected one with the provided path - if ($("#rootDirs option:selected").attr('id') == $("#whichDefaultRootDir").val()) + if ($("#rootDirs option:selected").attr('id') === $("#whichDefaultRootDir").val()) { $("#rootDirs option:selected").text('*'+path); - else + } else { $("#rootDirs option:selected").text(path); + } $("#rootDirs option:selected").val(path); } @@ -72,8 +74,8 @@ $(document).ready(function() { var toDelete = $("#rootDirs option:selected"); - var newDefault = (toDelete.attr('id') == $("#whichDefaultRootDir").val()); - var deleted_num = $("#rootDirs option:selected").attr('id').substr(3); + var newDefault = (toDelete.attr('id') === $("#whichDefaultRootDir").val()); + var deletedNum = $("#rootDirs option:selected").attr('id').substr(3); toDelete.remove(); syncOptionIDs(); @@ -86,12 +88,15 @@ $(document).ready(function() { $("#whichDefaultRootDir").val(''); // if we're deleting the default and there are options left then pick a new default - if ($("#rootDirs option").length) + if ($("#rootDirs option").length) { setDefault($('#rootDirs option').attr('id')); + } } else if ($("#whichDefaultRootDir").val().length) { - var old_default_num = $("#whichDefaultRootDir").val().substr(3); - if (old_default_num > deleted_num) $("#whichDefaultRootDir").val('rd-'+(old_default_num-1)); + var oldDefaultNum = $("#whichDefaultRootDir").val().substr(3); + if (oldDefaultNum > deletedNum) { + $("#whichDefaultRootDir").val('rd-'+(oldDefaultNum-1)); + } } } @@ -100,8 +105,9 @@ $(document).ready(function() { }); $('#defaultRootDir').click(function(){ - if ($("#rootDirs option:selected").length) + if ($("#rootDirs option:selected").length) { setDefault($("#rootDirs option:selected").attr('id')); + } refreshRootDirs(); $.get(srRoot+'/config/general/saveRootDirs', {rootDirString: $('#rootDirText').val()}); }); @@ -109,17 +115,17 @@ $(document).ready(function() { function setDefault(which, force){ console.log('setting default to '+which); - if (which !== undefined && !which.length) return; + if (which !== undefined && !which.length) { return; } - if ($('#whichDefaultRootDir').val() == which && force !== true) return; + if ($('#whichDefaultRootDir').val() === which && force !== true) { return; } // put an asterisk on the text - if ($('#'+which).text().charAt(0) != '*') $('#'+which).text('*'+$('#'+which).text()); + if ($('#'+which).text().charAt(0) !== '*') { $('#'+which).text('*'+$('#'+which).text()); } // if there's an existing one then take the asterisk off if ($('#whichDefaultRootDir').val() && force !== true) { - var old_default = $('#'+$('#whichDefaultRootDir').val()); - old_default.text(old_default.text().substring(1)); + var oldDefault = $('#'+$('#whichDefaultRootDir').val()); + oldDefault.text(oldDefault.text().substring(1)); } $('#whichDefaultRootDir').val(which); @@ -135,39 +141,43 @@ $(document).ready(function() { function refreshRootDirs() { - if (!$("#rootDirs").length) return; + if (!$("#rootDirs").length) { return; } - var do_disable = 'true'; + var doDisable = 'true'; // re-sync option ids syncOptionIDs(); // if nothing's selected then select the default - if (!$("#rootDirs option:selected").length && $('#whichDefaultRootDir').val().length) $('#'+$('#whichDefaultRootDir').val()).prop("selected", true); + if (!$("#rootDirs option:selected").length && $('#whichDefaultRootDir').val().length) { + $('#'+$('#whichDefaultRootDir').val()).prop("selected", true); + } // if something's selected then we have some behavior to figure out if ($("#rootDirs option:selected").length) { - do_disable = ''; + doDisable = ''; } // update the elements - $('#deleteRootDir').prop('disabled', do_disable); - $('#defaultRootDir').prop('disabled', do_disable); - $('#editRootDir').prop('disabled', do_disable); + $('#deleteRootDir').prop('disabled', doDisable); + $('#defaultRootDir').prop('disabled', doDisable); + $('#editRootDir').prop('disabled', doDisable); - var log_str = ''; - var dir_text = ''; + var logString = ''; + var dirString = ''; if ($('#whichDefaultRootDir').val().length >= 4){ - dir_text = $('#whichDefaultRootDir').val().substr(3); + dirString = $('#whichDefaultRootDir').val().substr(3); } $('#rootDirs option').each(function() { - log_str += $(this).val()+'='+$(this).text()+'->'+$(this).attr('id')+'\n'; - if (dir_text.length) dir_text += '|' + $(this).val(); + logString += $(this).val()+'='+$(this).text()+'->'+$(this).attr('id')+'\n'; + if (dirString.length) { + dirString += '|' + $(this).val(); + } }); - log_str += 'def: '+ $('#whichDefaultRootDir').val(); - console.log(log_str); + logString += 'def: '+ $('#whichDefaultRootDir').val(); + console.log(logString); - $('#rootDirText').val(dir_text); + $('#rootDirText').val(dirString); $('#rootDirText').change(); console.log('rootDirText: '+$('#rootDirText').val()); } diff --git a/gui/slick/js/sceneExceptionsTooltip.js b/gui/slick/js/sceneExceptionsTooltip.js index 2be789935..face3cdd5 100644 --- a/gui/slick/js/sceneExceptionsTooltip.js +++ b/gui/slick/js/sceneExceptionsTooltip.js @@ -1,6 +1,6 @@ $(function () { $('.title a').each(function () { - match = $(this).parent().attr("id").match(/^scene_exception_(\d+)$/); + var match = $(this).parent().attr("id").match(/^scene_exception_(\d+)$/); $(this).qtip({ content: { text: 'Loading...', @@ -10,7 +10,7 @@ $(function () { data: { show: match[1] }, - success: function (data, status) { + success: function (data) { this.set('content.text', data); } } diff --git a/gui/slick/js/testRename.js b/gui/slick/js/testRename.js index b0972122a..6b7cb5e35 100644 --- a/gui/slick/js/testRename.js +++ b/gui/slick/js/testRename.js @@ -18,7 +18,7 @@ $(document).ready(function(){ $('.epCheck:visible').each(function(){ var epParts = $(this).attr('id').split('x'); - if (epParts[0] == seasNo) { + if (epParts[0] === seasNo) { this.checked = seasCheck.checked; } }); @@ -33,10 +33,9 @@ $(document).ready(function(){ } }); - if (epArr.length === 0) return false; + if (epArr.length === 0) { return false; } - url = srRoot+'/home/doRename?show='+$('#showID').attr('value')+'&eps='+epArr.join('|'); - window.location.href = url; + window.location.href = srRoot+'/home/doRename?show='+$('#showID').attr('value')+'&eps='+epArr.join('|'); }); }); diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako index 172fd34b3..e123aab59 100644 --- a/gui/slick/views/config_anime.mako +++ b/gui/slick/views/config_anime.mako @@ -5,7 +5,6 @@ %> <%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/configAnime.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> </%block> <%block name="content"> diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako index 6e239e521..b8963dbe5 100644 --- a/gui/slick/views/displayShow.mako +++ b/gui/slick/views/displayShow.mako @@ -14,7 +14,6 @@ %> <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/displayShow.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/sceneExceptionsTooltip.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/ratingTooltip.js?${sbPID}"></script> @@ -481,7 +480,7 @@ ## Lets do this exactly like ComingEpisodes and History ## Avoid issues with dateutil's _isdst on Windows but still provide air dates <% airDate = datetime.datetime.fromordinal(epResult['airdate']) %> - % if airDate.year >= 1970 or show.network: + % if airDate.year >= 1970 or show.network: <% airDate = sbdatetime.sbdatetime.convert_to_setting(network_timezones.parse_date_time(epResult['airdate'], show.airs, show.network)) %> % endif <time datetime="${airDate.isoformat('T')}" class="date">${sbdatetime.sbdatetime.sbfdatetime(airDate)}</time> -- GitLab From f5c9e75bd517662612c6a62de9b805499ae95bce Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 13:18:14 -0500 Subject: [PATCH 079/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/clients/download_station_client.py | 24 +++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/sickbeard/clients/download_station_client.py b/sickbeard/clients/download_station_client.py index 5db4dc2e6..9119dce2b 100644 --- a/sickbeard/clients/download_station_client.py +++ b/sickbeard/clients/download_station_client.py @@ -23,6 +23,7 @@ import sickbeard from sickbeard.clients.generic import GenericClient + class DownloadStationAPI(GenericClient): def __init__(self, host=None, username=None, password=None): @@ -46,11 +47,12 @@ class DownloadStationAPI(GenericClient): def _add_torrent_uri(self, result): data = { - 'api':'SYNO.DownloadStation.Task', - 'version':'1', 'method':'create', - 'session':'DownloadStation', - '_sid':self.auth, - 'uri':result.url + 'api': 'SYNO.DownloadStation.Task', + 'version': '1', + 'method': 'create', + 'session': 'DownloadStation', + '_sid': self.auth, + 'uri': result.url } if sickbeard.TORRENT_PATH: @@ -62,16 +64,16 @@ class DownloadStationAPI(GenericClient): def _add_torrent_file(self, result): data = { - 'api':'SYNO.DownloadStation.Task', - 'version':'1', - 'method':'create', - 'session':'DownloadStation', - '_sid':self.auth + 'api': 'SYNO.DownloadStation.Task', + 'version': '1', + 'method': 'create', + 'session': 'DownloadStation', + '_sid': self.auth } if sickbeard.TORRENT_PATH: data['destination'] = sickbeard.TORRENT_PATH - files = {'file':(result.name + '.torrent', result.content)} + files = {'file': (result.name + '.torrent', result.content)} self._request(method='post', data=data, files=files) return self.response.json()['success'] -- GitLab From e09c239a7d183390d527301e304645686ce54a07 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 13:19:00 -0500 Subject: [PATCH 080/215] PEP 263: Add encoding declaration --- sickbeard/clients/download_station_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/download_station_client.py b/sickbeard/clients/download_station_client.py index 9119dce2b..621e517d8 100644 --- a/sickbeard/clients/download_station_client.py +++ b/sickbeard/clients/download_station_client.py @@ -1,3 +1,4 @@ +# coding=utf-8 # Authors: # Pedro Jose Pereira Vieito <pvieito@gmail.com> (Twitter: @pvieito) # -- GitLab From 627d09601b9173090f23921f9c3c920b8acc563f Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 13:30:03 -0500 Subject: [PATCH 081/215] PEP 8: Add blank lines for consistency --- sickbeard/clients/generic.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/generic.py b/sickbeard/clients/generic.py index 4603d3ba2..e24b71b39 100644 --- a/sickbeard/clients/generic.py +++ b/sickbeard/clients/generic.py @@ -10,6 +10,7 @@ from bencode import bencode, bdecode import requests from bencode.BTL import BTFailure + class GenericClient(object): def __init__(self, name, host=None, username=None, password=None): -- GitLab From 214b2749b2e4db9b13be78249a209f72f8729c02 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 13:28:52 -0500 Subject: [PATCH 082/215] PEP 263: Add encoding declaration --- sickbeard/clients/generic.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/clients/generic.py b/sickbeard/clients/generic.py index e24b71b39..830192b8e 100644 --- a/sickbeard/clients/generic.py +++ b/sickbeard/clients/generic.py @@ -1,3 +1,5 @@ +# coding=utf-8 + import re import time from hashlib import sha1 -- GitLab From 5074c1b9124b20be2ed8687f01806e1c11330ef7 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 13:36:13 -0500 Subject: [PATCH 083/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/clients/mlnet_client.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sickbeard/clients/mlnet_client.py b/sickbeard/clients/mlnet_client.py index 4db6d0115..ee52d3f0b 100644 --- a/sickbeard/clients/mlnet_client.py +++ b/sickbeard/clients/mlnet_client.py @@ -18,13 +18,14 @@ from sickbeard.clients.generic import GenericClient + class mlnetAPI(GenericClient): def __init__(self, host=None, username=None, password=None): super(mlnetAPI, self).__init__('mlnet', host, username, password) self.url = self.host - #self.session.auth = HTTPDigestAuth(self.username, self.password); + # self.session.auth = HTTPDigestAuth(self.username, self.password); def _get_auth(self): @@ -38,13 +39,13 @@ class mlnetAPI(GenericClient): def _add_torrent_uri(self, result): - self.url = self.host+'submit' + self.url = self.host + 'submit' params = {'q': 'dllink ' + result.url} return self._request(method='get', params=params) def _add_torrent_file(self, result): - self.url = self.host+'submit' + self.url = self.host + 'submit' params = {'q': 'dllink ' + result.url} return self._request(method='get', params=params) -- GitLab From 7a556fbcc852d8ec1f5882765d1f26001d9f5451 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 13:34:57 -0500 Subject: [PATCH 084/215] PEP 263: Add encoding declaration --- sickbeard/clients/mlnet_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/clients/mlnet_client.py b/sickbeard/clients/mlnet_client.py index ee52d3f0b..abd4634a0 100644 --- a/sickbeard/clients/mlnet_client.py +++ b/sickbeard/clients/mlnet_client.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: kounch # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 023c21cc5d620e67cab46cb631077a8089afadd1 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:17:05 -0500 Subject: [PATCH 085/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/clients/qbittorrent_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/clients/qbittorrent_client.py b/sickbeard/clients/qbittorrent_client.py index c78b6b6b0..55d2dea33 100644 --- a/sickbeard/clients/qbittorrent_client.py +++ b/sickbeard/clients/qbittorrent_client.py @@ -20,6 +20,7 @@ import sickbeard from sickbeard.clients.generic import GenericClient from requests.auth import HTTPDigestAuth + class qbittorrentAPI(GenericClient): def __init__(self, host=None, username=None, password=None): -- GitLab From 6fdc5359b67f17d8efaa61bbd5b2f4b85c9e34e3 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:17:30 -0500 Subject: [PATCH 086/215] PEP 263: Add encoding declaration --- sickbeard/clients/qbittorrent_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/clients/qbittorrent_client.py b/sickbeard/clients/qbittorrent_client.py index 55d2dea33..962fd22ac 100644 --- a/sickbeard/clients/qbittorrent_client.py +++ b/sickbeard/clients/qbittorrent_client.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Mr_Orange <mr_orange@hotmail.it> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 92fa0bedfac753d1480c1bc917cafd00f1a39015 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 12:57:18 -0800 Subject: [PATCH 087/215] Fix starting as a daemon when running in unicode mode =P --- SickBeard.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index ef0c9b552..5bd7d2261 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -443,9 +443,10 @@ class SickRage(object): stdin = file(devnull, 'r') stdout = file(devnull, 'a+') stderr = file(devnull, 'a+') - os.dup2(stdin.fileno(), sys.stdin.fileno()) - os.dup2(stdout.fileno(), sys.stdout.fileno()) - os.dup2(stderr.fileno(), sys.stderr.fileno()) + + os.dup2(stdin.fileno(), getattr(sys.stdin, 'device', sys.stdin).fileno()) + os.dup2(stdout.fileno(), getattr(sys.stdout, 'device', sys.stdout).fileno()) + os.dup2(stderr.fileno(), getattr(sys.stderr, 'device', sys.stderr).fileno()) @staticmethod def remove_pid_file(PIDFILE): -- GitLab From 16f3118e8338651d1d730d42ff4c052af7a1ecf2 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 13:07:12 -0800 Subject: [PATCH 088/215] Clean up old tornado location before it is imported Remove old client pyc removal code --- SickBeard.py | 36 +++++------------------------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index 5bd7d2261..f15dc8d19 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -57,13 +57,17 @@ import datetime import threading import getopt +# Do this before importing sickbeard, to prevent locked files and incorrect import +oldtornado = os.path.abspath(os.path.join(os.path.dirname(__file__), 'tornado')) +shutil.move(oldtornado, oldtornado + '_kill') +shutil.rmtree(oldtornado + '_kill') + import sickbeard from sickbeard import db, logger, network_timezones, failed_history, name_cache from sickbeard.tv import TVShow from sickbeard.webserveInit import SRWebServer from sickbeard.event_queue import Events from configobj import ConfigObj -from sickrage.helper.encoding import ek # http://bugs.python.org/issue7980#msg221094 throwaway = datetime.datetime.strptime('20110101', '%Y%m%d') @@ -128,33 +132,6 @@ class SickRage(object): return help_msg - @staticmethod - def fix_clients_nonsense(): - filenames = [ - "sickbeard/clients/download_station.py", - "sickbeard/clients/utorrent.py", - "sickbeard/clients/qbittorrent.py", - "sickbeard/clients/transmission.py", - "sickbeard/clients/deluge.py", - "sickbeard/clients/deluged.py", - "sickbeard/clients/rtorrent.py" - ] - - for filename in filenames: - filename = ek(os.path.join, sickbeard.PROG_DIR, filename) - - try: - if ek(os.path.exists, filename): - ek(os.remove, filename) - except Exception: - pass - - try: - if ek(os.path.exists, filename + "c"): - ek(os.remove, filename + "c") - except Exception: - pass - # pylint: disable=R0912,R0915 # Too many branches # Too many statements @@ -306,9 +283,6 @@ class SickRage(object): # Get PID sickbeard.PID = os.getpid() - # Fix clients old files - self.fix_clients_nonsense() - # Build from the DB to start with self.loadShowsFromDB() -- GitLab From c5d49a07a52b92ceec235c1fb68ffb05d9f2838f Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:47:26 -0500 Subject: [PATCH 089/215] PEP 263: Add encoding declaration --- sickbeard/databases/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sickbeard/databases/__init__.py b/sickbeard/databases/__init__.py index 96925d164..2e67a9dd6 100644 --- a/sickbeard/databases/__init__.py +++ b/sickbeard/databases/__init__.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # @@ -16,4 +18,4 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -__all__ = ["mainDB", "cache", "failed"] \ No newline at end of file +__all__ = ["mainDB", "cache", "failed"] -- GitLab From cd91907db971520be5fef6ad6733485274508483 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:49:33 -0500 Subject: [PATCH 090/215] PEP 8: Add and remove blank lines for consistency --- sickbeard/databases/cache_db.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sickbeard/databases/cache_db.py b/sickbeard/databases/cache_db.py index 9734be453..98b9dd7b2 100644 --- a/sickbeard/databases/cache_db.py +++ b/sickbeard/databases/cache_db.py @@ -18,6 +18,7 @@ from sickbeard import db + # Add new migrations at the bottom of the list; subclass the previous migration. class InitialSchema(db.SchemaUpgrade): def test(self): @@ -49,6 +50,7 @@ class AddSceneExceptions(InitialSchema): self.connection.action( "CREATE TABLE scene_exceptions (exception_id INTEGER PRIMARY KEY, indexer_id INTEGER KEY, show_name TEXT);") + class AddSceneNameCache(AddSceneExceptions): def test(self): return self.hasTable("scene_names") @@ -64,6 +66,7 @@ class AddNetworkTimezones(AddSceneNameCache): def execute(self): self.connection.action("CREATE TABLE network_timezones (network_name TEXT PRIMARY KEY, timezone TEXT);") + class AddLastSearch(AddNetworkTimezones): def test(self): return self.hasTable("lastSearch") @@ -71,6 +74,7 @@ class AddLastSearch(AddNetworkTimezones): def execute(self): self.connection.action("CREATE TABLE lastSearch (provider TEXT, time NUMERIC);") + class AddSceneExceptionsSeasons(AddLastSearch): def test(self): return self.hasColumn("scene_exceptions", "season") @@ -78,6 +82,7 @@ class AddSceneExceptionsSeasons(AddLastSearch): def execute(self): self.addColumn("scene_exceptions", "season", "NUMERIC", -1) + class AddSceneExceptionsCustom(AddSceneExceptionsSeasons): def test(self): return self.hasColumn("scene_exceptions", "custom") @@ -85,6 +90,7 @@ class AddSceneExceptionsCustom(AddSceneExceptionsSeasons): def execute(self): self.addColumn("scene_exceptions", "custom", "NUMERIC", 0) + class AddSceneExceptionsRefresh(AddSceneExceptionsCustom): def test(self): return self.hasTable("scene_exceptions_refresh") -- GitLab From 49af8d2c3edfcc79d7783f41ff291c0e00d8c674 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:50:01 -0500 Subject: [PATCH 091/215] PEP 263: Add encoding declaration --- sickbeard/databases/cache_db.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/databases/cache_db.py b/sickbeard/databases/cache_db.py index 98b9dd7b2..316955a57 100644 --- a/sickbeard/databases/cache_db.py +++ b/sickbeard/databases/cache_db.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From d731c42b196fee9d66c3db30187ea9f5c2898f93 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:50:44 -0500 Subject: [PATCH 092/215] PEP 263: Add encoding declaration --- sickbeard/databases/failed_db.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/databases/failed_db.py b/sickbeard/databases/failed_db.py index 9d880bf3a..6a91a8af1 100644 --- a/sickbeard/databases/failed_db.py +++ b/sickbeard/databases/failed_db.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Tyler Fenby <tylerfenby@gmail.com> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 48c5c76ab56bcd2a590d6a2f51ca07920662dbd7 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 16:06:59 -0500 Subject: [PATCH 093/215] PEP 8: Convert None comparisons from operators to 'is / is not None' --- sickbeard/databases/mainDB.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 7641677cc..5ba177517 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -427,7 +427,7 @@ class AddSizeAndSceneNameFields(InitialSchema): except (InvalidNameException, InvalidShowException): continue - if parse_result.series_name and parse_result.season_number != None and parse_result.episode_numbers and parse_result.release_group: + if parse_result.series_name and parse_result.season_number is not None and parse_result.episode_numbers and parse_result.release_group: # if all is well by this point we'll just put the release name into the database self.connection.action("UPDATE tv_episodes SET release_name = ? WHERE episode_id = ?", [cur_name, ep_results[0]["episode_id"]]) -- GitLab From 8e1a17caebb54d255e2822ac3d4076b42415d11c Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 16:15:38 -0500 Subject: [PATCH 094/215] PEP 8: Convert membership test from 'not x in y' to 'x not in y' --- sickbeard/databases/mainDB.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 5ba177517..c351e07c8 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -279,7 +279,7 @@ class MainSanityCheck(db.DBSanityCheck): (sqlResult['episode_id'], sqlResult['subtitles']), logger.DEBUG) for subcode in sqlResult['subtitles'].split(','): - if not len(subcode) is 3 or not subcode in validLanguages: + if not len(subcode) is 3 or subcode not in validLanguages: logger.log(u"Fixing subtitle codes for episode_id: %s, invalid code: %s" % (sqlResult['episode_id'], subcode), logger.DEBUG) continue -- GitLab From e1d2e95ac09373e5e68ab10cf9c2830fd8e6d338 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:58:41 -0500 Subject: [PATCH 095/215] PEP 203: Replace assignment with augmented assignment --- sickbeard/databases/mainDB.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index c351e07c8..d3edd854d 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -518,16 +518,16 @@ class Add1080pAndRawHDQualities(RenameSeasonFolders): result = old_quality # move fullhdbluray from 1<<5 to 1<<8 if set if (result & (1 << 5)): - result = result & ~(1 << 5) - result = result | (1 << 8) + result &= ~(1 << 5) + result |= 1 << 8 # move hdbluray from 1<<4 to 1<<7 if set if (result & (1 << 4)): - result = result & ~(1 << 4) - result = result | (1 << 7) + result &= ~(1 << 4) + result |= 1 << 7 # move hdwebdl from 1<<3 to 1<<5 if set if (result & (1 << 3)): - result = result & ~(1 << 3) - result = result | (1 << 5) + result &= ~(1 << 3) + result |= 1 << 5 return result -- GitLab From 85894908e13df8c29f5fc9edda49db973f209a81 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 16:02:54 -0500 Subject: [PATCH 096/215] PEP 203: Replace list creation with list literal --- sickbeard/databases/mainDB.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index d3edd854d..c9628a052 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -994,9 +994,11 @@ class AddAnimeBlacklistWhitelist(AddSceneAbsoluteNumbering): def execute(self): backupDatabase(35) - cl = [] - cl.append(["CREATE TABLE blacklist (show_id INTEGER, range TEXT, keyword TEXT)"]) - cl.append(["CREATE TABLE whitelist (show_id INTEGER, range TEXT, keyword TEXT)"]) + cl = [ + ["CREATE TABLE blacklist (show_id INTEGER, range TEXT, keyword TEXT)"], + ["CREATE TABLE whitelist (show_id INTEGER, range TEXT, keyword TEXT)"] + ] + self.connection.mass_action(cl) self.incDBVersion() -- GitLab From de1cae3029cb81c3b5bb34ba6c88425454d77704 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 16:11:16 -0500 Subject: [PATCH 097/215] PEP 8: Fix indentation and add/remove blank lines for consistency --- sickbeard/databases/mainDB.py | 68 ++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index c9628a052..468d3d4ed 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -48,12 +48,11 @@ class MainSanityCheck(db.DBSanityCheck): self.convert_tvrage_to_tvdb() self.convert_archived_to_compund() - def convert_archived_to_compund(self): logger.log(u'Checking for archived episodes not qualified', logger.DEBUG) query = "SELECT episode_id, showid, status, location, season, episode " + \ - "FROM tv_episodes WHERE status = %s" % common.ARCHIVED + "FROM tv_episodes WHERE status = %s" % common.ARCHIVED sqlResults = self.connection.select(query) if sqlResults: @@ -67,9 +66,9 @@ class MainSanityCheck(db.DBSanityCheck): fixedStatus = common.Quality.compositeStatus(common.ARCHIVED, quality) logger.log(u'Changing status from %s to %s for %s: S%02dE%02d at %s (File %s)' % - (common.statusStrings[common.ARCHIVED], common.statusStrings[fixedStatus], - archivedEp['showid'], archivedEp['season'], archivedEp['episode'], - archivedEp['location'] if archivedEp['location'] else 'unknown location', ('NOT FOUND', 'EXISTS')[bool(existing)])) + (common.statusStrings[common.ARCHIVED], common.statusStrings[fixedStatus], + archivedEp['showid'], archivedEp['season'], archivedEp['episode'], + archivedEp['location'] if archivedEp['location'] else 'unknown location', ('NOT FOUND', 'EXISTS')[bool(existing)])) self.connection.action("UPDATE tv_episodes SET status = %i WHERE episode_id = %i" % (fixedStatus, archivedEp['episode_id'])) @@ -86,11 +85,11 @@ class MainSanityCheck(db.DBSanityCheck): for tvrage_show in sqlResults: logger.log(u"Processing %s at %s" % (tvrage_show['show_name'], tvrage_show['location'])) mapping = self.connection.select("SELECT mindexer_id FROM indexer_mapping WHERE indexer_id=%i AND indexer=%i AND mindexer=%i" % - (tvrage_show['indexer_id'], INDEXER_TVRAGE, INDEXER_TVDB)) + (tvrage_show['indexer_id'], INDEXER_TVRAGE, INDEXER_TVDB)) if len(mapping) != 1: logger.log(u"Error mapping show from tvrage to tvdb for %s (%s), found %i mapping results. Cannot convert automatically!" % - (tvrage_show['show_name'], tvrage_show['location'], len(mapping)), logger.WARNING) + (tvrage_show['show_name'], tvrage_show['location'], len(mapping)), logger.WARNING) logger.log(u"Removing the TVRage show and it's episodes from the DB, use 'addExistingShow'", logger.WARNING) self.connection.action("DELETE FROM tv_shows WHERE indexer_id = %i AND indexer = %i" % (tvrage_show['indexer_id'], INDEXER_TVRAGE)) self.connection.action("DELETE FROM tv_episodes WHERE showid = %i" % tvrage_show['indexer_id']) @@ -100,33 +99,32 @@ class MainSanityCheck(db.DBSanityCheck): duplicate = self.connection.select("SELECT * FROM tv_shows WHERE indexer_id = %i AND indexer = %i" % (mapping[0]['mindexer_id'], INDEXER_TVDB)) if duplicate: logger.log(u'Found %s which has the same id as %s, cannot convert automatically so I am pausing %s' % - (duplicate[0]['show_name'], tvrage_show['show_name'], duplicate[0]['show_name']), logger.WARNING) + (duplicate[0]['show_name'], tvrage_show['show_name'], duplicate[0]['show_name']), logger.WARNING) self.connection.action("UPDATE tv_shows SET paused=1 WHERE indexer=%i AND indexer_id=%i" % - (INDEXER_TVDB, duplicate[0]['indexer_id'])) + (INDEXER_TVDB, duplicate[0]['indexer_id'])) logger.log(u"Removing %s and it's episodes from the DB" % tvrage_show['show_name'], logger.WARNING) self.connection.action("DELETE FROM tv_shows WHERE indexer_id = %i AND indexer = %i" % (tvrage_show['indexer_id'], INDEXER_TVRAGE)) self.connection.action("DELETE FROM tv_episodes WHERE showid = %i" % tvrage_show['indexer_id']) logger.log(u'Manually move the season folders from %s into %s, and delete %s before rescanning %s and unpausing it' % - (tvrage_show['location'], duplicate[0]['location'], tvrage_show['location'], duplicate[0]['show_name']), logger.WARNING) + (tvrage_show['location'], duplicate[0]['location'], tvrage_show['location'], duplicate[0]['show_name']), logger.WARNING) continue logger.log(u'Mapping %s to tvdb id %i' % (tvrage_show['show_name'], mapping[0]['mindexer_id'])) self.connection.action( "UPDATE tv_shows SET indexer=%i, indexer_id=%i WHERE indexer_id=%i" % - (INDEXER_TVDB, mapping[0]['mindexer_id'], tvrage_show['indexer_id']) - ) + (INDEXER_TVDB, mapping[0]['mindexer_id'], tvrage_show['indexer_id']) + ) logger.log(u'Relinking episodes to show') self.connection.action( "UPDATE tv_episodes SET indexer=%i, showid=%i, indexerid=0 WHERE showid=%i" % - (INDEXER_TVDB, mapping[0]['mindexer_id'], tvrage_show['indexer_id']) - ) + (INDEXER_TVDB, mapping[0]['mindexer_id'], tvrage_show['indexer_id']) + ) logger.log(u'Please perform a full update on %s' % tvrage_show['show_name'], logger.WARNING) - def fix_duplicate_shows(self, column='indexer_id'): sqlResults = self.connection.select( @@ -148,7 +146,6 @@ class MainSanityCheck(db.DBSanityCheck): cur_dupe_id["show_id"])) self.connection.action("DELETE FROM tv_shows WHERE show_id = ?", [cur_dupe_id["show_id"]]) - def fix_duplicate_episodes(self): sqlResults = self.connection.select( @@ -265,7 +262,8 @@ class MainSanityCheck(db.DBSanityCheck): sqlResults = self.connection.select( "SELECT subtitles, episode_id FROM tv_episodes WHERE subtitles != '' AND subtitles_lastsearch < ?;", - [datetime.datetime(2015, 7, 15, 17, 20, 44, 326380).strftime(dateTimeFormat)]) + [datetime.datetime(2015, 7, 15, 17, 20, 44, 326380).strftime(dateTimeFormat)] + ) validLanguages = [Language.fromopensubtitles(language).opensubtitles for language in language_converters['opensubtitles'].codes if len(language) == 3] @@ -276,18 +274,18 @@ class MainSanityCheck(db.DBSanityCheck): langs = [] logger.log(u"Checking subtitle codes for episode_id: %s, codes: %s" % - (sqlResult['episode_id'], sqlResult['subtitles']), logger.DEBUG) + (sqlResult['episode_id'], sqlResult['subtitles']), logger.DEBUG) for subcode in sqlResult['subtitles'].split(','): if not len(subcode) is 3 or subcode not in validLanguages: logger.log(u"Fixing subtitle codes for episode_id: %s, invalid code: %s" % - (sqlResult['episode_id'], subcode), logger.DEBUG) + (sqlResult['episode_id'], subcode), logger.DEBUG) continue langs.append(subcode) self.connection.action("UPDATE tv_episodes SET subtitles = ?, subtitles_lastsearch = ? WHERE episode_id = ?;", - [','.join(langs), datetime.datetime.now().strftime(dateTimeFormat), sqlResult['episode_id']]) + [','.join(langs), datetime.datetime.now().strftime(dateTimeFormat), sqlResult['episode_id']]) def fix_show_nfo_lang(self): self.connection.action("UPDATE tv_shows SET lang = '' WHERE lang = 0 or lang = '0'") @@ -300,6 +298,7 @@ def backupDatabase(version): else: logger.log(u"Proceeding with upgrade") + # ====================== # = Main DB Migrations = # ====================== @@ -338,18 +337,18 @@ class InitialSchema(db.SchemaUpgrade): cur_db_version = self.checkDBVersion() if cur_db_version < MIN_DB_VERSION: - logger.log_error_and_exit(u"Your database version (" + str( - cur_db_version) + ") is too old to migrate from what this version of SickRage supports (" + \ - str(MIN_DB_VERSION) + ").\n" + \ + logger.log_error_and_exit(u"Your database version (" + + str(cur_db_version) + ") is too old to migrate from what this version of SickRage supports (" + + str(MIN_DB_VERSION) + ").\n" + "Upgrade using a previous version (tag) build 496 to build 501 of SickRage first or remove database file to begin fresh." - ) + ) if cur_db_version > MAX_DB_VERSION: - logger.log_error_and_exit(u"Your database version (" + str( - cur_db_version) + ") has been incremented past what this version of SickRage supports (" + \ - str(MAX_DB_VERSION) + ").\n" + \ + logger.log_error_and_exit(u"Your database version (" + + str(cur_db_version) + ") has been incremented past what this version of SickRage supports (" + + str(MAX_DB_VERSION) + ").\n" + "If you have used other forks of SickRage, your database may be unusable due to their modifications." - ) + ) class AddSizeAndSceneNameFields(InitialSchema): @@ -559,7 +558,7 @@ class Add1080pAndRawHDQualities(RenameSeasonFolders): old_hd = common.Quality.combineQualities( [common.Quality.HDTV, common.Quality.HDWEBDL >> 2, common.Quality.HDBLURAY >> 3], []) new_hd = common.Quality.combineQualities([common.Quality.HDTV, common.Quality.HDWEBDL, common.Quality.HDBLURAY], - []) + []) # update ANY -- shift existing qualities and add new 1080p qualities, note that rawHD was not added to the ANY template old_any = common.Quality.combineQualities( @@ -949,6 +948,7 @@ class AddSceneNumberingToTvEpisodes(AddSportsOption): self.incDBVersion() + class AddAnimeTVShow(AddSceneNumberingToTvEpisodes): def test(self): return self.checkDBVersion() >= 32 @@ -961,6 +961,7 @@ class AddAnimeTVShow(AddSceneNumberingToTvEpisodes): self.incDBVersion() + class AddAbsoluteNumbering(AddAnimeTVShow): def test(self): return self.checkDBVersion() >= 33 @@ -973,6 +974,7 @@ class AddAbsoluteNumbering(AddAnimeTVShow): self.incDBVersion() + class AddSceneAbsoluteNumbering(AddAbsoluteNumbering): def test(self): return self.checkDBVersion() >= 34 @@ -986,6 +988,7 @@ class AddSceneAbsoluteNumbering(AddAbsoluteNumbering): self.incDBVersion() + class AddAnimeBlacklistWhitelist(AddSceneAbsoluteNumbering): def test(self): @@ -1003,6 +1006,7 @@ class AddAnimeBlacklistWhitelist(AddSceneAbsoluteNumbering): self.incDBVersion() + class AddSceneAbsoluteNumbering2(AddAnimeBlacklistWhitelist): def test(self): return self.checkDBVersion() >= 36 @@ -1015,6 +1019,7 @@ class AddSceneAbsoluteNumbering2(AddAnimeBlacklistWhitelist): self.incDBVersion() + class AddXemRefresh(AddSceneAbsoluteNumbering2): def test(self): return self.checkDBVersion() >= 37 @@ -1028,6 +1033,7 @@ class AddXemRefresh(AddSceneAbsoluteNumbering2): self.incDBVersion() + class AddSceneToTvShows(AddXemRefresh): def test(self): return self.checkDBVersion() >= 38 @@ -1040,6 +1046,7 @@ class AddSceneToTvShows(AddXemRefresh): self.incDBVersion() + class AddIndexerMapping(AddSceneToTvShows): def test(self): return self.checkDBVersion() >= 39 @@ -1056,6 +1063,7 @@ class AddIndexerMapping(AddSceneToTvShows): self.incDBVersion() + class AddVersionToTvEpisodes(AddIndexerMapping): def test(self): return self.checkDBVersion() >= 40 @@ -1070,6 +1078,7 @@ class AddVersionToTvEpisodes(AddIndexerMapping): self.incDBVersion() + class AddDefaultEpStatusToTvShows(AddVersionToTvEpisodes): def test(self): return self.checkDBVersion() >= 41 @@ -1082,6 +1091,7 @@ class AddDefaultEpStatusToTvShows(AddVersionToTvEpisodes): self.incDBVersion() + class AlterTVShowsFieldTypes(AddDefaultEpStatusToTvShows): def test(self): return self.checkDBVersion() >= 42 -- GitLab From d87efd92f436a27118c478d724490d328a699c5a Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:59:21 -0500 Subject: [PATCH 098/215] PEP 263: Add encoding declaration --- sickbeard/databases/mainDB.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 468d3d4ed..93183d006 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 3e0c7cc6426239ce9d99dde2e4a92aeaa0b3376d Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 16:07:50 -0500 Subject: [PATCH 099/215] Remove redundant parentheses --- sickbeard/databases/mainDB.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 93183d006..56b057109 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -518,15 +518,15 @@ class Add1080pAndRawHDQualities(RenameSeasonFolders): result = old_quality # move fullhdbluray from 1<<5 to 1<<8 if set - if (result & (1 << 5)): + if result & (1 << 5): result &= ~(1 << 5) result |= 1 << 8 # move hdbluray from 1<<4 to 1<<7 if set - if (result & (1 << 4)): + if result & (1 << 4): result &= ~(1 << 4) result |= 1 << 7 # move hdwebdl from 1<<3 to 1<<5 if set - if (result & (1 << 3)): + if result & (1 << 3): result &= ~(1 << 3) result |= 1 << 5 @@ -541,7 +541,7 @@ class Add1080pAndRawHDQualities(RenameSeasonFolders): """ best = (status & (0xffff << 16)) >> 16 - initial = status & (0xffff) + initial = status & 0xffff best = self._update_quality(best) initial = self._update_quality(initial) -- GitLab From 0bee3834db8fcd0ea307b018c5ca973ad399d29f Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 16:27:33 -0500 Subject: [PATCH 100/215] Add a todo for correcting spelling of compound --- sickbeard/databases/mainDB.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/databases/mainDB.py b/sickbeard/databases/mainDB.py index 56b057109..131406cef 100644 --- a/sickbeard/databases/mainDB.py +++ b/sickbeard/databases/mainDB.py @@ -50,6 +50,7 @@ class MainSanityCheck(db.DBSanityCheck): self.convert_tvrage_to_tvdb() self.convert_archived_to_compund() + # todo: fix spelling to compound def convert_archived_to_compund(self): logger.log(u'Checking for archived episodes not qualified', logger.DEBUG) -- GitLab From 5adbc70a91d8f8bd93627d86e47159006690894a Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:37:42 -0500 Subject: [PATCH 101/215] PEP 263: Add encoding declaration --- sickbeard/clients/utorrent_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/clients/utorrent_client.py b/sickbeard/clients/utorrent_client.py index 5bc010aed..68a8a7ec6 100644 --- a/sickbeard/clients/utorrent_client.py +++ b/sickbeard/clients/utorrent_client.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Authors: Mr_Orange <mr_orange@hotmail.it>, EchelonFour # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 4767c90a0b13ca2bbacc6f1c2e45f6998a8772a0 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:31:26 -0500 Subject: [PATCH 102/215] PEP 203: Replace assignment with augmented assignment --- sickbeard/clients/transmission_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/clients/transmission_client.py b/sickbeard/clients/transmission_client.py index 608eb479e..b236e93f6 100644 --- a/sickbeard/clients/transmission_client.py +++ b/sickbeard/clients/transmission_client.py @@ -30,7 +30,7 @@ class TransmissionAPI(GenericClient): super(TransmissionAPI, self).__init__('Transmission', host, username, password) if not self.host.endswith('/'): - self.host = self.host + '/' + self.host += '/' if self.rpcurl.startswith('/'): self.rpcurl = self.rpcurl[1:] -- GitLab From 3ac9dd8d3e7215fe51cf058f540fed9d73fbece8 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 15:28:21 -0500 Subject: [PATCH 103/215] PEP 263: Add encoding declaration --- sickbeard/clients/transmission_client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/clients/transmission_client.py b/sickbeard/clients/transmission_client.py index b236e93f6..c26a83912 100644 --- a/sickbeard/clients/transmission_client.py +++ b/sickbeard/clients/transmission_client.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Mr_Orange <mr_orange@hotmail.it> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 4b8bbde54a615d8cf99860b176f2baf177ebeef7 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 14:13:47 -0800 Subject: [PATCH 104/215] Should probably check if it exists first, doh --- SickBeard.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index f15dc8d19..e4d398f9e 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -59,8 +59,9 @@ import getopt # Do this before importing sickbeard, to prevent locked files and incorrect import oldtornado = os.path.abspath(os.path.join(os.path.dirname(__file__), 'tornado')) -shutil.move(oldtornado, oldtornado + '_kill') -shutil.rmtree(oldtornado + '_kill') +if os.path.isdir(oldtornado): + shutil.move(oldtornado, oldtornado + '_kill') + shutil.rmtree(oldtornado + '_kill') import sickbeard from sickbeard import db, logger, network_timezones, failed_history, name_cache -- GitLab From 7bdc8b598c25dd86b86164f1cc1dd9d25bbfa9fc Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 15:56:52 -0800 Subject: [PATCH 105/215] Add param to getURL "needBytes" for when we need bytes instead of unicode (rare) Fix sending torrents to clients Fix string representation of an episode object --- sickbeard/classes.py | 5 ++++- sickbeard/clients/generic.py | 2 +- sickbeard/helpers.py | 4 ++-- sickbeard/providers/generic.py | 4 ++-- sickbeard/search.py | 2 +- sickbeard/tv.py | 22 +++++++++++----------- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/sickbeard/classes.py b/sickbeard/classes.py index eb96a12da..534888efa 100644 --- a/sickbeard/classes.py +++ b/sickbeard/classes.py @@ -124,7 +124,10 @@ class SearchResult: for extra in self.extraInfo: myString += " " + extra + "\n" - myString += "Episode: " + str(self.episodes) + "\n" + myString += "Episodes:\n" + for ep in self.episodes: + myString += " " + str(ep) + "\n" + myString += "Quality: " + Quality.qualityStrings[self.quality] + "\n" myString += "Name: " + self.name + "\n" myString += "Size: " + str(self.size) + "\n" diff --git a/sickbeard/clients/generic.py b/sickbeard/clients/generic.py index 830192b8e..945554403 100644 --- a/sickbeard/clients/generic.py +++ b/sickbeard/clients/generic.py @@ -151,7 +151,7 @@ class GenericClient(object): torrent_bdecode = bdecode(result.content) except BTFailure: logger.log(u'Unable to bdecode torrent', logger.ERROR) - logger.log(u'Torrent bencoded data: {0}'.format(str(result.content)), logger.DEBUG) + logger.log(u'Torrent bencoded data: %r' % result.content, logger.DEBUG) raise try: info = torrent_bdecode["info"] diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index e29c7ecca..cd00ca565 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1582,7 +1582,7 @@ def _setUpSession(session, headers): return session -def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=None, json=False): +def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=None, json=False, needBytes=False): """ Returns a byte-string retrieved from the url provider. """ @@ -1635,7 +1635,7 @@ def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=N logger.log(traceback.format_exc(), logger.WARNING) return None - return resp.text if not json else resp.json() + return (resp.text, resp.content)[needBytes] if not json else resp.json() def download_file(url, filename, session=None, headers=None): diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index c3fb3f7d2..702fb0f11 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -126,14 +126,14 @@ class GenericProvider(object): return result - def getURL(self, url, post_data=None, params=None, timeout=30, json=False): + def getURL(self, url, post_data=None, params=None, timeout=30, json=False, needBytes=False): """ By default this is just a simple urlopen call but this method should be overridden for providers with special URL requirements (like cookies) """ return helpers.getURL(url, post_data=post_data, params=params, headers=self.headers, timeout=timeout, - session=self.session, json=json) + session=self.session, json=json, needBytes=needBytes) def _makeURL(self, result): diff --git a/sickbeard/search.py b/sickbeard/search.py index 8149563f2..ddd3b2f92 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -132,7 +132,7 @@ def snatchEpisode(result, endStatus=SNATCHED): dlResult = _downloadResult(result) else: if not result.content and not result.url.startswith('magnet'): - result.content = result.provider.getURL(result.url) + result.content = result.provider.getURL(result.url, needBytes=True) if result.content or result.url.startswith('magnet'): client = clients.getClientIstance(sickbeard.TORRENT_METHOD)() diff --git a/sickbeard/tv.py b/sickbeard/tv.py index d668f76d5..05e035b20 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -1815,17 +1815,17 @@ class TVEpisode(object): def __str__(self): - toReturn = "" - toReturn += "%s - S%02dE%02d - %s " % (self.show.name, self.season or 0, self.episode or 0, self.name) + "\n" - toReturn += "location: " + str(self.location) + "\n" - toReturn += "description: " + str(self.description) + "\n" - toReturn += "subtitles: " + str(",".join(self.subtitles)) + "\n" - toReturn += "subtitles_searchcount: " + str(self.subtitles_searchcount) + "\n" - toReturn += "subtitles_lastsearch: " + str(self.subtitles_lastsearch) + "\n" - toReturn += "airdate: " + str(self.airdate.toordinal()) + " (" + str(self.airdate) + ")\n" - toReturn += "hasnfo: " + str(self.hasnfo) + "\n" - toReturn += "hastbn: " + str(self.hastbn) + "\n" - toReturn += "status: " + str(self.status) + "\n" + toReturn = u"" + toReturn += u"%r - S%02rE%02r - %r\n" % (self.show.name, self.season, self.episode, self.name) + toReturn += u"location: %r\n" % self.location + toReturn += u"description: %r\n" % self.description + toReturn += u"subtitles: %r\n" % u",".join(self.subtitles) + toReturn += u"subtitles_searchcount: %r\n" % self.subtitles_searchcount + toReturn += u"subtitles_lastsearch: %r\n" % self.subtitles_lastsearch + toReturn += u"airdate: %r (%r)\n" % (self.airdate.toordinal(), self.airdate) + toReturn += u"hasnfo: %r\n" % self.hasnfo + toReturn += u"hastbn: %r\n" % self.hastbn + toReturn += u"status: %r\n" % self.status return toReturn def createMetaFiles(self): -- GitLab From 20393c4854cb8509efd77d14582ac1d72d251e1d Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 18:36:00 -0500 Subject: [PATCH 106/215] PEP 8: Move module level imports to top of file --- sickbeard/indexers/indexer_exceptions.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sickbeard/indexers/indexer_exceptions.py b/sickbeard/indexers/indexer_exceptions.py index 32a90ffda..d2a67bd09 100644 --- a/sickbeard/indexers/indexer_exceptions.py +++ b/sickbeard/indexers/indexer_exceptions.py @@ -1,5 +1,6 @@ #!/usr/bin/env python2.7 # encoding:utf-8 + # author:echel0n # project:indexer_api # repository:http://github.com/echel0n/Sick-Beard @@ -7,15 +8,13 @@ """Custom exceptions used or raised by indexer_api""" +from tvdb_api.tvdb_exceptions import (tvdb_exception, tvdb_error, tvdb_userabort, tvdb_shownotfound, tvdb_showincomplete, + tvdb_seasonnotfound, tvdb_episodenotfound, tvdb_attributenotfound) + __author__ = "echel0n" __version__ = "1.0" -from tvdb_api.tvdb_exceptions import \ - tvdb_exception, tvdb_attributenotfound, tvdb_episodenotfound, tvdb_error, \ - tvdb_seasonnotfound, tvdb_shownotfound, tvdb_showincomplete, tvdb_userabort - -indexerExcepts = ["indexer_exception", "indexer_error", "indexer_userabort", "indexer_shownotfound", - "indexer_showincomplete", +indexerExcepts = ["indexer_exception", "indexer_error", "indexer_userabort", "indexer_shownotfound", "indexer_showincomplete", "indexer_seasonnotfound", "indexer_episodenotfound", "indexer_attributenotfound"] tvdbExcepts = ["tvdb_exception", "tvdb_error", "tvdb_userabort", "tvdb_shownotfound", "tvdb_showincomplete", -- GitLab From 251493f400c458b31033ccd653dc326b6747b374 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 18:24:29 -0500 Subject: [PATCH 107/215] PEP 203: Replace dict creation with dict literal --- sickbeard/indexers/indexer_config.py | 64 +++++++++++++--------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/sickbeard/indexers/indexer_config.py b/sickbeard/indexers/indexer_config.py index 6040d2325..b9b214568 100644 --- a/sickbeard/indexers/indexer_config.py +++ b/sickbeard/indexers/indexer_config.py @@ -1,41 +1,37 @@ from tvdb_api.tvdb_api import Tvdb import requests -INDEXER_TVDB = 1 - -# Must keep -INDEXER_TVRAGE = 2 - -initConfig = {} -indexerConfig = {} - -initConfig['valid_languages'] = [ - "da", "fi", "nl", "de", "it", "es", "fr", "pl", "hu", "el", "tr", - "ru", "he", "ja", "pt", "zh", "cs", "sl", "hr", "ko", "en", "sv", "no" -] - -initConfig['langabbv_to_id'] = { - 'el': 20, 'en': 7, 'zh': 27, - 'it': 15, 'cs': 28, 'es': 16, 'ru': 22, 'nl': 13, 'pt': 26, 'no': 9, - 'tr': 21, 'pl': 18, 'fr': 17, 'hr': 31, 'de': 14, 'da': 10, 'fi': 11, - 'hu': 19, 'ja': 25, 'he': 24, 'ko': 32, 'sv': 8, 'sl': 30 +initConfig = { + 'valid_languages': ["da", "fi", "nl", "de", "it", "es", "fr", "pl", "hu", "el", "tr", + "ru", "he", "ja", "pt", "zh", "cs", "sl", "hr", "ko", "en", "sv", "no" + ], + 'langabbv_to_id': {'el': 20, 'en': 7, 'zh': 27, + 'it': 15, 'cs': 28, 'es': 16, 'ru': 22, 'nl': 13, 'pt': 26, 'no': 9, + 'tr': 21, 'pl': 18, 'fr': 17, 'hr': 31, 'de': 14, 'da': 10, 'fi': 11, + 'hu': 19, 'ja': 25, 'he': 24, 'ko': 32, 'sv': 8, 'sl': 30 + } } -indexerConfig[INDEXER_TVDB] = { - 'id': INDEXER_TVDB, - 'name': 'theTVDB', - 'module': Tvdb, - 'api_params': {'apikey': 'F9C450E78D99172E', - 'language': 'en', - 'useZip': True, - }, - 'session': requests.Session() +INDEXER_TVDB = 1 +INDEXER_TVRAGE = 2 # Must keep + +indexerConfig = { + INDEXER_TVDB: { + 'id': INDEXER_TVDB, + 'name': 'theTVDB', + 'module': Tvdb, + 'api_params': {'apikey': 'F9C450E78D99172E', + 'language': 'en', + 'useZip': True, + }, + 'session': requests.Session(), + 'trakt_id': 'tvdb_id', + 'xem_origin': 'tvdb', + 'icon': 'thetvdb16.png', + 'scene_loc': 'http://sickragetv.github.io/sb_tvdb_scene_exceptions/exceptions.txt', + 'show_url': 'http://thetvdb.com/?tab=series&id=', + 'base_url': 'http://thetvdb.com/api/%(apikey)s/series/' + } } -# TVDB Indexer Settings -indexerConfig[INDEXER_TVDB]['trakt_id'] = 'tvdb_id' -indexerConfig[INDEXER_TVDB]['xem_origin'] = 'tvdb' -indexerConfig[INDEXER_TVDB]['icon'] = 'thetvdb16.png' -indexerConfig[INDEXER_TVDB]['scene_loc'] = 'http://sickragetv.github.io/sb_tvdb_scene_exceptions/exceptions.txt' -indexerConfig[INDEXER_TVDB]['show_url'] = 'http://thetvdb.com/?tab=series&id=' -indexerConfig[INDEXER_TVDB]['base_url'] = 'http://thetvdb.com/api/%(apikey)s/series/' % indexerConfig[INDEXER_TVDB]['api_params'] +indexerConfig[INDEXER_TVDB]['base_url'] %= indexerConfig[INDEXER_TVDB]['api_params'] # insert API key into base url -- GitLab From 7f6c15149165b271406b51078287563822238e3a Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 17:40:17 -0500 Subject: [PATCH 108/215] PEP 263: Add encoding declaration --- sickbeard/indexers/indexer_config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/indexers/indexer_config.py b/sickbeard/indexers/indexer_config.py index b9b214568..a76c09a25 100644 --- a/sickbeard/indexers/indexer_config.py +++ b/sickbeard/indexers/indexer_config.py @@ -1,3 +1,5 @@ +# coding=utf-8 + from tvdb_api.tvdb_api import Tvdb import requests -- GitLab From b4f95783d4434d2ea21519e42af624964ff33259 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 17:39:20 -0500 Subject: [PATCH 109/215] PEP 263: Add encoding declaration --- sickbeard/indexers/indexer_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/indexers/indexer_api.py b/sickbeard/indexers/indexer_api.py index da79422da..bf9f09ab6 100644 --- a/sickbeard/indexers/indexer_api.py +++ b/sickbeard/indexers/indexer_api.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 9468cf991027e667a4470b29d700db3c1131d8aa Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 17:37:57 -0500 Subject: [PATCH 110/215] PEP 263: Add encoding declaration --- sickbeard/indexers/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sickbeard/indexers/__init__.py b/sickbeard/indexers/__init__.py index b7e23c773..bdbdcca31 100644 --- a/sickbeard/indexers/__init__.py +++ b/sickbeard/indexers/__init__.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # @@ -16,4 +18,4 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -from . import indexer_api, indexer_exceptions \ No newline at end of file +from . import indexer_api, indexer_exceptions -- GitLab From 23f1c9d11600306c04e843ea49136ffeef272357 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 12:51:30 +1030 Subject: [PATCH 111/215] fix typo --- gui/slick/views/config_postProcessing.mako | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index 4855c8650..f5e3491ec 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -47,7 +47,7 @@ </label> <label class="nocheck" for="process_automatically"> <span class="component-title"> </span> - <span class="component-desc"><b>NOTE:</b> Do not use if you use an external PostProcesing script</span> + <span class="component-desc"><b>NOTE:</b> Do not use if you use an external PostProcessing script</span> </label> </div> <div class="field-pair"> @@ -280,7 +280,7 @@ </label> <label class="nocheck"> <span class="component-title"> </span> - <span class="component-desc"><b>NOTE:</b> Don't forget to add quality pattern. Otherwise after post-procesing the episode will have UNKNOWN quality</span> + <span class="component-desc"><b>NOTE:</b> Don't forget to add quality pattern. Otherwise after post-processing the episode will have UNKNOWN quality</span> </label> </div> -- GitLab From 7f4ee8f713c8e1e09965bebbd953cd27f3156b34 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 13:15:04 +1030 Subject: [PATCH 112/215] fix indentation --- gui/slick/views/config_postProcessing.mako | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index f5e3491ec..089b6960d 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -23,10 +23,8 @@ <h1 class="title">${title}</h1> % endif <div id="config"> -<div id="config-content"> - -<form id="configForm" action="savePostProcessing" method="post"> - + <div id="config-content"> + <form id="configForm" action="savePostProcessing" method="post"> <div id="config-components"> <ul> <li><a href="#core-component-group1">Post-Processing</a></li> @@ -247,7 +245,6 @@ </div> <fieldset class="component-group-list"> - <div class="field-pair"> <label class="nocheck" for="name_presets"> <span class="component-title">Name Pattern:</span> @@ -1121,10 +1118,8 @@ <br/> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> - </form> </div> </div> - <div class="clearfix"></div> </%block> -- GitLab From 194b04677edb4609d32204852540f8833779b67c Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 13:18:05 +1030 Subject: [PATCH 113/215] update old br tags to HTML5 standards --- gui/slick/js/ajaxNotifications.js | 2 +- gui/slick/js/configSearch.js | 2 +- gui/slick/js/confirmations.js | 4 +- gui/slick/js/lib/pnotify.custom.min.js | Bin 27444 -> 27440 bytes gui/slick/js/new/displayShow.js | 2 +- gui/slick/js/newShow.js | 2 +- gui/slick/views/apiBuilder.mako | 10 ++--- gui/slick/views/config.mako | 4 +- gui/slick/views/config_anime.mako | 2 +- gui/slick/views/config_backuprestore.mako | 8 ++-- gui/slick/views/config_general.mako | 4 +- gui/slick/views/config_notifications.mako | 10 ++--- gui/slick/views/config_postProcessing.mako | 30 ++++++------- gui/slick/views/config_providers.mako | 10 ++--- gui/slick/views/config_search.mako | 16 +++---- gui/slick/views/config_subtitles.mako | 6 +-- gui/slick/views/editShow.mako | 16 +++---- gui/slick/views/home_addExistingShow.mako | 8 ++-- gui/slick/views/home_addShows.mako | 8 ++-- gui/slick/views/home_newShow.mako | 16 +++---- gui/slick/views/home_popularShows.mako | 2 +- gui/slick/views/home_recommendedShows.mako | 4 +- gui/slick/views/home_trendingShows.mako | 4 +- gui/slick/views/inc_blackwhitelist.mako | 6 +-- gui/slick/views/manage.mako | 14 +++--- gui/slick/views/manage_backlogOverview.mako | 4 +- gui/slick/views/manage_episodeStatuses.mako | 6 +-- gui/slick/views/manage_failedDownloads.mako | 2 +- gui/slick/views/manage_manageSearches.mako | 18 ++++---- gui/slick/views/manage_massEdit.mako | 26 +++++------ gui/slick/views/manage_subtitleMissed.mako | 6 +-- gui/slick/views/restart.mako | 2 +- gui/slick/views/schedule.mako | 12 ++--- gui/slick/views/testRename.mako | 6 +-- gui/slick/views/viewlogs.mako | 4 +- readme.md | 2 +- sickbeard/webserve.py | 46 ++++++++++---------- 37 files changed, 162 insertions(+), 162 deletions(-) diff --git a/gui/slick/js/ajaxNotifications.js b/gui/slick/js/ajaxNotifications.js index 80e2a359c..11cf3bce4 100644 --- a/gui/slick/js/ajaxNotifications.js +++ b/gui/slick/js/ajaxNotifications.js @@ -39,5 +39,5 @@ function check_notifications() { $(document).ready(function(){ check_notifications(); - if(test) displayPNotify('notice', 'test', 'test<br/><i class="test-class">hello <b>world</b></i><ul><li>item 1</li><li>item 2</li></ul>'); + if(test) displayPNotify('notice', 'test', 'test<br><i class="test-class">hello <b>world</b></i><ul><li>item 1</li><li>item 2</li></ul>'); }); diff --git a/gui/slick/js/configSearch.js b/gui/slick/js/configSearch.js index eca621cb5..efe80fb9b 100644 --- a/gui/slick/js/configSearch.js +++ b/gui/slick/js/configSearch.js @@ -154,7 +154,7 @@ $(document).ready(function(){ } else if ('rtorrent' == selectedProvider){ client = 'rTorrent'; $(torrent_paused_option).hide(); - $('#host_desc_torrent').text('URL to your rTorrent client (e.g. scgi://localhost:5000 <br/> or https://localhost/rutorrent/plugins/httprpc/action.php)'); + $('#host_desc_torrent').text('URL to your rTorrent client (e.g. scgi://localhost:5000 <br> or https://localhost/rutorrent/plugins/httprpc/action.php)'); $(torrent_verify_cert_option).show(); $(torrent_verify_deluge).hide(); $(torrent_verify_rtorrent).show(); diff --git a/gui/slick/js/confirmations.js b/gui/slick/js/confirmations.js index 274673290..f20a64db0 100644 --- a/gui/slick/js/confirmations.js +++ b/gui/slick/js/confirmations.js @@ -47,7 +47,7 @@ $(document).ready(function () { var showname = document.getElementById("showtitle").getAttribute('data-showname'); $.confirm({ 'title' : 'Remove Show', - 'message' : 'Are you sure you want to remove <span class="footerhighlight">' + showname + '</span> from the database ?<br /><br /><input type="checkbox" id="deleteFiles"> <span class="red-text">Check to delete files as well. IRREVERSIBLE</span></input>', + 'message' : 'Are you sure you want to remove <span class="footerhighlight">' + showname + '</span> from the database ?<br><br><input type="checkbox" id="deleteFiles"> <span class="red-text">Check to delete files as well. IRREVERSIBLE</span></input>', 'buttons' : { 'Yes' : { 'class' : 'green', @@ -111,7 +111,7 @@ $(document).ready(function () { var target = $(this).attr('href'); $.confirm({ 'title' : 'Submit Errors', - 'message' : 'Are you sure you want to submit these errors ?<br /><br /><span class="red-text">Make sure SickRage is updated and trigger<br /> this error with debug enabled before submitting</span>', + 'message' : 'Are you sure you want to submit these errors ?<br><br><span class="red-text">Make sure SickRage is updated and trigger<br> this error with debug enabled before submitting</span>', 'buttons' : { 'Yes' : { 'class' : 'green', diff --git a/gui/slick/js/lib/pnotify.custom.min.js b/gui/slick/js/lib/pnotify.custom.min.js index f927d92712aa970d3baeabde56c84448bb888a33..b530874b9c8496d26425c0e3b3ca2d7fbddff6c0 100644 GIT binary patch delta 19 bcmdmTjd8;@#tnr$n~QnwvThC%dK3WwTaO5( delta 29 lcmdmRjd9C0#tnr$ObYs&3wiFcGAZa!F60s0oFa540syBv3TFTS diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js index 413404fcb..061358d2e 100644 --- a/gui/slick/js/new/displayShow.js +++ b/gui/slick/js/new/displayShow.js @@ -259,7 +259,7 @@ $(document).ready(function(){ widgets: ['saveSort', 'stickyHeaders', 'columnSelector'], widgetOptions : { columnSelector_saveColumns: true, // jshint ignore:line - columnSelector_layout : '<br/><label><input type="checkbox">{name}</label>', // jshint ignore:line + columnSelector_layout : '<br><label><input type="checkbox">{name}</label>', // jshint ignore:line columnSelector_mediaquery: false, // jshint ignore:line columnSelector_cssChecked : 'checked' // jshint ignore:line } diff --git a/gui/slick/js/newShow.js b/gui/slick/js/newShow.js index c347253fb..65135532d 100644 --- a/gui/slick/js/newShow.js +++ b/gui/slick/js/newShow.js @@ -58,7 +58,7 @@ $(document).ready(function () { resultStr += ' [' + obj[0] + ']'; } - resultStr += '<br />'; + resultStr += '<br>'; }); resultStr += '</ul>'; } diff --git a/gui/slick/views/apiBuilder.mako b/gui/slick/views/apiBuilder.mako index acf688a02..1f4163eb8 100644 --- a/gui/slick/views/apiBuilder.mako +++ b/gui/slick/views/apiBuilder.mako @@ -149,22 +149,22 @@ <h4>Playground</h4> - URL: <kbd id="command-${command_id}-base-url">/api/${apikey}/?cmd=${command}</kbd><br /> + URL: <kbd id="command-${command_id}-base-url">/api/${apikey}/?cmd=${command}</kbd><br> % if help['data']['requiredParameters']: - Required parameters: ${display_parameters_playground(help['data']['requiredParameters'], True, command_id)}<br /> + Required parameters: ${display_parameters_playground(help['data']['requiredParameters'], True, command_id)}<br> % endif % if help['data']['optionalParameters']: - Optional parameters: ${display_parameters_playground(help['data']['optionalParameters'], False, command_id)}<br /> + Optional parameters: ${display_parameters_playground(help['data']['optionalParameters'], False, command_id)}<br> % endif - <button class="btn btn-primary" data-action="api-call" data-command-name="${command_id}" data-base-url="command-${command_id}-base-url" data-target="#command-${command_id}-response" data-time="#command-${command_id}-time" data-url="#command-${command_id}-url">Call API</button><br /> + <button class="btn btn-primary" data-action="api-call" data-command-name="${command_id}" data-base-url="command-${command_id}-base-url" data-target="#command-${command_id}-response" data-time="#command-${command_id}-time" data-url="#command-${command_id}-url">Call API</button><br> <div class="result-wrapper hidden"> <div class="clearfix"> <span class="pull-left"> - Response: <strong id="command-${command_id}-time"></strong><br /> + Response: <strong id="command-${command_id}-time"></strong><br> URL: <kbd id="command-${command_id}-url"></kbd> </span> <span class="pull-right"> diff --git a/gui/slick/views/config.mako b/gui/slick/views/config.mako index 6cd206a1c..ac0e4addc 100644 --- a/gui/slick/views/config.mako +++ b/gui/slick/views/config.mako @@ -27,9 +27,9 @@ <table class="infoTable" cellspacing="1" border="0" cellpadding="0" width="100%"> <tr><td class="infoTableHeader">SR Version: </td><td class="infoTableCell"> % if sickbeard.VERSION_NOTIFY: - BRANCH: (${sickbeard.BRANCH}) / COMMIT: (${sickbeard.CUR_COMMIT_HASH}) <!-- – build.date //--><br /> + BRANCH: (${sickbeard.BRANCH}) / COMMIT: (${sickbeard.CUR_COMMIT_HASH}) <!-- – build.date //--><br> % else: - You don't have version checking turned on. Please turn on "Check for Update" in Config > General.<br /> + You don't have version checking turned on. Please turn on "Check for Update" in Config > General.<br> % endif </td></tr> diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako index e123aab59..bd83311e0 100644 --- a/gui/slick/views/config_anime.mako +++ b/gui/slick/views/config_anime.mako @@ -90,7 +90,7 @@ </fieldset> </div><!-- /component-group //--> - <br/><input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> </div><!-- /config-components //--> diff --git a/gui/slick/views/config_backuprestore.mako b/gui/slick/views/config_backuprestore.mako index 51293caf1..1e2365b9d 100644 --- a/gui/slick/views/config_backuprestore.mako +++ b/gui/slick/views/config_backuprestore.mako @@ -45,12 +45,12 @@ <div class="field-pair"> Select the folder you wish to save your backup file to: - <br/><br/> + <br><br> <input type="text" name="backupDir" id="backupDir" class="form-control input-sm input350" /> <input class="btn btn-inline" type="button" value="Backup" id="Backup" /> - <br/> + <br> </div> <div class="Backup" id="Backup-result"></div> @@ -68,12 +68,12 @@ <div class="field-pair"> Select the backup file you wish to restore: - <br/><br/> + <br><br> <input type="text" name="backupFile" id="backupFile" class="form-control input-sm input350" /> <input class="btn btn-inline" type="button" value="Restore" id="Restore" /> - <br/> + <br> </div> <div class="Restore" id="Restore-result"></div> diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index 7a5b49244..096874d1d 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -491,7 +491,7 @@ <span class="component-title">Reverse proxy headers</span> <span class="component-desc"> <input type="checkbox" name="handle_reverse_proxy" id="handle_reverse_proxy" ${('', 'checked="checked"')[bool(sickbeard.HANDLE_REVERSE_PROXY)]}/> - <p>accept the following reverse proxy headers (advanced)...<br />(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)</p> + <p>accept the following reverse proxy headers (advanced)...<br>(X-Forwarded-For, X-Forwarded-Host, and X-Forwarded-Proto)</p> </span> </label> </div> @@ -773,7 +773,7 @@ </div><!-- /component-group3 //--> - <br/> + <br> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> diff --git a/gui/slick/views/config_notifications.mako b/gui/slick/views/config_notifications.mako index c2771c1a9..eca63e139 100644 --- a/gui/slick/views/config_notifications.mako +++ b/gui/slick/views/config_notifications.mako @@ -227,7 +227,7 @@ <span class="component-desc"> <input type="text" name="plex_server_host" id="plex_server_host" value="${re.sub(r'\b,\b', ', ', sickbeard.PLEX_SERVER_HOST)}" class="form-control input-sm input350" /> <div class="clear-left"> - <p>one or more hosts running Plex Media Server<br />(eg. 192.168.1.1:32400, 192.168.1.2:32400)</p> + <p>one or more hosts running Plex Media Server<br>(eg. 192.168.1.1:32400, 192.168.1.2:32400)</p> </div> </span> </label> @@ -295,7 +295,7 @@ <span class="component-desc"> <input type="text" name="plex_host" id="plex_host" value="${sickbeard.PLEX_HOST}" class="form-control input-sm input350" /> <div class="clear-left"> - <p>one or more hosts running Plex client<br />(eg. 192.168.1.100:3000, 192.168.1.101:3000)</p> + <p>one or more hosts running Plex client<br>(eg. 192.168.1.100:3000, 192.168.1.101:3000)</p> </div> </span> </label> @@ -1495,7 +1495,7 @@ <span class="component-title">Step One</span> </label> <label> - <span style="font-size: 11px;">Click the "Request Authorization" button.<br/> This will open a new page containing an auth key.<br/> <b>Note:</b> if nothing happens check your popup blocker.<br/></span> + <span style="font-size: 11px;">Click the "Request Authorization" button.<br> This will open a new page containing an auth key.<br> <b>Note:</b> if nothing happens check your popup blocker.<br></span> <input class="btn" type="button" value="Request Authorization" id="twitterStep1" /> </label> </div> @@ -1504,7 +1504,7 @@ <span class="component-title">Step Two</span> </label> <label> - <span style="font-size: 11px;">Enter the key Twitter gave you below, and click "Verify Key".<br/><br/></span> + <span style="font-size: 11px;">Enter the key Twitter gave you below, and click "Verify Key".<br><br></span> <input type="text" id="twitter_key" value="" class="form-control input-sm input350" /> <input class="btn btn-inline" type="button" value="Verify Key" id="twitterStep2" /> </label> @@ -1831,7 +1831,7 @@ </div><!-- /config-components //--> </form> - <br/><input type="submit" class="config_submitter btn" value="Save Changes" /><br/> + <br><input type="submit" class="config_submitter btn" value="Save Changes" /><br> </div> </div> diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index f5e3491ec..4ac11b9a7 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -236,7 +236,7 @@ <span class="component-desc">See <a href="https://github.com/SiCKRAGETV/sickrage-issues/wiki/Post-Processing#extra-scripts"><font color='red'><b>Wiki</b></font></a> for script arguments description and usage.</span> </label> </div> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group1 //--> <div id="core-component-group2" class="component-group"> @@ -416,7 +416,7 @@ </tr> </tbody> </table> - <br/> + <br> </div> </div> @@ -438,7 +438,7 @@ <div class="example"> <span class="jumbo" id="naming_example"> </span> </div> - <br/> + <br> </div> <div id="naming_example_multi_div"> @@ -446,7 +446,7 @@ <div class="example"> <span class="jumbo" id="naming_example_multi"> </span> </div> - <br/> + <br> </div> <div class="field-pair"> @@ -624,7 +624,7 @@ </tr> </tbody> </table> - <br/> + <br> </div> </div><!-- /naming_abd_custom --> @@ -633,7 +633,7 @@ <div class="example"> <span class="jumbo" id="naming_abd_example"> </span> </div> - <br/> + <br> </div> </div><!-- /naming_abd_different --> @@ -801,7 +801,7 @@ </tr> </tbody> </table> - <br/> + <br> </div> </div><!-- /naming_sports_custom --> @@ -810,7 +810,7 @@ <div class="example"> <span class="jumbo" id="naming_sports_example"> </span> </div> - <br/> + <br> </div> </div><!-- /naming_sports_different --> @@ -974,7 +974,7 @@ </tr> </tbody> </table> - <br/> + <br> </div> </div><!-- /naming_anime_custom --> @@ -996,7 +996,7 @@ <div class="example"> <span class="jumbo" id="naming_example_anime"> </span> </div> - <br/> + <br> </div> <div id="naming_example_multi_anime_div"> @@ -1004,7 +1004,7 @@ <div class="example"> <span class="jumbo" id="naming_example_multi_anime"> </span> </div> - <br/> + <br> </div> <div class="field-pair"> @@ -1046,7 +1046,7 @@ </div><!-- /naming_anime_different --> <div></div> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group2 //--> @@ -1112,13 +1112,13 @@ </div> % endfor - <div class="clearfix"></div><br/> + <div class="clearfix"></div><br> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group3 //--> - <br/> + <br> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index d5478b073..acc35b3f0 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -59,7 +59,7 @@ $('#config-components').tabs(); % if not sickbeard.USE_NZBS or not sickbeard.USE_TORRENTS: <blockquote style="margin: 20px 0;">NZB/Torrent providers can be toggled in <b><a href="${srRoot}/config/search">Search Settings</a></b></blockquote> % else: - <br/> + <br> % endif <div> @@ -90,7 +90,7 @@ $('#config-components').tabs(); % endfor </ul> <input type="hidden" name="provider_order" id="provider_order" value="${" ".join([x.getID()+':'+str(int(x.isEnabled())) for x in sickbeard.providers.sortedProviderList()])}"/> - <br/><input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group1 //--> @@ -586,7 +586,7 @@ $('#config-components').tabs(); <!-- end div for editing providers --> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group2 //--> @@ -595,7 +595,7 @@ $('#config-components').tabs(); <div id="core-component-group3" class="component-group"> <div class="component-group-desc"> - <h3>Configure Custom<br />Newznab Providers</h3> + <h3>Configure Custom<br>Newznab Providers</h3> <p>Add and setup or remove custom Newznab providers.</p> </div> @@ -732,7 +732,7 @@ $('#config-components').tabs(); </div><!-- /component-group4 //--> % endif - <br/><input type="submit" class="btn config_submitter_refresh" value="Save Changes" /><br/> + <br><input type="submit" class="btn config_submitter_refresh" value="Save Changes" /><br> </div><!-- /config-components //--> diff --git a/gui/slick/views/config_search.mako b/gui/slick/views/config_search.mako index d8b1e4914..3560645ce 100644 --- a/gui/slick/views/config_search.mako +++ b/gui/slick/views/config_search.mako @@ -105,7 +105,7 @@ <span class="component-title">Ignore words</span> <span class="component-desc"> <input type="text" name="ignore_words" value="${sickbeard.IGNORE_WORDS}" class="form-control input-sm input350" /> - <div class="clear-left">results with one or more word from this list will be ignored<br /> + <div class="clear-left">results with one or more word from this list will be ignored<br> separate words with a comma, e.g. "word1,word2,word3" </div> </span> @@ -117,7 +117,7 @@ <span class="component-title">Require words</span> <span class="component-desc"> <input type="text" name="require_words" value="${sickbeard.REQUIRE_WORDS}" class="form-control input-sm input350" /> - <div class="clear-left">results with no word from this list will be ignored<br /> + <div class="clear-left">results with no word from this list will be ignored<br> separate words with a comma, e.g. "word1,word2,word3" </div> </span> @@ -129,8 +129,8 @@ <span class="component-title">Ignore language names in subbed results</span> <span class="component-desc"> <input type="text" name="ignored_subs_list" value="${sickbeard.IGNORED_SUBS_LIST}" class="form-control input-sm input350" /> - <div class="clear-left">Ignore subbed releases based on language names <br /> - Example: "dk" will ignore words: dksub, dksubs, dksubbed, dksubed <br /> + <div class="clear-left">Ignore subbed releases based on language names <br> + Example: "dk" will ignore words: dksub, dksubs, dksubbed, dksubed <br> separate languages with a comma, e.g. "lang1,lang2,lang3 </div> </span> @@ -420,7 +420,7 @@ <div class="testNotification" id="testSABnzbd_result">Click below to test</div> <input class="btn" type="button" value="Test SABnzbd" id="testSABnzbd" class="btn test-button"/> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </div><!-- /content_use_nzbs //--> @@ -472,7 +472,7 @@ </div> <div></div> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </div> </div> @@ -613,13 +613,13 @@ <div class="testNotification" id="test_torrent_result">Click below to test</div> <input class="btn" type="button" value="Test Connection" id="test_torrent" class="btn test-button"/> - <input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <input type="submit" class="btn config_submitter" value="Save Changes" /><br> </div> </div><!-- /content_use_torrents //--> </fieldset> </div><!-- /component-group3 //--> - <br/> + <br> <h6 class="pull-right"><b>All non-absolute folder locations are relative to <span class="path">${sickbeard.DATA_DIR}</span></b> </h6> <input type="submit" class="btn pull-left config_submitter button" value="Save Changes" /> diff --git a/gui/slick/views/config_subtitles.mako b/gui/slick/views/config_subtitles.mako index 28cf9a369..940d7eb87 100644 --- a/gui/slick/views/config_subtitles.mako +++ b/gui/slick/views/config_subtitles.mako @@ -146,7 +146,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } </label> </div> - <br/><input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> </div> </fieldset> </div><!-- /component-group1 //--> @@ -175,7 +175,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } </ul> <input type="hidden" name="service_order" id="service_order" value="<%" ".join(['%s:%d' % (x['name'], x['enabled']) for x in sickbeard.subtitles.sortedServiceList()])%>"/> - <br/><input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group2 //--> <div id="core-component-group3" class="component-group"> @@ -211,7 +211,7 @@ $('#subtitles_dir').fileBrowser({ title: 'Select Subtitles Download Directory' } </label> </div> % endfor - <br/><input type="submit" class="btn config_submitter" value="Save Changes" /><br/> + <br><input type="submit" class="btn config_submitter" value="Save Changes" /><br> </fieldset> </div><!-- /component-group3 //--> </div><!-- /config-components //--> diff --git a/gui/slick/views/editShow.mako b/gui/slick/views/editShow.mako index d8e9cc47b..2bee5ca1f 100644 --- a/gui/slick/views/editShow.mako +++ b/gui/slick/views/editShow.mako @@ -134,7 +134,7 @@ <label for="airbydate"> <span class="component-title">Air by date</span> <span class="component-desc"> - <input type="checkbox" id="airbydate" name="air_by_date" ${('', 'checked="checked"')[show.air_by_date == 1]} /> check if the show is released as Show.03.02.2010 rather than Show.S02E03.<br /> + <input type="checkbox" id="airbydate" name="air_by_date" ${('', 'checked="checked"')[show.air_by_date == 1]} /> check if the show is released as Show.03.02.2010 rather than Show.S02E03.<br> <span style="color:red">In case of an air date conflict between regular and special episodes, the later will be ignored.</span> </span> </label> @@ -144,7 +144,7 @@ <label for="anime"> <span class="component-title">Anime</span> <span class="component-desc"> - <input type="checkbox" id="anime" name="anime" ${('', 'checked="checked"')[show.is_anime == 1]}> check if the show is Anime and episodes are released as Show.265 rather than Show.S02E03<br /> + <input type="checkbox" id="anime" name="anime" ${('', 'checked="checked"')[show.is_anime == 1]}> check if the show is Anime and episodes are released as Show.265 rather than Show.S02E03<br> % if show.is_anime: <%include file="/inc_blackwhitelist.mako"/> % endif @@ -156,7 +156,7 @@ <label for="sports"> <span class="component-title">Sports</span> <span class="component-desc"> - <input type="checkbox" id="sports" name="sports" ${('', 'checked="checked"')[show.sports == 1]}/> check if the show is a sporting or MMA event released as Show.03.02.2010 rather than Show.S02E03<br /> + <input type="checkbox" id="sports" name="sports" ${('', 'checked="checked"')[show.sports == 1]}/> check if the show is a sporting or MMA event released as Show.03.02.2010 rather than Show.S02E03<br> <span style="color:red">In case of an air date conflict between regular and special episodes, the later will be ignored.</span> </span> </label> @@ -184,7 +184,7 @@ <label for="dvdorder"> <span class="component-title">DVD Order</span> <span class="component-desc"> - <input type="checkbox" id="dvdorder" name="dvdorder" ${('', 'checked="checked"')[show.dvdorder == 1]} /> use the DVD order instead of the air order<br /> + <input type="checkbox" id="dvdorder" name="dvdorder" ${('', 'checked="checked"')[show.dvdorder == 1]} /> use the DVD order instead of the air order<br> <div class="clear-left"><p>A "Force Full Update" is necessary, and if you have existing episodes you need to sort them manually.</p></div> </span> </label> @@ -203,7 +203,7 @@ <label for="rls_ignore_words"> <span class="component-title">Ignored Words</span> <span class="component-desc"> - <input type="text" id="rls_ignore_words" name="rls_ignore_words" id="rls_ignore_words" value="${show.rls_ignore_words}" class="form-control form-control-inline input-sm input350" /><br /> + <input type="text" id="rls_ignore_words" name="rls_ignore_words" id="rls_ignore_words" value="${show.rls_ignore_words}" class="form-control form-control-inline input-sm input350" /><br> <div class="clear-left"> <p>comma-separated <i>e.g. "word1,word2,word3"</i></> <p>Search results with one or more words from this list will be ignored.</p> @@ -216,7 +216,7 @@ <label for="rls_require_words"> <span class="component-title">Required Words</span> <span class="component-desc"> - <input type="text" id="rls_require_words" name="rls_require_words" id="rls_require_words" value="${show.rls_require_words}" class="form-control form-control-inline input-sm input350" /><br /> + <input type="text" id="rls_require_words" name="rls_require_words" id="rls_require_words" value="${show.rls_require_words}" class="form-control form-control-inline input-sm input350" /><br> <div class="clear-left"> <p>comma-separated <i>e.g. "word1,word2,word3"</i></p> <p>Search results with no words from this list will be ignored.</p> @@ -229,7 +229,7 @@ <label for="SceneName"> <span class="component-title">Scene Exception</span> <span class="component-desc"> - <input type="text" id="SceneName" class="form-control form-control-inline input-sm input200" /><input class="btn btn-inline" type="button" value="Add" id="addSceneName" /><br /><br /> + <input type="text" id="SceneName" class="form-control form-control-inline input-sm input200" /><input class="btn btn-inline" type="button" value="Add" id="addSceneName" /><br><br> <div class="pull-left"> <select id="exceptions_list" name="exceptions_list" multiple="multiple" style="min-width:200px;height:99px;"> % for cur_exception in show.exceptions: @@ -249,7 +249,7 @@ </div> - <br /> + <br> <input id="submit" type="submit" value="Save Changes" class="btn pull-left config_submitter button"> </form> </div> diff --git a/gui/slick/views/home_addExistingShow.mako b/gui/slick/views/home_addExistingShow.mako index 3e029e486..c4f59585b 100644 --- a/gui/slick/views/home_addExistingShow.mako +++ b/gui/slick/views/home_addExistingShow.mako @@ -36,7 +36,7 @@ <%include file="/inc_addShowOptions.mako"/> </div> </div> - <br /> + <br> <p>SickRage can add existing shows, using the current options, by using locally stored NFO/XML metadata to eliminate user interaction. If you would rather have SickRage prompt you to customize each show, then use the checkbox below.</p> @@ -48,10 +48,10 @@ <p><b>Displaying folders within these directories which aren't already added to SickRage:</b></p> <ul id="rootDirStaticList"><li></li></ul> - <br /> + <br> <div id="tableDiv"></div> - <br /> - <br /> + <br> + <br> <input class="btn btn-primary" type="button" value="Submit" id="submitShowDirs" /> </form> diff --git a/gui/slick/views/home_addShows.mako b/gui/slick/views/home_addShows.mako index c06e1e2b4..16da9f75c 100644 --- a/gui/slick/views/home_addShows.mako +++ b/gui/slick/views/home_addShows.mako @@ -20,7 +20,7 @@ </div> </a> - <br/><br/> + <br><br> % if sickbeard.USE_TRAKT == True: <a href="${srRoot}/home/addShows/trendingShows/" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addtrendingshow"></div></div> @@ -30,7 +30,7 @@ </div> </a> - <br/><br/> + <br><br> <a href="${srRoot}/home/addShows/recommendedShows/" id="btnNewShow" class="btn btn-large"> <div class="button"><div class="icon-addrecommendedshow"></div></div> @@ -40,7 +40,7 @@ </div> </a> - <br/><br/> + <br><br> % endif <a href="${srRoot}/home/addShows/popularShows/" id="btnNewShow" class="btn btn-large"> @@ -51,7 +51,7 @@ </div> </a> - <br/><br/> + <br><br> <a href="${srRoot}/home/addShows/existingShows/" id="btnExistingShow" class="btn btn-large"> <div class="button"><div class="icon-addexistingshow"></div></div> diff --git a/gui/slick/views/home_newShow.mako b/gui/slick/views/home_newShow.mako index 0a13df259..62a72a473 100644 --- a/gui/slick/views/home_newShow.mako +++ b/gui/slick/views/home_newShow.mako @@ -27,7 +27,7 @@ <div id="core-component-group1" class="tab-pane active component-group"> <div id="displayText">aoeu</div> - <br /> + <br> <form id="addShowForm" method="post" action="${srRoot}/home/addShows/addNewShow" accept-charset="utf-8"> @@ -60,10 +60,10 @@ <input class="btn btn-inline" type="button" id="searchName" value="Search" /> - <br /><br /> - <b>*</b> This will only affect the language of the retrieved metadata file contents and episode filenames.<br /> - This <b>DOES NOT</b> allow SickRage to download non-english TV episodes!<br /><br /> - <div id="searchResults" style="height: 100%;"><br/></div> + <br><br> + <b>*</b> This will only affect the language of the retrieved metadata file contents and episode filenames.<br> + This <b>DOES NOT</b> allow SickRage to download non-english TV episodes!<br><br> + <div id="searchResults" style="height: 100%;"><br></div> % endif </div> @@ -74,8 +74,8 @@ <div class="stepDiv"> % if provided_show_dir: - Pre-chosen Destination Folder: <b>${provided_show_dir}</b> <br /> - <input type="hidden" id="fullShowPath" name="fullShowPath" value="${provided_show_dir}" /><br /> + Pre-chosen Destination Folder: <b>${provided_show_dir}</b> <br> + <input type="hidden" id="fullShowPath" name="fullShowPath" value="${provided_show_dir}" /><br> % else: <%include file="/inc_rootDirs.mako"/> % endif @@ -95,7 +95,7 @@ <input type="hidden" name="skipShow" id="skipShow" value="" /> </form> -<br /> +<br> <div style="width: 100%; text-align: center;"> <input class="btn" type="button" id="addShowButton" value="Add Show" disabled="disabled" /> diff --git a/gui/slick/views/home_popularShows.mako b/gui/slick/views/home_popularShows.mako index 17fdc4498..3b5b5ed94 100644 --- a/gui/slick/views/home_popularShows.mako +++ b/gui/slick/views/home_popularShows.mako @@ -6,7 +6,7 @@ %> <%block name="content"> <h2>Popular Shows</h2> -<br /> +<br> % if not popular_shows: <h3>Fetching of IMDB Data failed. Are you online?</h3> diff --git a/gui/slick/views/home_recommendedShows.mako b/gui/slick/views/home_recommendedShows.mako index f1ede4327..f5d77e8ea 100644 --- a/gui/slick/views/home_recommendedShows.mako +++ b/gui/slick/views/home_recommendedShows.mako @@ -44,7 +44,7 @@ </select> </div> -<br /> +<br> <div id="trendingShows"></div> -<br /> +<br> </%block> diff --git a/gui/slick/views/home_trendingShows.mako b/gui/slick/views/home_trendingShows.mako index a6aa74f07..a49b019d8 100644 --- a/gui/slick/views/home_trendingShows.mako +++ b/gui/slick/views/home_trendingShows.mako @@ -50,7 +50,7 @@ </select> </div> -<br /> +<br> <div id="trendingShows"></div> -<br /> +<br> </%block> diff --git a/gui/slick/views/inc_blackwhitelist.mako b/gui/slick/views/inc_blackwhitelist.mako index 0b088b327..0aa539466 100644 --- a/gui/slick/views/inc_blackwhitelist.mako +++ b/gui/slick/views/inc_blackwhitelist.mako @@ -19,7 +19,7 @@ <option value="${keyword}">${keyword}</option> % endfor </select> - <br/> + <br> <input class="btn" id="removeW" value="Remove" type="button"/> </div> <div class="blackwhitelist pool"> @@ -31,7 +31,7 @@ % endif % endfor </select> - <br/> + <br> <input class="btn" id="addW" value="Add to Whitelist" type="button"/> <input class="btn" id="addB" value="Add to Blacklist" type="button"/> </div> @@ -42,7 +42,7 @@ <option value="${keyword}">${keyword}</option> % endfor </select> - <br/> + <br> <input class="btn" id="removeB" value="Remove" type="button"/> </div> </div> diff --git a/gui/slick/views/manage.mako b/gui/slick/views/manage.mako index e7f0ba823..cb8264528 100644 --- a/gui/slick/views/manage.mako +++ b/gui/slick/views/manage.mako @@ -21,7 +21,7 @@ <table id="massUpdateTable" class="sickbeardTable tablesorter" cellspacing="1" border="0" cellpadding="0"> <thead> <tr> - <th class="col-checkbox">Edit<br/><input type="checkbox" class="bulkCheck" id="editCheck" /></th> + <th class="col-checkbox">Edit<br><input type="checkbox" class="bulkCheck" id="editCheck" /></th> <th class="nowrap" style="text-align: left;">Show Name</th> <th class="col-quality">Quality</th> <th class="col-legend">Sports</th> @@ -33,15 +33,15 @@ <th class="col-legend">Subtitle</th> <th class="col-legend">Default Ep<br>Status</th> <th class="col-legend">Status</th> - <th width="1%">Update<br/><input type="checkbox" class="bulkCheck" id="updateCheck" /></th> - <th width="1%">Rescan<br/><input type="checkbox" class="bulkCheck" id="refreshCheck" /></th> - <th width="1%">Rename<br/><input type="checkbox" class="bulkCheck" id="renameCheck" /></th> + <th width="1%">Update<br><input type="checkbox" class="bulkCheck" id="updateCheck" /></th> + <th width="1%">Rescan<br><input type="checkbox" class="bulkCheck" id="refreshCheck" /></th> + <th width="1%">Rename<br><input type="checkbox" class="bulkCheck" id="renameCheck" /></th> % if sickbeard.USE_SUBTITLES: - <th width="1%">Search Subtitle<br/><input type="checkbox" class="bulkCheck" id="subtitleCheck" /></th> + <th width="1%">Search Subtitle<br><input type="checkbox" class="bulkCheck" id="subtitleCheck" /></th> % endif <!-- <th>Force Metadata Regen <input type="checkbox" class="bulkCheck" id="metadataCheck" /></th>//--> - <th width="1%">Delete<br/><input type="checkbox" class="bulkCheck" id="deleteCheck" /></th> - <th width="1%">Remove<br/><input type="checkbox" class="bulkCheck" id="removeCheck" /></th> + <th width="1%">Delete<br><input type="checkbox" class="bulkCheck" id="deleteCheck" /></th> + <th width="1%">Remove<br><input type="checkbox" class="bulkCheck" id="removeCheck" /></th> </tr> </thead> diff --git a/gui/slick/views/manage_backlogOverview.mako b/gui/slick/views/manage_backlogOverview.mako index db2eca310..637c9d114 100644 --- a/gui/slick/views/manage_backlogOverview.mako +++ b/gui/slick/views/manage_backlogOverview.mako @@ -30,7 +30,7 @@ <div class="h2footer pull-right"> <span class="listing-key wanted">Wanted: <b>${totalWanted}</b></span> <span class="listing-key qual">Low Quality: <b>${totalQual}</b></span> -</div><br/> +</div><br> <div class="float-left"> Jump to Show @@ -51,7 +51,7 @@ Jump to Show % endif <tr class="seasonheader" id="show-${curShow.indexerid}"> <td colspan="3" class="align-left"> - <br/><h2><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2> + <br><h2><a href="${srRoot}/home/displayShow?show=${curShow.indexerid}">${curShow.name}</a></h2> <div class="pull-right"> <span class="listing-key wanted">Wanted: <b>${showCounts[curShow.indexerid][Overview.WANTED]}</b></span> <span class="listing-key qual">Low Quality: <b>${showCounts[curShow.indexerid][Overview.QUAL]}</b></span> diff --git a/gui/slick/views/manage_episodeStatuses.mako b/gui/slick/views/manage_episodeStatuses.mako index e26bfdbe8..ebf0cdff4 100644 --- a/gui/slick/views/manage_episodeStatuses.mako +++ b/gui/slick/views/manage_episodeStatuses.mako @@ -20,7 +20,7 @@ % if whichStatus: <h2>None of your episodes have status ${common.statusStrings[int(whichStatus)]}</h2> -<br /> +<br> % endif <form action="${srRoot}/manage/episodeStatuses" method="get"> @@ -41,7 +41,7 @@ Manage episodes with status <select name="whichStatus" class="form-control form- <h2>Shows containing ${common.statusStrings[int(whichStatus)]} episodes</h2> -<br /> +<br> <% if int(whichStatus) in [common.IGNORED, common.SNATCHED] + common.Quality.DOWNLOADED + common.Quality.ARCHIVED: @@ -77,7 +77,7 @@ Set checked shows/episodes to <select name="newStatus" class="form-control form- <button type="button" class="btn btn-xs selectAllShows">Select all</a></button> <button type="button" class="btn btn-xs unselectAllShows">Clear all</a></button> </div> -<br /> +<br> <table class="sickbeardTable manageTable" cellspacing="1" border="0" cellpadding="0"> % for cur_indexer_id in sorted_show_ids: diff --git a/gui/slick/views/manage_failedDownloads.mako b/gui/slick/views/manage_failedDownloads.mako index 759c93070..dbce4121f 100644 --- a/gui/slick/views/manage_failedDownloads.mako +++ b/gui/slick/views/manage_failedDownloads.mako @@ -35,7 +35,7 @@ <th class="nowrap" width="75%" style="text-align: left;">Release</th> <th width="10%">Size</th> <th width="14%">Provider</th> - <th width="1%">Remove<br /> + <th width="1%">Remove<br> <input type="checkbox" class="bulkCheck" id="removeCheck" /> </th> </tr> diff --git a/gui/slick/views/manage_manageSearches.mako b/gui/slick/views/manage_manageSearches.mako index 78e3d36a7..e3caf400a 100644 --- a/gui/slick/views/manage_manageSearches.mako +++ b/gui/slick/views/manage_manageSearches.mako @@ -21,28 +21,28 @@ <a class="btn" href="${srRoot}/manage/manageSearches/forceBacklog"><i class="icon-exclamation-sign"></i> Force</a> <a class="btn" href="${srRoot}/manage/manageSearches/pauseBacklog?paused=${('1', '0')[bool(backlogPaused)]}"><i class="icon-${('paused', 'play')[bool(backlogPaused)]}"></i> ${('pause', 'Unpause')[bool(backlogPaused)]}</a> % if not backlogRunning: - Not in progress<br /> + Not in progress<br> % else: ${('', 'Paused:')[bool(backlogPaused)]} - Currently running<br /> + Currently running<br> % endif -<br /> +<br> <h3>Daily Search:</h3> <a class="btn" href="${srRoot}/manage/manageSearches/forceSearch"><i class="icon-exclamation-sign"></i> Force</a> -${('Not in progress', 'In Progress')[dailySearchStatus]}<br /> -<br /> +${('Not in progress', 'In Progress')[dailySearchStatus]}<br> +<br> <h3>Find Propers Search:</h3> <a class="btn ${('disabled', '')[bool(sickbeard.DOWNLOAD_PROPERS)]}" href="${srRoot}/manage/manageSearches/forceFindPropers"><i class="icon-exclamation-sign"></i> Force</a> % if not sickbeard.DOWNLOAD_PROPERS: - Propers search disabled <br /> + Propers search disabled <br> % elif not findPropersStatus: - Not in progress<br /> + Not in progress<br> % else: - In Progress<br /> + In Progress<br> % endif -<br /> +<br> <h3>Search Queue:</h3> Backlog: <i>${queueLength['backlog']} pending items</i></br> diff --git a/gui/slick/views/manage_massEdit.mako b/gui/slick/views/manage_massEdit.mako index 4f28b0896..216782360 100644 --- a/gui/slick/views/manage_massEdit.mako +++ b/gui/slick/views/manage_massEdit.mako @@ -39,8 +39,8 @@ <div class="component-group"> <h3>Main Settings</h3> - ==> <u>Changing any settings marked with (<span class="separator">*</span>) will force a refresh of the selected shows.</u><br /> - <br /> + ==> <u>Changing any settings marked with (<span class="separator">*</span>) will force a refresh of the selected shows.</u><br> + <br> <fieldset class="component-group-list"> @@ -49,7 +49,7 @@ <span class="component-title">Selected Shows</span> <span class="component-desc"> % for curName in sorted(showNames): - <span style="font-size: 14px;">${curName}</span><br /> + <span style="font-size: 14px;">${curName}</span><br> % endfor </span> </label> @@ -142,7 +142,7 @@ <option value="keep" ${('', 'selected="selected"')[archive_firstmatch_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[archive_firstmatch_value == 1]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[archive_firstmatch_value == 0]}>No</option> - </select><br /> + </select><br> Archive episode after the first best match is found from your archive quality list. </span> </label> @@ -156,7 +156,7 @@ <option value="keep" ${('', 'selected="selected"')[flatten_folders_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[flatten_folders_value == 0]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[flatten_folders_value == 1]}>No</option> - </select><br /> + </select><br> Group episodes by season folder (set to "No" to store in a single folder). </span> </label> @@ -185,7 +185,7 @@ % for curStatus in [WANTED, SKIPPED, IGNORED]: <option value="${curStatus}" ${('', 'selected="selected"')[curStatus == default_ep_status_value]}>${statusStrings[curStatus]}</option> % endfor - </select><br /> + </select><br> This will set the status for future episodes. </span> </label> @@ -199,7 +199,7 @@ <option value="keep" ${('', 'selected="selected"')[scene_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[scene_value == 1]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[scene_value == 0]}>No</option> - </select><br /> + </select><br> Search by scene numbering (set to "No" to search by indexer numbering). </span> </label> @@ -213,7 +213,7 @@ <option value="keep" ${('', 'selected="selected"')[anime_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[anime_value == 1]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[anime_value == 0]}>No</option> - </select><br /> + </select><br> Set if these shows are Anime and episodes are released as Show.265 rather than Show.S02E03 </span> </label> @@ -227,8 +227,8 @@ <option value="keep" ${('', 'selected="selected"')[sports_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[sports_value == 1]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[sports_value == 0]}>No</option> - </select><br /> - Set if these shows are sporting or MMA events released as Show.03.02.2010 rather than Show.S02E03.<br /> + </select><br> + Set if these shows are sporting or MMA events released as Show.03.02.2010 rather than Show.S02E03.<br> <span style="color:red">In case of an air date conflict between regular and special episodes, the later will be ignored.</span> </span> </label> @@ -242,8 +242,8 @@ <option value="keep" ${('', 'selected="selected"')[air_by_date_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[air_by_date_value == 1]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[air_by_date_value == 0]}>No</option> - </select><br /> - Set if these shows are released as Show.03.02.2010 rather than Show.S02E03.<br /> + </select><br> + Set if these shows are released as Show.03.02.2010 rather than Show.S02E03.<br> <span style="color:red">In case of an air date conflict between regular and special episodes, the later will be ignored.</span> </span> </label> @@ -257,7 +257,7 @@ <option value="keep" ${('', 'selected="selected"')[subtitles_value == None]}>< Keep ></option> <option value="enable" ${('', 'selected="selected"')[subtitles_value == 1]}>Yes</option> <option value="disable" ${('', 'selected="selected"')[subtitles_value == 0]}>No</option> - </select><br /> + </select><br> Search for subtitles. </span> </label> diff --git a/gui/slick/views/manage_subtitleMissed.mako b/gui/slick/views/manage_subtitleMissed.mako index c53672070..5337fd8e6 100644 --- a/gui/slick/views/manage_subtitleMissed.mako +++ b/gui/slick/views/manage_subtitleMissed.mako @@ -22,7 +22,7 @@ % if whichSubs: <h2>All of your episodes have ${subsLanguage} subtitles.</h2> -<br /> +<br> % endif <form action="${srRoot}/manage/subtitleMissed" method="get"> @@ -42,13 +42,13 @@ subtitles <form action="${srRoot}/manage/downloadSubtitleMissed" method="post"> <h2>Episodes without ${subsLanguage} subtitles.</h2> -<br /> +<br> Download missed subtitles for selected episodes <input class="btn btn-inline" type="submit" value="Go" /> <div> <button type="button" class="btn btn-xs selectAllShows">Select all</a></button> <button type="button" class="btn btn-xs unselectAllShows">Clear all</a></button> </div> -<br /> +<br> <table class="sickbeardTable manageTable" cellspacing="1" border="0" cellpadding="0"> % for cur_indexer_id in sorted_show_ids: <tr id="${cur_indexer_id}"> diff --git a/gui/slick/views/restart.mako b/gui/slick/views/restart.mako index 67510c016..6c53fb340 100644 --- a/gui/slick/views/restart.mako +++ b/gui/slick/views/restart.mako @@ -49,7 +49,7 @@ sbDefaultPage = "${sbDefaultPage}"; %> <% themeSpinner = ('', '-dark')['dark' == themeSpinner] %> <h2>Performing Restart</h2> -<br /> +<br> <div id="shut_down_message"> Waiting for SickRage to shut down: <img src="${srRoot}/images/loading16${themeSpinner}.gif" height="16" width="16" id="shut_down_loading" /> diff --git a/gui/slick/views/schedule.mako b/gui/slick/views/schedule.mako index 6f6e69472..921ab7466 100644 --- a/gui/slick/views/schedule.mako +++ b/gui/slick/views/schedule.mako @@ -196,7 +196,7 @@ show_div = 'ep_listing listing-default' %> % if 'show' == sort: - <br /><br /> + <br><br> % endif % for cur_result in results: @@ -238,17 +238,17 @@ % elif 'date' == sort: % if cur_segment != cur_ep_airdate: % if cur_ep_enddate < today and cur_ep_airdate != today.date() and not missed_header: - <br /><h2 class="day">Missed</h2> + <br><h2 class="day">Missed</h2> <% missed_header = True %> % elif cur_ep_airdate >= next_week.date() and not too_late_header: - <br /><h2 class="day">Later</h2> + <br><h2 class="day">Later</h2> <% too_late_header = True %> % elif cur_ep_enddate >= today and cur_ep_airdate < next_week.date(): % if cur_ep_airdate == today.date(): - <br /><h2 class="day">${datetime.date.fromordinal(cur_ep_airdate.toordinal()).strftime('%A').decode(sickbeard.SYS_ENCODING).capitalize()}<span style="font-size: 14px; vertical-align: top;">[Today]</span></h2> + <br><h2 class="day">${datetime.date.fromordinal(cur_ep_airdate.toordinal()).strftime('%A').decode(sickbeard.SYS_ENCODING).capitalize()}<span style="font-size: 14px; vertical-align: top;">[Today]</span></h2> <% today_header = True %> % else: - <br /><h2 class="day">${datetime.date.fromordinal(cur_ep_airdate.toordinal()).strftime('%A').decode(sickbeard.SYS_ENCODING).capitalize()}</h2> + <br><h2 class="day">${datetime.date.fromordinal(cur_ep_airdate.toordinal()).strftime('%A').decode(sickbeard.SYS_ENCODING).capitalize()}</h2> % endif % endif <% cur_segment = cur_ep_airdate %> @@ -256,7 +256,7 @@ % if cur_ep_airdate == today.date() and not today_header: <div> - <br /><h2 class="day">${datetime.date.fromordinal(cur_ep_airdate.toordinal()).strftime('%A').decode(sickbeard.SYS_ENCODING).capitalize()} <span style="font-size: 14px; vertical-align: top;">[Today]</span></h2> + <br><h2 class="day">${datetime.date.fromordinal(cur_ep_airdate.toordinal()).strftime('%A').decode(sickbeard.SYS_ENCODING).capitalize()} <span style="font-size: 14px; vertical-align: top;">[Today]</span></h2> <% today_header = True %> % endif diff --git a/gui/slick/views/testRename.mako b/gui/slick/views/testRename.mako index f7410d500..fb43c9d77 100644 --- a/gui/slick/views/testRename.mako +++ b/gui/slick/views/testRename.mako @@ -49,7 +49,7 @@ </thead> </table> -<br/> +<br> <input type="submit" value="Rename Selected" class="btn btn-success"> <a href="/home/displayShow?show=${show.indexerid}" class="btn btn-danger">Cancel Rename</a> <table id="testRenameTable" class="sickbeardTable" cellspacing="1" border="0" cellpadding="0"> @@ -64,7 +64,7 @@ <thead> <tr class="seasonheader" id="season-${cur_ep_obj.season}"> <td colspan="4"> - <br/> + <br> <h2>${('Season '+str(cur_ep_obj.season), 'Specials')[int(cur_ep_obj.season) == 0]}</h2> </td> </tr> @@ -98,6 +98,6 @@ if len(epList) > 1: </tbody> % endfor -</table><br /> +</table><br> <input type="submit" value="Rename Selected" class="btn btn-success"> <a href="/home/displayShow?show=${show.indexerid}" class="btn btn-danger">Cancel Rename</a> </%block> diff --git a/gui/slick/views/viewlogs.mako b/gui/slick/views/viewlogs.mako index c6c809cd8..cda4163c9 100644 --- a/gui/slick/views/viewlogs.mako +++ b/gui/slick/views/viewlogs.mako @@ -33,10 +33,10 @@ Filter log by: <select name="logFilter" id="logFilter" class="form-control form- Search log by: <input type="text" name="logSearch" placeholder="clear to reset" id="logSearch" value="${('', logSearch)[bool(logSearch)]}" class="form-control form-control-inline input-sm" /> </div> -<br /> +<br> <div class="align-left"><pre> ${logLines} </pre> </div> -<br /> +<br> </%block> diff --git a/readme.md b/readme.md index 9e6029d1b..f7e3af8a8 100644 --- a/readme.md +++ b/readme.md @@ -41,7 +41,7 @@ Automatic Video Library Manager for TV Shows. It watches for new episodes of you ##### [Wiki](https://github.com/SiCKRAGETV/SickRage/wiki) #### Important -Before using this with your existing database (sickbeard.db) please make a backup copy of it and delete any other database files such as cache.db and failed.db if present<br/> +Before using this with your existing database (sickbeard.db) please make a backup copy of it and delete any other database files such as cache.db and failed.db if present<br> We HIGHLY recommend starting out with no database files at all to make this a fresh start but the choice is at your own risk #### Supported providers diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index a00506ddd..bb15f5695 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -177,8 +177,8 @@ class BaseHandler(RequestHandler): elif self.settings.get("debug") and "exc_info" in kwargs: exc_info = kwargs["exc_info"] - trace_info = ''.join(["%s<br/>" % line for line in traceback.format_exception(*exc_info)]) - request_info = ''.join(["<strong>%s</strong>: %s<br/>" % (k, self.request.__dict__[k]) for k in + trace_info = ''.join(["%s<br>" % line for line in traceback.format_exception(*exc_info)]) + request_info = ''.join(["<strong>%s</strong>: %s<br>" % (k, self.request.__dict__[k]) for k in self.request.__dict__.keys()]) error = exc_info[1] @@ -874,7 +874,7 @@ class Home(WebRoot): finalResult += "Test KODI notice sent successfully to " + urllib.unquote_plus(curHost) else: finalResult += "Test KODI notice failed to " + urllib.unquote_plus(curHost) - finalResult += "<br />\n" + finalResult += "<br>\n" return finalResult @@ -891,7 +891,7 @@ class Home(WebRoot): finalResult += 'Successful test notice sent to Plex client ... ' + urllib.unquote_plus(curHost) else: finalResult += 'Test failed for Plex client ... ' + urllib.unquote_plus(curHost) - finalResult += '<br />' + '\n' + finalResult += '<br>' + '\n' ui.notifications.message('Tested Plex client(s): ', urllib.unquote_plus(host.replace(',', ', '))) @@ -912,7 +912,7 @@ class Home(WebRoot): finalResult += 'Test failed, No Plex Media Server host specified' else: finalResult += 'Test failed for Plex server(s) ... ' + urllib.unquote_plus(curResult.replace(',', ', ')) - finalResult += '<br />' + '\n' + finalResult += '<br>' + '\n' ui.notifications.message('Tested Plex Media Server host(s): ', urllib.unquote_plus(host.replace(',', ', '))) @@ -1309,7 +1309,7 @@ class Home(WebRoot): if season == -1: season = "*" out.append("S" + str(season) + ": " + ", ".join(names)) - return "<br/>".join(out) + return "<br>".join(out) def editShow(self, show=None, location=None, anyQualities=[], bestQualities=[], exceptions_list=[], flatten_folders=None, paused=None, directCall=False, air_by_date=None, sports=None, dvdorder=None, @@ -1748,7 +1748,7 @@ class Home(WebRoot): myDB.mass_action(sql_l) if int(status) == WANTED and not showObj.paused: - msg = "Backlog was automatically started for the following seasons of <b>" + showObj.name + "</b>:<br />" + msg = "Backlog was automatically started for the following seasons of <b>" + showObj.name + "</b>:<br>" msg += '<ul>' for season, segment in segments.iteritems(): @@ -1767,7 +1767,7 @@ class Home(WebRoot): logger.log(u"Some episodes were set to wanted, but " + showObj.name + " is paused. Not adding to Backlog until show is unpaused") if int(status) == FAILED: - msg = "Retrying Search was automatically started for the following season of <b>" + showObj.name + "</b>:<br />" + msg = "Retrying Search was automatically started for the following season of <b>" + showObj.name + "</b>:<br>" msg += '<ul>' for season, segment in segments.iteritems(): @@ -2200,7 +2200,7 @@ class HomePostProcess(Home): if quiet is not None and int(quiet) == 1: return result - result = result.replace("\n", "<br />\n") + result = result.replace("\n", "<br>\n") return self._genericMessage("Postprocessing results", result) @@ -3349,22 +3349,22 @@ class Manage(Home, WebRoot): messageDetail = "" if updates: - messageDetail += "<br /><b>Updates</b><br /><ul><li>" + messageDetail += "<br><b>Updates</b><br><ul><li>" messageDetail += "</li><li>".join(updates) messageDetail += "</li></ul>" if refreshes: - messageDetail += "<br /><b>Refreshes</b><br /><ul><li>" + messageDetail += "<br><b>Refreshes</b><br><ul><li>" messageDetail += "</li><li>".join(refreshes) messageDetail += "</li></ul>" if renames: - messageDetail += "<br /><b>Renames</b><br /><ul><li>" + messageDetail += "<br><b>Renames</b><br><ul><li>" messageDetail += "</li><li>".join(renames) messageDetail += "</li></ul>" if subtitles: - messageDetail += "<br /><b>Subtitles</b><br /><ul><li>" + messageDetail += "<br><b>Subtitles</b><br><ul><li>" messageDetail += "</li><li>".join(subtitles) messageDetail += "</li></ul>" @@ -3393,7 +3393,7 @@ class Manage(Home, WebRoot): if helpers.check_url(webui_url + 'download/'): webui_url += 'download/' else: - info_download_station = '<p>To have a better experience please set the Download Station alias as <code>download</code>, you can check this setting in the Synology DSM <b>Control Panel</b> > <b>Application Portal</b>. Make sure you allow DSM to be embedded with iFrames too in <b>Control Panel</b> > <b>DSM Settings</b> > <b>Security</b>.</p><br/><p>There is more information about this available <a href="https://github.com/midgetspy/Sick-Beard/pull/338">here</a>.</p><br/>' + info_download_station = '<p>To have a better experience please set the Download Station alias as <code>download</code>, you can check this setting in the Synology DSM <b>Control Panel</b> > <b>Application Portal</b>. Make sure you allow DSM to be embedded with iFrames too in <b>Control Panel</b> > <b>DSM Settings</b> > <b>Security</b>.</p><br><p>There is more information about this available <a href="https://github.com/midgetspy/Sick-Beard/pull/338">here</a>.</p><br>' if not sickbeard.TORRENT_PASSWORD == "" and not sickbeard.TORRENT_USERNAME == "": webui_url = re.sub('://', '://' + str(sickbeard.TORRENT_USERNAME) + ':' + str(sickbeard.TORRENT_PASSWORD) + '@', webui_url) @@ -3737,7 +3737,7 @@ class ConfigGeneral(Config): for x in results: logger.log(x, logger.ERROR) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) @@ -3779,7 +3779,7 @@ class ConfigBackupRestore(Config): else: finalResult += "You need to choose a folder to save your backup to!" - finalResult += "<br />\n" + finalResult += "<br>\n" return finalResult @@ -3800,7 +3800,7 @@ class ConfigBackupRestore(Config): else: finalResult += "You need to select a backup file to restore!" - finalResult += "<br />\n" + finalResult += "<br>\n" return finalResult @@ -3900,7 +3900,7 @@ class ConfigSearch(Config): for x in results: logger.log(x, logger.ERROR) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) @@ -4027,7 +4027,7 @@ class ConfigPostProcessing(Config): for x in results: logger.log(x, logger.WARNING) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) @@ -4579,7 +4579,7 @@ class ConfigProviders(Config): for x in results: logger.log(x, logger.ERROR) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) @@ -4811,7 +4811,7 @@ class ConfigNotifications(Config): for x in results: logger.log(x, logger.ERROR) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) @@ -4871,7 +4871,7 @@ class ConfigSubtitles(Config): for x in results: logger.log(x, logger.ERROR) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) @@ -4906,7 +4906,7 @@ class ConfigAnime(Config): for x in results: logger.log(x, logger.ERROR) ui.notifications.error('Error(s) Saving Configuration', - '<br />\n'.join(results)) + '<br>\n'.join(results)) else: ui.notifications.message('Configuration Saved', ek(os.path.join, sickbeard.CONFIG_FILE)) -- GitLab From d0702c002441376cfd4ad39d3525dd77e4f043c6 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:14:48 -0500 Subject: [PATCH 114/215] PEP 8: Refactor variables that shadow built-in names --- sickbeard/metadata/kodi_12plus.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/metadata/kodi_12plus.py b/sickbeard/metadata/kodi_12plus.py index 5d61c52ba..47e3fb811 100644 --- a/sickbeard/metadata/kodi_12plus.py +++ b/sickbeard/metadata/kodi_12plus.py @@ -309,8 +309,8 @@ class KODI_12PlusMetadata(generic.GenericMetadata): # watched.text = 'false' if getattr(myEp, 'writer', None): - credits = etree.SubElement(episode, "credits") - credits.text = myEp['writer'].strip() + ep_credits = etree.SubElement(episode, "credits") + ep_credits.text = myEp['writer'].strip() if getattr(myEp, 'director', None): director = etree.SubElement(episode, "director") -- GitLab From c3b644f5be254f731ec8b9ac459d9d62855f6fed Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:10:48 -0500 Subject: [PATCH 115/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/metadata/kodi_12plus.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/metadata/kodi_12plus.py b/sickbeard/metadata/kodi_12plus.py index 47e3fb811..91cf75287 100644 --- a/sickbeard/metadata/kodi_12plus.py +++ b/sickbeard/metadata/kodi_12plus.py @@ -321,7 +321,7 @@ class KODI_12PlusMetadata(generic.GenericMetadata): rating.text = myEp['rating'] if getattr(myEp, 'gueststars', None) and isinstance(myEp['gueststars'], basestring): - for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): + for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): cur_actor = etree.SubElement(episode, "actor") cur_actor_name = etree.SubElement(cur_actor, "name") cur_actor_name.text = actor -- GitLab From 69f4294ac931df22295fde31cb41388459d4cd9e Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:09:58 -0500 Subject: [PATCH 116/215] PEP 263: Add encoding declaration --- sickbeard/metadata/kodi_12plus.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/kodi_12plus.py b/sickbeard/metadata/kodi_12plus.py index 91cf75287..4014b8144 100644 --- a/sickbeard/metadata/kodi_12plus.py +++ b/sickbeard/metadata/kodi_12plus.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # URL: http://code.google.com/p/sickbeard/ # # This file is part of SickRage. -- GitLab From b21b7977ab0dd06cab7e27c0b7aa3d5b0faf1470 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:20:26 -0500 Subject: [PATCH 117/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/metadata/mede8er.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/metadata/mede8er.py b/sickbeard/metadata/mede8er.py index c4bd685b7..37d79c7d7 100644 --- a/sickbeard/metadata/mede8er.py +++ b/sickbeard/metadata/mede8er.py @@ -316,7 +316,7 @@ class Mede8erMetadata(mediabrowser.MediaBrowserMetadata): if getattr(myShow, '_actors', None) or getattr(myEp, 'gueststars', None): cast = etree.SubElement(episode, "cast") if getattr(myEp, 'gueststars', None) and isinstance(myEp['gueststars'], basestring): - for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): + for actor in (x.strip() for x in myEp['gueststars'].split('|') if x.strip()): cur_actor = etree.SubElement(cast, "actor") cur_actor.text = actor -- GitLab From b0fb54fa474769a3620a22b7a7ef5f164aeea078 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:20:05 -0500 Subject: [PATCH 118/215] PEP 263: Add encoding declaration --- sickbeard/metadata/mede8er.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/mede8er.py b/sickbeard/metadata/mede8er.py index 37d79c7d7..36609fde1 100644 --- a/sickbeard/metadata/mede8er.py +++ b/sickbeard/metadata/mede8er.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From ff7907fc78ee6ad5bf0c50f8f9d908c5e2c469bb Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:28:35 -0500 Subject: [PATCH 119/215] PEP 203: Replace dict creation with dict literal --- sickbeard/metadata/mediabrowser.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sickbeard/metadata/mediabrowser.py b/sickbeard/metadata/mediabrowser.py index a9d608a20..c33c7fe7d 100644 --- a/sickbeard/metadata/mediabrowser.py +++ b/sickbeard/metadata/mediabrowser.py @@ -401,10 +401,11 @@ class MediaBrowserMetadata(generic.GenericMetadata): eps_to_write = [ep_obj] + ep_obj.relatedEps - persons_dict = {} - persons_dict['Director'] = [] - persons_dict['GuestStar'] = [] - persons_dict['Writer'] = [] + persons_dict = { + 'Director': [], + 'GuestStar': [], + 'Writer': [] + } indexer_lang = ep_obj.show.lang -- GitLab From 6070bb03884318af7930009122dd584d9cfc232a Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:23:54 -0500 Subject: [PATCH 120/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/metadata/mediabrowser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sickbeard/metadata/mediabrowser.py b/sickbeard/metadata/mediabrowser.py index c33c7fe7d..6f45abd61 100644 --- a/sickbeard/metadata/mediabrowser.py +++ b/sickbeard/metadata/mediabrowser.py @@ -272,7 +272,6 @@ class MediaBrowserMetadata(generic.GenericMetadata): indexerid = etree.SubElement(tv_node, "id") indexerid.text = str(myShow['id']) - if getattr(myShow, 'seriesname', None): SeriesName = etree.SubElement(tv_node, "SeriesName") SeriesName.text = myShow['seriesname'] -- GitLab From 00f511b3e0446ee93c0ef46a1f5cd881363210ac Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:23:28 -0500 Subject: [PATCH 121/215] PEP 263: Add encoding declaration --- sickbeard/metadata/mediabrowser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/mediabrowser.py b/sickbeard/metadata/mediabrowser.py index 6f45abd61..0a60d4bb5 100644 --- a/sickbeard/metadata/mediabrowser.py +++ b/sickbeard/metadata/mediabrowser.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From fa1c8fe3558cc18fd4509fbdf33c243ee5398150 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:24:23 -0500 Subject: [PATCH 122/215] Remove redundant parentheses --- sickbeard/metadata/mediabrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/metadata/mediabrowser.py b/sickbeard/metadata/mediabrowser.py index 0a60d4bb5..e43195281 100644 --- a/sickbeard/metadata/mediabrowser.py +++ b/sickbeard/metadata/mediabrowser.py @@ -100,7 +100,7 @@ class MediaBrowserMetadata(generic.GenericMetadata): # Override with empty methods for unsupported features def retrieveShowMetadata(self, folder): # while show metadata is generated, it is not supported for our lookup - return (None, None, None) + return None, None, None def create_season_all_poster(self, show_obj): pass -- GitLab From c150459c71c7f21214dd00f9d17667a5ccb4116a Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:08:12 -0500 Subject: [PATCH 123/215] PEP 263: Add encoding declaration --- sickbeard/metadata/kodi.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/kodi.py b/sickbeard/metadata/kodi.py index ac9e24312..b093e8272 100644 --- a/sickbeard/metadata/kodi.py +++ b/sickbeard/metadata/kodi.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 91009f7555d3b5ecf3fe0d62532b8e3ee0472f34 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:31:35 -0500 Subject: [PATCH 124/215] PEP 8: Move module level imports to top of file --- sickbeard/metadata/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/metadata/__init__.py b/sickbeard/metadata/__init__.py index 2e8f09157..5f137bd51 100644 --- a/sickbeard/metadata/__init__.py +++ b/sickbeard/metadata/__init__.py @@ -16,11 +16,11 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -__all__ = ['generic', 'helpers', 'kodi', 'kodi_12plus', 'mediabrowser', 'ps3', 'wdtv', 'tivo', 'mede8er'] - import sys from sickbeard.metadata import kodi, kodi_12plus, mediabrowser, ps3, wdtv, tivo, mede8er, generic, helpers +__all__ = ['generic', 'helpers', 'kodi', 'kodi_12plus', 'mediabrowser', 'ps3', 'wdtv', 'tivo', 'mede8er'] + def available_generators(): return [x for x in __all__ if x not in ['generic', 'helpers']] -- GitLab From ef5a113dfb617b2a3dfffaa3cfafbdd40f42e826 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:32:05 -0500 Subject: [PATCH 125/215] PEP 8: Add and remove blank lines for consistency --- sickbeard/metadata/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sickbeard/metadata/__init__.py b/sickbeard/metadata/__init__.py index 5f137bd51..51db601f3 100644 --- a/sickbeard/metadata/__init__.py +++ b/sickbeard/metadata/__init__.py @@ -25,6 +25,7 @@ __all__ = ['generic', 'helpers', 'kodi', 'kodi_12plus', 'mediabrowser', 'ps3', ' def available_generators(): return [x for x in __all__ if x not in ['generic', 'helpers']] + def _getMetadataModule(name): name = name.lower() prefix = "sickbeard.metadata." -- GitLab From 275b55fbfde22d27b38309d69057339584695498 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:30:56 -0500 Subject: [PATCH 126/215] PEP 263: Add encoding declaration --- sickbeard/metadata/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/__init__.py b/sickbeard/metadata/__init__.py index 51db601f3..aa6862f5e 100644 --- a/sickbeard/metadata/__init__.py +++ b/sickbeard/metadata/__init__.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 4b1d6a06b7966a180569791613085686a56292c2 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:51:17 -0500 Subject: [PATCH 127/215] Remove unreachable code --- sickbeard/metadata/generic.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 6af12b5eb..da567762a 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -618,8 +618,6 @@ class GenericMetadata(object): else: return False - return True - def save_season_banners(self, show_obj, season): """ Saves all season banners to disk for the given show. @@ -667,8 +665,6 @@ class GenericMetadata(object): else: return False - return True - def save_season_all_poster(self, show_obj, which=None): # use the default season all poster name poster_path = self.get_season_all_poster_path(show_obj) -- GitLab From 0111c52efc360613d16b4b11bb35f3c876ab6e96 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:49:51 -0500 Subject: [PATCH 128/215] PEP 8: Refactor variables that shadow built-in names --- sickbeard/metadata/generic.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index da567762a..7a252b02a 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -965,7 +965,7 @@ class GenericMetadata(object): return (indexer_id, name, indexer) - def _retrieve_show_images_from_tmdb(self, show, type): + def _retrieve_show_images_from_tmdb(self, show, img_type): types = {'poster': 'poster_path', 'banner': None, 'fanart': 'backdrop_path', @@ -988,15 +988,15 @@ class GenericMetadata(object): search = tmdb.Search() for show_name in set(allPossibleShowNames(show)): for result in search.collection({'query': show_name})['results'] + search.tv({'query': show_name})['results']: - if types[type] and getattr(result, types[type]): - return "{0}{1}{2}".format(base_url, max_size, result[types[type]]) + if types[img_type] and getattr(result, types[img_type]): + return "{0}{1}{2}".format(base_url, max_size, result[types[img_type]]) except Exception: pass - logger.log(u"Could not find any " + type + " images on TMDB for " + show.name, logger.INFO) + logger.log(u"Could not find any " + img_type + " images on TMDB for " + show.name, logger.INFO) - def _retrieve_show_images_from_fanart(self, show, type, thumb=False): + def _retrieve_show_images_from_fanart(self, show, img_type, thumb=False): types = { 'poster': fanart.TYPE.TV.POSTER, 'banner': fanart.TYPE.TV.BANNER, @@ -1012,17 +1012,17 @@ class GenericMetadata(object): apikey=sickbeard.FANART_API_KEY, id=indexerid, ws=fanart.WS.TV, - type=types[type], + type=types[img_type], sort=fanart.SORT.POPULAR, limit=fanart.LIMIT.ONE, ) resp = request.response() - url = resp[types[type]][0]['url'] + url = resp[types[img_type]][0]['url'] if thumb: url = re.sub('/fanart/', '/preview/', url) return url except Exception: pass - logger.log(u"Could not find any " + type + " images on Fanart.tv for " + show.name, logger.INFO) + logger.log(u"Could not find any " + img_type + " images on Fanart.tv for " + show.name, logger.INFO) -- GitLab From 3257c713d32d6e59b97db5f6536294352569ad94 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:38:02 -0500 Subject: [PATCH 129/215] PEP 8: Convert None comparisons from operators to 'is / is not None' --- sickbeard/metadata/generic.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 7a252b02a..3a96dac67 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -139,21 +139,21 @@ class GenericMetadata(object): def _has_episode_thumb(self, ep_obj): location = self.get_episode_thumb_path(ep_obj) - result = location != None and ek(os.path.isfile, location) + result = location is not None and ek(os.path.isfile, location) if location: logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) return result def _has_season_poster(self, show_obj, season): location = self.get_season_poster_path(show_obj, season) - result = location != None and ek(os.path.isfile, location) + result = location is not None and ek(os.path.isfile, location) if location: logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) return result def _has_season_banner(self, show_obj, season): location = self.get_season_banner_path(show_obj, season) - result = location != None and ek(os.path.isfile, location) + result = location is not None and ek(os.path.isfile, location) if location: logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) return result @@ -928,15 +928,15 @@ class GenericMetadata(object): with open(metadata_path, 'r') as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) - if showXML.findtext('title') == None or (showXML.findtext('tvdbid') == None and showXML.findtext('id') == None): + if showXML.findtext('title') is None or (showXML.findtext('tvdbid') is None and showXML.findtext('id') is None): logger.log(u"Invalid info in tvshow.nfo (missing name or id): %s %s %s" % (showXML.findtext('title'), showXML.findtext('tvdbid'), showXML.findtext('id'))) return empty_return name = showXML.findtext('title') - if showXML.findtext('tvdbid') != None: + if showXML.findtext('tvdbid') is not None: indexer_id = int(showXML.findtext('tvdbid')) - elif showXML.findtext('id') != None: + elif showXML.findtext('id') is not None: indexer_id = int(showXML.findtext('id')) else: logger.log(u"Empty <id> or <tvdbid> field in NFO, unable to find a ID", logger.WARNING) @@ -947,7 +947,7 @@ class GenericMetadata(object): return empty_return indexer = None - if showXML.find('episodeguide/url') != None: + if showXML.find('episodeguide/url') is not None: epg_url = showXML.findtext('episodeguide/url').lower() if str(indexer_id) in epg_url: if 'thetvdb.com' in epg_url: -- GitLab From cc473f831d52e149bbeab0b63b72121eb0ee0f33 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:34:12 -0500 Subject: [PATCH 130/215] PEP 8: Add and remove blank lines for consistency --- sickbeard/metadata/generic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 3a96dac67..ea788b136 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -956,7 +956,6 @@ class GenericMetadata(object): logger.log(u"Invalid Indexer ID (" + str(indexer_id) + "), not using metadata file because it has TVRage info", logger.WARNING) return empty_return - except Exception, e: logger.log( u"There was an error parsing your existing metadata file: '" + metadata_path + "' error: " + ex(e), -- GitLab From 3248c589893e32479be4219586b7a5005614032a Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:33:53 -0500 Subject: [PATCH 131/215] PEP 263: Add encoding declaration --- sickbeard/metadata/generic.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index ea788b136..7cb75a4e6 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 609e6d329b1314c5de4d761cdbcfc3523dc6b3b7 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 20:50:20 -0500 Subject: [PATCH 132/215] Remove redundant parentheses --- sickbeard/metadata/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 7cb75a4e6..a49389f01 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -964,7 +964,7 @@ class GenericMetadata(object): logger.WARNING) return empty_return - return (indexer_id, name, indexer) + return indexer_id, name, indexer def _retrieve_show_images_from_tmdb(self, show, img_type): types = {'poster': 'poster_path', -- GitLab From e51ec7aba475078b24ec2a6cb0118ada7ffa9431 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:58:39 -0500 Subject: [PATCH 133/215] PEP 8: Remove unused variable --- sickbeard/metadata/helpers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sickbeard/metadata/helpers.py b/sickbeard/metadata/helpers.py index 6f3eb3ff4..fb3e9f0df 100644 --- a/sickbeard/metadata/helpers.py +++ b/sickbeard/metadata/helpers.py @@ -22,8 +22,6 @@ import requests meta_session = requests.Session() def getShowImage(url, imgNum=None): - image_data = None # @UnusedVariable - if url == None: return None -- GitLab From 922f763a5b38b8da1f28765997164f941e43e766 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:59:13 -0500 Subject: [PATCH 134/215] PEP 8: Convert None comparisons from operators to 'is / is not None' --- sickbeard/metadata/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/metadata/helpers.py b/sickbeard/metadata/helpers.py index fb3e9f0df..030509b5e 100644 --- a/sickbeard/metadata/helpers.py +++ b/sickbeard/metadata/helpers.py @@ -22,11 +22,11 @@ import requests meta_session = requests.Session() def getShowImage(url, imgNum=None): - if url == None: + if url is None: return None # if they provided a fanart number try to use it instead - if imgNum != None: + if imgNum is not None: tempURL = url.split('-')[0] + "-" + str(imgNum) + ".jpg" else: tempURL = url -- GitLab From 5c987505a11f424539911c320c315dff2cb614ff Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 21:59:47 -0500 Subject: [PATCH 135/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/metadata/helpers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/helpers.py b/sickbeard/metadata/helpers.py index 030509b5e..c49361ccb 100644 --- a/sickbeard/metadata/helpers.py +++ b/sickbeard/metadata/helpers.py @@ -21,6 +21,8 @@ from sickbeard import logger import requests meta_session = requests.Session() + + def getShowImage(url, imgNum=None): if url is None: return None -- GitLab From 9862ebad4dd2e1872b99f53b615e1a1ecd7bcf52 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:00:12 -0500 Subject: [PATCH 136/215] PEP 263: Add encoding declaration --- sickbeard/metadata/helpers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/helpers.py b/sickbeard/metadata/helpers.py index c49361ccb..e93cbd11c 100644 --- a/sickbeard/metadata/helpers.py +++ b/sickbeard/metadata/helpers.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From bce75e5adacca952c15813c5754c310cdbb05ff8 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:04:09 -0500 Subject: [PATCH 137/215] Remove redundant parentheses --- sickbeard/metadata/ps3.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/metadata/ps3.py b/sickbeard/metadata/ps3.py index 6dbeab00e..7da393375 100644 --- a/sickbeard/metadata/ps3.py +++ b/sickbeard/metadata/ps3.py @@ -77,7 +77,7 @@ class PS3Metadata(generic.GenericMetadata): # Override with empty methods for unsupported features def retrieveShowMetadata(self, folder): # no show metadata generated, we abort this lookup function - return (None, None, None) + return None, None, None def create_show_metadata(self, show_obj): pass -- GitLab From ef71f193d15e6aeee851e24fa552893138f90dd0 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:04:45 -0500 Subject: [PATCH 138/215] PEP 263: Add encoding declaration --- sickbeard/metadata/ps3.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/ps3.py b/sickbeard/metadata/ps3.py index 7da393375..e11da1389 100644 --- a/sickbeard/metadata/ps3.py +++ b/sickbeard/metadata/ps3.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From c675674cea4bf6a7d2f72cfaa376369ca9bde19b Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:07:42 -0500 Subject: [PATCH 139/215] Remove redundant parentheses --- sickbeard/metadata/tivo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/metadata/tivo.py b/sickbeard/metadata/tivo.py index 228254a3f..e31ddf056 100644 --- a/sickbeard/metadata/tivo.py +++ b/sickbeard/metadata/tivo.py @@ -84,7 +84,7 @@ class TIVOMetadata(generic.GenericMetadata): # Override with empty methods for unsupported features def retrieveShowMetadata(self, folder): # no show metadata generated, we abort this lookup function - return (None, None, None) + return None, None, None def create_show_metadata(self, show_obj): pass @@ -224,7 +224,7 @@ class TIVOMetadata(generic.GenericMetadata): # after the episode's title and before the description on the Program screen. # FIXME: Hardcode isEpisode to true for now, not sure how to handle movies - data += ("isEpisode : true\n") + data += "isEpisode : true\n" # Write the synopsis of the video here # Micrsoft Word's smartquotes can die in a fire. -- GitLab From f4f5f55ebeac9b3d2b645e5033ecb5fe8cb77d65 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:13:50 -0500 Subject: [PATCH 140/215] Remove redundant parentheses --- sickbeard/metadata/wdtv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/metadata/wdtv.py b/sickbeard/metadata/wdtv.py index 7dfa88f7d..5eafd5057 100644 --- a/sickbeard/metadata/wdtv.py +++ b/sickbeard/metadata/wdtv.py @@ -93,7 +93,7 @@ class WDTVMetadata(generic.GenericMetadata): # Override with empty methods for unsupported features def retrieveShowMetadata(self, folder): # no show metadata generated, we abort this lookup function - return (None, None, None) + return None, None, None def create_show_metadata(self, show_obj): pass -- GitLab From 4a7e8d111e7d43213c3035db22ea883db67a7aab Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:14:18 -0500 Subject: [PATCH 141/215] PEP 263: Add encoding declaration --- sickbeard/metadata/wdtv.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/wdtv.py b/sickbeard/metadata/wdtv.py index 5eafd5057..03310c80c 100644 --- a/sickbeard/metadata/wdtv.py +++ b/sickbeard/metadata/wdtv.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 6edd83d493bf2c6fe70b1d047ac862d935bf9032 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:11:20 -0500 Subject: [PATCH 142/215] PEP 8: Add and remove whitespace and blank lines --- sickbeard/metadata/tivo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sickbeard/metadata/tivo.py b/sickbeard/metadata/tivo.py index e31ddf056..5d46cd9b7 100644 --- a/sickbeard/metadata/tivo.py +++ b/sickbeard/metadata/tivo.py @@ -232,8 +232,7 @@ class TIVOMetadata(generic.GenericMetadata): # Replace double curly quotes sanitizedDescription = sanitizedDescription.replace(u"\u201c", "\"").replace(u"\u201d", "\"") # Replace single curly quotes - sanitizedDescription = sanitizedDescription.replace(u"\u2018", "'").replace(u"\u2019", "'").replace( - u"\u02BC", "'") + sanitizedDescription = sanitizedDescription.replace(u"\u2018", "'").replace(u"\u2019", "'").replace(u"\u02BC", "'") data += ("description : " + sanitizedDescription + "\n") -- GitLab From b2b842bb35d919ef3e68a14d7e94142e65f42a59 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 22:08:20 -0500 Subject: [PATCH 143/215] PEP 263: Add encoding declaration --- sickbeard/metadata/tivo.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/metadata/tivo.py b/sickbeard/metadata/tivo.py index 5d46cd9b7..15420bb73 100644 --- a/sickbeard/metadata/tivo.py +++ b/sickbeard/metadata/tivo.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # Author: Gordon Turner <gordonturner@gordonturner.ca> # URL: http://code.google.com/p/sickbeard/ -- GitLab From 641754cc91329954c339403ac8db9039ec1c11d0 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 13:56:39 +1030 Subject: [PATCH 144/215] add extra globals --- .jshintrc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.jshintrc b/.jshintrc index a0611d71d..1509de9ae 100644 --- a/.jshintrc +++ b/.jshintrc @@ -25,6 +25,8 @@ "isMeta": true, "generate_bwlist": true, "_": true, - "bootbox": true + "bootbox": true, + "PNotify": true, + "anonURL": true } } -- GitLab From 03a781c52eae9e2fb5f9df23422ce024aed55385 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 13:56:54 +1030 Subject: [PATCH 145/215] linted js files --- gui/slick/js/addExistingShow.js | 14 +-- gui/slick/js/ajaxEpSearch.js | 173 ++++++++++++++++---------------- gui/slick/js/ajaxEpSubtitles.js | 48 ++++----- gui/slick/js/configProviders.js | 151 +++++++++++++--------------- 4 files changed, 185 insertions(+), 201 deletions(-) diff --git a/gui/slick/js/addExistingShow.js b/gui/slick/js/addExistingShow.js index 851628a09..150b5a158 100644 --- a/gui/slick/js/addExistingShow.js +++ b/gui/slick/js/addExistingShow.js @@ -1,5 +1,4 @@ $(document).ready(function() { - $('#tableDiv').on('click', '#checkAll', function() { var seasCheck = this; $('.dirCheck').each(function() { @@ -9,7 +8,7 @@ $(document).ready(function() { $('#submitShowDirs').click(function() { var dirArr = []; - $('.dirCheck').each(function(i,w) { + $('.dirCheck').each(function() { if (this.checked === true) { var show = $(this).attr('id'); var indexer = $(this).closest('tr').find('select').val(); @@ -21,10 +20,7 @@ $(document).ready(function() { return false; } - url = srRoot + '/home/addShows/addExistingShows?promptForSettings=' + ($('#promptForSettings').prop('checked') ? 'on' : 'off'); - url += '&shows_to_add=' + dirArr.join('&shows_to_add='); - - window.location.href = url; + window.location.href = srRoot + '/home/addShows/addExistingShows?promptForSettings=' + ($('#promptForSettings').prop('checked') ? 'on' : 'off') + '&shows_to_add=' + dirArr.join('&shows_to_add='); }); @@ -52,12 +48,12 @@ $(document).ready(function() { }); } - var last_txt = ''; + var lastTxt = ''; $('#rootDirText').change(function() { - if (last_txt == $('#rootDirText').val()) { + if (lastTxt === $('#rootDirText').val()) { return false; } else { - last_txt = $('#rootDirText').val(); + lastTxt = $('#rootDirText').val(); } $('#rootDirStaticList').html(''); $('#rootDirs option').each(function(i, w) { diff --git a/gui/slick/js/ajaxEpSearch.js b/gui/slick/js/ajaxEpSearch.js index 6c01dcfd1..ff66ca7c7 100644 --- a/gui/slick/js/ajaxEpSearch.js +++ b/gui/slick/js/ajaxEpSearch.js @@ -1,4 +1,4 @@ -var search_status_url = srRoot + '/home/getManualSearchStatus'; +var searchStatusUrl = srRoot + '/home/getManualSearchStatus'; var failedDownload = false; var qualityDownload = false; var selectedEpisode = ''; @@ -6,32 +6,16 @@ PNotify.prototype.options.maxonscreen = 5; $.fn.manualSearches = []; -function check_manual_searches() { - var poll_interval = 5000; - showId = $('#showID').val(); - var url = showId !== undefined ? search_status_url + '?show=' + showId : search_status_url ; - $.ajax({ - url: url, - success: function (data) { - if (data.episodes) { - poll_interval = 5000; - } else { - poll_interval = 15000; - } +function enableLink(el) { + el.on('click.disabled', false); + el.prop('enableClick', '1'); + el.fadeTo("fast", 1); +} - updateImages(data); - //cleanupManualSearches(data); - }, - error: function () { - poll_interval = 30000; - }, - type: "GET", - dataType: "json", - complete: function () { - setTimeout(check_manual_searches, poll_interval); - }, - timeout: 15000 // timeout every 15 secs - }); +function disableLink(el) { + el.off('click.disabled'); + el.prop('enableClick', '0'); + el.fadeTo("fast", 0.5); } function updateImages(data) { @@ -40,14 +24,14 @@ function updateImages(data) { var loadingImage = 'loading16.gif'; var queuedImage = 'queued.png'; var searchImage = 'search16.png'; - var status = null; + var htmlContent = ''; //Try to get the <a> Element - el=$('a[id=' + ep.show + 'x' + ep.season + 'x' + ep.episode+']'); - img=el.children('img'); - parent=el.parent(); + var el = $('a[id=' + ep.show + 'x' + ep.season + 'x' + ep.episode+']'); + var img = el.children('img'); + var parent = el.parent(); if (el) { var rSearchTerm = ''; - if (ep.searchstatus == 'searching') { + if (ep.searchstatus.toLowerCase() === 'searching') { //el=$('td#' + ep.season + 'x' + ep.episode + '.search img'); img.prop('title','Searching'); img.prop('alt','Searching'); @@ -55,16 +39,16 @@ function updateImages(data) { disableLink(el); // Update Status and Quality rSearchTerm = /(\w+)\s\((.+?)\)/; - HtmlContent = ep.searchstatus; + htmlContent = ep.searchstatus; - } else if (ep.searchstatus == 'queued') { + } else if (ep.searchstatus.toLowerCase() === 'queued') { //el=$('td#' + ep.season + 'x' + ep.episode + '.search img'); img.prop('title','Queued'); img.prop('alt','queued'); img.prop('src',srRoot+'/images/' + queuedImage ); disableLink(el); - HtmlContent = ep.searchstatus; - } else if (ep.searchstatus == 'finished') { + htmlContent = ep.searchstatus; + } else if (ep.searchstatus.toLowerCase() === 'finished') { //el=$('td#' + ep.season + 'x' + ep.episode + '.search img'); img.prop('title','Searching'); img.prop('alt','searching'); @@ -74,54 +58,70 @@ function updateImages(data) { // Update Status and Quality rSearchTerm = /(\w+)\s\((.+?)\)/; - HtmlContent = ep.status.replace(rSearchTerm,"$1"+' <span class="quality '+ep.quality+'">'+"$2"+'</span>'); + htmlContent = ep.status.replace(rSearchTerm,"$1"+' <span class="quality '+ep.quality+'">'+"$2"+'</span>'); parent.closest('tr').prop("class", ep.overview + " season-" + ep.season + " seasonstyle"); } // update the status column if it exists - parent.siblings('.col-status').html(HtmlContent); + parent.siblings('.col-status').html(htmlContent); } - el_comEps=$('a[id=forceUpdate-' + ep.show + 'x' + ep.season + 'x' + ep.episode+']'); - img_comEps=el_comEps.children('img'); - if (el_comEps) { - if (ep.searchstatus == 'searching') { - img_comEps.prop('title','Searching'); - img_comEps.prop('alt','Searching'); - img_comEps.prop('src',srRoot+'/images/' + loadingImage); - disableLink(el_comEps); - } else if (ep.searchstatus == 'queued') { - img_comEps.prop('title','Queued'); - img_comEps.prop('alt','queued'); - img_comEps.prop('src',srRoot+'/images/' + queuedImage ); - } else if (ep.searchstatus == 'finished') { - img_comEps.prop('title','Manual Search'); - img_comEps.prop('alt','[search]'); - img_comEps.prop('src',srRoot+'/images/' + searchImage); - if (ep.overview == 'snatched') { - el_comEps.closest('tr').remove(); + var elementCompleteEpisodes = $('a[id=forceUpdate-' + ep.show + 'x' + ep.season + 'x' + ep.episode+']'); + var imageCompleteEpisodes = elementCompleteEpisodes.children('img'); + if (elementCompleteEpisodes) { + if (ep.searchstatus.toLowerCase() === 'searching') { + imageCompleteEpisodes.prop('title','Searching'); + imageCompleteEpisodes.prop('alt','Searching'); + imageCompleteEpisodes.prop('src',srRoot+'/images/' + loadingImage); + disableLink(elementCompleteEpisodes); + } else if (ep.searchstatus.toLowerCase() === 'queued') { + imageCompleteEpisodes.prop('title','Queued'); + imageCompleteEpisodes.prop('alt','queued'); + imageCompleteEpisodes.prop('src',srRoot+'/images/' + queuedImage ); + } else if (ep.searchstatus.toLowerCase() === 'finished') { + imageCompleteEpisodes.prop('title','Manual Search'); + imageCompleteEpisodes.prop('alt','[search]'); + imageCompleteEpisodes.prop('src',srRoot+'/images/' + searchImage); + if (ep.overview.toLowerCase() === 'snatched') { + elementCompleteEpisodes.closest('tr').remove(); } else { - enableLink(el_comEps); + enableLink(elementCompleteEpisodes); } } } }); } -$(document).ready(function () { - check_manual_searches(); -}); +function checkManualSearches() { + var pollInterval = 5000; + var showId = $('#showID').val(); + var url = showId !== undefined ? searchStatusUrl + '?show=' + showId : searchStatusUrl ; + $.ajax({ + url: url, + success: function (data) { + if (data.episodes) { + pollInterval = 5000; + } else { + pollInterval = 15000; + } -function enableLink(el) { - el.on('click.disabled', false); - el.prop('enableClick', '1'); - el.fadeTo("fast", 1); + updateImages(data); + //cleanupManualSearches(data); + }, + error: function () { + pollInterval = 30000; + }, + type: "GET", + dataType: "json", + complete: function () { + setTimeout(checkManualSearches, pollInterval); + }, + timeout: 15000 // timeout every 15 secs + }); } -function disableLink(el) { - el.off('click.disabled'); - el.prop('enableClick', '0'); - el.fadeTo("fast", 0.5); -} +$(document).ready(function () { + checkManualSearches(); +}); (function(){ $.ajaxEpSearch = { @@ -142,7 +142,7 @@ function disableLink(el) { event.preventDefault(); // Check if we have disabled the click - if($(this).prop('enableClick') == '0') return false; + if($(this).prop('enableClick') === '0') { return false; } selectedEpisode = $(this); @@ -153,7 +153,7 @@ function disableLink(el) { event.preventDefault(); // Check if we have disabled the click - if ($(this).prop('enableClick') == '0') return false; + if ($(this).prop('enableClick') === '0') { return false; } selectedEpisode = $(this); @@ -165,23 +165,25 @@ function disableLink(el) { }); $('#manualSearchModalFailed .btn').click(function(){ - failedDownload = ($(this).text() == 'Yes'); + failedDownload = ($(this).text().toLowerCase() === 'yes'); $("#manualSearchModalQuality").modal('show'); }); $('#manualSearchModalQuality .btn').click(function(){ - qualityDownload = ($(this).text() == 'Yes'); + qualityDownload = ($(this).text().toLowerCase() === 'yes'); manualSearch(); }); function manualSearch(){ + var imageName, imageResult, htmlContent; + var parent = selectedEpisode.parent(); // Create var for anchor - link = selectedEpisode; + var link = selectedEpisode; // Create var for img under anchor and set options for the loading gif - img=selectedEpisode.children('img'); + var img = selectedEpisode.children('img'); img.prop('title','loading'); img.prop('alt',''); img.prop('src',srRoot+'/images/' + options.loadingImage); @@ -197,31 +199,32 @@ function disableLink(el) { $.getJSON(url, function(data){ // if they failed then just put the red X - if (data.result == 'failure') { - img_name = options.noImage; - img_result = 'failed'; + if (data.result.toLowerCase() === 'failure') { + imageName = options.noImage; + imageResult = 'failed'; // if the snatch was successful then apply the corresponding class and fill in the row appropriately } else { - img_name = options.loadingImage; - img_result = 'success'; + imageName = options.loadingImage; + imageResult = 'success'; // color the row - if (options.colorRow) + if (options.colorRow) { parent.parent().removeClass('skipped wanted qual good unaired').addClass('snatched'); + } // applying the quality class var rSearchTerm = /(\w+)\s\((.+?)\)/; - HtmlContent = data.result.replace(rSearchTerm,"$1"+' <span class="quality '+data.quality+'">'+"$2"+'</span>'); + htmlContent = data.result.replace(rSearchTerm,"$1"+' <span class="quality '+data.quality+'">'+"$2"+'</span>'); // update the status column if it exists - parent.siblings('.col-status').html(HtmlContent); + parent.siblings('.col-status').html(htmlContent); // Only if the queuing was successful, disable the onClick event of the loading image disableLink(link); } // put the corresponding image as the result of queuing of the manual search - img.prop('title',img_result); - img.prop('alt',img_result); + img.prop('title', imageResult); + img.prop('alt', imageResult); img.prop('height', options.size); - img.prop('src',srRoot+"/images/"+img_name); + img.prop('src', srRoot+"/images/" + imageName); }); // don't follow the link diff --git a/gui/slick/js/ajaxEpSubtitles.js b/gui/slick/js/ajaxEpSubtitles.js index 241ed7f69..a61499c39 100644 --- a/gui/slick/js/ajaxEpSubtitles.js +++ b/gui/slick/js/ajaxEpSubtitles.js @@ -1,29 +1,29 @@ (function(){ $.fn.ajaxEpSubtitlesSearch = function(){ $('.epSubtitlesSearch').click(function(){ - var subtitles_td = $(this).parent().siblings('.col-subtitles'); - var subtitles_search_link = $(this); + var subtitlesTd = $(this).parent().siblings('.col-subtitles'); + var subtitlesSearchLink = $(this); // fill with the ajax loading gif - subtitles_search_link.empty(); - subtitles_search_link.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); + subtitlesSearchLink.empty(); + subtitlesSearchLink.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); $.getJSON($(this).attr('href'), function(data){ - if (data.result != "failure" && data.result != "No subtitles downloaded") { - // clear and update the subtitles column with new informations - var subtitles = data.subtitles.split(','); - subtitles_td.empty(); - $.each(subtitles,function(index, language){ - if (language !== "" && language != "und") { - if (index != subtitles.length - 1) { - subtitles_td.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); - } else { - subtitles_td.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); + if (data.result.toLowerCase() !== "failure" && data.result.toLowerCase() !== "no subtitles downloaded") { + // clear and update the subtitles column with new informations + var subtitles = data.subtitles.split(','); + subtitlesTd.empty(); + $.each(subtitles,function(index, language){ + if (language !== "" && language !== "und") { + if (index !== subtitles.length - 1) { + subtitlesTd.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); + } else { + subtitlesTd.append($("<img/>").attr({"src": srRoot+"/images/subtitles/flags/"+language+".png", "alt": language, "width": 16, "height": 11})); + } } - } - }); - // don't allow other searches - subtitles_search_link.remove(); + }); + // don't allow other searches + subtitlesSearchLink.remove(); } else { - subtitles_search_link.remove(); + subtitlesSearchLink.remove(); } }); @@ -34,13 +34,13 @@ $.fn.ajaxEpMergeSubtitles = function(){ $('.epMergeSubtitles').click(function(){ - var subtitles_merge_link = $(this); + var subtitlesMergeLink = $(this); // fill with the ajax loading gif - subtitles_merge_link.empty(); - subtitles_merge_link.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); - $.getJSON($(this).attr('href'), function(data){ + subtitlesMergeLink.empty(); + subtitlesMergeLink.append($("<img/>").attr({"src": srRoot+"/images/loading16.gif", "alt": "", "title": "loading"})); + $.getJSON($(this).attr('href'), function(){ // don't allow other merges - subtitles_merge_link.remove(); + subtitlesMergeLink.remove(); }); // don't follow the link return false; diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js index 466df5ceb..4bdce6496 100644 --- a/gui/slick/js/configProviders.js +++ b/gui/slick/js/configProviders.js @@ -4,7 +4,7 @@ $(document).ready(function(){ var providerName = $(this).attr('id'); var selectedProvider = $('#editAProvider :selected').val(); - if (selectedProvider + 'Div' == providerName) { + if (selectedProvider + 'Div' == providerName) { // jshint ignore:line $(this).show(); } else { $(this).hide(); @@ -24,14 +24,9 @@ $(document).ready(function(){ var url = selectedProvider[1]; var key = selectedProvider[2]; - if (!name) - return; - - if (!url) - return; - - if (!key) + if (!name || !url || !key) { return; + } var params = {url: url, name: name, key: key}; var returnData; @@ -40,22 +35,27 @@ $(document).ready(function(){ var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ $(this).updateNewznabCaps( data, selectedProvider ); - console.debug(data.tv_categories); + console.debug(data.tv_categories); // jshint ignore:line }); jqxhr.always(function() { $(".updating_categories").empty(); - }); + }); }; $.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) { url = $.trim(url); - if (!url) + if (!url) { return; + } - if (!/^https?:\/\//i.test(url)) url = "http://" + url; + if (!/^https?:\/\//i.test(url)) { + url = "http://" + url; + } - if (url.match('/$') === null) url = url + '/'; + if (url.match('/$') === null) { + url = url + '/'; + } var newData = [isDefault, [name, url, key, cat]]; newznabProviders[id] = newData; @@ -94,7 +94,6 @@ $(document).ready(function(){ }; $.fn.updateProvider = function (id, url, key, cat) { - newznabProviders[id][1][1] = url; newznabProviders[id][1][2] = key; newznabProviders[id][1][3] = cat; @@ -102,17 +101,14 @@ $(document).ready(function(){ $(this).populateNewznabSection(); $(this).makeNewznabProviderString(); - }; $.fn.deleteProvider = function (id) { - $('#editANewznabProvider').removeOption(id); delete newznabProviders[id]; $(this).populateNewznabSection(); $('li').remove('#'+id); $(this).makeNewznabProviderString(); - }; $.fn.updateTorrentRssProvider = function (id, url, cookies, titleTAG) { @@ -132,12 +128,11 @@ $(document).ready(function(){ }; $.fn.populateNewznabSection = function() { - var selectedProvider = $('#editANewznabProvider :selected').val(); var data = ''; var isDefault = ''; - if (selectedProvider == 'addNewznab') { + if (selectedProvider === 'addNewznab') { data = ['','','']; isDefault = 0; $('#newznab_add_div').show(); @@ -183,16 +178,17 @@ $(document).ready(function(){ var newCatOptions = []; if (rrcat) { rrcat.forEach(function (cat) { - if (cat !== '') newCatOptions.push({text : cat, value : cat}); + if (cat !== '') { + newCatOptions.push({text : cat, value : cat}); + } }); $("#newznab_cat").replaceOptions(newCatOptions); } - if (selectedProvider == 'addNewznab') { + if (selectedProvider === 'addNewznab') { $('#newznab_name').removeAttr("disabled"); $('#newznab_url').removeAttr("disabled"); } else { - $('#newznab_name').attr("disabled", "disabled"); if (isDefault) { @@ -215,7 +211,7 @@ $(document).ready(function(){ var found = false; loopThroughArray.forEach(function(rootObject) { - if (rootObject.name == searchFor) { + if (rootObject.name === searchFor) { found = true; } console.log(rootObject.name + " while searching for: "+ searchFor); @@ -231,24 +227,22 @@ $(document).ready(function(){ * @return no return data. The multiselect input $("#newznab_cap") is updated, as a result. */ $.fn.updateNewznabCaps = function( newzNabCaps, selectedProvider ) { - if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])) { - $.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories}); + $.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories}); // jshint ignore:line } //Loop through the array and if currently selected newznab provider name matches one in the array, use it to //update the capabilities select box (on the left). if (selectedProvider[0]) { $.fn.newznabProvidersCapabilities.forEach(function(newzNabCap) { - - if (newzNabCap.name && newzNabCap.name == selectedProvider[0] && newzNabCap.categories instanceof Array) { - var newCapOptions = []; - newzNabCap.categories.forEach(function(category_set) { - if (category_set.id && category_set.name) { - newCapOptions.push({value : category_set.id, text : category_set.name + "(" + category_set.id + ")"}); - } - }); - $("#newznab_cap").replaceOptions(newCapOptions); + if (newzNabCap.name && newzNabCap.name === selectedProvider[0] && newzNabCap.categories instanceof Array) { + var newCapOptions = []; + newzNabCap.categories.forEach(function(categorySet) { + if (categorySet.id && categorySet.name) { + newCapOptions.push({value : categorySet.id, text : categorySet.name + "(" + categorySet.id + ")"}); + } + }); + $("#newznab_cap").replaceOptions(newCapOptions); } }); } @@ -258,7 +252,9 @@ $(document).ready(function(){ var provStrings = []; for (var id in newznabProviders) { - provStrings.push(newznabProviders[id][1].join('|')); + if (newznabProviders.hasOwnProperty(id)) { + provStrings.push(newznabProviders[id][1].join('|')); + } } $('#newznab_string').val(provStrings.join('!!!')); @@ -268,7 +264,7 @@ $(document).ready(function(){ var selectedProvider = $('#editATorrentRssProvider :selected').val(); var data = ''; - if (selectedProvider == 'addTorrentRss') { + if (selectedProvider === 'addTorrentRss') { data = ['','','','title']; $('#torrentrss_add_div').show(); $('#torrentrss_update_div').hide(); @@ -283,7 +279,7 @@ $(document).ready(function(){ $('#torrentrss_cookies').val(data[2]); $('#torrentrss_titleTAG').val(data[3]); - if (selectedProvider == 'addTorrentRss') { + if (selectedProvider === 'addTorrentRss') { $('#torrentrss_name').removeAttr("disabled"); $('#torrentrss_url').removeAttr("disabled"); $('#torrentrss_cookies').removeAttr("disabled"); @@ -295,13 +291,14 @@ $(document).ready(function(){ $('#torrentrss_titleTAG').removeAttr("disabled"); $('#torrentrss_delete').removeAttr("disabled"); } - }; $.fn.makeTorrentRssProviderString = function() { var provStrings = []; for (var id in torrentRssProviders) { - provStrings.push(torrentRssProviders[id].join('|')); + if (obj.hasOwnProperty(id)) { + provStrings.push(torrentRssProviders[id].join('|')); + } } $('#torrentrss_string').val(provStrings.join('!!!')); @@ -348,22 +345,22 @@ $(document).ready(function(){ var torrentRssProviders = []; $(this).on('change', '.newznab_key', function(){ + var providerId = $(this).attr('id'); + providerId = providerId.substring(0, providerId.length-'_hash'.length); - var provider_id = $(this).attr('id'); - provider_id = provider_id.substring(0, provider_id.length-'_hash'.length); - - var url = $('#'+provider_id+'_url').val(); - var cat = $('#'+provider_id+'_cat').val(); + var url = $('#'+providerId+'_url').val(); + var cat = $('#'+providerId+'_cat').val(); var key = $(this).val(); - $(this).updateProvider(provider_id, url, key, cat); - + $(this).updateProvider(providerId, url, key, cat); }); $('#newznab_key,#newznab_url').change(function(){ var selectedProvider = $('#editANewznabProvider :selected').val(); - if (selectedProvider == "addNewznab") return; + if (selectedProvider === "addNewznab"){ + return; + } var url = $('#newznab_url').val(); var key = $('#newznab_key').val(); @@ -378,7 +375,9 @@ $(document).ready(function(){ $('#torrentrss_url,#torrentrss_cookies,#torrentrss_titleTAG').change(function(){ var selectedProvider = $('#editATorrentRssProvider :selected').val(); - if (selectedProvider == "addTorrentRss") return; + if (selectedProvider === "addTorrentRss"){ + return; + } var url = $('#torrentrss_url').val(); var cookies = $('#torrentrss_cookies').val(); @@ -416,33 +415,32 @@ $(document).ready(function(){ // When the update botton is clicked, loop through the capabilities list // and copy the selected category id's to the category list on the right. $("#newznab_cap option:selected").each(function(){ - var selected_cat = $(this).val(); - console.debug(selected_cat); - newOptions.push({text: selected_cat, value: selected_cat}); + var selectedCat = $(this).val(); + console.debug(selectedCat); + newOptions.push({text: selectedCat, value: selectedCat}); }); $("#newznab_cat").replaceOptions(newOptions); var selectedProvider = $("#editANewznabProvider :selected").val(); - if (selectedProvider == "addNewznab") + if (selectedProvider === "addNewznab"){ return; + } var url = $('#newznab_url').val(); var key = $('#newznab_key').val(); var cat = $('#newznab_cat option').map(function(i, opt) { return $(opt).text(); - }).toArray().join(','); + }).toArray().join(','); $("#newznab_cat option:not([value])").remove(); $(this).updateProvider(selectedProvider, url, key, cat); - }); $('#newznab_add').click(function(){ - var selectedProvider = $('#editANewznabProvider :selected').val(); var name = $.trim($('#newznab_name').val()); @@ -451,17 +449,12 @@ $(document).ready(function(){ //var cat = $.trim($('#newznab_cat').val()); var cat = $.trim($('#newznab_cat option').map(function(i, opt) { - return $(opt).text();}).toArray().join(',')); - - - if (!name) - return; - - if (!url) - return; + return $(opt).text(); + }).toArray().join(',')); - if (!key) + if (!name || !url || !key) { return; + } var params = {name: name}; @@ -473,7 +466,6 @@ $(document).ready(function(){ } $(this).addProvider(data.success, name, url, key, cat, 0); }); - }); $('.newznab_delete').click(function(){ @@ -546,22 +538,20 @@ $(document).ready(function(){ } }); - $.fn.makeTorrentOptionString = function(provider_id) { - - var seed_ratio = $('.providerDiv_tip #'+provider_id+'_seed_ratio').prop('value'); - var seed_time = $('.providerDiv_tip #'+provider_id+'_seed_time').prop('value'); - var process_met = $('.providerDiv_tip #'+provider_id+'_process_method').prop('value'); - var option_string = $('.providerDiv_tip #'+provider_id+'_option_string'); + $.fn.makeTorrentOptionString = function(providerId) { + var seedRatio = $('.providerDiv_tip #' + providerId + '_seed_ratio').prop('value'); + var seedTime = $('.providerDiv_tip #' + providerId + '_seed_time').prop('value'); + var processMet = $('.providerDiv_tip #' + providerId + '_process_method').prop('value'); + var optionString = $('.providerDiv_tip #' + providerId + '_option_string'); - option_string.val([seed_ratio, seed_time, process_met].join('|')); + optionString.val([seedRatio, seedTime, processMet].join('|')); }; $(this).on('change', '.seed_option', function(){ - var provider_id = $(this).attr('id').split('_')[0]; - $(this).makeTorrentOptionString(provider_id); + var providerId = $(this).attr('id').split('_')[0]; + $(this).makeTorrentOptionString(providerId); }); - $.fn.replaceOptions = function(options) { var self, $option; @@ -569,16 +559,12 @@ $(document).ready(function(){ self = this; $.each(options, function(index, option) { - $option = $("<option></option>") - .attr("value", option.value) - .text(option.text); - self.append($option); + $option = $("<option></option>").attr("value", option.value).text(option.text); + self.append($option); }); - }; + }; // initialization stuff - - $.fn.newznabProvidersCapabilities = []; $(this).showHideProviders(); @@ -595,5 +581,4 @@ $(document).ready(function(){ if ($('#editANewznabProvider').length) { $(this).populateNewznabSection(); } - }); -- GitLab From 8c60b698794ae7feeb828c2c8eebb326d5df7855 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 13:57:10 +1030 Subject: [PATCH 146/215] linted mako --- gui/slick/views/layouts/main.mako | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index 4dbb89fe3..4f31742ee 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -85,13 +85,12 @@ <link rel="stylesheet" type="text/css" href="${srRoot}/css/style.css?${sbPID}"/> <link rel="stylesheet" type="text/css" href="${srRoot}/css/${sickbeard.THEME_NAME}.css?${sbPID}" /> <link rel="stylesheet" type="text/css" href="${srRoot}/css/print.css?${sbPID}" /> - % if sbLogin: + % if srLogin: <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/pnotify.custom.min.css?${sbPID}" /> <link rel="stylesheet" type="text/css" href="${srRoot}/css/country-flags.css?${sbPID}"/> % endif <%block name="css" /> </head> - <body> <nav class="navbar navbar-default navbar-fixed-top hidden-print" role="navigation"> <div class="container-fluid"> @@ -105,7 +104,7 @@ <a class="navbar-brand" href="${srRoot}/home/" title="SickRage"><img alt="SickRage" src="${srRoot}/images/sickrage.png" style="height: 50px;" class="img-responsive pull-left" /></a> </div> - % if sbLogin: + % if srLogin: <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> <li id="NAVhome" class="navbar-split dropdown${('', ' active')[topmenu == 'home']}"> @@ -223,7 +222,7 @@ <li><a href="${srRoot}/home/updateCheck?pid=${sbPID}"><i class="menu-icon-update"></i> Check For Updates</a></li> <li><a href="${srRoot}/home/restart/?pid=${sbPID}" class="confirm restart"><i class="menu-icon-restart"></i> Restart</a></li> <li><a href="${srRoot}/home/shutdown/?pid=${sbPID}" class="confirm shutdown"><i class="menu-icon-shutdown"></i> Shutdown</a></li> - % if sbLogin != True: + % if srLogin != True: <li><a href="${srRoot}/logout" class="confirm logout"><i class="menu-icon-shutdown"></i> Logout</a></li> % endif <li role="separator" class="divider"></li> @@ -264,13 +263,13 @@ </div> % endif - % if sickbeard.BRANCH and sickbeard.BRANCH != 'master' and not sickbeard.DEVELOPER and sbLogin: + % if sickbeard.BRANCH and sickbeard.BRANCH != 'master' and not sickbeard.DEVELOPER and srLogin: <div class="alert alert-danger upgrade-notification hidden-print" role="alert"> <span>You're using the ${sickbeard.BRANCH} branch. Please use 'master' unless specifically asked</span> </div> % endif - % if sickbeard.NEWEST_VERSION_STRING and sbLogin: + % if sickbeard.NEWEST_VERSION_STRING and srLogin: <div class="alert alert-success upgrade-notification hidden-print" role="alert"> <span>${sickbeard.NEWEST_VERSION_STRING}</span> </div> @@ -281,7 +280,7 @@ <%block name="content" /> </div> <!-- /content --> </div> <!-- /contentWrapper --> - % if sbLogin: + % if srLogin: <footer> <div class="footer clearfix"> <% -- GitLab From 8c9515e66a26f46c2ddf4aa6df9547b5017e70ca Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 13:58:06 +1030 Subject: [PATCH 147/215] change sbLogin to srLogin --- sickbeard/webserve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index a00506ddd..d685ceab7 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -118,7 +118,7 @@ class PageTemplate(MakoTemplate): self.arguments['sbHandleReverseProxy'] = sickbeard.HANDLE_REVERSE_PROXY self.arguments['sbThemeName'] = sickbeard.THEME_NAME self.arguments['sbDefaultPage'] = sickbeard.DEFAULT_PAGE - self.arguments['sbLogin'] = rh.get_current_user() + self.arguments['srLogin'] = rh.get_current_user() self.arguments['sbStartTime'] = rh.startTime if rh.request.headers['Host'][0] == '[': -- GitLab From 4566d2c8eb37d10d17ef36518fb822bf8f7b126d Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 23:27:20 -0500 Subject: [PATCH 148/215] PEP 8: Convert tabbedindents to spaces --- sickbeard/name_parser/regexes.py | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/sickbeard/name_parser/regexes.py b/sickbeard/name_parser/regexes.py index 432da8ed1..768ac82be 100644 --- a/sickbeard/name_parser/regexes.py +++ b/sickbeard/name_parser/regexes.py @@ -116,7 +116,7 @@ normal_regexes = [ '''), ('newpct', - # Example: Sobrenatural - Temporada 10 [HDTV][Cap.1023][Espanol Castellano] + # Example: Sobrenatural - Temporada 10 [HDTV][Cap.1023][Espanol Castellano] r''' (?P<series_name>.+?) # Showw_Name: "Sobrenatural" (?:.-.+\d{1,2}.\[) # Separator and junk: " - Temporada 10 [" @@ -147,7 +147,7 @@ normal_regexes = [ ((?<![. _-])(?<!WEB) # Make sure this is really the release group -(?P<release_group>[^- ]+([. _-]\[.*\])?))?)?$ # Group ''' - ), + ), ('no_season_multi_ep', # Show.Name.E02-03 @@ -162,7 +162,7 @@ normal_regexes = [ ((?<![. _-])(?<!WEB) # Make sure this is really the release group -(?P<release_group>[^- ]+([. _-]\[.*\])?))?)?$ # Group ''' - ), + ), ('no_season_general', # Show.Name.E23.Test @@ -180,7 +180,7 @@ normal_regexes = [ ((?<![. _-])(?<!WEB) # Make sure this is really the release group -(?P<release_group>[^- ]+([. _-]\[.*\])?))?)?$ # Group ''' - ), + ), ('no_season', # Show Name - 01 - Ep Name @@ -195,7 +195,7 @@ normal_regexes = [ ((?<![. _-])(?<!WEB) # Make sure this is really the release group -(?P<release_group>[^- ]+([. _-]\[.*\])?))?)?$ # Group ''' - ), + ), ('bare', # Show.Name.102.Source.Quality.Etc-Group @@ -239,14 +239,14 @@ anime_regexes = [ # [ISLAND]One_Piece_679_[VOSTFR]_[8bit]_[720p]_[EB7838FC].mp4 r''' ^\[(?P<release_group>ISLAND?)\] # Release Group - (?P<series_name>.+?)[ ._-]+ # Show_Name and separator - (?P<ep_ab_num>\d{1,3})[ ._-]+ # Episode number - (\[VOSTFR\]) - ([ ._-]+\[[vV](?P<version>[0-9])\])*[ ._-]+ # Version - (\[(8bit|10bit)\])?[ ._-]+ - \[(?P<extra_info>(\d{3,4}[xp]?\d{0,4})?[\.\w\s-]*)\][ ._-]+ # Extra info - (\[(?P<crc>\w{8})\])? # CRC - .*? + (?P<series_name>.+?)[ ._-]+ # Show_Name and separator + (?P<ep_ab_num>\d{1,3})[ ._-]+ # Episode number + (\[VOSTFR\]) + ([ ._-]+\[[vV](?P<version>[0-9])\])*[ ._-]+ # Version + (\[(8bit|10bit)\])?[ ._-]+ + \[(?P<extra_info>(\d{3,4}[xp]?\d{0,4})?[\.\w\s-]*)\][ ._-]+ # Extra info + (\[(?P<crc>\w{8})\])? # CRC + .*? '''), ('anime_Kaerizaki-Fansub', @@ -354,7 +354,7 @@ anime_regexes = [ .*? ''' - ), + ), ('anime_and_normal_x', # Bleach - s16e03-04 - 313-314 @@ -373,7 +373,7 @@ anime_regexes = [ .*? ''' - ), + ), ('anime_and_normal_reverse', # Bleach - 313-314 - s16e03-04 @@ -389,7 +389,7 @@ anime_regexes = [ (?P<extra_ep_num>\d+))* # additional E03/etc .*? ''' - ), + ), ('anime_and_normal_front', # 165.Naruto Shippuuden.s08e014 @@ -404,7 +404,7 @@ anime_regexes = [ (?P<extra_ep_num>\d+))* # additional E03/etc .*? ''' - ), + ), ('anime_ep_name', r''' @@ -418,7 +418,7 @@ anime_regexes = [ (?:\[(?P<crc>\w{8})\])? .*? ''' - ), + ), ('anime_WarB3asT', # 003. Show Name - Ep Name.ext -- GitLab From 34a1d21b042698c1ba2c7696d1eef9454fe515ee Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 23:27:38 -0500 Subject: [PATCH 149/215] PEP 263: Add encoding declaration --- sickbeard/name_parser/regexes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/name_parser/regexes.py b/sickbeard/name_parser/regexes.py index 768ac82be..b2beb6882 100644 --- a/sickbeard/name_parser/regexes.py +++ b/sickbeard/name_parser/regexes.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 38244917caa09601dfcd3c81926ffed3ff2c9b62 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 23:07:19 -0500 Subject: [PATCH 150/215] PEP 8: Convert None comparisons from operators to 'is / is not None' --- sickbeard/name_parser/parser.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index cd5bc886d..e4e665212 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -346,7 +346,7 @@ class NameParser(object): b = getattr(second, attr) # if a is good use it - if a != None or (isinstance(a, list) and a): + if a is not None or (isinstance(a, list) and a): return a # if not use b (if b isn't set it'll just be default) else: @@ -459,7 +459,7 @@ class NameParser(object): "Unable to parse " + name.encode(sickbeard.SYS_ENCODING, 'xmlcharrefreplace')) # if there's no useful info in it then raise an exception - if final_result.season_number == None and not final_result.episode_numbers and final_result.air_date == None and not final_result.ab_episode_numbers and not final_result.series_name: + if final_result.season_number is None and not final_result.episode_numbers and final_result.air_date is None and not final_result.ab_episode_numbers and not final_result.series_name: raise InvalidNameException("Unable to parse " + name.encode(sickbeard.SYS_ENCODING, 'xmlcharrefreplace')) if cache_result: @@ -545,11 +545,11 @@ class ParseResult(object): return True def __str__(self): - if self.series_name != None: + if self.series_name is not None: to_return = self.series_name + u' - ' else: to_return = u'' - if self.season_number != None: + if self.season_number is not None: to_return += 'S' + str(self.season_number).zfill(2) if self.episode_numbers and len(self.episode_numbers): for e in self.episode_numbers: -- GitLab From 54edd2923589b40cc2df2babe0e49bac29a2df6b Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 23:20:56 -0500 Subject: [PATCH 151/215] PEP 8: Fix indentation --- sickbeard/name_parser/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index e4e665212..eb2f92bab 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -483,7 +483,7 @@ class ParseResult(object): score=None, quality=None, version=None - ): + ): self.original_name = original_name -- GitLab From 1bfa2e5b86299dffc90fb194d96ed5054976925f Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 23:08:10 -0500 Subject: [PATCH 152/215] PEP 263: Add encoding declaration --- sickbeard/name_parser/parser.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sickbeard/name_parser/parser.py b/sickbeard/name_parser/parser.py index eb2f92bab..9ea8bbe61 100644 --- a/sickbeard/name_parser/parser.py +++ b/sickbeard/name_parser/parser.py @@ -1,3 +1,5 @@ +# coding=utf-8 + # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # -- GitLab From 1c96df573d86df510cedfa14d99f491a4906d45b Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 20:42:26 -0800 Subject: [PATCH 153/215] make sure images and nzb data is downloaded as bytes instead of unicode --- sickbeard/metadata/helpers.py | 2 +- sickbeard/nzbSplitter.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sickbeard/metadata/helpers.py b/sickbeard/metadata/helpers.py index e93cbd11c..c952c6644 100644 --- a/sickbeard/metadata/helpers.py +++ b/sickbeard/metadata/helpers.py @@ -37,7 +37,7 @@ def getShowImage(url, imgNum=None): logger.log(u"Fetching image from " + tempURL, logger.DEBUG) - image_data = helpers.getURL(tempURL, session=meta_session) + image_data = helpers.getURL(tempURL, session=meta_session, needBytes=True) if image_data is None: logger.log(u"There was an error trying to retrieve the image, aborting", logger.WARNING) return diff --git a/sickbeard/nzbSplitter.py b/sickbeard/nzbSplitter.py index 8c547270b..56b2d5418 100644 --- a/sickbeard/nzbSplitter.py +++ b/sickbeard/nzbSplitter.py @@ -128,7 +128,7 @@ def splitResult(result): :param result: search result object :return: False upon failure, a list of episode objects otherwise """ - urlData = helpers.getURL(result.url, session=requests.Session()) + urlData = helpers.getURL(result.url, session=requests.Session(), needBytes=True) if urlData is None: logger.log(u"Unable to load url " + result.url + ", can't download season NZB", logger.ERROR) return False -- GitLab From 1edc4f219cccbf8614549fbbcaa08b32d0e96fdb Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 22:37:42 -0800 Subject: [PATCH 154/215] Switch open for io.open, remove ek/ss from generic.metadata --- sickbeard/helpers.py | 19 ++-- sickbeard/metadata/generic.py | 154 ++++++++++++++---------------- sickbeard/metadata/mede8er.py | 14 +-- sickbeard/metadata/tivo.py | 6 +- sickbeard/providers/rsstorrent.py | 4 +- 5 files changed, 97 insertions(+), 100 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index cd00ca565..3569f1ac8 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -20,6 +20,7 @@ import os +import io import ctypes import random import re @@ -948,6 +949,9 @@ def create_https_certificates(ssl_cert, ssl_key): :return: True on success, False on failure """ + assert isinstance(ssl_key, unicode) + assert isinstance(ssl_cert, unicode) + try: from OpenSSL import crypto # @UnresolvedImport from certgen import createKeyPair, createCertRequest, createCertificate, TYPE_RSA, \ @@ -970,8 +974,8 @@ def create_https_certificates(ssl_cert, ssl_key): try: # pylint: disable=E1101 # Module has no member - open(ssl_key, 'w').write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) - open(ssl_cert, 'w').write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + io.open(ssl_key, 'w').write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + io.open(ssl_cert, 'w').write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) except Exception: logger.log(u"Error creating SSL key and certificate", logger.ERROR) return False @@ -1091,8 +1095,10 @@ def md5_for_file(filename, block_size=2 ** 16): :return MD5 hexdigest on success, or None on failure """ + assert isinstance(filename, unicode) + try: - with open(filename, 'rb') as f: + with io.open(filename, 'rb') as f: md5 = hashlib.md5() while True: data = f.read(block_size) @@ -1660,7 +1666,7 @@ def download_file(url, filename, session=None, headers=None): return False try: - with open(filename, 'wb') as fp: + with io.open(filename, 'wb') as fp: for chunk in resp.iter_content(chunk_size=1024): if chunk: fp.write(chunk) @@ -1866,12 +1872,13 @@ def isFileLocked(checkfile, writeLockCheck=False): :param writeLockCheck: when true will check if the file is locked for writing (prevents move operations) """ - checkfile = ek(os.path.abspath, checkfile) + checkfile = os.path.abspath(checkfile) + assert isinstance(checkfile, unicode) if not os.path.exists(checkfile): return True try: - f = open(checkfile, 'r') + f = io.open(checkfile, 'rb') f.close() except IOError: return True diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index a49389f01..2738e982e 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -19,7 +19,8 @@ # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import os.path +import os +import io import re try: @@ -33,7 +34,6 @@ from sickbeard import helpers from sickbeard import logger from sickbeard.metadata import helpers as metadata_helpers from sickbeard.show_name_helpers import allPossibleShowNames -from sickrage.helper.encoding import ek, ss from sickrage.helper.exceptions import ex from tmdb_api.tmdb_api import TMDB @@ -63,17 +63,17 @@ class GenericMetadata(object): season_posters=False, season_banners=False, season_all_poster=False, season_all_banner=False): - self.name = "Generic" + self.name = u"Generic" - self._ep_nfo_extension = "nfo" - self._show_metadata_filename = "tvshow.nfo" + self._ep_nfo_extension = u"nfo" + self._show_metadata_filename = u"tvshow.nfo" - self.fanart_name = "fanart.jpg" - self.poster_name = "poster.jpg" - self.banner_name = "banner.jpg" + self.fanart_name = u"fanart.jpg" + self.poster_name = u"poster.jpg" + self.banner_name = u"banner.jpg" - self.season_all_poster_name = "season-all-poster.jpg" - self.season_all_banner_name = "season-all-banner.jpg" + self.season_all_poster_name = u"season-all-poster.jpg" + self.season_all_banner_name = u"season-all-banner.jpg" self.show_metadata = show_metadata self.episode_metadata = episode_metadata @@ -90,7 +90,7 @@ class GenericMetadata(object): config_list = [self.show_metadata, self.episode_metadata, self.fanart, self.poster, self.banner, self.episode_thumbnails, self.season_posters, self.season_banners, self.season_all_poster, self.season_all_banner] - return '|'.join([str(int(x)) for x in config_list]) + return u'|'.join([str(int(x)) for x in config_list]) def get_id(self): return GenericMetadata.makeID(self.name) @@ -114,78 +114,59 @@ class GenericMetadata(object): self.season_all_poster = config_list[8] self.season_all_banner = config_list[9] + @staticmethod + def _check_exists(location): + if location: + assert isinstance(location, unicode) + result = os.path.isfile(location) + logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) + return result + return False + def _has_show_metadata(self, show_obj): - result = ek(os.path.isfile, self.get_show_file_path(show_obj)) - logger.log(u"Checking if " + self.get_show_file_path(show_obj) + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_show_file_path(show_obj)) def _has_episode_metadata(self, ep_obj): - result = ek(os.path.isfile, self.get_episode_file_path(ep_obj)) - logger.log(u"Checking if " + self.get_episode_file_path(ep_obj) + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_episode_file_path(ep_obj)) def _has_fanart(self, show_obj): - result = ek(os.path.isfile, self.get_fanart_path(show_obj)) - logger.log(u"Checking if " + self.get_fanart_path(show_obj) + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_fanart_path(show_obj)) def _has_poster(self, show_obj): - result = ek(os.path.isfile, self.get_poster_path(show_obj)) - logger.log(u"Checking if " + self.get_poster_path(show_obj) + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_poster_path(show_obj)) def _has_banner(self, show_obj): - result = ek(os.path.isfile, self.get_banner_path(show_obj)) - logger.log(u"Checking if " + self.get_banner_path(show_obj) + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_banner_path(show_obj)) def _has_episode_thumb(self, ep_obj): - location = self.get_episode_thumb_path(ep_obj) - result = location is not None and ek(os.path.isfile, location) - if location: - logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_episode_thumb_path(ep_obj)) def _has_season_poster(self, show_obj, season): - location = self.get_season_poster_path(show_obj, season) - result = location is not None and ek(os.path.isfile, location) - if location: - logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_season_poster_path(show_obj, season)) def _has_season_banner(self, show_obj, season): - location = self.get_season_banner_path(show_obj, season) - result = location is not None and ek(os.path.isfile, location) - if location: - logger.log(u"Checking if " + location + " exists: " + str(result), logger.DEBUG) - return result + return self._check_exists(self.get_season_banner_path(show_obj, season)) def _has_season_all_poster(self, show_obj): - result = ek(os.path.isfile, self.get_season_all_poster_path(show_obj)) - logger.log(u"Checking if " + self.get_season_all_poster_path(show_obj) + " exists: " + str(result), - logger.DEBUG) - return result + return self._check_exists(self.get_season_all_poster_path(show_obj)) def _has_season_all_banner(self, show_obj): - result = ek(os.path.isfile, self.get_season_all_banner_path(show_obj)) - logger.log(u"Checking if " + self.get_season_all_banner_path(show_obj) + " exists: " + str(result), - logger.DEBUG) - return result + return self._check_exists(self.get_season_all_banner_path(show_obj)) def get_show_file_path(self, show_obj): - return ek(os.path.join, show_obj.location, self._show_metadata_filename) + return os.path.join(show_obj.location, self._show_metadata_filename) def get_episode_file_path(self, ep_obj): - return ek(helpers.replaceExtension, ep_obj.location, self._ep_nfo_extension) + return helpers.replaceExtension(ep_obj.location, self._ep_nfo_extension) def get_fanart_path(self, show_obj): - return ek(os.path.join, show_obj.location, self.fanart_name) + return os.path.join(show_obj.location, self.fanart_name) def get_poster_path(self, show_obj): - return ek(os.path.join, show_obj.location, self.poster_name) + return os.path.join(show_obj.location, self.poster_name) def get_banner_path(self, show_obj): - return ek(os.path.join, show_obj.location, self.banner_name) + return os.path.join(show_obj.location, self.banner_name) @staticmethod def get_episode_thumb_path(ep_obj): @@ -193,7 +174,8 @@ class GenericMetadata(object): Returns the path where the episode thumbnail should be stored. ep_obj: a TVEpisode instance for which to create the thumbnail """ - if ek(os.path.isfile, ep_obj.location): + assert isinstance(ep_obj.location, unicode) + if os.path.isfile(ep_obj.location): tbn_filename = ep_obj.location.rpartition(".") @@ -222,7 +204,7 @@ class GenericMetadata(object): else: season_poster_filename = 'season' + str(season).zfill(2) - return ek(os.path.join, show_obj.location, season_poster_filename + '-poster.jpg') + return os.path.join(show_obj.location, season_poster_filename + '-poster.jpg') @staticmethod def get_season_banner_path(show_obj, season): @@ -240,13 +222,13 @@ class GenericMetadata(object): else: season_banner_filename = 'season' + str(season).zfill(2) - return ek(os.path.join, show_obj.location, season_banner_filename + '-banner.jpg') + return os.path.join(show_obj.location, season_banner_filename + '-banner.jpg') def get_season_all_poster_path(self, show_obj): - return ek(os.path.join, show_obj.location, self.season_all_poster_name) + return os.path.join(show_obj.location, self.season_all_poster_name) def get_season_all_banner_path(self, show_obj): - return ek(os.path.join, show_obj.location, self.season_all_banner_name) + return os.path.join(show_obj.location, self.season_all_banner_name) # pylint: disable=W0613,R0201 def _show_data(self, show_obj): @@ -284,8 +266,10 @@ class GenericMetadata(object): logger.DEBUG) nfo_file_path = self.get_show_file_path(show_obj) + assert isinstance(nfo_file_path, unicode) + try: - with open(nfo_file_path, 'r') as xmlFileObj: + with io.open(nfo_file_path, 'r', encoding='utf-8') as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) indexerid = showXML.find('id') @@ -415,19 +399,20 @@ class GenericMetadata(object): return False nfo_file_path = self.get_show_file_path(show_obj) - nfo_file_dir = ek(os.path.dirname, nfo_file_path) + assert isinstance(nfo_file_path, unicode) + + nfo_file_dir = os.path.dirname(nfo_file_path) try: - if not ek(os.path.isdir, nfo_file_dir): + if not os.path.isdir(nfo_file_dir): logger.log(u"Metadata dir didn't exist, creating it at " + nfo_file_dir, logger.DEBUG) - ek(os.makedirs, nfo_file_dir) + os.makedirs(nfo_file_dir) helpers.chmodAsParent(nfo_file_dir) logger.log(u"Writing show nfo file to " + nfo_file_path, logger.DEBUG) - nfo_file = open(nfo_file_path, 'w') - - data.write(nfo_file, encoding="utf-8") + nfo_file = io.open(nfo_file_path, 'wb') + data.write(nfo_file) nfo_file.close() helpers.chmodAsParent(nfo_file_path) except IOError, e: @@ -460,19 +445,18 @@ class GenericMetadata(object): return False nfo_file_path = self.get_episode_file_path(ep_obj) - nfo_file_dir = ek(os.path.dirname, nfo_file_path) + assert isinstance(nfo_file_path, unicode) + nfo_file_dir = os.path.dirname(nfo_file_path) try: - if not ek(os.path.isdir, nfo_file_dir): + if not os.path.isdir(nfo_file_dir): logger.log(u"Metadata dir didn't exist, creating it at " + nfo_file_dir, logger.DEBUG) - ek(os.makedirs, nfo_file_dir) + os.makedirs(nfo_file_dir) helpers.chmodAsParent(nfo_file_dir) logger.log(u"Writing episode nfo file to " + nfo_file_path, logger.DEBUG) - - nfo_file = open(nfo_file_path, 'w') - - data.write(nfo_file, encoding="utf-8") + nfo_file = io.open(nfo_file_path, 'wb') + data.write(nfo_file) nfo_file.close() helpers.chmodAsParent(nfo_file_path) except IOError, e: @@ -700,24 +684,26 @@ class GenericMetadata(object): image_path: file location to save the image to """ + assert isinstance(image_path, unicode) + # don't bother overwriting it - if ek(os.path.isfile, image_path): + if os.path.isfile(image_path): logger.log(u"Image already exists, not downloading", logger.DEBUG) return False - image_dir = ek(os.path.dirname, image_path) + image_dir = os.path.dirname(image_path) if not image_data: - logger.log(u"Unable to retrieve image to save in %s, skipping" % (ss(image_path)), logger.DEBUG) + logger.log(u"Unable to retrieve image to save in %s, skipping" % image_path, logger.DEBUG) return False try: - if not ek(os.path.isdir, image_dir): + if not os.path.isdir(image_dir): logger.log(u"Metadata dir didn't exist, creating it at " + image_dir, logger.DEBUG) - ek(os.makedirs, image_dir) + os.makedirs(image_dir) helpers.chmodAsParent(image_dir) - outFile = open(image_path, 'wb') + outFile = io.open(image_path, 'wb') outFile.write(image_data) outFile.close() helpers.chmodAsParent(image_path) @@ -918,16 +904,18 @@ class GenericMetadata(object): empty_return = (None, None, None) - metadata_path = ek(os.path.join, folder, self._show_metadata_filename) + assert isinstance(folder, unicode) + + metadata_path = os.path.join(folder, self._show_metadata_filename) - if not ek(os.path.isdir, folder) or not ek(os.path.isfile, metadata_path): - logger.log(u"Can't load the metadata file from " + repr(metadata_path) + ", it doesn't exist", logger.DEBUG) + if not os.path.isdir(folder) or not os.path.isfile(metadata_path): + logger.log(u"Can't load the metadata file from " + metadata_path + ", it doesn't exist", logger.DEBUG) return empty_return logger.log(u"Loading show info from metadata file in " + folder, logger.DEBUG) try: - with open(metadata_path, 'r') as xmlFileObj: + with io.open(metadata_path, 'r', encoding='utf-8') as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) if showXML.findtext('title') is None or (showXML.findtext('tvdbid') is None and showXML.findtext('id') is None): diff --git a/sickbeard/metadata/mede8er.py b/sickbeard/metadata/mede8er.py index 36609fde1..654465e11 100644 --- a/sickbeard/metadata/mede8er.py +++ b/sickbeard/metadata/mede8er.py @@ -18,14 +18,14 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +import io +import os import datetime -import os.path import sickbeard - +from sickbeard import logger, helpers from sickbeard.metadata import mediabrowser -from sickbeard import logger, helpers from sickrage.helper.common import dateFormat from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex, ShowNotFoundException @@ -379,9 +379,9 @@ class Mede8erMetadata(mediabrowser.MediaBrowserMetadata): logger.log(u"Writing show nfo file to " + nfo_file_path, logger.DEBUG) - nfo_file = open(nfo_file_path, 'w') + nfo_file = io.open(nfo_file_path, 'wb') - data.write(nfo_file, encoding="UTF-8") + data.write(nfo_file) nfo_file.close() helpers.chmodAsParent(nfo_file_path) except IOError, e: @@ -424,9 +424,9 @@ class Mede8erMetadata(mediabrowser.MediaBrowserMetadata): logger.log(u"Writing episode nfo file to " + nfo_file_path, logger.DEBUG) - nfo_file = open(nfo_file_path, 'w') + nfo_file = io.open(nfo_file_path, 'wb') - data.write(nfo_file, encoding="UTF-8") + data.write(nfo_file) nfo_file.close() helpers.chmodAsParent(nfo_file_path) except IOError, e: diff --git a/sickbeard/metadata/tivo.py b/sickbeard/metadata/tivo.py index 15420bb73..6d9cd236e 100644 --- a/sickbeard/metadata/tivo.py +++ b/sickbeard/metadata/tivo.py @@ -20,11 +20,11 @@ # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import datetime +import io import os +import datetime import sickbeard - from sickbeard import logger, helpers from sickbeard.metadata import generic from sickrage.helper.encoding import ek @@ -321,7 +321,7 @@ class TIVOMetadata(generic.GenericMetadata): logger.log(u"Writing episode nfo file to " + nfo_file_path, logger.DEBUG) - with open(nfo_file_path, 'w') as nfo_file: + with io.open(nfo_file_path, 'w') as nfo_file: # Calling encode directly, b/c often descriptions have wonky characters. nfo_file.write(data.encode("utf-8")) diff --git a/sickbeard/providers/rsstorrent.py b/sickbeard/providers/rsstorrent.py index 2bdaad283..434174d36 100644 --- a/sickbeard/providers/rsstorrent.py +++ b/sickbeard/providers/rsstorrent.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. +import io import os import re import requests @@ -25,6 +26,7 @@ from sickbeard.providers import generic from sickbeard import helpers from sickbeard import logger from sickbeard import tvcache + from sickrage.helper.encoding import ek from sickrage.helper.exceptions import ex @@ -136,7 +138,7 @@ class TorrentRssProvider(generic.TorrentProvider): dumpName = ek(os.path.join, sickbeard.CACHE_DIR, 'custom_torrent.html') try: - fileOut = open(dumpName, 'wb') + fileOut = io.open(dumpName, 'wb') fileOut.write(data) fileOut.close() helpers.chmodAsParent(dumpName) -- GitLab From 9120677d54d85e874a19ce9da5b98c0f9ee16e20 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 22:43:18 -0800 Subject: [PATCH 155/215] Fix another stdout error --- SickBeard.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index e4d398f9e..2b9ee49b3 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -152,7 +152,7 @@ class SickRage(object): # pylint: disable=E1101 if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING.lower() in ('ansi_x3.4-1968', 'us-ascii', 'ascii', 'charmap') or \ - (sys.platform.startswith('win') and sys.getwindowsversion()[0] >= 6 and str(sys.stdout.encoding).lower() in ('cp65001', 'charmap')): + (sys.platform.startswith('win') and sys.getwindowsversion()[0] >= 6 and getattr(sys.stdout, 'device', sys.stdout).encoding.lower() in ('cp65001', 'charmap')): sickbeard.SYS_ENCODING = 'UTF-8' # Need console logging for SickBeard.py and SickBeard-console.exe @@ -233,7 +233,7 @@ class SickRage(object): else: if self.consoleLogging: - sys.stdout.write("Not running in daemon mode. PID file creation disabled.\n") + sys.stdout.write(u"Not running in daemon mode. PID file creation disabled.\n") self.CREATEPID = False @@ -267,11 +267,11 @@ class SickRage(object): if os.path.exists(restoreDir): success = self.restoreDB(restoreDir, sickbeard.DATA_DIR) if self.consoleLogging: - sys.stdout.write("Restore: restoring DB and config.ini %s!\n" % ("FAILED", "SUCCESSFUL")[success]) + sys.stdout.write(u"Restore: restoring DB and config.ini %s!\n" % ("FAILED", "SUCCESSFUL")[success]) # Load the config and publish it to the sickbeard package if self.consoleLogging and not os.path.isfile(sickbeard.CONFIG_FILE): - sys.stdout.write("Unable to find '" + sickbeard.CONFIG_FILE + "' , all settings will be default!" + "\n") + sys.stdout.write(u"Unable to find '" + sickbeard.CONFIG_FILE + "' , all settings will be default!" + "\n") sickbeard.CFG = ConfigObj(sickbeard.CONFIG_FILE) @@ -377,7 +377,7 @@ class SickRage(object): if pid != 0: os._exit(0) except OSError, e: - sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) + sys.stderr.write(u"fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) sys.exit(1) os.setsid() # @UndefinedVariable - only available in UNIX @@ -395,7 +395,7 @@ class SickRage(object): if pid != 0: os._exit(0) except OSError, e: - sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) + sys.stderr.write(u"fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) sys.exit(1) # Write pid -- GitLab From 638583cab4acfa99250440745158a6afaa975037 Mon Sep 17 00:00:00 2001 From: Labrys <labrys@users.noreply.github.com> Date: Fri, 6 Nov 2015 07:14:12 -0500 Subject: [PATCH 156/215] Convert StatusStrings to a dict subclass --- sickbeard/common.py | 91 ++++++++++++++++++++++++++++++++------------- 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/sickbeard/common.py b/sickbeard/common.py index 846488ff2..bff0bc50e 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -512,39 +512,80 @@ qualityPresetStrings = {SD: "SD", ANY: "Any"} -# pylint: disable=R0903,C1001 -class StatusStrings: +class StatusStrings(dict): + """ + Dictionary containing strings for status codes + + Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until + the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. + + Membership checks using __contains__ (i.e. 'x in y') do not raise a ValueError to match expected dict functionality + """ + # todo: Deprecate StatusStrings().statusStrings and use StatusStrings() directly + # todo: Deprecate .has_key and switch to 'x in y' + # todo: Switch from raising ValueError to a saner KeyError + # todo: Raise KeyError when unable to resolve a missing key instead of returning '' + # todo: Make key of None match dict() functionality def __init__(self): - self.statusStrings = {UNKNOWN: "Unknown", - UNAIRED: "Unaired", - SNATCHED: "Snatched", - DOWNLOADED: "Downloaded", - SKIPPED: "Skipped", - SNATCHED_PROPER: "Snatched (Proper)", - WANTED: "Wanted", - ARCHIVED: "Archived", - IGNORED: "Ignored", - SUBTITLED: "Subtitled", - FAILED: "Failed", - SNATCHED_BEST: "Snatched (Best)"} - - def __getitem__(self, key): - key = int(key) - if key in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: + """ + Initialize status strings + """ + self[UNKNOWN] = "Unknown" + self[UNAIRED] = "Unaired" + self[SNATCHED] = "Snatched" + self[DOWNLOADED] = "Downloaded" + self[SKIPPED] = "Skipped" + self[SNATCHED_PROPER] = "Snatched (Proper)" + self[WANTED] = "Wanted" + self[ARCHIVED] = "Archived" + self[IGNORED] = "Ignored" + self[SUBTITLED] = "Subtitled" + self[FAILED] = "Failed" + self[SNATCHED_BEST] = "Snatched (Best)" + self.statusStrings = dict(self) # for backwards compatibility + + def __missing__(self, key): + """ + If the key is not found, search for the missing key in qualities + + Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until + the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. + """ + key = int(key) # This will raise a ValueError if the key can't be converted to int + + if key in self.keys() + Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: status, quality = Quality.splitCompositeStatus(key) - if quality == Quality.NONE: - return self.statusStrings[status] + if quality == Quality.NONE: # If a Quality is not listed... (shouldn't this be 'if not quality:'?) + return self[status] # ...return the status... else: - return self.statusStrings[status] + " (" + Quality.qualityStrings[quality] + ")" + return self[status] + " (" + Quality.qualityStrings[quality] + ")" # ...otherwise append the quality to the status else: - return self.statusStrings[key] if self.statusStrings.has_key(key) else '' + return '' # return '' to match old functionality when the numeric key is not found + # Keep this until all has_key() checks are converted to 'key in dict' + # or else has_keys() won't search __missing__ for keys def has_key(self, key): - key = int(key) - return key in self.statusStrings or key in Quality.DOWNLOADED + Quality.ARCHIVED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + """ + Override has_key() to test membership using an 'x in y' search + + Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until + the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. + """ + return True if key in self else False # This will raise a ValueError if __missing__ can't convert the key to int def __contains__(self, key): - return self.has_key(key) + """ + Checks for existence of key + + Unlike has_key() and __missing__() this will NOT raise a ValueError to match expected functionality + when checking for 'key in dict' + """ + try: + # if the key is not found in keys() then leverage __missing__ by trying the key directly + return key in self.keys() or self[key] # This will raise a ValueError if __missing__ can't convert the key to int + except ValueError: # The key is not numeric and since we only want numeric keys... + # ...and we don't want this function to fail... + pass # ...suppress the ValueError and do nothing, the key does not exist statusStrings = StatusStrings() -- GitLab From cd8b0a7fc279dcd6bddd03e9a2b5f80d319e2fe2 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sat, 7 Nov 2015 03:31:25 -0500 Subject: [PATCH 157/215] Subclass UserDict instead of dict for StatusStrings --- sickbeard/common.py | 68 ++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/sickbeard/common.py b/sickbeard/common.py index bff0bc50e..9970e285d 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -22,6 +22,7 @@ import operator import platform import re import uuid +from UserDict import UserDict from random import shuffle @@ -512,7 +513,7 @@ qualityPresetStrings = {SD: "SD", ANY: "Any"} -class StatusStrings(dict): +class StatusStrings(UserDict): """ Dictionary containing strings for status codes @@ -526,23 +527,13 @@ class StatusStrings(dict): # todo: Switch from raising ValueError to a saner KeyError # todo: Raise KeyError when unable to resolve a missing key instead of returning '' # todo: Make key of None match dict() functionality - def __init__(self): - """ - Initialize status strings - """ - self[UNKNOWN] = "Unknown" - self[UNAIRED] = "Unaired" - self[SNATCHED] = "Snatched" - self[DOWNLOADED] = "Downloaded" - self[SKIPPED] = "Skipped" - self[SNATCHED_PROPER] = "Snatched (Proper)" - self[WANTED] = "Wanted" - self[ARCHIVED] = "Archived" - self[IGNORED] = "Ignored" - self[SUBTITLED] = "Subtitled" - self[FAILED] = "Failed" - self[SNATCHED_BEST] = "Snatched (Best)" - self.statusStrings = dict(self) # for backwards compatibility + + @property + def statusStrings(self): # for backwards compatibility + return self.data + + def __setitem__(self, key, value): + self.data[int(key)] = value # make sure all keys being assigned values are ints def __missing__(self, key): """ @@ -551,16 +542,16 @@ class StatusStrings(dict): Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. """ - key = int(key) # This will raise a ValueError if the key can't be converted to int - - if key in self.keys() + Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: - status, quality = Quality.splitCompositeStatus(key) - if quality == Quality.NONE: # If a Quality is not listed... (shouldn't this be 'if not quality:'?) - return self[status] # ...return the status... + if isinstance(key, int): # if the key is already an int... + if key in self.keys() + Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: + status, quality = Quality.splitCompositeStatus(key) + if quality == Quality.NONE: # If a Quality is not listed... (shouldn't this be 'if not quality:'?) + return self[status] # ...return the status... + else: + return self[status] + " (" + Quality.qualityStrings[quality] + ")" # ...otherwise append the quality to the status else: - return self[status] + " (" + Quality.qualityStrings[quality] + ")" # ...otherwise append the quality to the status - else: - return '' # return '' to match old functionality when the numeric key is not found + return '' # return '' to match old functionality when the numeric key is not found + return self[int(key)] # Since the key was not an int, let's try int(key) instead # Keep this until all has_key() checks are converted to 'key in dict' # or else has_keys() won't search __missing__ for keys @@ -571,7 +562,7 @@ class StatusStrings(dict): Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. """ - return True if key in self else False # This will raise a ValueError if __missing__ can't convert the key to int + return key in self # This will raise a ValueError if __missing__ can't convert the key to int def __contains__(self, key): """ @@ -581,14 +572,27 @@ class StatusStrings(dict): when checking for 'key in dict' """ try: - # if the key is not found in keys() then leverage __missing__ by trying the key directly - return key in self.keys() or self[key] # This will raise a ValueError if __missing__ can't convert the key to int + # This will raise a ValueError if we can't convert the key to int + return ((int(key) in self.data) or + (int(key) in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED)) except ValueError: # The key is not numeric and since we only want numeric keys... # ...and we don't want this function to fail... pass # ...suppress the ValueError and do nothing, the key does not exist -statusStrings = StatusStrings() - +statusStrings = StatusStrings( + {UNKNOWN: "Unknown", + UNAIRED: "Unaired", + SNATCHED: "Snatched", + DOWNLOADED: "Downloaded", + SKIPPED: "Skipped", + SNATCHED_PROPER: "Snatched (Proper)", + WANTED: "Wanted", + ARCHIVED: "Archived", + IGNORED: "Ignored", + SUBTITLED: "Subtitled", + FAILED: "Failed", + SNATCHED_BEST: "Snatched (Best)" + }) # pylint: disable=R0903,C1001 class Overview: -- GitLab From b45b3bcd0f549e931ec1b8a68e4073318662374f Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 7 Nov 2015 23:45:33 -0800 Subject: [PATCH 158/215] Fix unicode in nfo's, clean up some log spam --- sickbeard/metadata/generic.py | 13 ++++++------- sickbeard/tv.py | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/sickbeard/metadata/generic.py b/sickbeard/metadata/generic.py index 2738e982e..5e570fd8f 100644 --- a/sickbeard/metadata/generic.py +++ b/sickbeard/metadata/generic.py @@ -269,7 +269,7 @@ class GenericMetadata(object): assert isinstance(nfo_file_path, unicode) try: - with io.open(nfo_file_path, 'r', encoding='utf-8') as xmlFileObj: + with io.open(nfo_file_path, 'rb') as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) indexerid = showXML.find('id') @@ -283,7 +283,7 @@ class GenericMetadata(object): # Make it purdy helpers.indentXML(root) - showXML.write(nfo_file_path) + showXML.write(nfo_file_path, encoding='UTF-8') helpers.chmodAsParent(nfo_file_path) return True @@ -331,10 +331,9 @@ class GenericMetadata(object): def create_season_banners(self, show_obj): if self.season_banners and show_obj: result = [] + logger.log(u"Metadata provider " + self.name + " creating season banners for " + show_obj.name, logger.DEBUG) for season, _ in show_obj.episodes.iteritems(): # @UnusedVariable if not self._has_season_banner(show_obj, season): - logger.log(u"Metadata provider " + self.name + " creating season banners for " + show_obj.name, - logger.DEBUG) result = result + [self.save_season_banners(show_obj, season)] return all(result) return False @@ -412,7 +411,7 @@ class GenericMetadata(object): logger.log(u"Writing show nfo file to " + nfo_file_path, logger.DEBUG) nfo_file = io.open(nfo_file_path, 'wb') - data.write(nfo_file) + data.write(nfo_file, encoding='UTF-8') nfo_file.close() helpers.chmodAsParent(nfo_file_path) except IOError, e: @@ -456,7 +455,7 @@ class GenericMetadata(object): logger.log(u"Writing episode nfo file to " + nfo_file_path, logger.DEBUG) nfo_file = io.open(nfo_file_path, 'wb') - data.write(nfo_file) + data.write(nfo_file, encoding='UTF-8') nfo_file.close() helpers.chmodAsParent(nfo_file_path) except IOError, e: @@ -915,7 +914,7 @@ class GenericMetadata(object): logger.log(u"Loading show info from metadata file in " + folder, logger.DEBUG) try: - with io.open(metadata_path, 'r', encoding='utf-8') as xmlFileObj: + with io.open(metadata_path, 'rb') as xmlFileObj: showXML = etree.ElementTree(file=xmlFileObj) if showXML.findtext('title') is None or (showXML.findtext('tvdbid') is None and showXML.findtext('id') is None): diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 05e035b20..3d84b9808 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -1142,10 +1142,10 @@ class TVShow(object): def saveToDB(self, forceSave=False): if not self.dirty and not forceSave: - logger.log(str(self.indexerid) + ": Not saving show to db - record is not dirty", logger.DEBUG) + # logger.log(str(self.indexerid) + ": Not saving show to db - record is not dirty", logger.DEBUG) return - logger.log(str(self.indexerid) + u": Saving show info to database", logger.DEBUG) + logger.log(u"%i: Saving to database: %s" % (self.indexerid, self.name), logger.DEBUG) controlValueDict = {"indexer_id": self.indexerid} newValueDict = {"indexer": self.indexer, @@ -1949,13 +1949,9 @@ class TVEpisode(object): """ if not self.dirty and not forceSave: - logger.log(str(self.show.indexerid) + u": Not saving episode to db - record is not dirty", logger.DEBUG) + # logger.log(str(self.show.indexerid) + u": Not saving episode to db - record is not dirty", logger.DEBUG) return - logger.log(str(self.show.indexerid) + u": Saving episode details to database", logger.DEBUG) - - logger.log(u"STATUS IS " + str(self.status), logger.DEBUG) - newValueDict = {"indexerid": self.indexerid, "indexer": self.indexer, "name": self.name, @@ -1979,6 +1975,9 @@ class TVEpisode(object): "season": self.season, "episode": self.episode} + # logger.log(u"%s: Saving episode details to database %rx%r: %s" % + # (self.show.indexerid, self.season, self.episode, statusStrings[self.status]), logger.DEBUG) + # use a custom update/insert method to get the data into the DB myDB = db.DBConnection() myDB.upsert("tv_episodes", newValueDict, controlValueDict) -- GitLab From 29cc94b08ab36572540ae81f4c7ae344fd3f95dd Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 19:02:50 +1030 Subject: [PATCH 159/215] lint js --- gui/slick/js/configProviders.js | 70 +++++++++++-------------- gui/slick/js/configSearch.js | 74 ++++++++++++--------------- gui/slick/js/manageEpisodeStatuses.js | 38 ++++++-------- gui/slick/js/restart.js | 36 ++++++------- 4 files changed, 98 insertions(+), 120 deletions(-) diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js index 4bdce6496..2f6e1bc1f 100644 --- a/gui/slick/js/configProviders.js +++ b/gui/slick/js/configProviders.js @@ -12,6 +12,18 @@ $(document).ready(function(){ }); }; + var ifExists = function(loopThroughArray, searchFor) { + var found = false; + + loopThroughArray.forEach(function(rootObject) { + if (rootObject.name === searchFor) { + found = true; + } + console.log(rootObject.name + " while searching for: "+ searchFor); + }); + return found; + }; + /** * Gets categories for the provided newznab provider. * @param {String} isDefault @@ -29,21 +41,18 @@ $(document).ready(function(){ } var params = {url: url, name: name, key: key}; - var returnData; $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); - var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, - function(data){ - $(this).updateNewznabCaps( data, selectedProvider ); - console.debug(data.tv_categories); // jshint ignore:line - }); + var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ + $(this).updateNewznabCaps( data, selectedProvider ); + console.debug(data.tv_categories); // jshint ignore:line + }); jqxhr.always(function() { $(".updating_categories").empty(); - }); + }); }; $.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) { - url = $.trim(url); if (!url) { return; @@ -76,7 +85,6 @@ $(document).ready(function(){ }; $.fn.addTorrentRssProvider = function (id, name, url, cookies, titleTAG) { - var newData = [name, url, cookies, titleTAG]; torrentRssProviders[id] = newData; @@ -84,9 +92,7 @@ $(document).ready(function(){ $(this).populateTorrentRssSection(); if ($('#provider_order_list > #'+id).length === 0) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; - - $('#provider_order_list').append(toAdd); + $('#provider_order_list').append('<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'); $('#provider_order_list').sortable("refresh"); } @@ -131,6 +137,7 @@ $(document).ready(function(){ var selectedProvider = $('#editANewznabProvider :selected').val(); var data = ''; var isDefault = ''; + var rrcat = ''; if (selectedProvider === 'addNewznab') { data = ['','','']; @@ -207,18 +214,6 @@ $(document).ready(function(){ } }; - ifExists = function(loopThroughArray, searchFor) { - var found = false; - - loopThroughArray.forEach(function(rootObject) { - if (rootObject.name === searchFor) { - found = true; - } - console.log(rootObject.name + " while searching for: "+ searchFor); - }); - return found; - }; - /** * Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name * and category capabilities. Return @@ -296,7 +291,7 @@ $(document).ready(function(){ $.fn.makeTorrentRssProviderString = function() { var provStrings = []; for (var id in torrentRssProviders) { - if (obj.hasOwnProperty(id)) { + if (torrentRssProviders.hasOwnProperty(id)) { provStrings.push(torrentRssProviders[id].join('|')); } } @@ -441,8 +436,6 @@ $(document).ready(function(){ $('#newznab_add').click(function(){ - var selectedProvider = $('#editANewznabProvider :selected').val(); - var name = $.trim($('#newznab_name').val()); var url = $.trim($('#newznab_url').val()); var key = $.trim($('#newznab_key').val()); @@ -474,8 +467,6 @@ $(document).ready(function(){ }); $('#torrentrss_add').click(function(){ - var selectedProvider = $('#editATorrentRssProvider :selected').val(); - var name = $('#torrentrss_name').val(); var url = $('#torrentrss_url').val(); var cookies = $('#torrentrss_cookies').val(); @@ -483,25 +474,22 @@ $(document).ready(function(){ var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG}; // send to the form with ajax, get a return value - $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, - function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } + $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } - $(this).addTorrentRssProvider(data.success, name, url, cookies, titleTAG); - $(this).refreshEditAProvider(); + $(this).addTorrentRssProvider(data.success, name, url, cookies, titleTAG); + $(this).refreshEditAProvider(); }); }); $('.torrentrss_delete').on('click', function(){ - var selectedProvider = $('#editATorrentRssProvider :selected').val(); - $(this).deleteTorrentRssProvider(selectedProvider); + $(this).deleteTorrentRssProvider($('#editATorrentRssProvider :selected').val()); $(this).refreshEditAProvider(); }); - $(this).on('change', "[class='providerDiv_tip'] input", function(){ $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").replaceWith($(this).clone()); $('div .providerDiv ' + "[newznab_name=" + $(this).attr('id') + "]").replaceWith($(this).clone()); @@ -571,7 +559,7 @@ $(document).ready(function(){ $("#provider_order_list").sortable({ placeholder: 'ui-state-highlight', - update: function (event, ui) { + update: function () { $(this).refreshProviderList(); } }); diff --git a/gui/slick/js/configSearch.js b/gui/slick/js/configSearch.js index efe80fb9b..defb6407a 100644 --- a/gui/slick/js/configSearch.js +++ b/gui/slick/js/configSearch.js @@ -1,7 +1,7 @@ $(document).ready(function(){ var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; - function toggle_torrent_title(){ + function toggleTorrentTitle(){ if ($('#use_torrents').prop('checked')){ $('#no_torrents').show(); } else { @@ -9,37 +9,37 @@ $(document).ready(function(){ } } - $.fn.nzb_method_handler = function() { + $.fn.nzbMethodHandler = function() { var selectedProvider = $('#nzb_method :selected').val(), - blackhole_settings = '#blackhole_settings', - sabnzbd_settings = '#sabnzbd_settings', + blackholeSettings = '#blackhole_settings', + sabnzbdSettings = '#sabnzbd_settings', testSABnzbd = '#testSABnzbd', - testSABnzbd_result = '#testSABnzbd_result', - nzbget_settings = '#nzbget_settings'; + testSABnzbdResult = '#testSABnzbd_result', + nzbgetSettings = '#nzbget_settings'; - $(blackhole_settings).hide(); - $(sabnzbd_settings).hide(); + $(blackholeSettings).hide(); + $(sabnzbdSettings).hide(); $(testSABnzbd).hide(); - $(testSABnzbd_result).hide(); - $(nzbget_settings).hide(); + $(testSABnzbdResult).hide(); + $(nzbgetSettings).hide(); - if ('blackhole' == selectedProvider) { - $(blackhole_settings).show(); - } else if ('nzbget' == selectedProvider) { - $(nzbget_settings).show(); + if (selectedProvider.toLowerCase() === 'blackhole') { + $(blackholeSettings).show(); + } else if (selectedProvider.toLowerCase() === 'nzbget') { + $(nzbgetSettings).show(); } else { - $(sabnzbd_settings).show(); + $(sabnzbdSettings).show(); $(testSABnzbd).show(); - $(testSABnzbd_result).show(); + $(testSABnzbdResult).show(); } }; - $.fn.rtorrent_scgi = function(){ + $.fn.rtorrentScgi = function(){ var selectedProvider = $('#torrent_method :selected').val(); - if ('rtorrent' == selectedProvider) { + if (selectedProvider.toLowerCase() === 'rtorrent') { var hostname = $('#torrent_host').prop('value'); - var isMatch = hostname.substr(0, 7) == "scgi://"; + var isMatch = hostname.substr(0, 7) === "scgi://"; if (isMatch) { $('#torrent_username_option').hide(); @@ -56,8 +56,7 @@ $(document).ready(function(){ } }; - $.fn.torrent_method_handler = function() { - + $.fn.torrentMethodHandler = function() { $('#options_torrent_clients').hide(); $('#options_torrent_blackhole').hide(); @@ -68,10 +67,10 @@ $(document).ready(function(){ label = ' label', directory = ' directory', client = '', - option_panel = '#options_torrent_blackhole'; + optionPanel = '#options_torrent_blackhole'; rpcurl = ' RPC URL'; - if ('blackhole' != selectedProvider) { + if (selectedProvider.toLowerCase() !== 'blackhole') { var label_warning_deluge = '#label_warning_deluge', label_anime_warning_deluge = '#label_anime_warning_deluge', host_desc_rtorrent = '#host_desc_rtorrent', @@ -103,15 +102,15 @@ $(document).ready(function(){ $(path_synology).hide(); $(torrent_paused_option).show(); $(torrent_rpcurl_option).hide(); - $(this).rtorrent_scgi(); + $(this).rtorrentScgi(); - if ('utorrent' == selectedProvider) { + if (selectedProvider.toLowerCase() === 'utorrent') { client = 'uTorrent'; $(torrent_path_option).hide(); $('#torrent_seed_time_label').text('Minimum seeding time is'); $(torrent_seed_time_option).show(); $('#host_desc_torrent').text('URL to your uTorrent client (e.g. http://localhost:8000)'); - } else if ('transmission' == selectedProvider){ + } else if (selectedProvider.toLowerCase() === 'transmission'){ client = 'Transmission'; $('#torrent_seed_time_label').text('Stop seeding when inactive for'); $(torrent_seed_time_option).show(); @@ -120,8 +119,7 @@ $(document).ready(function(){ $(torrent_label_anime_option).hide(); $(torrent_rpcurl_option).show(); $('#host_desc_torrent').text('URL to your Transmission client (e.g. http://localhost:9091)'); - //$('#directory_title').text(client + directory); - } else if ('deluge' == selectedProvider){ + } else if (selectedProvider.toLowerCase() === 'deluge'){ client = 'Deluge'; $(torrent_verify_cert_option).show(); $(torrent_verify_deluge).show(); @@ -131,7 +129,6 @@ $(document).ready(function(){ $('#torrent_username_option').hide(); $('#torrent_username').prop('value', ''); $('#host_desc_torrent').text('URL to your Deluge client (e.g. http://localhost:8112)'); - //$('#directory_title').text(client + directory); } else if ('deluged' == selectedProvider){ client = 'Deluge'; $(torrent_verify_cert_option).hide(); @@ -141,7 +138,6 @@ $(document).ready(function(){ $(label_anime_warning_deluge).show(); $('#torrent_username_option').show(); $('#host_desc_torrent').text('IP or Hostname of your Deluge Daemon (e.g. scgi://localhost:58846)'); - //$('#directory_title').text(client + directory); } else if ('download_station' == selectedProvider){ client = 'Synology DS'; $(torrent_label_option).hide(); @@ -149,7 +145,6 @@ $(document).ready(function(){ $('#torrent_paused_option').hide(); $(torrent_path_option).find('.fileBrowser').hide(); $('#host_desc_torrent').text('URL to your Synology DS client (e.g. http://localhost:5000)'); - //$('#directory_title').text(client + directory); $(path_synology).show(); } else if ('rtorrent' == selectedProvider){ client = 'rTorrent'; @@ -159,7 +154,6 @@ $(document).ready(function(){ $(torrent_verify_deluge).hide(); $(torrent_verify_rtorrent).show(); $(torrent_auth_type_option).show(); - //$('#directory_title').text(client + directory); } else if ('qbittorrent' == selectedProvider){ client = 'qbittorrent'; $(torrent_path_option).hide(); @@ -182,14 +176,14 @@ $(document).ready(function(){ $('#password_title').text(client + password); $('#torrent_client').text(client); $('#rpcurl_title').text(client + rpcurl); - option_panel = '#options_torrent_clients'; + optionPanel = '#options_torrent_clients'; } - $(option_panel).show(); + $(optionPanel).show(); }; - $('#nzb_method').change($(this).nzb_method_handler); + $('#nzb_method').change($(this).nzbMethodHandler); - $(this).nzb_method_handler(); + $(this).nzbMethodHandler(); $('#testSABnzbd').click(function(){ $('#testSABnzbd_result').html(loading); @@ -205,12 +199,12 @@ $(document).ready(function(){ }); - $('#torrent_method').change($(this).torrent_method_handler); + $('#torrent_method').change($(this).torrentMethodHandler); - $(this).torrent_method_handler(); + $(this).torrentMethodHandler(); $('#use_torrents').click(function(){ - toggle_torrent_title(); + toggleTorrentTitle(); }); $('#test_torrent').click(function(){ @@ -224,5 +218,5 @@ $(document).ready(function(){ function(data){ $('#test_torrent_result').html(data); }); }); - $('#torrent_host').change($(this).rtorrent_scgi); + $('#torrent_host').change($(this).rtorrentScgi); }); diff --git a/gui/slick/js/manageEpisodeStatuses.js b/gui/slick/js/manageEpisodeStatuses.js index 313087e30..8118aa478 100644 --- a/gui/slick/js/manageEpisodeStatuses.js +++ b/gui/slick/js/manageEpisodeStatuses.js @@ -1,52 +1,48 @@ $(document).ready(function() { - function make_row(indexer_id, season, episode, name, checked) { - checked = checked ? ' checked' : ''; - - var row_class = $('#row_class').val(); - + function makeRow(indexerId, season, episode, name, checked) { var row = ''; - row += ' <tr class="'+row_class+' show-'+indexer_id+'">'; - row += ' <td class="tableleft" align="center"><input type="checkbox" class="'+indexer_id+'-epcheck" name="'+indexer_id+'-'+season+'x'+episode+'"'+checked+'></td>'; - row += ' <td>'+season+'x'+episode+'</td>'; - row += ' <td class="tableright" style="width: 100%">'+name+'</td>'; + row += ' <tr class="' + $('#row_class').val() + ' show-' + indexerId + '">'; + row += ' <td class="tableleft" align="center"><input type="checkbox" class="' + indexerId + '-epcheck" name="' + indexerId + '-' + season + 'x' + episode + '"' + (checked ? ' checked' : '') + '></td>'; + row += ' <td>' + season + 'x' + episode + '</td>'; + row += ' <td class="tableright" style="width: 100%">' + name + '</td>'; row += ' </tr>'; return row; } $('.allCheck').click(function(){ - var indexer_id = $(this).attr('id').split('-')[1]; - $('.'+indexer_id+'-epcheck').prop('checked', $(this).prop('checked')); + var indexerId = $(this).attr('id').split('-')[1]; + $('.' + indexerId + '-epcheck').prop('checked', $(this).prop('checked')); }); $('.get_more_eps').click(function(){ - var cur_indexer_id = $(this).attr('id'); - var checked = $('#allCheck-'+cur_indexer_id).prop('checked'); - var last_row = $('tr#'+cur_indexer_id); + var curIndexerId = $(this).attr('id'); + var checked = $('#allCheck-' + curIndexerId).prop('checked'); + var lastRow = $('tr#' + curIndexerId); var clicked = $(this).attr('data-clicked'); var action = $(this).attr('value'); - if (!clicked) { + if(!clicked) { $.getJSON(srRoot+'/manage/showEpisodeStatuses',{ - indexer_id: cur_indexer_id, + indexer_id: curIndexerId, // jshint ignore:line whichStatus: $('#oldStatus').val() }, function (data) { $.each(data, function(season,eps){ $.each(eps, function(episode, name) { //alert(season+'x'+episode+': '+name); - last_row.after(make_row(cur_indexer_id, season, episode, name, checked)); + lastRow.after(makeRow(curIndexerId, season, episode, name, checked)); }); }); }); $(this).attr('data-clicked',1); $(this).prop('value', 'Collapse'); } else { - if (action === 'Collapse') { - $('table tr').filter('.show-'+cur_indexer_id).hide(); + if (action.toLowerCase() === 'collapse') { + $('table tr').filter('.show-' + curIndexerId).hide(); $(this).prop('value', 'Expand'); - } else if (action === 'Expand') { - $('table tr').filter('.show-'+cur_indexer_id).show(); + } else if (action.toLowerCase() === 'expand') { + $('table tr').filter('.show-' + curIndexerId).show(); $(this).prop('value', 'Collapse'); } } diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js index 8fec86c0b..5c5e1b7dc 100644 --- a/gui/slick/js/restart.js +++ b/gui/slick/js/restart.js @@ -3,37 +3,37 @@ $(document).ready(function() { window.console_prefix = 'Restart: '; // jshint ignore:line window.current_pid = ''; // jshint ignore:line - var is_alive_url = srRoot + '/home/is_alive/'; + var isAliveUrl = srRoot + '/home/is_alive/'; - var check_isAlive = setInterval(is_alive, 1000); + var checkIsAlive = setInterval(isAlive, 1000); - function is_alive() { + function isAlive() { // Setup error detection $.ajaxSetup({ - error: ajax_error + error: ajaxError }); - var jqxhr = $.get(is_alive_url, function(data) { - if (data.msg == 'nope') { + var jqxhr = $.get(isAliveUrl, function(data) { + if (data.msg.toLowerCase() === 'nope') { // if it's still initializing then just wait and try again - if (console_debug) { - console.log(console_prefix + 'is_alive: Sickrage is starting.'); + if (console_debug) { // jshint ignore:line + console.log(console_prefix + 'isAlive: Sickrage is starting.'); } $('#shut_down_loading').hide(); $('#shut_down_success').show(); $('#restart_message').show(); } else { // if this is before we've even shut down then just try again later - if (console_debug) { - console.log(console_prefix + 'is_alive: Sickrage is shutdowning.'); + if (console_debug) { // jshint ignore:line + console.log(console_prefix + 'isAlive: Sickrage is shutdowning.'); } if (current_pid === '' || data.msg == current_pid) { current_pid = data.msg; // if we're ready to go then redirect to new url } else { - clearInterval(check_isAlive); + clearInterval(checkIsAlive); if (console_debug) { - console.log(console_prefix + 'is_alive: Setting redirect.'); + console.log(console_prefix + 'isAlive: Setting redirect.'); } $('#restart_loading').hide(); $('#restart_success').show(); @@ -45,20 +45,20 @@ $(document).ready(function() { }, 'jsonp'); jqxhr.fail(function() { - ajax_error(); + ajaxError(); }); } - function ajax_error(x, e) { + function ajaxError(x, e) { if (console_debug) { if (x.status === 0) { - console.log(console_prefix + 'is_alive: Sickrage is not responding.'); + console.log(console_prefix + 'isAlive: Sickrage is not responding.'); } else if (x.status == 404) { - console.log(console_prefix + 'is_alive: Requested URL not found.'); + console.log(console_prefix + 'isAlive: Requested URL not found.'); } else if (x.status == 500) { - console.log(console_prefix + 'is_alive: Internel Server Error.'); + console.log(console_prefix + 'isAlive: Internel Server Error.'); } else { - console.log(console_prefix + 'is_alive: Unknow Error.\n' + x.responseText); + console.log(console_prefix + 'isAlive: Unknow Error.\n' + x.responseText); } } } -- GitLab From baa20ef23b6e2a8190dc0c50833c4224c316c907 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 8 Nov 2015 19:29:34 +1030 Subject: [PATCH 160/215] linted js --- gui/slick/js/configSubtitles.js | 5 +---- gui/slick/js/displayShow.js | 3 --- gui/slick/js/restart.js | 16 ++++++++-------- 3 files changed, 9 insertions(+), 15 deletions(-) delete mode 100644 gui/slick/js/displayShow.js diff --git a/gui/slick/js/configSubtitles.js b/gui/slick/js/configSubtitles.js index 8414d8e9b..5ff3942a2 100644 --- a/gui/slick/js/configSubtitles.js +++ b/gui/slick/js/configSubtitles.js @@ -15,8 +15,6 @@ $(document).ready(function(){ $.fn.addService = function (id, name, url, key, isDefault, showService) { if (url.match('/$') === null) { url = url + '/'; } - var newData = [isDefault, [name, url, key]]; - if ($('#service_order_list > #'+id).length === 0 && showService !== false) { var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; @@ -47,13 +45,12 @@ $(document).ready(function(){ $(this).refreshServiceList(); }); - // initialization stuff $(this).showHideServices(); $("#service_order_list").sortable({ placeholder: 'ui-state-highlight', - update: function (event, ui) { + update: function () { $(this).refreshServiceList(); } }); diff --git a/gui/slick/js/displayShow.js b/gui/slick/js/displayShow.js deleted file mode 100644 index a01c02b14..000000000 --- a/gui/slick/js/displayShow.js +++ /dev/null @@ -1,3 +0,0 @@ -$(document).ready(function () { - -}); diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js index 5c5e1b7dc..f51c67b86 100644 --- a/gui/slick/js/restart.js +++ b/gui/slick/js/restart.js @@ -7,7 +7,7 @@ $(document).ready(function() { var checkIsAlive = setInterval(isAlive, 1000); - function isAlive() { + function isAlive() { // jshint ignore:line // Setup error detection $.ajaxSetup({ error: ajaxError @@ -17,7 +17,7 @@ $(document).ready(function() { if (data.msg.toLowerCase() === 'nope') { // if it's still initializing then just wait and try again if (console_debug) { // jshint ignore:line - console.log(console_prefix + 'isAlive: Sickrage is starting.'); + console.log(console_prefix + 'isAlive: Sickrage is starting.'); // jshint ignore:line } $('#shut_down_loading').hide(); $('#shut_down_success').show(); @@ -25,15 +25,15 @@ $(document).ready(function() { } else { // if this is before we've even shut down then just try again later if (console_debug) { // jshint ignore:line - console.log(console_prefix + 'isAlive: Sickrage is shutdowning.'); + console.log(console_prefix + 'isAlive: Sickrage is shutdowning.'); // jshint ignore:line } - if (current_pid === '' || data.msg == current_pid) { - current_pid = data.msg; + if (current_pid === '' || data.msg == current_pid) { // jshint ignore:line + current_pid = data.msg; // jshint ignore:line // if we're ready to go then redirect to new url } else { clearInterval(checkIsAlive); - if (console_debug) { - console.log(console_prefix + 'isAlive: Setting redirect.'); + if (console_debug) { // jshint ignore:line + console.log(console_prefix + 'isAlive: Setting redirect.'); // jshint ignore:line } $('#restart_loading').hide(); $('#restart_success').show(); @@ -50,7 +50,7 @@ $(document).ready(function() { } function ajaxError(x, e) { - if (console_debug) { + if (console_debug) { // jshint ignore:line if (x.status === 0) { console.log(console_prefix + 'isAlive: Sickrage is not responding.'); } else if (x.status == 404) { -- GitLab From 8a9496b51f2962df2a6da6631c588e009f0485fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gae=CC=88tan=20Muller?= <m.gaetan89@gmail.com> Date: Sun, 8 Nov 2015 11:42:02 +0100 Subject: [PATCH 161/215] Use names parameters when adding a show from the API --- sickbeard/webapi.py | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 96a3c1259..431b0ab8f 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -24,7 +24,6 @@ import urllib import datetime import re import traceback - import sickbeard from sickrage.helper.common import dateFormat, dateTimeFormat, timeFormat from sickrage.helper.encoding import ek @@ -39,7 +38,6 @@ from sickrage.show.History import History from sickrage.show.Show import Show from sickrage.system.Restart import Restart from sickrage.system.Shutdown import Shutdown - from sickbeard.versionChecker import CheckVersion from sickbeard import db, logger, ui, helpers from sickbeard import search_queue @@ -67,7 +65,6 @@ try: except ImportError: import simplejson as json - from tornado.web import RequestHandler indexer_ids = ["indexerid", "tvdbid"] @@ -86,6 +83,8 @@ result_type_map = { RESULT_FATAL: "fatal", RESULT_DENIED: "denied", } + + # basically everything except RESULT_SUCCESS / success is bad @@ -161,7 +160,7 @@ class ApiHandler(RequestHandler): out = callback + '(' + out + ');' # wrap with JSONP call if requested except Exception, e: # if we fail to generate the output fake an error logger.log(u"API :: " + traceback.format_exc(), logger.DEBUG) - out = '{"result": "%s", "message": "error while composing output: %s"}' %\ + out = '{"result": "%s", "message": "error while composing output: %s"}' % \ (result_type_map[RESULT_ERROR], ex(e)) return out @@ -234,7 +233,6 @@ class ApiHandler(RequestHandler): return outDict - def filter_params(self, cmd, args, kwargs): """ return only params kwargs that are for cmd and rename them to a clean version (remove "<cmd>_") @@ -618,6 +616,7 @@ class IntParseError(Exception): A value could not be parsed into an int, but should be parsable to an int """ + # -------------------------------------------------------------------------------------# @@ -754,7 +753,7 @@ class CMD_Episode(ApiCall): if helpers.tryInt(episode['airdate'], 1) > 693595: # 1900 episode['airdate'] = sbdatetime.sbdatetime.sbfdate(sbdatetime.sbdatetime.convert_to_setting( network_timezones.parse_date_time(int(episode['airdate']), showObj.airs, showObj.network)), - d_preset=dateFormat) + d_preset=dateFormat) else: episode['airdate'] = 'Never' @@ -853,7 +852,6 @@ class CMD_EpisodeSetStatus(ApiCall): # convert the string status to a int for status in statusStrings.statusStrings: if str(statusStrings[status]).lower() == str(self.status).lower(): - self.status = status break else: # if we dont break out of the for loop we got here. @@ -2016,8 +2014,11 @@ class CMD_ShowAddExisting(ApiCall): if iqualityID or aqualityID: newQuality = Quality.combineQualities(iqualityID, aqualityID) - sickbeard.showQueueScheduler.action.addShow(int(indexer), int(self.indexerid), self.location, SKIPPED, - newQuality, int(self.flatten_folders)) + sickbeard.showQueueScheduler.action.addShow( + int(indexer), int(self.indexerid), self.location, default_status=sickbeard.STATUS_DEFAULT, + quality=newQuality, flatten_folders=int(self.flatten_folders), subtitles=self.subtitles, + default_status_after=sickbeard.STATUS_DEFAULT_AFTER, archive=self.archive_firstmatch + ) return _responds(RESULT_SUCCESS, {"name": indexerName}, indexerName + " has been queued to be added") @@ -2040,7 +2041,9 @@ class CMD_ShowAddNew(ApiCall): "anime": {"desc": "True to mark the show as an anime, False otherwise"}, "scene": {"desc": "True if episodes search should be made by scene numbering, False otherwise"}, "future_status": {"desc": "The status of future episodes"}, - "archive_firstmatch": {"desc": "True if episodes should be archived when first match is downloaded, False otherwise"}, + "archive_firstmatch": { + "desc": "True if episodes should be archived when first match is downloaded, False otherwise" + }, } } @@ -2184,10 +2187,11 @@ class CMD_ShowAddNew(ApiCall): else: helpers.chmodAsParent(showPath) - sickbeard.showQueueScheduler.action.addShow(int(indexer), int(self.indexerid), showPath, newStatus, - newQuality, - int(self.flatten_folders), self.lang, self.subtitles, self.anime, - self.scene, default_status_after=default_ep_status_after, archive=self.archive_firstmatch) # @UndefinedVariable + sickbeard.showQueueScheduler.action.addShow( + int(indexer), int(self.indexerid), showPath, default_status=newStatus, quality=newQuality, + flatten_folders=int(self.flatten_folders), lang=self.lang, subtitles=self.subtitles, anime=self.anime, + scene=self.scene, default_status_after=default_ep_status_after, archive=self.archive_firstmatch + ) return _responds(RESULT_SUCCESS, {"name": indexerName}, indexerName + " has been queued to be added") @@ -2534,7 +2538,7 @@ class CMD_ShowSeasons(ApiCall): status, quality = Quality.splitCompositeStatus(int(row["status"])) row["status"] = _get_status_Strings(status) row["quality"] = get_quality_string(quality) - if helpers.tryInt(row['airdate'], 1) > 693595: # 1900 + if helpers.tryInt(row['airdate'], 1) > 693595: # 1900 dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( network_timezones.parse_date_time(row['airdate'], showObj.airs, showObj.network)) row['airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) @@ -2561,7 +2565,7 @@ class CMD_ShowSeasons(ApiCall): status, quality = Quality.splitCompositeStatus(int(row["status"])) row["status"] = _get_status_Strings(status) row["quality"] = get_quality_string(quality) - if helpers.tryInt(row['airdate'], 1) > 693595: # 1900 + if helpers.tryInt(row['airdate'], 1) > 693595: # 1900 dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( network_timezones.parse_date_time(row['airdate'], showObj.airs, showObj.network)) row['airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) @@ -2823,7 +2827,7 @@ class CMD_Shows(ApiCall): "subtitles": (0, 1)[curShow.subtitles], } - if helpers.tryInt(curShow.nextaired, 1) > 693595: # 1900 + if helpers.tryInt(curShow.nextaired, 1) > 693595: # 1900 dtEpisodeAirs = sbdatetime.sbdatetime.convert_to_setting( network_timezones.parse_date_time(curShow.nextaired, curShow.airs, showDict['network'])) showDict['next_ep_airdate'] = sbdatetime.sbdatetime.sbfdate(dtEpisodeAirs, d_preset=dateFormat) @@ -2862,6 +2866,7 @@ class CMD_ShowsStats(ApiCall): 'shows_total': stats['shows']['total'], }) + # WARNING: never define a cmd call string that contains a "_" (underscore) # this is reserved for cmd indexes used while cmd chaining -- GitLab From 9736515c72e16854353f6874b4f227b248658812 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sun, 8 Nov 2015 05:33:24 -0800 Subject: [PATCH 162/215] Hella lint errors and some actual bugs fixed --- gui/slick/views/home_postprocess.mako | 4 +- sickbeard/browser.py | 5 +- sickbeard/classes.py | 25 +++++---- sickbeard/common.py | 8 +-- sickbeard/imdbPopular.py | 4 +- sickbeard/naming.py | 4 +- sickbeard/notifiers/pushover.py | 4 +- sickbeard/nzbget.py | 19 +++---- sickbeard/processTV.py | 77 +++++++++++++-------------- sickbeard/providers/iptorrents.py | 5 +- sickbeard/show_queue.py | 34 +++++++----- sickbeard/traktChecker.py | 59 ++++++++++---------- sickbeard/webserve.py | 12 ++--- 13 files changed, 132 insertions(+), 128 deletions(-) diff --git a/gui/slick/views/home_postprocess.mako b/gui/slick/views/home_postprocess.mako index 795c3d3cd..670119977 100644 --- a/gui/slick/views/home_postprocess.mako +++ b/gui/slick/views/home_postprocess.mako @@ -16,13 +16,13 @@ <div id="postProcess"> <form name="processForm" method="post" action="processEpisode" style="line-height: 40px;"> <table> - <input type="hidden" id="type" name="type" value="manual"> + <input type="hidden" id="type" name="proc_type" value="manual"> <tr> <td style="padding-right:10px;"> <b>Enter the folder containing the episode:</b> </td> <td> - <input type="text" name="dir" id="episodeDir" class="form-control form-control-inline input-sm input350" /> + <input type="text" name="proc_dir" id="episodeDir" class="form-control form-control-inline input-sm input350" /> </td> </tr> <tr> diff --git a/sickbeard/browser.py b/sickbeard/browser.py index 127fbe9c1..f7b7b3cbb 100644 --- a/sickbeard/browser.py +++ b/sickbeard/browser.py @@ -83,13 +83,14 @@ def foldersAtPath(path, includeParent=False, includeFiles=False): fileList = [{'name': filename, 'path': ek(os.path.join, parentPath, filename)} for filename in ek(os.listdir, parentPath)] if not includeFiles: - fileList = filter(lambda entry: ek(os.path.isdir, entry['path']), fileList) + fileList = [x for x in fileList if ek(os.path.isdir, x['path'])] # prune out directories to protect the user from doing stupid things (already lower case the dir to reduce calls) hideList = ["boot", "bootmgr", "cache", "msocache", "recovery", "$recycle.bin", "recycler", "system volume information", "temporary internet files"] # windows specific hideList += [".fseventd", ".spotlight", ".trashes", ".vol", "cachedmessages", "caches", "trash"] # osx specific - fileList = filter(lambda entry: entry['name'].lower() not in hideList, fileList) + + fileList = [x for x in fileList if x['name'].lower() not in hideList] fileList = sorted(fileList, lambda x, y: cmp(os.path.basename(x['name']).lower(), os.path.basename(y['path']).lower())) diff --git a/sickbeard/classes.py b/sickbeard/classes.py index 534888efa..fdb20d3bc 100644 --- a/sickbeard/classes.py +++ b/sickbeard/classes.py @@ -25,7 +25,7 @@ import urllib import datetime from dateutil import parser -from common import USER_AGENT, Quality +from sickbeard.common import USER_AGENT, Quality from sickrage.helper.common import dateFormat, dateTimeFormat @@ -73,13 +73,13 @@ class AuthURLOpener(SickBeardURLopener): return SickBeardURLopener.open(self, url) -class SearchResult: +class SearchResult(object): """ Represents a search result from an indexer. """ def __init__(self, episodes): - self.provider = -1 + self.provider = None # release show object self.show = None @@ -114,6 +114,8 @@ class SearchResult: # content self.content = None + self.resultType = '' + def __str__(self): if self.provider is None: @@ -160,7 +162,7 @@ class TorrentSearchResult(SearchResult): resultType = "torrent" -class AllShowsListUI: +class AllShowsListUI(object): """ This class is for indexer api. Instead of prompting with a UI to pick the desired result out of a list of shows it tries to be smart about it @@ -203,7 +205,7 @@ class AllShowsListUI: return searchResults -class ShowListUI: +class ShowListUI(object): """ This class is for tvdb-api. Instead of prompting with a UI to pick the desired result out of a list of shows it tries to be smart about it @@ -217,17 +219,18 @@ class ShowListUI: def selectSeries(self, allSeries): try: # try to pick a show that's in my show list + showIDList = [int(x.indexerid) for x in sickbeard.showList] for curShow in allSeries: - if filter(lambda x: int(x.indexerid) == int(curShow['id']), sickbeard.showList): + if int(curShow['id']) in showIDList: return curShow - except: + except Exception: pass # if nothing matches then return first result return allSeries[0] -class Proper: +class Proper(object): def __init__(self, name, url, date, show): self.name = name self.url = url @@ -250,7 +253,7 @@ class Proper: self.indexerid) + " from " + str(sickbeard.indexerApi(self.indexer).name) -class ErrorViewer: +class ErrorViewer(object): """ Keeps a static list of UIErrors to be displayed on the UI and allows the list to be cleared. @@ -274,7 +277,7 @@ class ErrorViewer: return ErrorViewer.errors -class WarningViewer: +class WarningViewer(object): """ Keeps a static list of (warning) UIErrors to be displayed on the UI and allows the list to be cleared. @@ -298,7 +301,7 @@ class WarningViewer: return WarningViewer.errors -class UIError: +class UIError(object): """ Represents an error to be displayed in the web UI. """ diff --git a/sickbeard/common.py b/sickbeard/common.py index 9970e285d..7349d69df 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -108,8 +108,8 @@ multiEpStrings[NAMING_EXTEND] = "Extend" multiEpStrings[NAMING_LIMITED_EXTEND] = "Extend (Limited)" multiEpStrings[NAMING_LIMITED_EXTEND_E_PREFIXED] = "Extend (Limited, E-prefixed)" -# pylint: disable=W0232,C1001 -class Quality: +# pylint: disable=W0232 +class Quality(object): NONE = 0 # 0 SDTV = 1 # 1 SDDVD = 1 << 1 # 2 @@ -594,8 +594,8 @@ statusStrings = StatusStrings( SNATCHED_BEST: "Snatched (Best)" }) -# pylint: disable=R0903,C1001 -class Overview: +# pylint: disable=R0903 +class Overview(object): UNAIRED = UNAIRED # 1 QUAL = 2 diff --git a/sickbeard/imdbPopular.py b/sickbeard/imdbPopular.py index 3d09ec4b0..26af7f895 100644 --- a/sickbeard/imdbPopular.py +++ b/sickbeard/imdbPopular.py @@ -8,8 +8,8 @@ import sickbeard from sickbeard import helpers from sickrage.helper.encoding import ek -# pylint: disable=C1001 -class imdbPopular: + +class imdbPopular(object): def __init__(self): """Gets a list of most popular TV series from imdb""" diff --git a/sickbeard/naming.py b/sickbeard/naming.py index 3e64f17cc..4c7965338 100644 --- a/sickbeard/naming.py +++ b/sickbeard/naming.py @@ -25,9 +25,9 @@ from sickbeard import tv from sickbeard import common from sickbeard import logger from sickbeard.name_parser.parser import NameParser -from sickrage.helper.encoding import ek +from sickbeard.common import Quality, DOWNLOADED -from common import Quality, DOWNLOADED +from sickrage.helper.encoding import ek name_presets = ( '%SN - %Sx%0E - %EN', diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py index dbc422877..e605f3c31 100644 --- a/sickbeard/notifiers/pushover.py +++ b/sickbeard/notifiers/pushover.py @@ -29,8 +29,8 @@ from sickrage.helper.exceptions import ex API_URL = "https://api.pushover.net/1/messages.json" -# pylint: disable=W0232,C1001 -class PushoverNotifier: +# pylint: disable=W0232 +class PushoverNotifier(object): def test_notify(self, userKey=None, apiKey=None): return self._notifyPushover("This is a test notification from SickRage", 'Test', userKey=userKey, apiKey=apiKey, force=True) diff --git a/sickbeard/nzbget.py b/sickbeard/nzbget.py index 64278c9a5..b37bc57b9 100644 --- a/sickbeard/nzbget.py +++ b/sickbeard/nzbget.py @@ -18,20 +18,15 @@ # along with SickRage. If not, see <http://www.gnu.org/licenses/>. - import httplib import datetime - -import sickbeard - from base64 import standard_b64encode import xmlrpclib +import sickbeard from sickbeard.providers.generic import GenericProvider - from sickbeard import logger, helpers - -from common import Quality +from sickbeard.common import Quality def sendNZB(nzb, proper=False): @@ -46,7 +41,7 @@ def sendNZB(nzb, proper=False): category = sickbeard.NZBGET_CATEGORY if nzb.show.is_anime: category = sickbeard.NZBGET_CATEGORY_ANIME - + if sickbeard.NZBGET_USE_HTTPS: nzbgetXMLrpc = "https://%(username)s:%(password)s@%(host)s/xmlrpc" else: @@ -73,7 +68,7 @@ def sendNZB(nzb, proper=False): return False except xmlrpclib.ProtocolError, e: - if (e.errmsg == "Unauthorized"): + if e.errmsg == "Unauthorized": logger.log(u"NZBget username or password is incorrect.", logger.ERROR) else: logger.log(u"Protocol Error: " + e.errmsg, logger.ERROR) @@ -121,7 +116,7 @@ def sendNZB(nzb, proper=False): if nzb.resultType == "nzb": genProvider = GenericProvider("") data = genProvider.getURL(nzb.url) - if (data == None): + if data == None: return False nzbcontent64 = standard_b64encode(data) nzbget_result = nzbGetRPC.append(nzb.name + ".nzb", category, addToTop, nzbcontent64) @@ -133,7 +128,7 @@ def sendNZB(nzb, proper=False): nzbget_result = nzbGetRPC.appendurl(nzb.name + ".nzb", category, nzbgetprio, False, nzb.url, False, dupekey, dupescore, "score") # v13+ has a new combined append method that accepts both (url and content) - # also the return value has changed from boolean to integer + # also the return value has changed from boolean to integer # (Positive number representing NZBID of the queue item. 0 and negative numbers represent error codes.) elif nzbget_version >= 13: nzbget_result = True if nzbGetRPC.append(nzb.name + ".nzb", nzbcontent64 if nzbcontent64 is not None else nzb.url, @@ -153,6 +148,6 @@ def sendNZB(nzb, proper=False): else: logger.log(u"NZBget could not add %s to the queue" % (nzb.name + ".nzb"), logger.ERROR) return False - except: + except Exception: logger.log(u"Connect Error to NZBget: could not add %s to the queue" % (nzb.name + ".nzb"), logger.ERROR) return False diff --git a/sickbeard/processTV.py b/sickbeard/processTV.py index 0ba1f8899..6ea2c5a0b 100644 --- a/sickbeard/processTV.py +++ b/sickbeard/processTV.py @@ -44,7 +44,7 @@ import shutil_custom shutil.copyfile = shutil_custom.copyfile_custom -class ProcessResult: +class ProcessResult(object): def __init__(self): self.result = True self.output = '' @@ -127,8 +127,7 @@ def delete_files(processPath, notwantedFiles, result, force=False): try: ek(os.chmod, cur_file_path, stat.S_IWRITE) except OSError, e: - result.output += logHelper(u"Cannot change permissions of " + cur_file_path + ': ' + str(e.strerror), - logger.DEBUG) + result.output += logHelper(u"Cannot change permissions of " + cur_file_path + ': ' + ex(e), logger.DEBUG) try: ek(os.remove, cur_file_path) except OSError, e: @@ -140,7 +139,7 @@ def logHelper(logMessage, logLevel=logger.INFO): return logMessage + u"\n" -def processDir(dirName, nzbName=None, process_method=None, force=False, is_priority=None, delete_on=False, failed=False, type="auto"): +def processDir(dirName, nzbName=None, process_method=None, force=False, is_priority=None, delete_on=False, failed=False, proc_type="auto"): """ Scans through the files in dirName and processes whatever media files it finds @@ -148,7 +147,7 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior :param nzbName: The NZB name which resulted in this folder being downloaded :param force: True to postprocess already postprocessed files :param failed: Boolean for whether or not the download failed - :param type: Type of postprocessing auto or manual + :param proc_type: Type of postprocessing auto or manual """ result = ProcessResult() @@ -174,10 +173,10 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior logger.DEBUG) return result.output - path, dirs, files = get_path_dir_files(dirName, nzbName, type) + path, dirs, files = get_path_dir_files(dirName, nzbName, proc_type) - files = filter(helpers.notTorNZBFile, files) - SyncFiles = filter(helpers.isSyncFile, files) + files = [x for x in files if helpers.notTorNZBFile(x)] + SyncFiles = [x for x in files if helpers.isSyncFile(x)] # Don't post process if files are still being synced and option is activated if SyncFiles and sickbeard.POSTPONE_IF_SYNC_FILES: @@ -189,11 +188,11 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior result.output += logHelper(u"PostProcessing Path: " + path, logger.INFO) result.output += logHelper(u"PostProcessing Dirs: " + str(dirs), logger.DEBUG) - rarFiles = filter(helpers.isRarFile, files) + rarFiles = [x for x in files if helpers.isRarFile(x)] rarContent = unRAR(path, rarFiles, force, result) files += rarContent - videoFiles = filter(helpers.isMediaFile, files) - videoInRar = filter(helpers.isMediaFile, rarContent) + videoFiles = [x for x in files if helpers.isMediaFile(x)] + videoInRar = [x for x in rarContent if helpers.isMediaFile(x)] result.output += logHelper(u"PostProcessing Files: " + str(files), logger.DEBUG) result.output += logHelper(u"PostProcessing VideoFiles: " + str(videoFiles), logger.DEBUG) @@ -230,29 +229,29 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior result.missedfiles.append(path + " : Syncfiles found") # Process Video File in all TV Subdir - for dir in [x for x in dirs if validateDir(path, x, nzbNameOriginal, failed, result)]: + for curDir in [x for x in dirs if validateDir(path, x, nzbNameOriginal, failed, result)]: result.result = True - for processPath, processDir, fileList in ek(os.walk, ek(os.path.join, path, dir), topdown=False): + for processPath, _, fileList in ek(os.walk, ek(os.path.join, path, curDir), topdown=False): - if (not validateDir(path, processPath, nzbNameOriginal, failed, result)): + if not validateDir(path, processPath, nzbNameOriginal, failed, result): continue postpone = False - SyncFiles = filter(helpers.isSyncFile, fileList) + SyncFiles = [x for x in fileList if helpers.isSyncFile(x)] # Don't post process if files are still being synced and option is activated if SyncFiles and sickbeard.POSTPONE_IF_SYNC_FILES: postpone = True if not postpone: - rarFiles = filter(helpers.isRarFile, fileList) + rarFiles = [x for x in fileList if helpers.isRarFile(x)] rarContent = unRAR(processPath, rarFiles, force, result) fileList = set(fileList + rarContent) - videoFiles = filter(helpers.isMediaFile, fileList) - videoInRar = filter(helpers.isMediaFile, rarContent) + videoFiles = [x for x in fileList if helpers.isMediaFile(x)] + videoInRar = [x for x in rarContent if helpers.isMediaFile(x)] notwantedFiles = [x for x in fileList if x not in videoFiles] if notwantedFiles: result.output += logHelper(u"Found unwanted files: " + str(notwantedFiles), logger.DEBUG) @@ -273,14 +272,13 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior # Delete all file not needed if process_method != "move" or not result.result \ - or (type == "manual" and not delete_on): # Avoid to delete files if is Manual PostProcessing + or (proc_type == "manual" and not delete_on): # Avoid to delete files if is Manual PostProcessing continue delete_files(processPath, notwantedFiles, result) - if (not sickbeard.NO_DELETE or type == "manual") and process_method == "move" and \ - ek(os.path.normpath, processPath) != ek(os.path.normpath, - sickbeard.TV_DOWNLOAD_DIR): + if (not sickbeard.NO_DELETE or proc_type == "manual") and process_method == "move" and \ + ek(os.path.normpath, processPath) != ek(os.path.normpath, sickbeard.TV_DOWNLOAD_DIR): if delete_folder(processPath, check_empty=True): result.output += logHelper(u"Deleted folder: " + processPath, logger.DEBUG) else: @@ -325,12 +323,10 @@ def validateDir(path, dirName, nzbNameOriginal, failed, result): result.output += logHelper(u"The directory name indicates it failed to extract.", logger.DEBUG) failed = True elif folder_name.startswith('_UNDERSIZED_'): - result.output += logHelper(u"The directory name indicates that it was previously rejected for being undersized.", - logger.DEBUG) + result.output += logHelper(u"The directory name indicates that it was previously rejected for being undersized.", logger.DEBUG) failed = True elif folder_name.upper().startswith('_UNPACK'): - result.output += logHelper(u"The directory name indicates that this release is in the process of being unpacked.", - logger.DEBUG) + result.output += logHelper(u"The directory name indicates that this release is in the process of being unpacked.", logger.DEBUG) result.missedfiles.append(dirName + " : Being unpacked") return False @@ -349,9 +345,9 @@ def validateDir(path, dirName, nzbNameOriginal, failed, result): sqlResults = myDB.select("SELECT * FROM tv_shows") for sqlShow in sqlResults: - if dirName.lower().startswith( - ek(os.path.realpath, sqlShow["location"]).lower() + os.sep) or dirName.lower() == ek( - os.path.realpath, sqlShow["location"]).lower(): + if dirName.lower().startswith(ek(os.path.realpath, sqlShow["location"]).lower() + os.sep) or \ + dirName.lower() == ek(os.path.realpath, sqlShow["location"]).lower(): + result.output += logHelper( u"Cannot process an episode that's already been moved to its show dir, skipping " + dirName, logger.WARNING) @@ -360,11 +356,11 @@ def validateDir(path, dirName, nzbNameOriginal, failed, result): # Get the videofile list for the next checks allFiles = [] allDirs = [] - for processPath, processDir, fileList in ek(os.walk, ek(os.path.join, path, dirName), topdown=False): - allDirs += processDir + for _, processdir, fileList in ek(os.walk, ek(os.path.join, path, dirName), topdown=False): + allDirs += processdir allFiles += fileList - videoFiles = filter(helpers.isMediaFile, allFiles) + videoFiles = [x for x in allFiles if helpers.isMediaFile(x)] allDirs.append(dirName) # check if the dir have at least one tv video file @@ -375,16 +371,16 @@ def validateDir(path, dirName, nzbNameOriginal, failed, result): except (InvalidNameException, InvalidShowException): pass - for dir in allDirs: + for proc_dir in allDirs: try: - NameParser().parse(dir, cache_result=False) + NameParser().parse(proc_dir, cache_result=False) return True except (InvalidNameException, InvalidShowException): pass if sickbeard.UNPACK: # Search for packed release - packedFiles = filter(helpers.isRarFile, allFiles) + packedFiles = [x for x in allFiles if helpers.isRarFile(x)] for packed in packedFiles: try: @@ -508,7 +504,7 @@ def already_postprocessed(dirName, videofile, force, result): np = NameParser(dirName, tryIndexers=True) try: # if it fails to find any info (because we're doing an unparsable folder (like the TV root dir) it will throw an exception, which we want to ignore parse_result = np.parse(dirName) - except: # ignore the exception, because we kind of expected it, but create parse_result anyway so we can perform a check on it. + except Exception: # ignore the exception, because we kind of expected it, but create parse_result anyway so we can perform a check on it. parse_result = False @@ -563,26 +559,25 @@ def process_media(processPath, videoFiles, nzbName, process_method, force, is_pr if result.result: result.output += logHelper(u"Processing succeeded for " + cur_video_file_path) else: - result.output += logHelper(u"Processing failed for " + cur_video_file_path + ": " + process_fail_message, - logger.WARNING) + result.output += logHelper(u"Processing failed for " + cur_video_file_path + ": " + process_fail_message, logger.WARNING) result.missedfiles.append(cur_video_file_path + " : Processing failed: " + process_fail_message) result.aggresult = False -def get_path_dir_files(dirName, nzbName, type): +def get_path_dir_files(dirName, nzbName, proc_type): """ Get files in a path :param dirName: Directory to start in :param nzbName: NZB file, if present - :param type: auto/manual + :param proc_type: auto/manual :return: a tuple of (path,dirs,files) """ path = "" dirs = [] files = [] - if dirName == sickbeard.TV_DOWNLOAD_DIR and not nzbName or type == "manual": # Scheduled Post Processing Active + if dirName == sickbeard.TV_DOWNLOAD_DIR and not nzbName or proc_type == "manual": # Scheduled Post Processing Active # Get at first all the subdir in the dirName for path, dirs, files in ek(os.walk, dirName): break diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index 1fd44e609..000c9b03e 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -20,8 +20,8 @@ import re from sickbeard.providers import generic from sickbeard import logger from sickbeard import tvcache -from sickrage.helper.exceptions import AuthException from sickbeard.bs4_parser import BS4Parser +from sickrage.helper.exceptions import AuthException, ex class IPTorrentsProvider(generic.TorrentProvider): def __init__(self): @@ -159,7 +159,8 @@ class IPTorrentsProvider(generic.TorrentProvider): def seedRatio(self): return self.ratio - def _convertSize(self, size): + @staticmethod + def _convertSize(size): size, modifier = size.split(' ') size = float(size) if modifier in 'KB': diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index b8342b151..e31752e09 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -168,7 +168,11 @@ class ShowQueue(generic_queue.GenericQueue): return queueItemObj -class ShowQueueActions: +class ShowQueueActions(object): + + def __init__(self): + pass + REFRESH = 1 ADD = 2 UPDATE = 3 @@ -177,13 +181,14 @@ class ShowQueueActions: SUBTITLE = 6 REMOVE = 7 - names = {REFRESH: 'Refresh', - ADD: 'Add', - UPDATE: 'Update', - FORCEUPDATE: 'Force Update', - RENAME: 'Rename', - SUBTITLE: 'Subtitle', - REMOVE: 'Remove Show' + names = { + REFRESH: 'Refresh', + ADD: 'Add', + UPDATE: 'Update', + FORCEUPDATE: 'Force Update', + RENAME: 'Rename', + SUBTITLE: 'Subtitle', + REMOVE: 'Remove Show' } @@ -305,14 +310,15 @@ class QueueItemAdd(ShowQueueItem): self._finishEarly() return except Exception, e: - logger.log(u"Error while loading information from indexer %s. Error: %r" % (self.indexer_id,sickbeard.indexerApi(self.indexer).name, ex(e)),logger.ERROR) + logger.log(u"%s Error while loading information from indexer %s. Error: %r" % (self.indexer_id, sickbeard.indexerApi(self.indexer).name, ex(e)), logger.ERROR) # logger.log(u"Show name with ID %s doesn't exist on %s anymore. If you are using trakt, it will be removed from your TRAKT watchlist. If you are adding manually, try removing the nfo and adding again" % # (self.indexer_id, sickbeard.indexerApi(self.indexer).name), logger.WARNING) - ui.notifications.error("Unable to add show", - "Unable to look up the show in " + self.showDir + " on " + str(sickbeard.indexerApi( - self.indexer).name) + " using ID " + str( - self.indexer_id) + ", not using the NFO. Delete .nfo and try adding manually again.") + ui.notifications.error( + "Unable to add show", + "Unable to look up the show in %s on %s using ID %s, not using the NFO. Delete .nfo and try adding manually again." % + (self.showDir, sickbeard.indexerApi(self.indexer).name, self.indexer_id) + ) if sickbeard.USE_TRAKT: @@ -669,6 +675,6 @@ class QueueItemRemove(ShowQueueItem): try: sickbeard.traktCheckerScheduler.action.removeShowFromTraktLibrary(self.show) except Exception as e: - logger.log(u"Unable to delete show from Trakt: %s. Error: %s" % (self.show.name, ex(e)),logger.WARNING) + logger.log(u"Unable to delete show from Trakt: %s. Error: %s" % (self.show.name, ex(e)), logger.WARNING) self.finish() diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index 42efb9394..e5463eadf 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -20,6 +20,8 @@ import os import traceback import datetime +from libtrakt.exceptions import traktException +from libtrakt import TraktAPI import sickbeard from sickbeard import logger @@ -30,10 +32,9 @@ from sickbeard.common import ARCHIVED from sickbeard.common import SKIPPED from sickbeard.common import UNKNOWN from sickbeard.common import WANTED +from sickbeard.common import Quality from sickrage.helper.encoding import ek -from common import Quality -from libtrakt import * -from libtrakt.exceptions import traktException +from sickrage.helper.exceptions import ex def setEpisodeToWanted(show, s, e): @@ -106,7 +107,7 @@ class TraktChecker(object): logger.log(u"No shows found in your library, aborting library update", logger.DEBUG) return - traktShow = filter(lambda x: int(indexerid) in [int(x['show']['ids']['tvdb'] or 0), int(x['show']['ids']['tvrage'] or 0)], library) + traktShow = [x for x in library if int(indexerid) in [int(x['show']['ids']['tvdb'] or 0), int(x['show']['ids']['tvrage'] or 0)]] except traktException as e: logger.log(u"Could not connect to Trakt service. Aborting library check. Error: %s" % repr(e), logger.WARNING) @@ -203,13 +204,13 @@ class TraktChecker(object): (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) - if len(trakt_data): - try: - data = self.trakt_bulk_data_generate(trakt_data) - self.trakt_api.traktRequest("sync/collection/remove", data, method='POST') - self._getShowCollection() - except traktException as e: - logger.log(u"Could not connect to Trakt service. Aborting removing episode %s S%02dE%02d from Trakt collection. Error: %s" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"], repr(e)), logger.WARNING) + if len(trakt_data): + try: + data = self.trakt_bulk_data_generate(trakt_data) + self.trakt_api.traktRequest("sync/collection/remove", data, method='POST') + self._getShowCollection() + except traktException as e: + logger.log(u"Could not connect to Trakt service. Error: %s" % ex(e), logger.WARNING) logger.log(u"COLLECTION::REMOVE::FINISH - Look for Episodes to Remove From Trakt Collection", logger.DEBUG) @@ -238,7 +239,7 @@ class TraktChecker(object): self.trakt_api.traktRequest("sync/collection", data, method='POST') self._getShowCollection() except traktException as e: - logger.log(u"Could not connect to Trakt service. Aborting adding episode to Trakt collection. Error: %s" % repr(e), logger.WARNING) + logger.log(u"Could not connect to Trakt service. Error: %s" % ex(e), logger.WARNING) logger.log(u"COLLECTION::ADD::FINISH - Look for Episodes to Add to Trakt Collection", logger.DEBUG) @@ -277,15 +278,15 @@ class TraktChecker(object): (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"]), logger.DEBUG) trakt_data.append((cur_episode["showid"], cur_episode["indexer"], cur_episode["show_name"], cur_episode["startyear"], cur_episode["season"], cur_episode["episode"])) - if len(trakt_data): - try: - data = self.trakt_bulk_data_generate(trakt_data) - self.trakt_api.traktRequest("sync/watchlist/remove", data, method='POST') - self._getEpisodeWatchlist() - except traktException as e: - logger.log(u"Could not connect to Trakt service. Aborting removing episode %s S%02dE%02d from Trakt watchlist. Error: %s" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"], repr(e)), logger.WARNING) + if len(trakt_data): + try: + data = self.trakt_bulk_data_generate(trakt_data) + self.trakt_api.traktRequest("sync/watchlist/remove", data, method='POST') + self._getEpisodeWatchlist() + except traktException as e: + logger.log(u"Could not connect to Trakt service. Error: %s" % ex(e), logger.WARNING) - logger.log(u"WATCHLIST::REMOVE::FINISH - Look for Episodes to Remove from Trakt Watchlist", logger.DEBUG) + logger.log(u"WATCHLIST::REMOVE::FINISH - Look for Episodes to Remove from Trakt Watchlist", logger.DEBUG) def addEpisodeToTraktWatchList(self): if sickbeard.TRAKT_SYNC_WATCHLIST and sickbeard.USE_TRAKT: @@ -313,7 +314,7 @@ class TraktChecker(object): self.trakt_api.traktRequest("sync/watchlist", data, method='POST') self._getEpisodeWatchlist() except traktException as e: - logger.log(u"Could not connect to Trakt service. Aborting adding episode %s S%02dE%02d to Trakt watchlist. Error: %s" % (cur_episode["show_name"], cur_episode["season"], cur_episode["episode"], repr(e)), logger.WARNING) + logger.log(u"Could not connect to Trakt service. Error %s" % ex(e), logger.WARNING) logger.log(u"WATCHLIST::ADD::FINISH - Look for Episodes to Add to Trakt Watchlist", logger.DEBUG) @@ -342,7 +343,7 @@ class TraktChecker(object): self.trakt_api.traktRequest("sync/watchlist", data, method='POST') self._getShowWatchlist() except traktException as e: - logger.log(u"Could not connect to Trakt service. Aborting adding show %s to Trakt watchlist. Error: %s" % (show.name, repr(e)), logger.WARNING) + logger.log(u"Could not connect to Trakt service. Error: %s" % ex(e), logger.WARNING) logger.log(u"SHOW_WATCHLIST::ADD::FINISH - Look for Shows to Add to Trakt Watchlist", logger.DEBUG) @@ -437,7 +438,8 @@ class TraktChecker(object): logger.log(u"Could not parse the output from trakt for %s " % show["title"], logger.DEBUG) logger.log(u"SHOW_WATCHLIST::CHECK::FINISH - Trakt Episode Watchlist", logger.DEBUG) - def addDefaultShow(self, indexer, indexer_id, name, status): + @staticmethod + def addDefaultShow(indexer, indexer_id, name, status): """ Adds a new show with the default settings """ @@ -447,7 +449,7 @@ class TraktChecker(object): try: location = root_dirs[int(root_dirs[0]) + 1] - except: + except Exception: location = None if location: @@ -490,19 +492,19 @@ class TraktChecker(object): try: if self.Collectionlist[trakt_id][showid]['seasons'][season]['episodes'][episode] == episode: return True - except: + except Exception: return False elif "Show" == List: try: if self.ShowWatchlist[trakt_id][showid]['id'] == showid: return True - except: + except Exception: return False else: try: if self.EpisodeWatchlist[trakt_id][showid]['seasons'][season]['episodes'][episode] == episode: return True - except: + except Exception: return False def _getShowWatchlist(self): @@ -651,7 +653,8 @@ class TraktChecker(object): return False return True - def trakt_bulk_data_generate(self, data): + @staticmethod + def trakt_bulk_data_generate(data): """ Build the JSON structure to send back to Trakt """ diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index e2f6e78fe..c6df598a0 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -911,7 +911,7 @@ class Home(WebRoot): elif curResult is False: finalResult += 'Test failed, No Plex Media Server host specified' else: - finalResult += 'Test failed for Plex server(s) ... ' + urllib.unquote_plus(curResult.replace(',', ', ')) + finalResult += 'Test failed for Plex server(s) ... ' + urllib.unquote_plus(str(curResult).replace(',', ', ')) finalResult += '<br>' + '\n' ui.notifications.message('Tested Plex Media Server host(s): ', urllib.unquote_plus(host.replace(',', ', '))) @@ -2173,8 +2173,8 @@ class HomePostProcess(Home): t = PageTemplate(rh=self, filename="home_postprocess.mako") return t.render(title='Post Processing', header='Post Processing', topmenu='home') - def processEpisode(self, dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None, - is_priority=None, delete_on="0", failed="0", type="auto", *args, **kwargs): + def processEpisode(self, proc_dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None, + is_priority=None, delete_on="0", failed="0", proc_type="auto", *args, **kwargs): def argToBool(argument): if isinstance(argument, basestring): @@ -2189,12 +2189,12 @@ class HomePostProcess(Home): return argument - if not dir: + if not proc_dir: return self.redirect("/home/postprocess/") else: result = processTV.processDir( - dir, nzbName, process_method=process_method, force=argToBool(force), - is_priority=argToBool(is_priority), delete_on=argToBool(delete_on), failed=argToBool(failed), type=type + proc_dir, nzbName, process_method=process_method, force=argToBool(force), + is_priority=argToBool(is_priority), delete_on=argToBool(delete_on), failed=argToBool(failed), proc_type=proc_type ) if quiet is not None and int(quiet) == 1: -- GitLab From 32d665285ef42a4eccf21e2a78f36bffc71ea902 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sun, 8 Nov 2015 21:11:27 -0800 Subject: [PATCH 163/215] Select sbtimezone correctly for windows/linux Rewrite pushbullet notifier to use requests and better code Fix snatching (calling init for SearchResult) Return uncode from sbdatetime Lint scene_exceptions --- SickBeard.py | 2 +- sickbeard/classes.py | 12 ++- sickbeard/helpers.py | 8 +- sickbeard/name_cache.py | 14 +-- sickbeard/network_timezones.py | 12 +-- sickbeard/notifiers/pushbullet.py | 147 ++++++++++++++---------------- sickbeard/sbdatetime.py | 131 +++++++++++++------------- sickbeard/scene_exceptions.py | 18 ++-- sickbeard/search.py | 2 +- 9 files changed, 163 insertions(+), 183 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index 2b9ee49b3..96c4afdb6 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -1,5 +1,5 @@ #!/usr/bin/env python2.7 -# coding=utf-8 +# -*- coding: utf-8 -* # Author: Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ # diff --git a/sickbeard/classes.py b/sickbeard/classes.py index fdb20d3bc..422261220 100644 --- a/sickbeard/classes.py +++ b/sickbeard/classes.py @@ -145,21 +145,27 @@ class NZBSearchResult(SearchResult): """ Regular NZB result with an URL to the NZB """ - resultType = "nzb" + def __init__(self, episodes): + super(NZBSearchResult, self).__init__(episodes) + self.resultType = "nzb" class NZBDataSearchResult(SearchResult): """ NZB result where the actual NZB XML data is stored in the extraInfo """ - resultType = "nzbdata" + def __init__(self, episodes): + super(NZBDataSearchResult, self).__init__(episodes) + self.resultType = "nzbdata" class TorrentSearchResult(SearchResult): """ Torrent result with an URL to the torrent """ - resultType = "torrent" + def __init__(self, episodes): + super(TorrentSearchResult, self).__init__(episodes) + self.resultType = "torrent" class AllShowsListUI(object): diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 3569f1ac8..bdd4b0d09 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -54,7 +54,7 @@ from sickbeard.common import USER_AGENT from sickbeard.common import mediaExtensions from sickbeard.common import subtitleExtensions from sickbeard import db -from sickbeard import notifiers +from sickbeard.notifiers.synoindex import notifier as synoindex_notifier from sickbeard import clients from sickbeard.subtitles import isValidLanguage from sickrage.helper.encoding import ek @@ -357,7 +357,7 @@ def makeDir(path): try: ek(os.makedirs, path) # do the library update for synoindex - notifiers.synoindex_notifier.addFolder(path) + synoindex_notifier.addFolder(path) except OSError: return False return True @@ -622,7 +622,7 @@ def make_dirs(path): # use normpath to remove end separator, otherwise checks permissions against itself chmodAsParent(ek(os.path.normpath, sofar)) # do the library update for synoindex - notifiers.synoindex_notifier.addFolder(sofar) + synoindex_notifier.addFolder(sofar) except (OSError, IOError) as e: logger.log(u"Failed creating %s : %r" % (sofar, ex(e)), logger.ERROR) return False @@ -702,7 +702,7 @@ def delete_empty_folders(check_empty_dir, keep_dir=None): # need shutil.rmtree when ignore_items is really implemented ek(os.rmdir, check_empty_dir) # do the library update for synoindex - notifiers.synoindex_notifier.deleteFolder(check_empty_dir) + synoindex_notifier.deleteFolder(check_empty_dir) except OSError as e: logger.log(u"Unable to delete %s. Error: %r" % (check_empty_dir, repr(e)), logger.WARNING) break diff --git a/sickbeard/name_cache.py b/sickbeard/name_cache.py index 8b0af37e8..590eded75 100644 --- a/sickbeard/name_cache.py +++ b/sickbeard/name_cache.py @@ -31,9 +31,6 @@ def addNameToCache(name, indexer_id=0): :param name: The show name to cache :param indexer_id: the TVDB id that this show should be cached with (can be None/0 for unknown) """ - - global nameCache - cacheDB = db.DBConnection('cache.db') # standardize the name we're using to account for small differences in providers @@ -50,8 +47,6 @@ def retrieveNameFromCache(name): :param name: The show name to look up. :return: the TVDB id that resulted from the cache lookup or None if the show wasn't found in the cache """ - global nameCache - name = sickbeard.helpers.full_sanitizeSceneName(name) if name in nameCache: return int(nameCache[name]) @@ -60,12 +55,6 @@ def clearCache(indexerid=0): """ Deletes all "unknown" entries from the cache (names with indexer_id of 0). """ - global nameCache - - # init name cache - if not nameCache: - nameCache = {} - cacheDB = db.DBConnection('cache.db') cacheDB.action("DELETE FROM scene_names WHERE indexer_id = ? OR indexer_id = ?", (indexerid, 0)) @@ -87,7 +76,6 @@ def buildNameCache(show=None): :param show: Specify show to build name cache for, if None, just do all shows """ - global nameCache with nameCacheLock: sickbeard.scene_exceptions.retrieve_exceptions() @@ -105,4 +93,4 @@ def buildNameCache(show=None): continue nameCache[name] = int(show.indexerid) - logger.log(u"Internal name cache for " + show.name + " set to: [ " + u', '.join([key for key, value in nameCache.iteritems() if value == show.indexerid]) +" ]" , logger.DEBUG) + logger.log(u"Internal name cache for " + show.name + " set to: [ " + u', '.join([key for key, value in nameCache.iteritems() if value == show.indexerid]) +" ]", logger.DEBUG) diff --git a/sickbeard/network_timezones.py b/sickbeard/network_timezones.py index 312ea3127..607df0192 100644 --- a/sickbeard/network_timezones.py +++ b/sickbeard/network_timezones.py @@ -21,7 +21,6 @@ import re import datetime import requests from dateutil import tz -from os import name as osname from sickbeard import db from sickbeard import helpers @@ -33,11 +32,7 @@ am_regex = re.compile(r'(A[. ]? ?M)', flags=re.IGNORECASE) pm_regex = re.compile(r'(P[. ]? ?M)', flags=re.IGNORECASE) network_dict = None - -if osname == 'nt' and tz.tzwinlocal is not None: - sb_timezone = tz.tzwinlocal() -else: - sb_timezone = tz.tzlocal() +sb_timezone = tz.tzwinlocal() if tz.tzwinlocal else tz.tzlocal() # update the network timezone table def update_network_dict(): @@ -76,7 +71,7 @@ def update_network_dict(): del network_list[network] if network_list: - purged = list(x for x in network_list) + purged = [x for x in network_list] queries.append(['DELETE FROM network_timezones WHERE network_name IN (%s);' % ','.join(['?'] * len(purged)), purged]) if queries: @@ -170,8 +165,7 @@ def parse_date_time(d, t, network): te = datetime.datetime.fromordinal(helpers.tryInt(d) or 1) try: foreign_timezone = get_network_timezone(network, network_dict) - foreign_naive = datetime.datetime(te.year, te.month, te.day, hr, m, tzinfo=foreign_timezone) - return foreign_naive + return datetime.datetime(te.year, te.month, te.day, hr, m, tzinfo=foreign_timezone) except Exception: return datetime.datetime(te.year, te.month, te.day, hr, m, tzinfo=sb_timezone) diff --git a/sickbeard/notifiers/pushbullet.py b/sickbeard/notifiers/pushbullet.py index 275578d47..5f8bc65d9 100644 --- a/sickbeard/notifiers/pushbullet.py +++ b/sickbeard/notifiers/pushbullet.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -* # Author: Pedro Correia (http://github.com/pedrocorreia/) # Based on pushalot.py by Nic Wolfe <nic@wolfeden.ca> # URL: http://code.google.com/p/sickbeard/ @@ -17,107 +18,99 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import socket -from httplib import HTTPSConnection, HTTPException import json -from ssl import SSLError +import requests +import traceback + import sickbeard -from sickbeard import logger, common +from sickbeard import logger +from sickbeard.common import notifyStrings +from sickbeard.common import NOTIFY_SNATCH +from sickbeard.common import NOTIFY_DOWNLOAD +from sickbeard.common import NOTIFY_GIT_UPDATE +from sickbeard.common import NOTIFY_GIT_UPDATE_TEXT +from sickbeard.common import NOTIFY_SUBTITLE_DOWNLOAD + + +class PushbulletNotifier(object): + session = requests.Session() + TEST_EVENT = 'Test' + def __init__(self): + pass -class PushbulletNotifier: def test_notify(self, pushbullet_api): - return self._sendPushbullet(pushbullet_api, event="Test", message="Testing Pushbullet settings from SickRage", - method="POST", notificationType="note", force=True) + logger.log(u"Sending a test Pushbullet notification.", logger.DEBUG) + return self._sendPushbullet(pushbullet_api, event=self.TEST_EVENT, message="Testing Pushbullet settings from SickRage") def get_devices(self, pushbullet_api): - return self._sendPushbullet(pushbullet_api, method="GET", force=True) + logger.log(u"Testing Pushbullet authentication and retrieving the device list.", logger.DEBUG) + return self._sendPushbullet(pushbullet_api) def notify_snatch(self, ep_name): if sickbeard.PUSHBULLET_NOTIFY_ONSNATCH: - self._sendPushbullet(pushbullet_api=None, event=common.notifyStrings[common.NOTIFY_SNATCH] + " : " + ep_name, message=ep_name, - notificationType="note", method="POST") + self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_SNATCH] + " : " + ep_name, message=ep_name) def notify_download(self, ep_name): if sickbeard.PUSHBULLET_NOTIFY_ONDOWNLOAD: - self._sendPushbullet(pushbullet_api=None, event=common.notifyStrings[common.NOTIFY_DOWNLOAD] + " : " + ep_name, - message=ep_name, notificationType="note", method="POST") + self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_DOWNLOAD] + " : " + ep_name, message=ep_name) def notify_subtitle_download(self, ep_name, lang): if sickbeard.PUSHBULLET_NOTIFY_ONSUBTITLEDOWNLOAD: - self._sendPushbullet(pushbullet_api=None, event=common.notifyStrings[common.NOTIFY_SUBTITLE_DOWNLOAD] + " : " + ep_name + " : " + lang, - message=ep_name + ": " + lang, notificationType="note", method="POST") - - def notify_git_update(self, new_version = "??"): + self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_SUBTITLE_DOWNLOAD] + " : " + ep_name + " : " + lang, message=ep_name + ": " + lang) + + def notify_git_update(self, new_version="??"): if sickbeard.USE_PUSHBULLET: - update_text=common.notifyStrings[common.NOTIFY_GIT_UPDATE_TEXT] - title=common.notifyStrings[common.NOTIFY_GIT_UPDATE] - self._sendPushbullet(pushbullet_api=None, event=title, message=update_text + new_version, notificationType="note", method="POST") + self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_GIT_UPDATE], message=notifyStrings[NOTIFY_GIT_UPDATE_TEXT] + new_version) - def _sendPushbullet(self, pushbullet_api=None, pushbullet_device=None, event=None, message=None, - notificationType=None, method=None, force=False): + def _sendPushbullet(self, pushbullet_api=None, pushbullet_device=None, event=None, message=None): - if not sickbeard.USE_PUSHBULLET and not force: + if not (sickbeard.USE_PUSHBULLET or event is 'Test' or event is None): return False - if pushbullet_api == None: - pushbullet_api = sickbeard.PUSHBULLET_API - if pushbullet_device == None: - pushbullet_device = sickbeard.PUSHBULLET_DEVICE - - if method == 'POST': - uri = '/v2/pushes' - else: - uri = '/v2/devices' - - logger.log(u"Pushbullet event: " + str(event), logger.DEBUG) - logger.log(u"Pushbullet message: " + str(message), logger.DEBUG) - logger.log(u"Pushbullet api: " + str(pushbullet_api), logger.DEBUG) - logger.log(u"Pushbullet devices: " + str(pushbullet_device), logger.DEBUG) - logger.log(u"Pushbullet notification type: " + str(notificationType), logger.DEBUG) - - http_handler = HTTPSConnection("api.pushbullet.com") - - if notificationType == None: - testMessage = True - try: - logger.log(u"Testing Pushbullet authentication and retrieving the device list.", logger.DEBUG) - http_handler.request(method, uri, None, headers={'Authorization': 'Bearer %s' % pushbullet_api}) - except (SSLError, HTTPException, socket.error): - logger.log(u"Pushbullet notification failed.", logger.ERROR) - return False - else: - testMessage = False - try: - data = { - 'title': event.encode('utf-8'), - 'body': message.encode('utf-8'), - 'device_iden': pushbullet_device, - 'type': notificationType} - data = json.dumps(data) - http_handler.request(method, uri, body=data, - headers={'Content-Type': 'application/json', 'Authorization': 'Bearer %s' % pushbullet_api}) - except (SSLError, HTTPException, socket.error): - return False - - response = http_handler.getresponse() - request_body = response.read() - request_status = response.status - logger.log(u"Pushbullet response: %s" % request_body, logger.DEBUG) - - if request_status == 200: - if testMessage: - return request_body - else: - logger.log(u"Pushbullet notifications sent.", logger.DEBUG) - return True - elif request_status == 410: - logger.log(u"Pushbullet auth failed: %s" % response.reason, logger.ERROR) + pushbullet_api = pushbullet_api or sickbeard.PUSHBULLET_API + pushbullet_device = pushbullet_device or sickbeard.PUSHBULLET_DEVICE + + logger.log(u"Pushbullet event: %r" % event, logger.DEBUG) + logger.log(u"Pushbullet message: %r" % message, logger.DEBUG) + logger.log(u"Pushbullet api: %r" % pushbullet_api, logger.DEBUG) + logger.log(u"Pushbullet devices: %r" % pushbullet_device, logger.DEBUG) + logger.log(u"Pushbullet notification type: %r" % 'note' if event else 'None', logger.DEBUG) + + url = 'https://api.pushbullet.com/v2/%s' % ('devices', 'pushes')[event is not None] + + data = json.dumps({ + 'title': event.encode('utf-8'), + 'body': message.encode('utf-8'), + 'device_iden': pushbullet_device.encode('utf-8'), + 'type': 'note' + }) if event else None + + method = 'GET' if data is None else 'POST' + headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer %s' % pushbullet_api} + + try: + response = self.session.request(method, url, data=data, headers=headers) + except Exception: + logger.log(u'Pushbullet authorization failed with exception: %r' % traceback.format_exc(), logger.DEBUG) return False - else: + + if response.status_code == 410: + logger.log(u'Pushbullet authorization failed', logger.DEBUG) + return False + + if response.status_code != 200: + logger.log(u'Pushbullet call failed with error code %r' % response.status_code, logger.DEBUG) + return False + + logger.log(u"Pushbullet response: %r" % response.text, logger.DEBUG) + + if not response.text: logger.log(u"Pushbullet notification failed.", logger.ERROR) return False + logger.log(u"Pushbullet notifications sent.", logger.DEBUG) + return (True, response.text)[event is self.TEST_EVENT or event is None] -notifier = PushbulletNotifier +notifier = PushbulletNotifier diff --git a/sickbeard/sbdatetime.py b/sickbeard/sbdatetime.py index 815eeb45b..27b7f69b8 100644 --- a/sickbeard/sbdatetime.py +++ b/sickbeard/sbdatetime.py @@ -24,69 +24,70 @@ import functools import sickbeard from sickbeard.network_timezones import sb_timezone -date_presets = ('%Y-%m-%d', - '%a, %Y-%m-%d', - '%A, %Y-%m-%d', - '%y-%m-%d', - '%a, %y-%m-%d', - '%A, %y-%m-%d', - '%m/%d/%Y', - '%a, %m/%d/%Y', - '%A, %m/%d/%Y', - '%m/%d/%y', - '%a, %m/%d/%y', - '%A, %m/%d/%y', - '%m-%d-%Y', - '%a, %m-%d-%Y', - '%A, %m-%d-%Y', - '%m-%d-%y', - '%a, %m-%d-%y', - '%A, %m-%d-%y', - '%m.%d.%Y', - '%a, %m.%d.%Y', - '%A, %m.%d.%Y', - '%m.%d.%y', - '%a, %m.%d.%y', - '%A, %m.%d.%y', - '%d-%m-%Y', - '%a, %d-%m-%Y', - '%A, %d-%m-%Y', - '%d-%m-%y', - '%a, %d-%m-%y', - '%A, %d-%m-%y', - '%d/%m/%Y', - '%a, %d/%m/%Y', - '%A, %d/%m/%Y', - '%d/%m/%y', - '%a, %d/%m/%y', - '%A, %d/%m/%y', - '%d.%m.%Y', - '%a, %d.%m.%Y', - '%A, %d.%m.%Y', - '%d.%m.%y', - '%a, %d.%m.%y', - '%A, %d.%m.%y', - '%d. %b %Y', - '%a, %d. %b %Y', - '%A, %d. %b %Y', - '%d. %b %y', - '%a, %d. %b %y', - '%A, %d. %b %y', - '%d. %B %Y', - '%a, %d. %B %Y', - '%A, %d. %B %Y', - '%d. %B %y', - '%a, %d. %B %y', - '%A, %d. %B %y', - '%b %d, %Y', - '%a, %b %d, %Y', - '%A, %b %d, %Y', - '%B %d, %Y', - '%a, %B %d, %Y', - '%A, %B %d, %Y') +date_presets = ( + '%Y-%m-%d', + '%a, %Y-%m-%d', + '%A, %Y-%m-%d', + '%y-%m-%d', + '%a, %y-%m-%d', + '%A, %y-%m-%d', + '%m/%d/%Y', + '%a, %m/%d/%Y', + '%A, %m/%d/%Y', + '%m/%d/%y', + '%a, %m/%d/%y', + '%A, %m/%d/%y', + '%m-%d-%Y', + '%a, %m-%d-%Y', + '%A, %m-%d-%Y', + '%m-%d-%y', + '%a, %m-%d-%y', + '%A, %m-%d-%y', + '%m.%d.%Y', + '%a, %m.%d.%Y', + '%A, %m.%d.%Y', + '%m.%d.%y', + '%a, %m.%d.%y', + '%A, %m.%d.%y', + '%d-%m-%Y', + '%a, %d-%m-%Y', + '%A, %d-%m-%Y', + '%d-%m-%y', + '%a, %d-%m-%y', + '%A, %d-%m-%y', + '%d/%m/%Y', + '%a, %d/%m/%Y', + '%A, %d/%m/%Y', + '%d/%m/%y', + '%a, %d/%m/%y', + '%A, %d/%m/%y', + '%d.%m.%Y', + '%a, %d.%m.%Y', + '%A, %d.%m.%Y', + '%d.%m.%y', + '%a, %d.%m.%y', + '%A, %d.%m.%y', + '%d. %b %Y', + '%a, %d. %b %Y', + '%A, %d. %b %Y', + '%d. %b %y', + '%a, %d. %b %y', + '%A, %d. %b %y', + '%d. %B %Y', + '%a, %d. %B %Y', + '%A, %d. %B %Y', + '%d. %B %y', + '%a, %d. %B %y', + '%A, %d. %B %y', + '%b %d, %Y', + '%a, %b %d, %Y', + '%A, %b %d, %Y', + '%B %d, %Y', + '%a, %B %d, %Y', + '%A, %B %d, %Y' +) -time_presets = ('%I:%M:%S %p', - '%H:%M:%S') +time_presets = ('%I:%M:%S %p', '%H:%M:%S') # helper class class static_or_instance(object): @@ -140,7 +141,7 @@ class sbdatetime(datetime.datetime): except Exception: sbdatetime.has_locale = False - strt = '' + strt = u'' try: if self is None: if dt is not None: @@ -183,7 +184,7 @@ class sbdatetime(datetime.datetime): except Exception: pass - strd = '' + strd = u'' try: if self is None: if dt is not None: @@ -224,7 +225,7 @@ class sbdatetime(datetime.datetime): except Exception: pass - strd = '' + strd = u'' try: if self is None: if dt is not None: diff --git a/sickbeard/scene_exceptions.py b/sickbeard/scene_exceptions.py index ed926d625..8e1e6b814 100644 --- a/sickbeard/scene_exceptions.py +++ b/sickbeard/scene_exceptions.py @@ -38,33 +38,33 @@ exceptionsSeasonCache = {} exceptionLock = threading.Lock() -def shouldRefresh(list): +def shouldRefresh(exList): """ - Check if we should refresh cache for items in list + Check if we should refresh cache for items in exList - :param list: list to check + :param exList: exception list to check if needs a refresh :return: True if refresh is needed """ MAX_REFRESH_AGE_SECS = 86400 # 1 day myDB = db.DBConnection('cache.db') - rows = myDB.select("SELECT last_refreshed FROM scene_exceptions_refresh WHERE list = ?", [list]) + rows = myDB.select("SELECT last_refreshed FROM scene_exceptions_refresh WHERE list = ?", [exList]) if rows: lastRefresh = int(rows[0]['last_refreshed']) return int(time.mktime(datetime.datetime.today().timetuple())) > lastRefresh + MAX_REFRESH_AGE_SECS else: return True -def setLastRefresh(list): +def setLastRefresh(exList): """ Update last cache update time for shows in list - :param list: list to check + :param exList: exception list to set refresh time """ myDB = db.DBConnection('cache.db') myDB.upsert("scene_exceptions_refresh", {'last_refreshed': int(time.mktime(datetime.datetime.today().timetuple()))}, - {'list': list}) + {'list': exList}) def get_scene_exceptions(indexer_id, season=-1): """ @@ -183,8 +183,6 @@ def retrieve_exceptions(): """ global exception_dict, anidb_exception_dict, xem_exception_dict - # exceptions are stored in submodules in this repo, sourced from the github repos - # TODO: `git submodule update` for indexer in sickbeard.indexerApi().indexers: if shouldRefresh(sickbeard.indexerApi(indexer).name): logger.log(u"Checking for scene exception updates for " + sickbeard.indexerApi(indexer).name + "") @@ -270,7 +268,7 @@ def update_scene_exceptions(indexer_id, scene_exceptions, season=-1): myDB.action('DELETE FROM scene_exceptions WHERE indexer_id=? and season=?', [indexer_id, season]) logger.log(u"Updating scene exceptions", logger.INFO) - + # A change has been made to the scene exception list. Let's clear the cache, to make this visible if indexer_id in exceptionsCache: exceptionsCache[indexer_id] = {} diff --git a/sickbeard/search.py b/sickbeard/search.py index ddd3b2f92..aea1bfa0d 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -141,7 +141,7 @@ def snatchEpisode(result, endStatus=SNATCHED): logger.log(u"Torrent file content is empty", logger.WARNING) dlResult = False else: - logger.log(u"Unknown result type, unable to download it", logger.ERROR) + logger.log(u"Unknown result type, unable to download it (%r)" % result.resultType, logger.ERROR) dlResult = False if not dlResult: -- GitLab From 5d53ef93afe320314fee0eaebe2ecc372d7dd83a Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sun, 8 Nov 2015 22:50:19 -0800 Subject: [PATCH 164/215] Fix displaying non ascii in log/error viewer Remove mako error matching regex, to speed up issue submitter Also return local encoding for windows in issue submitter (should work according to docs) --- sickbeard/logger.py | 46 ++++++++++++++++++------------------------- sickbeard/webapi.py | 2 +- sickbeard/webserve.py | 13 ++++++------ 3 files changed, 26 insertions(+), 35 deletions(-) diff --git a/sickbeard/logger.py b/sickbeard/logger.py index c322c5ade..abc96c575 100644 --- a/sickbeard/logger.py +++ b/sickbeard/logger.py @@ -16,8 +16,9 @@ # # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -# pylint: disable=W0703 + +import io import os import re import sys @@ -28,13 +29,14 @@ import platform import locale import traceback +from github import Github, InputFileContent + import sickbeard from sickbeard import classes from sickrage.helper.common import dateTimeFormat -from sickrage.helper.encoding import ek, ss from sickrage.helper.exceptions import ex -from github import Github, InputFileContent -import codecs +from sickrage.helper.encoding import ss + # log levels ERROR = logging.ERROR @@ -174,11 +176,11 @@ class Logger(object): else: sys.exit(1) - def submit_errors(self): + def submit_errors(self): # Too many local variables, too many branches, pylint: disable=R0912,R0914 submitter_result = u'' issue_id = None - # pylint: disable=R0912,R0914,R0915 + if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0): submitter_result = u'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id @@ -212,12 +214,12 @@ class Logger(object): log_data = None if os.path.isfile(self.logFile): - with ek(codecs.open, *[self.logFile, 'r', 'utf-8']) as f: + with io.open(self.logFile, 'r', encoding='utf-8') as f: log_data = f.readlines() for i in range(1, int(sickbeard.LOG_NR)): if os.path.isfile(self.logFile + ".%i" % i) and (len(log_data) <= 500): - with ek(codecs.open, *[self.logFile + ".%i" % i, 'r', 'utf-8']) as f: + with io.open(self.logFile + ".%i" % i, 'r', encoding='utf-8') as f: log_data += f.readlines() log_data = [line for line in reversed(log_data)] @@ -226,7 +228,7 @@ class Logger(object): for curError in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: - title_Error = ss(str(curError.title)) + title_Error = ss(curError.title) if not len(title_Error) or title_Error == 'None': title_Error = re.match(r"^[A-Z0-9\-\[\] :]+::\s*(.*)$", ss(curError.message)).group(1) @@ -236,14 +238,13 @@ class Logger(object): self.log("Unable to get error title : " + ex(e), ERROR) gist = None - regex = r"^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)$" % curError.time + regex = ur"^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)$" % curError.time for i, x in enumerate(log_data): - x = ss(x) match = re.match(regex, x) if match: level = match.group(2) if reverseNames[level] == ERROR: - paste_data = "".join(log_data[i:i+50]) + paste_data = u"".join(log_data[i:i+50]) if paste_data: gist = gh.get_user().create_gist(True, {"sickrage.log": InputFileContent(paste_data)}) break @@ -253,11 +254,10 @@ class Logger(object): message = u"### INFO\n" message += u"Python Version: **" + sys.version[:120].replace('\n', '') + "**\n" message += u"Operating System: **" + platform.platform() + "**\n" - if not 'Windows' in platform.platform(): - try: - message += u"Locale: " + locale.getdefaultlocale()[1] + "\n" - except Exception: - message += u"Locale: unknown" + "\n" + try: + message += u"Locale: " + locale.getdefaultlocale()[1] + "\n" + except Exception: + message += u"Locale: unknown" + "\n" message += u"Branch: **" + sickbeard.BRANCH + "**\n" message += u"Commit: SiCKRAGETV/SickRage@" + sickbeard.CUR_COMMIT_HASH + "\n" if gist and gist != 'No ERROR found': @@ -274,29 +274,21 @@ class Logger(object): title_Error = u"[APP SUBMITTED]: " + title_Error reports = gh.get_organization(gh_org).get_repo(gh_repo).get_issues(state="all") - def is_mako_error(title): - # [APP SUBMITTED]: Loaded module _home_pi_SickRage_gui_slick_views_home_mako not found in sys.modules - # [APP SUBMITTED]: Loaded module _opt_sickbeard_gui_slick_views_home_mako not found in sys.modules - # [APP SUBMITTED]: Loaded module D__TV_SickRage_gui_slick_views_home_mako not found in sys.modules - return re.search(r".* Loaded module .* not found in sys\.modules", title) is not None - def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> - return re.search(r".* codec can't .*code .* in position .*:", title) is not None + return re.search(ur".* codec can't .*code .* in position .*:", title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 - return re.search(r".* not well-formed \(invalid token\): line .* column .*", title) is not None + return re.search(ur".* not well-formed \(invalid token\): line .* column .*", title) is not None - mako_error = is_mako_error(title_Error) ascii_error = is_ascii_error(title_Error) malformed_error = is_malformed_error(title_Error) issue_found = False for report in reports: if title_Error.rsplit(' :: ')[-1] in report.title or \ - (mako_error and is_mako_error(report.title)) or \ (malformed_error and is_malformed_error(report.title)) or \ (ascii_error and is_ascii_error(report.title)): diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 431b0ab8f..4a2507c42 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -1211,7 +1211,7 @@ class CMD_Logs(ApiCall): data = [] if os.path.isfile(logger.logFile): - with ek(codecs.open, *[logger.logFile, 'r', 'utf-8']) as f: + with io.open(logger.logFile, 'r', encoding='utf-8') as f: data = f.readlines() regex = r"^(\d\d\d\d)\-(\d\d)\-(\d\d)\s*(\d\d)\:(\d\d):(\d\d)\s*([A-Z]+)\s*(.+?)\s*\:\:\s*(.*)$" diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index c6df598a0..659bba264 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -17,13 +17,13 @@ # You should have received a copy of the GNU General Public License # along with SickRage. If not, see <http://www.gnu.org/licenses/>. -import traceback +import io import os +import re import time import urllib -import re import datetime -import codecs +import traceback import sickbeard from sickbeard import config, sab @@ -4965,7 +4965,6 @@ class ErrorLogs(WebRoot): finalData = [] for x in reversed(data_in): - x = ss(x) match = re.match(regex, x) if match: @@ -5029,17 +5028,17 @@ class ErrorLogs(WebRoot): data = [] if os.path.isfile(logger.logFile): - with ek(codecs.open, *[logger.logFile, 'r', 'utf-8']) as f: + with io.open(logger.logFile, 'r', encoding='utf-8') as f: data = Get_Data(minLevel, f.readlines(), 0, regex, logFilter, logSearch, maxLines) for i in range(1, int(sickbeard.LOG_NR)): if os.path.isfile(logger.logFile + "." + str(i)) and (len(data) <= maxLines): - with ek(codecs.open, *[logger.logFile + "." + str(i), 'r', 'utf-8']) as f: + with io.open(logger.logFile + "." + str(i), 'r', encoding='utf-8') as f: data += Get_Data(minLevel, f.readlines(), len(data), regex, logFilter, logSearch, maxLines) return t.render( header="Log File", title="Logs", topmenu="system", - logLines="".join(data), minLevel=minLevel, logNameFilters=logNameFilters, + logLines=u"".join(data), minLevel=minLevel, logNameFilters=logNameFilters, logFilter=logFilter, logSearch=logSearch) def submit_errors(self): -- GitLab From eb15176b75602953ecc550c13785686782f2553c Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 9 Nov 2015 01:17:43 -0800 Subject: [PATCH 165/215] Fix missing episodes in displayShow --- gui/slick/js/new/displayShow.js | 7 ++++--- gui/slick/views/displayShow.mako | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js index 061358d2e..64dd98218 100644 --- a/gui/slick/js/new/displayShow.js +++ b/gui/slick/js/new/displayShow.js @@ -115,9 +115,10 @@ $(document).ready(function(){ }); // initially show/hide all the rows according to the checkboxes - $("#checkboxControls input").each(function() { - $("tr." + $(this).attr('id')).each(function() { - if(this.checked) { + $("#checkboxControls input").each(function(e) { + var status = $(this).prop('checked'); + $("tr." + $(this).attr('id')).each(function(status) { + if(status) { $(this).show(); } else { $(this).hide(); diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako index b8963dbe5..4dbed7129 100644 --- a/gui/slick/views/displayShow.mako +++ b/gui/slick/views/displayShow.mako @@ -14,12 +14,12 @@ %> <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/lib/jquery.bookmarkscroll.js?${sbPID}"></script> +<script type="text/javascript" src="${srRoot}/js/new/displayShow.js"></script> <script type="text/javascript" src="${srRoot}/js/plotTooltip.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/sceneExceptionsTooltip.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/ratingTooltip.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/ajaxEpSearch.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/ajaxEpSubtitles.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/new/displayShow.js"></script> </%block> <%block name="content"> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> @@ -250,11 +250,11 @@ <div class="pull-right clearfix" id="checkboxControls"> <div style="padding-bottom: 5px;"> - <label for="wanted"><span class="wanted"><input type="checkbox" id="wanted"checked="checked" /> Wanted: <b>${epCounts[Overview.WANTED]}</b></span></label> - <label for="qual"><span class="qual"><input type="checkbox" id="qual"checked="checked" /> Low Quality: <b>${epCounts[Overview.QUAL]}</b></span></label> - <label for="good"><span class="good"><input type="checkbox" id="good"checked="checked" /> Downloaded: <b>${epCounts[Overview.GOOD]}</b></span></label> - <label for="skipped"><span class="skipped"><input type="checkbox" id="skipped"checked="checked" /> Skipped: <b>${epCounts[Overview.SKIPPED]}</b></span></label> - <label for="snatched"><span class="snatched"><input type="checkbox" id="snatched"checked="checked" /> Snatched: <b>${epCounts[Overview.SNATCHED]}</b></span></label> + <label for="wanted"><span class="wanted"><input type="checkbox" id="wanted" checked="checked" /> Wanted: <b>${epCounts[Overview.WANTED]}</b></span></label> + <label for="qual"><span class="qual"><input type="checkbox" id="qual" checked="checked" /> Low Quality: <b>${epCounts[Overview.QUAL]}</b></span></label> + <label for="good"><span class="good"><input type="checkbox" id="good" checked="checked" /> Downloaded: <b>${epCounts[Overview.GOOD]}</b></span></label> + <label for="skipped"><span class="skipped"><input type="checkbox" id="skipped" checked="checked" /> Skipped: <b>${epCounts[Overview.SKIPPED]}</b></span></label> + <label for="snatched"><span class="snatched"><input type="checkbox" id="snatched" checked="checked" /> Snatched: <b>${epCounts[Overview.SNATCHED]}</b></span></label> </div> <button id="popover" type="button" class="btn btn-xs">Select Columns <b class="caret"></b></button> -- GitLab From d7c568249b59be3757de4b970d5f561527bc3553 Mon Sep 17 00:00:00 2001 From: medariox <dariovizz@hotmail.it> Date: Mon, 9 Nov 2015 17:10:36 +0100 Subject: [PATCH 166/215] Added DVD parsing for %SQN, making sure group is not included in parsing --- sickbeard/common.py | 4 ++-- sickbeard/tv.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sickbeard/common.py b/sickbeard/common.py index 7349d69df..fdab157b2 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -436,9 +436,9 @@ class Quality(object): # 2 corresponds to SDDVD quality if quality == 2: - if re.search(r"b[rd](|.|-| )(rip|mux)", name.lower()): + if re.search(r"b(r|d|rd)?(-| |\.)?(rip|mux)", name.lower()): rip_type = " BDRip" - elif re.search(r"dvd(|.|-| )(rip|mux)", name.lower()): + elif re.search(r"(dvd)(-| |\.)?(rip|mux)?", name.lower()): rip_type = " DVDRip" else: rip_type = "" diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 3d84b9808..1a54e45b8 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -2107,11 +2107,6 @@ class TVEpisode(object): else: show_name = self.show.name - # try to get the release encoder to comply with scene naming standards - encoder = Quality.sceneQualityFromName(self.release_name, epQual) - if encoder: - logger.log(u"Found codec for '" + show_name + ": " + ep_name + "'.", logger.DEBUG) - # try to get the release group rel_grp = {} rel_grp["SiCKRAGE"] = 'SiCKRAGE' @@ -2137,6 +2132,11 @@ class TVEpisode(object): relgrp = 'location' else: relgrp = 'SiCKRAGE' + # try to get the release encoder to comply with scene naming standards + encoder = Quality.sceneQualityFromName(self.release_name.replace(rel_grp[relgrp], ""), epQual) + if encoder: + logger.log(u"Found codec for '" + show_name + ": " + ep_name + "'.", logger.DEBUG) + return { '%SN': show_name, '%S.N': dot(show_name), -- GitLab From 51c8c8ba3443b6ce4dbe538c49c2f59a6180050f Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 9 Nov 2015 08:18:25 -0800 Subject: [PATCH 167/215] Fix forgotten import in webapi Lint gui/slick/js/new/displayShow.js --- gui/slick/js/new/displayShow.js | 4 ++-- sickbeard/webapi.py | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js index 64dd98218..acc6c5d6e 100644 --- a/gui/slick/js/new/displayShow.js +++ b/gui/slick/js/new/displayShow.js @@ -115,9 +115,9 @@ $(document).ready(function(){ }); // initially show/hide all the rows according to the checkboxes - $("#checkboxControls input").each(function(e) { + $("#checkboxControls input").each(function() { var status = $(this).prop('checked'); - $("tr." + $(this).attr('id')).each(function(status) { + $("tr." + $(this).attr('id')).each(function() { if(status) { $(this).show(); } else { diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index 4a2507c42..9fbe6cfae 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -18,12 +18,14 @@ # along with SickRage. If not, see <http://www.gnu.org/licenses/>. # pylint: disable=W0223,E0202 +import io import os +import re import time import urllib import datetime -import re import traceback + import sickbeard from sickrage.helper.common import dateFormat, dateTimeFormat, timeFormat from sickrage.helper.encoding import ek @@ -58,7 +60,6 @@ from sickbeard.common import UNKNOWN from sickbeard.common import WANTED from sickbeard.common import ARCHIVED from sickbeard.common import statusStrings -import codecs try: import json @@ -1290,7 +1291,7 @@ class CMD_PostProcess(ApiCall): self.type = 'manual' data = processTV.processDir(self.path, process_method=self.process_method, force=self.force_replace, - is_priority=self.is_priority, failed=self.failed, type=self.type) + is_priority=self.is_priority, failed=self.failed, proc_type=self.type) if not self.return_data: data = "" -- GitLab From 570e11a823e4aced85298760cd43110bf860bd29 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 9 Nov 2015 11:06:50 -0800 Subject: [PATCH 168/215] Fix displayshow, shcedule, history encoding problems. Still a few questionable str() calls around datetime objects in mako --- gui/slick/views/schedule.mako | 4 ++-- sickbeard/sbdatetime.py | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/gui/slick/views/schedule.mako b/gui/slick/views/schedule.mako index 921ab7466..87e79ab51 100644 --- a/gui/slick/views/schedule.mako +++ b/gui/slick/views/schedule.mako @@ -139,7 +139,7 @@ <td> % if cur_result['description']: - <img alt="" src="${srRoot}/images/info32.png" height="16" width="16" class="plotInfo" id="plot_info_${'%s_%s_%s' % (str(cur_result['showid']), str(cur_result['season']), str(cur_result['episode']))}" /> + <img alt="" src="${srRoot}/images/info32.png" height="16" width="16" class="plotInfo" id="plot_info_${'%s_%s_%s' % (cur_result['showid'], cur_result['season'], cur_result['episode'])}" /> % else: <img alt="" src="${srRoot}/images/info32.png" width="16" height="16" class="plotInfoNone" /> % endif @@ -319,7 +319,7 @@ <span class="title">Next Episode:</span> <span>${'S%02iE%02i' % (int(cur_result['season']), int(cur_result['episode']))} - ${cur_result['name']}</span> <div class="clearfix"> - <span class="title">Airs: </span><span class="airdate">${sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime']).decode(sickbeard.SYS_ENCODING)}</span>${('', '<span> on %s</span>' % str(cur_result['network']))[bool(cur_result['network'])]} + <span class="title">Airs: </span><span class="airdate">${sbdatetime.sbdatetime.sbfdatetime(cur_result['localtime'])}</span>${('', '<span> on %s</span>' % cur_result['network'])[bool(cur_result['network'])]} </div> <div class="clearfix"> diff --git a/sickbeard/sbdatetime.py b/sickbeard/sbdatetime.py index 27b7f69b8..4c0850bd8 100644 --- a/sickbeard/sbdatetime.py +++ b/sickbeard/sbdatetime.py @@ -141,7 +141,7 @@ class sbdatetime(datetime.datetime): except Exception: sbdatetime.has_locale = False - strt = u'' + strt = '' try: if self is None: if dt is not None: @@ -165,7 +165,7 @@ class sbdatetime(datetime.datetime): except Exception: sbdatetime.has_locale = False - return strt + return strt.decode(sickbeard.SYS_ENCODING) # display Date in SickRage Format @static_or_instance @@ -184,7 +184,7 @@ class sbdatetime(datetime.datetime): except Exception: pass - strd = u'' + strd = '' try: if self is None: if dt is not None: @@ -204,7 +204,7 @@ class sbdatetime(datetime.datetime): except Exception: pass - return strd + return strd.decode(sickbeard.SYS_ENCODING) # display Datetime in SickRage Format @static_or_instance @@ -225,7 +225,7 @@ class sbdatetime(datetime.datetime): except Exception: pass - strd = u'' + strd = '' try: if self is None: if dt is not None: @@ -243,11 +243,11 @@ class sbdatetime(datetime.datetime): except Exception: sbdatetime.has_locale = False if t_preset is not None: - strd += u', ' + dt.strftime(t_preset) + strd += ', ' + dt.strftime(t_preset) elif show_seconds: - strd += u', ' + dt.strftime(sickbeard.TIME_PRESET_W_SECONDS) + strd += ', ' + dt.strftime(sickbeard.TIME_PRESET_W_SECONDS) else: - strd += u', ' + dt.strftime(sickbeard.TIME_PRESET) + strd += ', ' + dt.strftime(sickbeard.TIME_PRESET) else: if d_preset is not None: strd = self.strftime(d_preset) @@ -263,11 +263,11 @@ class sbdatetime(datetime.datetime): except Exception: sbdatetime.has_locale = False if t_preset is not None: - strd += u', ' + self.strftime(t_preset) + strd += ', ' + self.strftime(t_preset) elif show_seconds: - strd += u', ' + self.strftime(sickbeard.TIME_PRESET_W_SECONDS) + strd += ', ' + self.strftime(sickbeard.TIME_PRESET_W_SECONDS) else: - strd += u', ' + self.strftime(sickbeard.TIME_PRESET) + strd += ', ' + self.strftime(sickbeard.TIME_PRESET) finally: try: if sbdatetime.has_locale: @@ -275,4 +275,4 @@ class sbdatetime(datetime.datetime): except Exception: sbdatetime.has_locale = False - return strd + return strd.decode(sickbeard.SYS_ENCODING) -- GitLab From 3f55c027638c401de4d4e0619827790dccc28dce Mon Sep 17 00:00:00 2001 From: medariox <dariovizz@hotmail.it> Date: Mon, 9 Nov 2015 20:39:04 +0100 Subject: [PATCH 169/215] Fixes extra scripts for subtitles --- sickbeard/subtitles.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index ab84da88b..5e06e596a 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -154,7 +154,7 @@ def downloadSubtitles(subtitles_info): save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickbeard.SUBTITLES_MULTI) if not sickbeard.EMBEDDED_SUBTITLES_ALL and sickbeard.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith(('.mkv', '.mp4')): - run_subs_extra_scripts(subtitles_info, found_subtitles) + run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickbeard.SUBTITLES_MULTI) current_subtitles = subtitlesLanguages(video_path)[0] new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) @@ -439,31 +439,26 @@ class SubtitlesFinder(object): return {'old': [0, 24], 'new': [0, 4, 8, 4, 16, 24, 24]} -def run_subs_extra_scripts(epObj, foundSubs): +def run_subs_extra_scripts(epObj, found_subtitles, video, single=False): for curScriptName in sickbeard.SUBTITLES_EXTRA_SCRIPTS: script_cmd = [piece for piece in re.split("( |\\\".*?\\\"|'.*?')", curScriptName) if piece.strip()] script_cmd[0] = ek(os.path.abspath, script_cmd[0]) logger.log(u"Absolute path to script: " + script_cmd[0], logger.DEBUG) - for video, subs in foundSubs.iteritems(): - for sub in subs: - subpath = subliminal.subtitle.get_subtitle_path(video.name, sub.language) - if os.path.isabs(sickbeard.SUBTITLES_DIR): - subpath = ek(os.path.join, sickbeard.SUBTITLES_DIR, ek(os.path.basename, subpath)) - elif sickbeard.SUBTITLES_DIR: - subpath = ek(os.path.join, ek(os.path.dirname, subpath), sickbeard.SUBTITLES_DIR, ek(os.path.basename, subpath)) + for subtitle in found_subtitles: + subtitle_path = subliminal.subtitle.get_subtitle_path(video.name, None if single else subtitle.language) - inner_cmd = script_cmd + [video.name, subpath, sub.language.opensubtitles, epObj['show.name'], - str(epObj['season']), str(epObj['episode']), epObj['name'], str(epObj['show.indexerid'])] + inner_cmd = script_cmd + [video.name, subtitle_path, subtitle.language.opensubtitles, epObj['show.name'], + str(epObj['season']), str(epObj['episode']), epObj['name'], str(epObj['show.indexerid'])] - # use subprocess to run the command and capture output - logger.log(u"Executing command: %s" % inner_cmd) - try: - p = subprocess.Popen(inner_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) - out, _ = p.communicate() # @UnusedVariable - logger.log(u"Script result: %s" % out, logger.DEBUG) + # use subprocess to run the command and capture output + logger.log(u"Executing command: %s" % inner_cmd) + try: + p = subprocess.Popen(inner_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, cwd=sickbeard.PROG_DIR) + out, _ = p.communicate() # @UnusedVariable + logger.log(u"Script result: %s" % out, logger.DEBUG) - except Exception as e: - logger.log(u"Unable to run subs_extra_script: " + ex(e)) + except Exception as e: + logger.log(u"Unable to run subs_extra_script: " + ex(e)) -- GitLab From 97ed4adedf4cca09086a80d336a5fd0149c10a27 Mon Sep 17 00:00:00 2001 From: Gaganpreet Arora <gaganpreet.arora@gmail.com> Date: Mon, 9 Nov 2015 20:55:26 +0100 Subject: [PATCH 170/215] Encode long type as int --- lib/rtorrent/lib/bencode.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/rtorrent/lib/bencode.py b/lib/rtorrent/lib/bencode.py index 97bd2f0eb..705d9cd65 100644 --- a/lib/rtorrent/lib/bencode.py +++ b/lib/rtorrent/lib/bencode.py @@ -42,8 +42,10 @@ _py3 = sys.version_info[0] == 3 if _py3: _VALID_STRING_TYPES = (str,) + _VALID_INT_TYPES = (int,) else: _VALID_STRING_TYPES = (str, unicode) # @UndefinedVariable + _VALID_INT_TYPES = (int, long) # @UndefinedVariable _TYPE_INT = 1 _TYPE_STRING = 2 @@ -267,7 +269,7 @@ def _encode_dict(data): def encode(data): if isinstance(data, bool): return False - elif isinstance(data, int): + elif isinstance(data, _VALID_INT_TYPES): return _encode_int(data) elif isinstance(data, bytes): return _encode_string(data) -- GitLab From 4b352bc44e189f45937b98b0365cc1b9c6d5c7eb Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 9 Nov 2015 13:54:53 -0800 Subject: [PATCH 171/215] Fix synoindex calls in helpers Remove unneeded global keywords in sceme_exceptions Clarify log message for torrentz --- sickbeard/helpers.py | 6 +++--- sickbeard/providers/torrentz.py | 2 +- sickbeard/scene_exceptions.py | 21 +++++++-------------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index bdd4b0d09..47aaf3bd1 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -357,7 +357,7 @@ def makeDir(path): try: ek(os.makedirs, path) # do the library update for synoindex - synoindex_notifier.addFolder(path) + synoindex_notifier().addFolder(path) except OSError: return False return True @@ -622,7 +622,7 @@ def make_dirs(path): # use normpath to remove end separator, otherwise checks permissions against itself chmodAsParent(ek(os.path.normpath, sofar)) # do the library update for synoindex - synoindex_notifier.addFolder(sofar) + synoindex_notifier().addFolder(sofar) except (OSError, IOError) as e: logger.log(u"Failed creating %s : %r" % (sofar, ex(e)), logger.ERROR) return False @@ -702,7 +702,7 @@ def delete_empty_folders(check_empty_dir, keep_dir=None): # need shutil.rmtree when ignore_items is really implemented ek(os.rmdir, check_empty_dir) # do the library update for synoindex - synoindex_notifier.deleteFolder(check_empty_dir) + synoindex_notifier().deleteFolder(check_empty_dir) except OSError as e: logger.log(u"Unable to delete %s. Error: %r" % (check_empty_dir, repr(e)), logger.WARNING) break diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index 2741708db..c5a89de89 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -86,7 +86,7 @@ class TORRENTZProvider(generic.TorrentProvider): continue if not all([data, 'rss' in data, 'channel' in data['rss'], 'item' in data['rss']['channel']]): - logger.log(u"Malformed rss returned, skipping", logger.DEBUG) + logger.log(u"Malformed rss returned or no results, skipping", logger.DEBUG) continue time.sleep(cpu_presets[sickbeard.CPU_PRESET]) diff --git a/sickbeard/scene_exceptions.py b/sickbeard/scene_exceptions.py index 8e1e6b814..69cdfbcfc 100644 --- a/sickbeard/scene_exceptions.py +++ b/sickbeard/scene_exceptions.py @@ -70,7 +70,7 @@ def get_scene_exceptions(indexer_id, season=-1): """ Given a indexer_id, return a list of all the scene exceptions. """ - global exceptionsCache + exceptionsList = [] if indexer_id not in exceptionsCache or season not in exceptionsCache[indexer_id]: @@ -117,7 +117,6 @@ def get_scene_seasons(indexer_id): """ return a list of season numbers that have scene exceptions """ - global exceptionsSeasonCache exceptionsSeasonList = [] if indexer_id not in exceptionsSeasonCache: @@ -181,7 +180,6 @@ def retrieve_exceptions(): Looks up the exceptions on github, parses them into a dict, and inserts them into the scene_exceptions table in cache.db. Also clears the scene name cache. """ - global exception_dict, anidb_exception_dict, xem_exception_dict for indexer in sickbeard.indexerApi().indexers: if shouldRefresh(sickbeard.indexerApi(indexer).name): @@ -202,7 +200,7 @@ def retrieve_exceptions(): # each exception is on one line with the format indexer_id: 'show name 1', 'show name 2', etc for cur_line in data.splitlines(): - indexer_id, sep, aliases = cur_line.partition(':') # @UnusedVariable + indexer_id, _, aliases = cur_line.partition(':') # @UnusedVariable if not aliases: continue @@ -246,8 +244,9 @@ def retrieve_exceptions(): for ex in cur_exception_dict.iteritems(): cur_exception, curSeason = ex if cur_exception not in existing_exceptions: - queries.append(["INSERT OR IGNORE INTO scene_exceptions (indexer_id, show_name, season) VALUES (?,?,?);", - [cur_indexer_id, cur_exception, curSeason]]) + queries.append( + ["INSERT OR IGNORE INTO scene_exceptions (indexer_id, show_name, season) VALUES (?,?,?);", + [cur_indexer_id, cur_exception, curSeason]]) if queries: myDB.mass_action(queries) logger.log(u"Updated scene exceptions", logger.DEBUG) @@ -263,7 +262,6 @@ def update_scene_exceptions(indexer_id, scene_exceptions, season=-1): """ Given a indexer_id, and a list of all show scene exceptions, update the db. """ - global exceptionsCache myDB = db.DBConnection('cache.db') myDB.action('DELETE FROM scene_exceptions WHERE indexer_id=? and season=?', [indexer_id, season]) @@ -279,15 +277,13 @@ def update_scene_exceptions(indexer_id, scene_exceptions, season=-1): [indexer_id, cur_exception, season]) def _anidb_exceptions_fetcher(): - global anidb_exception_dict - if shouldRefresh('anidb'): logger.log(u"Checking for scene exception updates for AniDB") for show in sickbeard.showList: if show.is_anime and show.indexer == 1: try: anime = adba.Anime(None, name=show.name, tvdbid=show.indexerid, autoCorrectName=True) - except: + except Exception: continue else: if anime.name and anime.name != show.name: @@ -300,9 +296,6 @@ def _anidb_exceptions_fetcher(): xem_session = requests.Session() def _xem_exceptions_fetcher(): - global xem_exception_dict - global xem_session - if shouldRefresh('xem'): for indexer in sickbeard.indexerApi().indexers: logger.log(u"Checking for XEM scene exception updates for " + sickbeard.indexerApi(indexer).name) @@ -310,7 +303,7 @@ def _xem_exceptions_fetcher(): url = "http://thexem.de/map/allNames?origin=%s&seasonNumbers=1" % sickbeard.indexerApi(indexer).config[ 'xem_origin'] - parsedJSON = helpers.getURL(url, session=xem_session, timeout = 90, json=True) + parsedJSON = helpers.getURL(url, session=xem_session, timeout=90, json=True) if not parsedJSON: logger.log(u"Check scene exceptions update failed for " + sickbeard.indexerApi( indexer).name + ", Unable to get URL: " + url, logger.DEBUG) -- GitLab From 505ad2a9326eba0f9f77b08338ef6f4a87243c8d Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 9 Nov 2015 17:27:40 -0800 Subject: [PATCH 172/215] Fix history layout caching issue (cant define mutables inside <%!) Fix a few mako errors --- gui/slick/views/config_providers.mako | 1 - gui/slick/views/displayShow.mako | 2 +- gui/slick/views/history.mako | 5 +---- gui/slick/views/home_popularShows.mako | 6 +++--- gui/slick/views/manage_massEdit.mako | 3 +-- gui/slick/views/schedule.mako | 11 +++++------ 6 files changed, 11 insertions(+), 17 deletions(-) diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index acc35b3f0..28bf95490 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -4,7 +4,6 @@ from sickbeard.providers.generic import GenericProvider from sickbeard.providers import thepiratebay from sickbeard.helpers import anon_url - %> <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/configProviders.js?${sbPID}"></script> diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako index 4dbed7129..77ae53cca 100644 --- a/gui/slick/views/displayShow.mako +++ b/gui/slick/views/displayShow.mako @@ -161,7 +161,7 @@ ${renderQualityPill(show.quality)} % else: % if anyQualities: - <i>Allowed:</i> ${", ".join([capture(renderQualityPill, x) for x in sorted(anyQualities)])}${("", "</br>")[bool(bestQualities)]} + <i>Allowed:</i> ${", ".join([capture(renderQualityPill, x) for x in sorted(anyQualities)])}${("", "<br>")[bool(bestQualities)]} % endif % if bestQualities: <i>Preferred:</i> ${", ".join([capture(renderQualityPill, x) for x in sorted(bestQualities)])} diff --git a/gui/slick/views/history.mako b/gui/slick/views/history.mako index 495e8968e..ce5a5b5dd 100644 --- a/gui/slick/views/history.mako +++ b/gui/slick/views/history.mako @@ -14,9 +14,6 @@ from sickbeard.common import Quality, statusStrings, Overview from sickrage.show.History import History - - layout = sickbeard.HISTORY_LAYOUT - history_limit = sickbeard.HISTORY_LIMIT %> <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/new/history.js"></script> @@ -50,7 +47,7 @@ </div> <br> -% if layout == "detailed": +% if sickbeard.HISTORY_LAYOUT == "detailed": <table id="historyTable" class="sickbeardTable tablesorter" cellspacing="1" border="0" cellpadding="0"> <thead> <tr> diff --git a/gui/slick/views/home_popularShows.mako b/gui/slick/views/home_popularShows.mako index 3b5b5ed94..0da617745 100644 --- a/gui/slick/views/home_popularShows.mako +++ b/gui/slick/views/home_popularShows.mako @@ -1,13 +1,13 @@ <%inherit file="/layouts/main.mako"/> <%! from sickbeard.helpers import anon_url - import sickbeard - imdb_tt = [show.imdbid for show in sickbeard.showList if show.imdbid] + import sickbeard %> <%block name="content"> <h2>Popular Shows</h2> <br> +<% imdb_tt = [show.imdbid for show in sickbeard.showList if show.imdbid] %> % if not popular_shows: <h3>Fetching of IMDB Data failed. Are you online?</h3> @@ -34,7 +34,7 @@ Add Show</a></span> % else: <span> Already added </span> - % endif + % endif </div> <br style="clear:both" /> diff --git a/gui/slick/views/manage_massEdit.mako b/gui/slick/views/manage_massEdit.mako index 216782360..816af35f2 100644 --- a/gui/slick/views/manage_massEdit.mako +++ b/gui/slick/views/manage_massEdit.mako @@ -13,7 +13,6 @@ initial_quality = int(quality_value) else: initial_quality = common.SD - endif anyQualities, bestQualities = common.Quality.splitQuality(initial_quality) %> @@ -43,7 +42,7 @@ <br> <fieldset class="component-group-list"> - + <div class="field-pair"> <label for="shows"> <span class="component-title">Selected Shows</span> diff --git a/gui/slick/views/schedule.mako b/gui/slick/views/schedule.mako index 87e79ab51..3429ed986 100644 --- a/gui/slick/views/schedule.mako +++ b/gui/slick/views/schedule.mako @@ -19,7 +19,6 @@ </style> </%block> <%block name="content"> -<% sort = sickbeard.COMING_EPS_SORT %> <%namespace file="/inc_defs.mako" import="renderQualityPill"/> <h1 class="header">${header}</h1> <div class="h2footer pull-right"> @@ -122,7 +121,7 @@ <time datetime="${airDate.isoformat('T')}" class="date">${sbdatetime.sbdatetime.sbfdatetime(airDate)}</time> </td> - <td align="center" nowrap="nowrap"> + <td align="center" nowrap="nowrap"> <% ends = sbdatetime.sbdatetime.convert_to_setting(cur_ep_enddate) %> <time datetime="${ends.isoformat('T')}" class="date">${sbdatetime.sbdatetime.sbfdatetime(ends)}</time> </td> @@ -195,7 +194,7 @@ today_header = False show_div = 'ep_listing listing-default' %> -% if 'show' == sort: +% if sickbeard.COMING_EPS_SORT == 'show': <br><br> % endif @@ -214,7 +213,7 @@ else: cur_ep_enddate = cur_result['localtime'] %> - % if 'network' == sort: + % if sickbeard.COMING_EPS_SORT == 'network: <% show_network = ('no network', cur_result['network'])[bool(cur_result['network'])] %> % if cur_segment != show_network: <div> @@ -235,7 +234,7 @@ % endif % endif - % elif 'date' == sort: + % elif sickbeard.COMING_EPS_SORT == 'date': % if cur_segment != cur_ep_airdate: % if cur_ep_enddate < today and cur_ep_airdate != today.date() and not missed_header: <br><h2 class="day">Missed</h2> @@ -272,7 +271,7 @@ % endif % endif - % elif 'show' == sort: + % elif sickbeard.COMING_EPS_SORT == 'show': % if cur_ep_enddate < today: <% show_div = 'ep_listing listing-overdue listingradius' %> % elif cur_ep_airdate >= next_week.date(): -- GitLab From 12d9056c0ea41091dd5741b25c4c688f00e722e0 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Mon, 9 Nov 2015 17:54:05 -0800 Subject: [PATCH 173/215] Remove unused imports in mako @OmgImAlexis I figured out how to lint mako fairly ok, I just lint the py files in cache/mako =P --- gui/slick/views/displayShow.mako | 3 +-- gui/slick/views/home.mako | 8 +++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/gui/slick/views/displayShow.mako b/gui/slick/views/displayShow.mako index 77ae53cca..44f17cb44 100644 --- a/gui/slick/views/displayShow.mako +++ b/gui/slick/views/displayShow.mako @@ -7,9 +7,8 @@ from sickbeard import subtitles, sbdatetime, network_timezones import sickbeard.helpers - from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED + from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, FAILED from sickbeard.common import Quality, qualityPresets, statusStrings, Overview - from sickbeard.helpers import anon_url %> <%block name="scripts"> diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako index 33b95391c..b386eaa95 100644 --- a/gui/slick/views/home.mako +++ b/gui/slick/views/home.mako @@ -2,10 +2,8 @@ <%! import sickbeard import calendar - from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED - from sickbeard.common import Quality, qualityPresets, qualityPresetStrings - from sickbeard import db, sbdatetime, network_timezones - import datetime + from sickbeard import sbdatetime + from sickbeard import network_timezones import re %> <%block name="metas"> @@ -404,7 +402,7 @@ <% display_status = curShow.status if None is not display_status: - if re.search('(?i)(?:new|returning)\s*series', curShow.status): + if re.search(r'(?i)(?:new|returning)\s*series', curShow.status): display_status = 'Continuing' elif re.search('(?i)(?:nded)', curShow.status): display_status = 'Ended' -- GitLab From e8c5912099a266dd7006a3ed65ed4678c58d5b2e Mon Sep 17 00:00:00 2001 From: Fernando <fernandog@users.noreply.github.com> Date: Tue, 10 Nov 2015 10:13:47 -0200 Subject: [PATCH 174/215] Fix typo --- gui/slick/views/schedule.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/slick/views/schedule.mako b/gui/slick/views/schedule.mako index 3429ed986..98a4c2cf3 100644 --- a/gui/slick/views/schedule.mako +++ b/gui/slick/views/schedule.mako @@ -213,7 +213,7 @@ else: cur_ep_enddate = cur_result['localtime'] %> - % if sickbeard.COMING_EPS_SORT == 'network: + % if sickbeard.COMING_EPS_SORT == 'network': <% show_network = ('no network', cur_result['network'])[bool(cur_result['network'])] %> % if cur_segment != show_network: <div> -- GitLab From e140a18be3ccc67943c020e456eb4107fc056616 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Tue, 10 Nov 2015 06:25:25 -0800 Subject: [PATCH 175/215] Only use the exception logger for ERROR level (maybe we should use logger.warn() too xD) Fixes https://github.com/SiCKRAGETV/sickrage-issues/issues/3609 --- sickbeard/logger.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sickbeard/logger.py b/sickbeard/logger.py index abc96c575..dc128ab86 100644 --- a/sickbeard/logger.py +++ b/sickbeard/logger.py @@ -155,9 +155,6 @@ class Logger(object): message = check level = WARNING - if level in (ERROR, WARNING): - self.logger.exception(message, *args, **kwargs) - if level == ERROR: classes.ErrorViewer.add(classes.UIError(message)) elif level == WARNING: @@ -165,6 +162,9 @@ class Logger(object): # if sickbeard.GIT_AUTOISSUES: # self.submit_errors() + + if level == ERROR: + self.logger.exception(message, *args, **kwargs) else: self.logger.log(level, message, *args, **kwargs) -- GitLab From 87bff389d2c11becb44ee883a7319aeec69571e6 Mon Sep 17 00:00:00 2001 From: supergonkas <duramato@users.noreply.github.com> Date: Tue, 10 Nov 2015 16:25:11 +0000 Subject: [PATCH 176/215] Add real to proper strings --- sickbeard/providers/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 702fb0f11..ff2cadc27 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -84,7 +84,7 @@ class GenericProvider(object): shuffle(self.btCacheURLS) - self.proper_strings = ['PROPER|REPACK'] + self.proper_strings = ['PROPER|REPACK|REAL'] def getID(self): return GenericProvider.makeID(self.name) -- GitLab From 56d32e9f33c10636992858ab5aac9736c88975e7 Mon Sep 17 00:00:00 2001 From: psych0d0g <bigluks@gmail.com> Date: Tue, 10 Nov 2015 20:44:31 +0100 Subject: [PATCH 177/215] update user information on anime Black- and Whitelisting behaviour --- gui/slick/views/inc_blackwhitelist.mako | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gui/slick/views/inc_blackwhitelist.mako b/gui/slick/views/inc_blackwhitelist.mako index 0aa539466..37cc9fb65 100644 --- a/gui/slick/views/inc_blackwhitelist.mako +++ b/gui/slick/views/inc_blackwhitelist.mako @@ -8,6 +8,8 @@ <p>The <b>Whitelist</b> is checked <i>before</i> the <b>Blacklist</b>.</p> <p>Groups are shown as <b>Name</b> | <b>Rating</b> | <b>Number of subbed episodes</b>.</p> <p>You may also add any fansub group not listed to either list manually.</p> + <p>When doing this please note that you can only use groups listed on anidb for this anime. + </br>If a group is not listed on anidb but subbed this anime, please correct anidb's data.</p> </div> <div class="bwlWrapper" id="Anime"> <div class="blackwhitelist all"> -- GitLab From d159d208325551a2fe20cddab62544db3f0f2731 Mon Sep 17 00:00:00 2001 From: adaur <adaur.underground@gmail.com> Date: Wed, 11 Nov 2015 15:00:55 +0100 Subject: [PATCH 178/215] Remove FTDB provider --- .../images/providers/frenchtorrentdb.png | Bin 441 -> 0 bytes sickbeard/helpers.py | 1 - sickbeard/providers/__init__.py | 3 +- sickbeard/providers/frenchtorrentdb.py | 200 ------------------ tests/helpers_tests.py | 1 - 5 files changed, 1 insertion(+), 204 deletions(-) delete mode 100644 gui/slick/images/providers/frenchtorrentdb.png delete mode 100644 sickbeard/providers/frenchtorrentdb.py diff --git a/gui/slick/images/providers/frenchtorrentdb.png b/gui/slick/images/providers/frenchtorrentdb.png deleted file mode 100644 index 26a665b300adc56127ec4e55e36574b66f5f27e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU<L+;Edf3uuK)l4XJBApVq#)o zU|?lsg|OM!*cccX*x1-OIXNLBtgNg&JUk2x44j;tTwEYySy@^6`1qKZm{?g^Au74J zxOjMY`1tsQgoMPz#3Upn<lRdY6ckicRMgbe)ck5RG&D5o9%wc^((3rA)%Rb!^n`Zj zC*9_!dacj&TA%Cd>l-FaF;1LjZf<UoyV5dau9cOQt*xy?{$j_NDtC8xFE6j);NXae zhzs=<whRmmq9s9o!3-uQ>FEs(4F?V!xO(;K)wgfoe*E~+Z^=|U1_p-to-U3d5|?w& z?<_jxAi!{OUUK9@tuz1stG4$>WTzkFRGAWgBl0jiqrmoa9g*u3POnl5wU2ISn0q&L ziPmw|f|QTjqz<UPE|+|JMJBpWEHt+zc~uox{=3J^+Ag_XITCU<#EMTT>oZ$=u;84+ zH9fzwrcN{sSfr(#p5_vkAi~}__s09m+G)Yj)0e+GbLP0R;fnh?Qza|+p8p=RSx@=f c6Z!gmi^7@jZ2INFz`(%Z>FVdQ&MBb@07nLrF#rGn diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 47aaf3bd1..78fbb5c40 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -154,7 +154,6 @@ def remove_non_release_groups(name): r'^\[ www\.Cpasbien\.com \] ': 'searchre', r'- \{ www\.SceneTime\.com \}$': 'searchre', r'^\{ www\.SceneTime\.com \} - ': 'searchre', - r'^\[www\.frenchtorrentdb\.com\] ': 'searchre', r'^\]\.\[www\.tensiontorrent.com\] - ': 'searchre', r'^\]\.\[ www\.tensiontorrent.com \] - ': 'searchre', r'- \[ www\.torrentday\.com \]$': 'searchre', diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 933cdf5d7..4c1ef35f2 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -18,7 +18,7 @@ from sickbeard.providers import btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, torrentz, \ omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, bluetigers, cpasbien, fnt, xthor, torrentbytes, \ - frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, torrentproject, extratorrent, \ + freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, torrentproject, extratorrent, \ scenetime, btdigg, strike, transmitthenet, tvchaosuk, bitcannon, pretome, gftracker, hdspace, newpct __all__ = ['womble', @@ -38,7 +38,6 @@ __all__ = ['womble', 'nyaatorrents', 'animenzb', 'torrentbytes', - 'frenchtorrentdb', 'freshontv', 'titansoftv', 'libertalia', diff --git a/sickbeard/providers/frenchtorrentdb.py b/sickbeard/providers/frenchtorrentdb.py deleted file mode 100644 index 0f120b54f..000000000 --- a/sickbeard/providers/frenchtorrentdb.py +++ /dev/null @@ -1,200 +0,0 @@ -# Authors: Yannick Croissant <yannick.croissant@gmail.com> -# adaur <adaur.underground@gmail.com> -# URL: http://code.google.com/p/sickbeard/ -# -# This file is part of SickRage. -# -# Sick Beard is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Sick Beard is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Sick Beard. If not, see <http://www.gnu.org/licenses/>. - -import re -from sickbeard.providers import generic - -from sickbeard.bs4_parser import BS4Parser -from sickbeard import logger -from sickbeard import tvcache - -class FrenchTorrentDBProvider(generic.TorrentProvider): - - def __init__(self): - - generic.TorrentProvider.__init__(self, "FrenchTorrentDB") - - self.supportsBacklog = True - - - self.urls = { - 'base_url': 'http://www.frenchtorrentdb.com', - } - - self.url = self.urls['base_url'] - self.search_params = { - "adv_cat%5Bs%5D%5B1%5D": 95, - "adv_cat%5Bs%5D%5B2%5D": 190, - "adv_cat%5Bs%5D%5B3%5D": 101, - "adv_cat%5Bs%5D%5B4%5D": 191, - "adv_cat%5Bs%5D%5B5%5D": 197, - "adv_cat%5Bs%5D%5B7%5D": 199, - "adv_cat%5Bs%5D%5B8%5D": 201, - "adv_cat%5Bs%5D%5B9%5D": 128, - "section": "TORRENTS", - "exact": 1, - "submit": "GO" - } - - self.username = None - self.password = None - self.ratio = None - self.minseed = None - self.minleech = None - - def _doLogin(self): - - params = { - "section": "LOGIN", - "challenge": 1 - } - - data = self.getURL(self.url, params=params, json=True) - - post_data = { - 'username' : self.username, - 'password' : self.password, - 'secure_login': self._getSecureLogin(data['challenge']), - 'hash' : data['hash'] - } - - params.pop('challenge') - params['ajax'] = 1 - self.getURL(self.url, params=params, post_data=post_data) - - return True - - def _getSecureLogin(self, challenges): - - def fromCharCode(*args): - return ''.join(map(unichr, args)) - - def decodeString(p, a, c, k, e, d): - a = int(a) - c = int(c) - def e(c): - if c < a: - f = '' - else: - f = e(c / a) - return f + fromCharCode(c % a + 161) - while c: - c -= 1 - if k[c]: - regex = re.compile(e(c)) - p = re.sub(regex, k[c], p) - return p - - def decodeChallenge(challenge): - regexGetArgs = re.compile('\'([^\']+)\',([0-9]+),([0-9]+),\'([^\']+)\'') - regexIsEncoded = re.compile('decodeURIComponent') - regexUnquote = re.compile('\'') - if challenge == 'a': - return '05f' - if re.match(regexIsEncoded, challenge) == None: - return re.sub(regexUnquote, '', challenge) - args = re.findall(regexGetArgs, challenge) - decoded = decodeString( - args[0][0], args[0][1], - args[0][2], args[0][3].split('|'), - 0, {}) - return decoded - - secureLogin = '' - for challenge in challenges: - secureLogin += decodeChallenge(challenge) - return secureLogin - - def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): - - results = [] - items = {'Season': [], 'Episode': [], 'RSS': []} - - # check for auth - if not self._doLogin(): - return results - - for mode in search_strings.keys(): - logger.log(u"Search Mode: %s" % mode, logger.DEBUG) - for search_string in search_strings[mode]: - - if mode is not 'RSS': - logger.log(u"Search string: %s " % search_string, logger.DEBUG) - - self.search_params['name'] = search_string - - r = self.getURL(self.url, params=self.search_params) - with BS4Parser(r, features=["html5lib", "permissive"]) as html: - resultsTable = html.find("div", {"class": "DataGrid"}) - - if resultsTable: - rows = resultsTable.findAll("ul") - - for row in rows: - link = row.find("a", title=True) - title = link['title'] - # FIXME - size = -1 - seeders = 1 - leechers = 0 - - autogetURL = self.url + '/' + (row.find("li", {"class": "torrents_name"}).find('a')['href'][1:]).replace('#FTD_MENU', '&menu=4') - r = self.getURL(autogetURL) - with BS4Parser(r, features=["html5lib", "permissive"]) as html: - - download_url = html.find("div", {"class" : "autoget"}).find('a')['href'] - - if not all([title, download_url]): - continue - - # Filter unseeded torrent - # if seeders < self.minseed or leechers < self.minleech: - # if mode is not 'RSS': - # logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) - # continue - - item = title, download_url, size, seeders, leechers - if mode is not 'RSS': - logger.log(u"Found result: %s " % title, logger.DEBUG) - - items[mode].append(item) - - # For each search mode sort all the items by seeders if available - items[mode].sort(key=lambda tup: tup[3], reverse=True) - - results += items[mode] - - return results - - def seedRatio(self): - return self.ratio - - -class FrenchTorrentDBCache(tvcache.TVCache): - def __init__(self, provider_obj): - tvcache.TVCache.__init__(self, provider_obj) - - # Only poll FTDB every 10 minutes max - self.minTime = 10 - - def _getRSSData(self): - search_strings = {'RSS': ['']} - return {'entries': self.provider._doSearch(search_strings)} - -provider = FrenchTorrentDBProvider() diff --git a/tests/helpers_tests.py b/tests/helpers_tests.py index b4ef164a2..f51b3896c 100755 --- a/tests/helpers_tests.py +++ b/tests/helpers_tests.py @@ -39,7 +39,6 @@ test_cases = { 'Show.Name.S01E01.HDTV.x264-RLSGROUP[EtHD]', 'Show.Name.S01E01.HDTV.x264-RLSGROUP-20-40', 'Show.Name.S01E01.HDTV.x264-RLSGROUP[NO-RAR] - [ www.torrentday.com ]', - '[www.frenchtorrentdb.com] Show.Name.S01E01.HDTV.x264-RLSGROUP', 'Show.Name.S01E01.HDTV.x264-RLSGROUP[rarbg]', 'Show.Name.S01E01.HDTV.x264-RLSGROUP[Seedbox]', '{ www.SceneTime.com } - Show.Name.S01E01.HDTV.x264-RLSGROUP', -- GitLab From 7029a4b4f8adb4cfc7a857002f76870d1acd3c49 Mon Sep 17 00:00:00 2001 From: theit8514 <theit8514@users.noreply.github.com> Date: Wed, 11 Nov 2015 16:08:57 -0800 Subject: [PATCH 179/215] Use login on initial Github request if defined. --- sickbeard/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 888de22b0..4157b2e78 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -682,7 +682,10 @@ def initialize(consoleLogging=True): # github api try: - gh = Github(user_agent="SiCKRAGE").get_organization(GIT_ORG).get_repo(GIT_REPO) + if not (GIT_USERNAME and GIT_PASSWORD): + gh = Github(user_agent="SiCKRAGE").get_organization(GIT_ORG).get_repo(GIT_REPO) + else: + gh = Github(login_or_token=GIT_USERNAME, password=GIT_PASSWORD, user_agent="SiCKRAGE").get_organization(GIT_ORG).get_repo(GIT_REPO) except Exception as e: gh = None logger.log(u'Unable to setup GitHub properly. GitHub will not be available. Error: %s' % ex(e), logger.WARNING) -- GitLab From d0153c962a2a092d3181e3e6f4cb4cb6a5dc0f8e Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Wed, 11 Nov 2015 17:06:08 -0800 Subject: [PATCH 180/215] Fix post processing non-ascii --- sickbeard/processTV.py | 4 ++-- sickbeard/webserve.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sickbeard/processTV.py b/sickbeard/processTV.py index 6ea2c5a0b..bcc58bb03 100644 --- a/sickbeard/processTV.py +++ b/sickbeard/processTV.py @@ -28,7 +28,7 @@ from sickbeard import logger from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException from sickbeard import common from sickbeard import failedProcessor -from sickrage.helper.encoding import ek +from sickrage.helper.encoding import ek, ss from sickrage.helper.exceptions import EpisodePostProcessingFailedException, ex, FailedPostProcessingFailedException from unrar2 import RarFile @@ -516,7 +516,7 @@ def already_postprocessed(dirName, videofile, force, result): search_sql += " and tv_episodes.status IN (" + ",".join([str(x) for x in common.Quality.DOWNLOADED]) + ")" search_sql += " and history.resource LIKE ?" - sqlResult = myDB.select(search_sql, [u'%' + videofile]) + sqlResult = myDB.select(search_sql, ['%' + videofile]) if sqlResult: # result.output += logHelper(u"You're trying to post process a video that's already been processed, skipping", logger.DEBUG) return True diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 659bba264..62c174d53 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -2192,8 +2192,10 @@ class HomePostProcess(Home): if not proc_dir: return self.redirect("/home/postprocess/") else: + nzbName = ss(nzbName) if nzbName else nzbName + result = processTV.processDir( - proc_dir, nzbName, process_method=process_method, force=argToBool(force), + ss(proc_dir), nzbName, process_method=process_method, force=argToBool(force), is_priority=argToBool(is_priority), delete_on=argToBool(delete_on), failed=argToBool(failed), proc_type=proc_type ) -- GitLab From f034dd320dc604962bc8b619126302994ba12d37 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 16:11:43 +1030 Subject: [PATCH 181/215] hide build files --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index e17cfc889..77f444fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,6 @@ lib/unrar2/UnRAR.exe # Bower # ###################### -bower_components -node_modules -gui/**/_bower.js +.build/bower_components +.build/node_modules +.build/_bower* -- GitLab From de8f2021333f689926cdda4cf4cd5f17bd561702 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 16:12:11 +1030 Subject: [PATCH 182/215] add minified vender files --- gui/slick/css/vender.min.css | Bin 0 -> 1812 bytes gui/slick/js/vender.min.js | Bin 0 -> 504707 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 gui/slick/css/vender.min.css create mode 100644 gui/slick/js/vender.min.js diff --git a/gui/slick/css/vender.min.css b/gui/slick/css/vender.min.css new file mode 100644 index 0000000000000000000000000000000000000000..16f33eb6152f17e9301150733d3242ef26430c9d GIT binary patch literal 1812 zcmYevEYmB=&rZ$L&CDw(EzwOW$}dRCFVE8{%|Q{*$t*6Z&M!+XO3TSFx5~&&NlDGK zPRq|L(JjubO0_aHDyV>P(-Lztb1JREQj1a&^AdH66Z497i&Kj-(`vDph|Ly-oXl#F zZMwxJl{u-pC6xuKR(bh(so3;aXQXDPXOvhamX_ozX66>;7nLODl~_YX4OOknGgC@3 ztV|3H3M#CV@{3YZi>wR_Din(Ib23vDlr1eSt&>ZOit~%CN>VFItgCc0^HNePtU%(q ziACv|c~%D21&JvsnR)3}2G&W5$=T^e`K5U&y2<%D`9)UBX=!QJ$vLTsMOHbfX(iZP zsF0JX01nw|sPzU=HyN9P+ypb+xS&G80^~-lR_K<eCS_-q=q45vq$U<6<|U_EB_|f8 zVpy1xS)7=ZlbV7atT1sT$6(mwY5{`iUO>``k{rNErW!LqTr6FUogJ;A!DH?Mf+U%# zP+X9hR}Izg>;{6cC`w69ODxSPsm;m6;uQ3x2~7ex69zPTjSDK^5e$k0Q><~2Vvw4a zXaMt-fq?-esh2|%pSghnniH*4GK&jx5-Y8ea`Kb2u{v0xpgJulKd}UyaNtfbu!g$J z0J|n|;6U^hff7E<N#^F}Feen`XXcfp7NP4ePR&V8E=f(%#T9b~78WKZsW1c6($eso zfD%thNlCT13X<xA{Nl`#%=|p7#H8Z<oYIn1Xa<00N{oaE%2SZMq6^AY$oVxnIT@OZ zb-~`pA(xb2Qj(vGE(y)(&{PD^>xMX8u24`7iw$@Lfzk)K)I*MYNLgTRZjRfi(i}{) z4Dcxjm4cYr3lug;MTRxjauQceD3s<XpyeG{X|J1ElA4PpJEtXrAOUxx<VF+|jj$P+ qmPWulh1A??^e_hV!4-m4UVc$-Vh#Z_P}~Gh`zVgX;x<S=uLS_A<*0lB literal 0 HcmV?d00001 diff --git a/gui/slick/js/vender.min.js b/gui/slick/js/vender.min.js new file mode 100644 index 0000000000000000000000000000000000000000..e37f67ccef5b5d5322859284153e21292d0efd20 GIT binary patch literal 504707 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 literal 0 HcmV?d00001 -- GitLab From 9960a80d9895aee4e8c485dc9057aec8d094c4e7 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 16:13:04 +1030 Subject: [PATCH 183/215] add libs to bower --- .build/Gruntfile.js | 37 +- .build/bower.json | 3 +- .build/package.json | 8 +- gui/slick/js/lib/bootbox.min.js | Bin 9972 -> 0 bytes .../js/lib/bootstrap-formhelpers.min-2.3.0.js | 8 - .../js/lib/bootstrap-hover-dropdown.min.js | Bin 1501 -> 0 bytes gui/slick/js/lib/bootstrap.min.js | Bin 36816 -> 0 bytes gui/slick/js/lib/bootstrap3-typeahead.min.js | Bin 6878 -> 0 bytes gui/slick/js/lib/jquery-2.1.4.min.js | Bin 84345 -> 0 bytes gui/slick/js/lib/jquery.confirm.js | 56 -- gui/slick/js/lib/jquery.cookie.js | 47 - gui/slick/js/lib/jquery.timeago.js | 223 ----- gui/slick/js/lib/jquery.tokeninput.js | 861 ------------------ 13 files changed, 33 insertions(+), 1210 deletions(-) delete mode 100644 gui/slick/js/lib/bootbox.min.js delete mode 100644 gui/slick/js/lib/bootstrap-formhelpers.min-2.3.0.js delete mode 100644 gui/slick/js/lib/bootstrap-hover-dropdown.min.js delete mode 100644 gui/slick/js/lib/bootstrap.min.js delete mode 100644 gui/slick/js/lib/bootstrap3-typeahead.min.js delete mode 100644 gui/slick/js/lib/jquery-2.1.4.min.js delete mode 100644 gui/slick/js/lib/jquery.confirm.js delete mode 100644 gui/slick/js/lib/jquery.cookie.js delete mode 100644 gui/slick/js/lib/jquery.timeago.js delete mode 100644 gui/slick/js/lib/jquery.tokeninput.js diff --git a/.build/Gruntfile.js b/.build/Gruntfile.js index 5ae24b022..8716d54c5 100644 --- a/.build/Gruntfile.js +++ b/.build/Gruntfile.js @@ -2,34 +2,49 @@ module.exports = function(grunt) { grunt.initConfig({ bower_concat: { all: { - dest: '../gui/slick/js/_bower.js', - // cssDest: 'gui/slick/css/_bower.css', + dest: './_bower.js', + cssDest: './_bower.css', exclude: [ - // 'jquery', - // 'modernizr' ], dependencies: { - // 'underscore': 'jquery', - // 'backbone': 'underscore', - // 'jquery-mousewheel': 'jquery' }, bowerOptions: { relative: false - }, + } } }, uglify: { my_target: { files: { - '../gui/slick/js/_bower.min.js': ['../gui/slick/js/_bower.js'] + '../gui/slick/js/vender.min.js': ['./_bower.js'], + '../gui/slick/js/core.min.js': ['../gui/slick/js/core.js'] + } + } + }, + cssmin: { + options: { + shorthandCompacting: false, + roundingPrecision: -1 + }, + target: { + files: { + '../gui/slick/css/vender.min.css': ['./_bower.css'], + // '../gui/slick/css/core.min.css': ['./gui/slick/css/core.css'] } } + }, + jshint: { + options: { + eqeqeq: true + }, + uses_defaults: ['../gui/slick/js/**/*.js'] } }); grunt.loadNpmTasks('grunt-bower-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.registerTask('default', ['bower_concat', 'uglify']); - + grunt.registerTask('default', ['bower_concat', 'uglify', 'cssmin']); }; diff --git a/.build/bower.json b/.build/bower.json index bb396f088..d92b4f39c 100644 --- a/.build/bower.json +++ b/.build/bower.json @@ -19,6 +19,7 @@ "jquery-timeago": "~1.4.3", "jquery-tokeninput": "~1.7.0", "bootstrap3-typeahead": "~3.1.1", - "underscore": "~1.8.3" + "underscore": "~1.8.3", + "jQuery Confirm": "jquery-confirm#~2.5.0" } } diff --git a/.build/package.json b/.build/package.json index cada201ee..a0a4b4118 100644 --- a/.build/package.json +++ b/.build/package.json @@ -5,14 +5,16 @@ "dependencies": { "grunt": "^0.4.5", "grunt-bower-concat": "^0.5.0", + "grunt-contrib-cssmin": "^0.14.0", + "grunt-contrib-jshint": "^0.11.3", "grunt-contrib-uglify": "^0.9.2" }, "repository": { "type": "git", - "url": "git+https://github.com/OmgImAlexis/SickRage.git" + "url": "git+https://github.com/SickRage/SickRage.git" }, "bugs": { - "url": "https://github.com/OmgImAlexis/SickRage/issues" + "url": "https://github.com/SickRage/SickRage/issues" }, - "homepage": "https://github.com/OmgImAlexis/SickRage#readme" + "homepage": "https://github.com/SickRage/SickRage#readme" } diff --git a/gui/slick/js/lib/bootbox.min.js b/gui/slick/js/lib/bootbox.min.js deleted file mode 100644 index 0dc0cbd5f42ee1df3ab6568b77f0f6366329b2e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9972 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 diff --git a/gui/slick/js/lib/bootstrap-formhelpers.min-2.3.0.js b/gui/slick/js/lib/bootstrap-formhelpers.min-2.3.0.js deleted file mode 100644 index 4cffbbccd..000000000 --- a/gui/slick/js/lib/bootstrap-formhelpers.min-2.3.0.js +++ /dev/null @@ -1,8 +0,0 @@ -/** -* bootstrap-formhelpers.js v2.3.0 by @vincentlamanna -* Copyright 2013 Vincent Lamanna -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if(!jQuery)throw new Error("Bootstrap Form Helpers requires jQuery");var BFHCountriesList={AF:"Afghanistan",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua and Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia",BA:"Bosnia and Herzegovina",BW:"Botswana",BV:"Bouvet Island",BR:"Brazil",IO:"British Indian Ocean Territory",VG:"British Virgin Islands",BN:"Brunei",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",CI:"Côte d'Ivoire",KH:"Cambodia",CM:"Cameroon",CA:"Canada",CV:"Cape Verde",KY:"Cayman Islands",CF:"Central African Republic",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo",CK:"Cook Islands",CR:"Costa Rica",HR:"Croatia",CU:"Cuba",CY:"Cyprus",CZ:"Czech Republic",CD:"Democratic Republic of the Congo",DK:"Denmark",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",TP:"East Timor",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",ET:"Ethiopia",FO:"Faeroe Islands",FK:"Falkland Islands",FJ:"Fiji",FI:"Finland",MK:"Former Yugoslav Republic of Macedonia",FR:"France",FX:"France, Metropolitan",GF:"French Guiana",PF:"French Polynesia",TF:"French Southern Territories",GA:"Gabon",GE:"Georgia",DE:"Germany",GH:"Ghana",GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HM:"Heard and Mc Donald Islands",HN:"Honduras",HK:"Hong Kong",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran",IQ:"Iraq",IE:"Ireland",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati",KW:"Kuwait",KG:"Kyrgyzstan",LA:"Laos",LV:"Latvia",LB:"Lebanon",LS:"Lesotho",LR:"Liberia",LY:"Libya",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",MO:"Macau",MG:"Madagascar",MW:"Malawi",MY:"Malaysia",MV:"Maldives",ML:"Mali",MT:"Malta",MH:"Marshall Islands",MQ:"Martinique",MR:"Mauritania",MU:"Mauritius",YT:"Mayotte",MX:"Mexico",FM:"Micronesia",MD:"Moldova",MC:"Monaco",MN:"Mongolia",ME:"Montenegro",MS:"Montserrat",MA:"Morocco",MZ:"Mozambique",MM:"Myanmar",NA:"Namibia",NR:"Nauru",NP:"Nepal",NL:"Netherlands",AN:"Netherlands Antilles",NC:"New Caledonia",NZ:"New Zealand",NI:"Nicaragua",NE:"Niger",NG:"Nigeria",NU:"Niue",NF:"Norfolk Island",KP:"North Korea",MP:"Northern Marianas",NO:"Norway",OM:"Oman",PK:"Pakistan",PW:"Palau",PS:"Palestine",PA:"Panama",PG:"Papua New Guinea",PY:"Paraguay",PE:"Peru",PH:"Philippines",PN:"Pitcairn Islands",PL:"Poland",PT:"Portugal",PR:"Puerto Rico",QA:"Qatar",RE:"Reunion",RO:"Romania",RU:"Russia",RW:"Rwanda",ST:"São Tomé and Príncipe",SH:"Saint Helena",PM:"St. Pierre and Miquelon",KN:"Saint Kitts and Nevis",LC:"Saint Lucia",VC:"Saint Vincent and the Grenadines",WS:"Samoa",SM:"San Marino",SA:"Saudi Arabia",SN:"Senegal",RS:"Serbia",SC:"Seychelles",SL:"Sierra Leone",SG:"Singapore",SK:"Slovakia",SI:"Slovenia",SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",GS:"South Georgia and the South Sandwich Islands",KR:"South Korea",ES:"Spain",LK:"Sri Lanka",SD:"Sudan",SR:"Suriname",SJ:"Svalbard and Jan Mayen Islands",SZ:"Swaziland",SE:"Sweden",CH:"Switzerland",SY:"Syria",TW:"Taiwan",TJ:"Tajikistan",TZ:"Tanzania",TH:"Thailand",BS:"The Bahamas",GM:"The Gambia",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad and Tobago",TN:"Tunisia",TR:"Turkey",TM:"Turkmenistan",TC:"Turks and Caicos Islands",TV:"Tuvalu",VI:"US Virgin Islands",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UM:"United States Minor Outlying Islands",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VA:"Vatican City",VE:"Venezuela",VN:"Vietnam",WF:"Wallis and Futuna Islands",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"},BFHCurrenciesList={AED:{label:"United Arab Emirates dirham",currencyflag:"",symbol:"د.إ"},AFN:{label:"Afghan afghani",currencyflag:"",symbol:"؋"},ALL:{label:"Albanian lek",currencyflag:"",symbol:"L"},AMD:{label:"Armenian dram",currencyflag:"",symbol:"դր"},AOA:{label:"Angolan kwanza",currencyflag:"",symbol:"Kz"},ARS:{label:"Argentine peso",currencyflag:"",symbol:"$"},AUD:{label:"Australian dollar",currencyflag:"AUD",symbol:"$"},AWG:{label:"Aruban florin",currencyflag:"",symbol:"ƒ"},AZN:{label:"Azerbaijani manat",currencyflag:"",symbol:""},BAM:{label:"Bosnia and Herzegovina convertible mark",currencyflag:"",symbol:"KM"},BBD:{label:"Barbadian dollar",currencyflag:"",symbol:"$"},BDT:{label:"Bangladeshi taka",currencyflag:"",symbol:"৳"},BGN:{label:"Bulgarian lev",currencyflag:"",symbol:"лв"},BHD:{label:"Bahraini dinar",currencyflag:"",symbol:".د.ب"},BIF:{label:"Burundian franc",currencyflag:"",symbol:"Fr"},BMD:{label:"Bermudian dollar",currencyflag:"",symbol:"$"},BND:{label:"Brunei dollar",currencyflag:"",symbol:"$"},BOB:{label:"Bolivian boliviano",currencyflag:"",symbol:"Bs"},BRL:{label:"Brazilian real",currencyflag:"",symbol:"R$"},BSD:{label:"Bahamian dollar",currencyflag:"",symbol:"$"},BTN:{label:"Bhutanese ngultrum",currencyflag:"",symbol:"Nu"},BWP:{label:"Botswana pula",currencyflag:"",symbol:"P"},BYR:{label:"Belarusian ruble",currencyflag:"",symbol:"Br"},BZD:{label:"Belize dollar",currencyflag:"",symbol:"$"},CAD:{label:"Canadian dollar",currencyflag:"",symbol:"$"},CDF:{label:"Congolese franc",currencyflag:"",symbol:"Fr"},CHF:{label:"Swiss franc",currencyflag:"CHF",symbol:"Fr"},CLP:{label:"Chilean peso",currencyflag:"",symbol:"$"},CNY:{label:"Chinese yuan",currencyflag:"",symbol:"¥"},COP:{label:"Colombian peso",currencyflag:"",symbol:"$"},CRC:{label:"Costa Rican colón",currencyflag:"",symbol:"₡"},CUP:{label:"Cuban convertible peso",currencyflag:"",symbol:"$"},CVE:{label:"Cape Verdean escudo",currencyflag:"",symbol:"$"},CZK:{label:"Czech koruna",currencyflag:"",symbol:"Kč"},DJF:{label:"Djiboutian franc",currencyflag:"",symbol:"Fr"},DKK:{label:"Danish krone",currencyflag:"DKK",symbol:"kr"},DOP:{label:"Dominican peso",currencyflag:"",symbol:"$"},DZD:{label:"Algerian dinar",currencyflag:"",symbol:"د.ج"},EGP:{label:"Egyptian pound",currencyflag:"",symbol:"ج.م"},ERN:{label:"Eritrean nakfa",currencyflag:"",symbol:"Nfk"},ETB:{label:"Ethiopian birr",currencyflag:"",symbol:"Br"},EUR:{label:"Euro",currencyflag:"EUR",symbol:"€"},FJD:{label:"Fijian dollar",currencyflag:"",symbol:"$"},FKP:{label:"Falkland Islands pound",currencyflag:"",symbol:"£"},GBP:{label:"British pound",currencyflag:"",symbol:"£"},GEL:{label:"Georgian lari",currencyflag:"",symbol:"ლ"},GHS:{label:"Ghana cedi",currencyflag:"",symbol:"₵"},GMD:{label:"Gambian dalasi",currencyflag:"",symbol:"D"},GNF:{label:"Guinean franc",currencyflag:"",symbol:"Fr"},GTQ:{label:"Guatemalan quetzal",currencyflag:"",symbol:"Q"},GYD:{label:"Guyanese dollar",currencyflag:"",symbol:"$"},HKD:{label:"Hong Kong dollar",currencyflag:"",symbol:"$"},HNL:{label:"Honduran lempira",currencyflag:"",symbol:"L"},HRK:{label:"Croatian kuna",currencyflag:"",symbol:"kn"},HTG:{label:"Haitian gourde",currencyflag:"",symbol:"G"},HUF:{label:"Hungarian forint",currencyflag:"",symbol:"Ft"},IDR:{label:"Indonesian rupiah",currencyflag:"",symbol:"Rp"},ILS:{label:"Israeli new shekel",currencyflag:"",symbol:"₪"},IMP:{label:"Manx pound",currencyflag:"",symbol:"£"},INR:{label:"Indian rupee",currencyflag:"",symbol:""},IQD:{label:"Iraqi dinar",currencyflag:"",symbol:"ع.د"},IRR:{label:"Iranian rial",currencyflag:"",symbol:"﷼"},ISK:{label:"Icelandic króna",currencyflag:"",symbol:"kr"},JEP:{label:"Jersey pound",currencyflag:"",symbol:"£"},JMD:{label:"Jamaican dollar",currencyflag:"",symbol:"$"},JOD:{label:"Jordanian dinar",currencyflag:"",symbol:"د.ا"},JPY:{label:"Japanese yen",currencyflag:"",symbol:"¥"},KES:{label:"Kenyan shilling",currencyflag:"",symbol:"Sh"},KGS:{label:"Kyrgyzstani som",currencyflag:"",symbol:"лв"},KHR:{label:"Cambodian riel",currencyflag:"",symbol:"៛"},KMF:{label:"Comorian franc",currencyflag:"",symbol:"Fr"},KPW:{label:"North Korean won",currencyflag:"",symbol:"₩"},KRW:{label:"South Korean won",currencyflag:"",symbol:"₩"},KWD:{label:"Kuwaiti dinar",currencyflag:"",symbol:"د.ك"},KYD:{label:"Cayman Islands dollar",currencyflag:"",symbol:"$"},KZT:{label:"Kazakhstani tenge",currencyflag:"",symbol:"₸"},LAK:{label:"Lao kip",currencyflag:"",symbol:"₭"},LBP:{label:"Lebanese pound",currencyflag:"",symbol:"ل.ل"},LKR:{label:"Sri Lankan rupee",currencyflag:"",symbol:"Rs"},LRD:{label:"Liberian dollar",currencyflag:"",symbol:"$"},LSL:{label:"Lesotho loti",currencyflag:"",symbol:"L"},LTL:{label:"Lithuanian litas",currencyflag:"",symbol:"Lt"},LVL:{label:"Latvian lats",currencyflag:"",symbol:"Ls"},LYD:{label:"Libyan dinar",currencyflag:"",symbol:"ل.د"},MAD:{label:"Moroccan dirham",currencyflag:"",symbol:"د.م."},MDL:{label:"Moldovan leu",currencyflag:"",symbol:"L"},MGA:{label:"Malagasy ariary",currencyflag:"",symbol:"Ar"},MKD:{label:"Macedonian denar",currencyflag:"",symbol:"ден"},MMK:{label:"Burmese kyat",currencyflag:"",symbol:"Ks"},MNT:{label:"Mongolian tögrög",currencyflag:"",symbol:"₮"},MOP:{label:"Macanese pataca",currencyflag:"",symbol:"P"},MRO:{label:"Mauritanian ouguiya",currencyflag:"",symbol:"UM"},MUR:{label:"Mauritian rupee",currencyflag:"",symbol:"Rs"},MVR:{label:"Maldivian rufiyaa",currencyflag:"",symbol:".ރ"},MWK:{label:"Malawian kwacha",currencyflag:"",symbol:"MK"},MXN:{label:"Mexican peso",currencyflag:"",symbol:"$"},MYR:{label:"Malaysian ringgit",currencyflag:"",symbol:"MR"},MZN:{label:"Mozambican metical",currencyflag:"",symbol:"MT"},NAD:{label:"Namibian dollar",currencyflag:"",symbol:"$"},NGN:{label:"Nigerian naira",currencyflag:"",symbol:"₦"},NIO:{label:"Nicaraguan córdoba",currencyflag:"",symbol:"C$"},NOK:{label:"Norwegian krone",currencyflag:"",symbol:"kr"},NPR:{label:"Nepalese rupee",currencyflag:"",symbol:"Rs"},NZD:{label:"New Zealand dollar",currencyflag:"",symbol:"$"},OMR:{label:"Omani rial",currencyflag:"",symbol:"ر.ع."},PAB:{label:"Panamanian balboa",currencyflag:"",symbol:"B/."},PEN:{label:"Peruvian nuevo sol",currencyflag:"",symbol:"S/."},PGK:{label:"Papua New Guinean kina",currencyflag:"",symbol:"K"},PHP:{label:"Philippine peso",currencyflag:"",symbol:"₱"},PKR:{label:"Pakistani rupee",currencyflag:"",symbol:"Rs"},PLN:{label:"Polish złoty",currencyflag:"",symbol:"zł"},PRB:{label:"Transnistrian ruble",currencyflag:"",symbol:"р."},PYG:{label:"Paraguayan guaraní",currencyflag:"",symbol:"₲"},QAR:{label:"Qatari riyal",currencyflag:"",symbol:"ر.ق"},RON:{label:"Romanian leu",currencyflag:"",symbol:"L"},RSD:{label:"Serbian dinar",currencyflag:"",symbol:"дин"},RUB:{label:"Russian ruble",currencyflag:"",symbol:"руб."},RWF:{label:"Rwandan franc",currencyflag:"",symbol:"Fr"},SAR:{label:"Saudi riyal",currencyflag:"",symbol:"ر.س"},SBD:{label:"Solomon Islands dollar",currencyflag:"",symbol:"$"},SCR:{label:"Seychellois rupee",currencyflag:"",symbol:"Rs"},SDG:{label:"Singapore dollar",currencyflag:"",symbol:"$"},SEK:{label:"Swedish krona",currencyflag:"",symbol:"kr"},SGD:{label:"Singapore dollar",currencyflag:"",symbol:"$"},SHP:{label:"Saint Helena pound",currencyflag:"",symbol:"£"},SLL:{label:"Sierra Leonean leone",currencyflag:"",symbol:"Le"},SOS:{label:"Somali shilling",currencyflag:"",symbol:"Sh"},SRD:{label:"Surinamese dollar",currencyflag:"",symbol:"$"},SSP:{label:"South Sudanese pound",currencyflag:"",symbol:"£"},STD:{label:"São Tomé and Príncipe dobra",currencyflag:"",symbol:"Db"},SVC:{label:"Salvadoran colón",currencyflag:"",symbol:"₡"},SYP:{label:"Syrian pound",currencyflag:"",symbol:"£"},SZL:{label:"Swazi lilangeni",currencyflag:"",symbol:"L"},THB:{label:"Thai baht",currencyflag:"",symbol:"฿"},TJS:{label:"Tajikistani somoni",currencyflag:"",symbol:"SM"},TMT:{label:"Turkmenistan manat",currencyflag:"",symbol:"m"},TND:{label:"Tunisian dinar",currencyflag:"",symbol:"د.ت"},TOP:{label:"Tongan paʻanga",currencyflag:"",symbol:"T$"},TRY:{label:"Turkish lira",currencyflag:"",symbol:"₺"},TTD:{label:"Trinidad and Tobago dollar",currencyflag:"",symbol:"$"},TWD:{label:"New Taiwan dollar",currencyflag:"",symbol:"$"},TZS:{label:"Tanzanian shilling",currencyflag:"",symbol:"Sh"},UAH:{label:"Ukrainian hryvnia",currencyflag:"",symbol:"₴"},UGX:{label:"Ugandan shilling",currencyflag:"",symbol:"Sh"},USD:{label:"United States dollar",currencyflag:"",symbol:"$"},UYU:{label:"Uruguayan peso",currencyflag:"",symbol:"$"},UZS:{label:"Uzbekistani som",currencyflag:"",symbol:"лв"},VEF:{label:"Venezuelan bolívar",currencyflag:"",symbol:"Bs F"},VND:{label:"Vietnamese đồng",currencyflag:"",symbol:"₫"},VUV:{label:"Vanuatu vatu",currencyflag:"",symbol:"Vt"},WST:{label:"Samoan tālā",currencyflag:"",symbol:"T"},XAF:{label:"Central African CFA franc",currencyflag:"XAF",symbol:"Fr"},XCD:{label:"East Caribbean dollar",currencyflag:"XCD",symbol:"$"},XOF:{label:"West African CFA franc",currencyflag:"XOF",symbol:"Fr"},XPF:{label:"CFP franc",currencyflag:"XPF",symbol:"Fr"},YER:{label:"Yemeni rial",currencyflag:"",symbol:"﷼"},ZAR:{label:"South African rand",currencyflag:"ZAR",symbol:"R"},ZMW:{label:"Zambian kwacha",currencyflag:"",symbol:"ZK"},ZWL:{label:"Zimbabwean dollar",currencyflag:"",symbol:"$"}},BFHMonthsList=["January","February","March","April","May","June","July","August","September","October","November","December"],BFHDaysList=["SUN","MON","TUE","WED","THU","FRI","SAT"],BFHDayOfWeekStart=0,BFHFontsList={"Andale Mono":'"Andale Mono", AndaleMono, monospace',Arial:'Arial, "Helvetica Neue", Helvetica, sans-serif',"Arial Black":'"Arial Black", "Arial Bold", Gadget, sans-serif',"Arial Narrow":'"Arial Narrow", Arial, sans-serif',"Arial Rounded MT Bold":'"Arial Rounded MT Bold", "Helvetica Rounded", Arial, sans-serif',"Avant Garde":'"Avant Garde", Avantgarde, "Century Gothic", CenturyGothic, "AppleGothic", sans-serif',Baskerville:'Baskerville, "Baskerville Old Face", "Hoefler Text", Garamond, "Times New Roman", serif',"Big Caslon":'"Big Caslon", "Book Antiqua", "Palatino Linotype", Georgia, serif',"Bodoni MT":'"Bodoni MT", Didot, "Didot LT STD", "Hoefler Text", Garamond, "Times New Roman", serif',"Book Antiqua":'"Book Antiqua", Palatino, "Palatino Linotype", "Palatino LT STD", Georgia, serif',"Brush Script MT":'"Brush Script MT", cursive',Calibri:'Calibri, Candara, Segoe, "Segoe UI", Optima, Arial, sans-serif',"Calisto MT":'"Calisto MT", "Bookman Old Style", Bookman, "Goudy Old Style", Garamond, "Hoefler Text", "Bitstream Charter", Georgia, serif',Cambrio:"Cambria, Georgia, serif",Candara:'Candara, Calibri, Segoe, "Segoe UI", Optima, Arial, sans-serif',"Century Gothic":'"Century Gothic", CenturyGothic, AppleGothic, sans-serif',Consolas:"Consolas, monaco, monospace",Copperplate:'Copperplate, "Copperplate Gothic Light", fantasy',"Courier New":'"Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace',Didot:'Didot, "Didot LT STD", "Hoefler Text", Garamond, "Times New Roman", serif',"Franklin Gothic Medium":'"Franklin Gothic Medium", "Franklin Gothic", "ITC Franklin Gothic", Arial, sans-serif',Futura:'Futura, "Trebuchet MS", Arial, sans-serif',Garamond:'Garamond, Baskerville, "Baskerville Old Face", "Hoefler Text", "Times New Roman", serif',Geneva:"Geneva, Tahoma, Verdana, sans-serif",Georgia:'Georgia, Times, "Times New Roman", serif',"Gill Sans":'"Gill Sans", "Gill Sans MT", Calibri, sans-serif',"Goudy Old Style":'"Goudy Old Style", Garamond, "Big Caslon", "Times New Roman", serif',Helvetica:'"Helvetica Neue", Helvetica, Arial, sans-serif',"Hoefler Text":'"Hoefler Text", "Baskerville old face", Garamond, "Times New Roman", serif',Impact:'Impact, Haettenschweiler, "Franklin Gothic Bold", Charcoal, "Helvetica Inserat", "Bitstream Vera Sans Bold", "Arial Black", sans serif',"Lucida Bright":'"Lucida Bright", Georgia, serif',"Lucida Console":'"Lucida Console", "Lucida Sans Typewriter", Monaco, "Bitstream Vera Sans Mono", monospace',"Lucida Sans Typewriter":'"Lucida Sans Typewriter", "Lucida Console", Monaco, "Bitstream Vera Sans Mono", monospace',"Lucida Grande":'"Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif',Monaco:'Monaco, Consolas, "Lucida Console", monospace',Optima:'Optima, Segoe, "Segoe UI", Candara, Calibri, Arial, sans-serif',Palatino:'Palatino, "Palatino Linotype", "Palatino LT STD", "Book Antiqua", Georgia, serif',Papyrus:"Papyrus, fantasy",Perpetua:'Perpetua, Baskerville, "Big Caslon", "Palatino Linotype", Palatino, "URW Palladio L", "Nimbus Roman No9 L", serif',Rockwell:'Rockwell, "Courier Bold", Courier, Georgia, Times, "Times New Roman", serif',"Rockwell Extra Bold":'"Rockwell Extra Bold", "Rockwell Bold", monospace',"Segoe UI":'"Segoe UI", Frutiger, "Frutiger Linotype',Tahoma:"Tahoma, Verdana, Segoe, sans-serif","Times New Roman":'TimesNewRoman, "Times New Roman", Times, Baskerville, Georgia, serif',"Trebuchet MS":'"Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Tahoma, sans-serif',Verdana:"Verdana, Geneva, sans-serif"},BFHFontSizesList={8:"8px",9:"9px",10:"10px",11:"11px",12:"12px",14:"14px",16:"16px",18:"18px",20:"20px",24:"24px",28:"28px",36:"36px",48:"48px"},BFHGoogleFontsList={kind:"webfonts#webfontList",items:[{kind:"webfonts#webfont",family:"ABeeZee",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Abel",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Abril Fatface",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Aclonica",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Acme",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Actor",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Adamina",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Advent Pro",variants:["100","200","300","regular","500","600","700"],subsets:["latin-ext","latin","greek"]},{kind:"webfonts#webfont",family:"Aguafina Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Akronim",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Aladin",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Aldrich",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Alegreya",variants:["regular","italic","700","700italic","900","900italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Alegreya SC",variants:["regular","italic","700","700italic","900","900italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Alex Brush",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Alfa Slab One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Alice",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Alike",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Alike Angular",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Allan",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Allerta",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Allerta Stencil",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Allura",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Almendra",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Almendra Display",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Almendra SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Amarante",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Amaranth",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Amatic SC",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Amethysta",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Anaheim",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Andada",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Andika",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Angkor",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Annie Use Your Telescope",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Anonymous Pro",variants:["regular","italic","700","700italic"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Antic",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Antic Didone",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Antic Slab",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Anton",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Arapey",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Arbutus",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Arbutus Slab",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Architects Daughter",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Archivo Black",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Archivo Narrow",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Arimo",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Arizonia",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Armata",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Artifika",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Arvo",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Asap",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Asset",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Astloch",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Asul",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Atomic Age",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Aubrey",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Audiowide",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Autour One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Average",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Average Sans",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Averia Gruesa Libre",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Averia Libre",variants:["300","300italic","regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Averia Sans Libre",variants:["300","300italic","regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Averia Serif Libre",variants:["300","300italic","regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bad Script",variants:["regular"],subsets:["cyrillic","latin"]},{kind:"webfonts#webfont",family:"Balthazar",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bangers",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Basic",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Battambang",variants:["regular","700"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Baumans",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bayon",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Belgrano",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Belleza",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"BenchNine",variants:["300","regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bentham",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Berkshire Swash",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bevan",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bigelow Rules",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bigshot One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bilbo",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bilbo Swash Caps",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bitter",variants:["regular","italic","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Black Ops One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bokor",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Bonbon",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Boogaloo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bowlby One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bowlby One SC",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Brawler",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Bree Serif",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bubblegum Sans",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Bubbler One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Buda",variants:["300"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Buenard",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Butcherman",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Butterfly Kids",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Cabin",variants:["regular","italic","500","500italic","600","600italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cabin Condensed",variants:["regular","500","600","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cabin Sketch",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Caesar Dressing",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cagliostro",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Calligraffitti",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cambo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Candal",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cantarell",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cantata One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Cantora One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Capriola",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Cardo",variants:["regular","italic","700"],subsets:["greek-ext","latin-ext","latin","greek"]},{kind:"webfonts#webfont",family:"Carme",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Carrois Gothic",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Carrois Gothic SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Carter One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Caudex",variants:["regular","italic","700","700italic"],subsets:["greek-ext","latin-ext","latin","greek"]},{kind:"webfonts#webfont",family:"Cedarville Cursive",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Ceviche One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Changa One",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Chango",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Chau Philomene One",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Chela One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Chelsea Market",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Chenla",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Cherry Cream Soda",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cherry Swash",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Chewy",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Chicle",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Chivo",variants:["regular","italic","900","900italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cinzel",variants:["regular","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cinzel Decorative",variants:["regular","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Clicker Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Coda",variants:["regular","800"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Coda Caption",variants:["800"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Codystar",variants:["300","regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Combo",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Comfortaa",variants:["300","regular","700"],subsets:["cyrillic","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Coming Soon",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Concert One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Condiment",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Content",variants:["regular","700"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Contrail One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Convergence",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cookie",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Copse",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Corben",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Courgette",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Cousine",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Coustard",variants:["regular","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Covered By Your Grace",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Crafty Girls",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Creepster",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Crete Round",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Crimson Text",variants:["regular","italic","600","600italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Croissant One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Crushed",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Cuprum",variants:["regular","italic","700","700italic"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Cutive",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Cutive Mono",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Damion",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Dancing Script",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Dangrek",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Dawning of a New Day",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Days One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Delius",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Delius Swash Caps",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Delius Unicase",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Della Respira",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Devonshire",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Didact Gothic",variants:["regular"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Diplomata",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Diplomata SC",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Doppio One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Dorsa",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Dosis",variants:["200","300","regular","500","600","700","800"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Dr Sugiyama",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Droid Sans",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Droid Sans Mono",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Droid Serif",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Duru Sans",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Dynalight",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"EB Garamond",variants:["regular"],subsets:["cyrillic","latin-ext","latin","vietnamese","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Eagle Lake",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Eater",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Economica",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Electrolize",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Emblema One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Emilys Candy",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Engagement",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Englebert",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Enriqueta",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Erica One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Esteban",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Euphoria Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ewert",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Exo",variants:["100","100italic","200","200italic","300","300italic","regular","italic","500","500italic","600","600italic","700","700italic","800","800italic","900","900italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Expletus Sans",variants:["regular","italic","500","500italic","600","600italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fanwood Text",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fascinate",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fascinate Inline",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Faster One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fasthand",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Federant",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Federo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Felipa",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Fenix",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Finger Paint",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fjord One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Flamenco",variants:["300","regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Flavors",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fondamento",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Fontdiner Swanky",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Forum",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Francois One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Freckle Face",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Fredericka the Great",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fredoka One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Freehand",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Fresca",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Frijole",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Fugaz One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"GFS Didot",variants:["regular"],subsets:["greek"]},{kind:"webfonts#webfont",family:"GFS Neohellenic",variants:["regular","italic","700","700italic"],subsets:["greek"]},{kind:"webfonts#webfont",family:"Gafata",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Galdeano",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Galindo",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Gentium Basic",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Gentium Book Basic",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Geo",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Geostar",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Geostar Fill",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Germania One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Gilda Display",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Give You Glory",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Glass Antiqua",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Glegoo",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Gloria Hallelujah",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Goblin One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Gochi Hand",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Gorditas",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Goudy Bookletter 1911",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Graduate",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Gravitas One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Great Vibes",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Griffy",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Gruppo",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Gudea",variants:["regular","italic","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Habibi",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Hammersmith One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Hanalei",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Hanalei Fill",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Handlee",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Hanuman",variants:["regular","700"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Happy Monkey",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Headland One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Henny Penny",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Herr Von Muellerhoff",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Holtwood One SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Homemade Apple",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Homenaje",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"IM Fell DW Pica",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell DW Pica SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell Double Pica",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell Double Pica SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell English",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell English SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell French Canon",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell French Canon SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell Great Primer",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"IM Fell Great Primer SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Iceberg",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Iceland",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Imprima",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Inconsolata",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Inder",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Indie Flower",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Inika",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Irish Grover",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Istok Web",variants:["regular","italic","700","700italic"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Italiana",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Italianno",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Jacques Francois",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Jacques Francois Shadow",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Jim Nightshade",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Jockey One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Jolly Lodger",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Josefin Sans",variants:["100","100italic","300","300italic","regular","italic","600","600italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Josefin Slab",variants:["100","100italic","300","300italic","regular","italic","600","600italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Joti One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Judson",variants:["regular","italic","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Julee",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Julius Sans One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Junge",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Jura",variants:["300","regular","500","600"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Just Another Hand",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Just Me Again Down Here",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Kameron",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Karla",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Kaushan Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Keania One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Kelly Slab",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Kenia",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Khmer",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Kite One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Knewave",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Kotta One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Koulen",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Kranky",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Kreon",variants:["300","regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Kristi",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Krona One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"La Belle Aurore",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lancelot",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lato",variants:["100","100italic","300","300italic","regular","italic","700","700italic","900","900italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"League Script",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Leckerli One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Ledger",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Lekton",variants:["regular","italic","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Lemon",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Life Savers",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Lilita One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Limelight",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Linden Hill",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lobster",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Lobster Two",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Londrina Outline",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Londrina Shadow",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Londrina Sketch",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Londrina Solid",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lora",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Love Ya Like A Sister",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Loved by the King",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lovers Quarrel",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Luckiest Guy",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lusitana",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Lustria",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Macondo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Macondo Swash Caps",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Magra",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Maiden Orange",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Mako",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Marcellus",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Marcellus SC",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Marck Script",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Margarine",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Marko One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Marmelad",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Marvel",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Mate",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Mate SC",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Maven Pro",variants:["regular","500","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"McLaren",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Meddon",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"MedievalSharp",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Medula One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Megrim",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Meie Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Merienda",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Merienda One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Merriweather",variants:["300","regular","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Metal",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Metal Mania",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Metamorphous",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Metrophobic",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Michroma",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Miltonian",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Miltonian Tattoo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Miniver",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Miss Fajardose",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Modern Antiqua",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Molengo",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Molle",variants:["italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Monofett",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Monoton",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Monsieur La Doulaise",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Montaga",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Montez",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Montserrat",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Montserrat Alternates",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Montserrat Subrayada",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Moul",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Moulpali",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Mountains of Christmas",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Mouse Memoirs",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Mr Bedfort",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Mr Dafoe",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Mr De Haviland",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Mrs Saint Delafield",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Mrs Sheppards",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Muli",variants:["300","300italic","regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Mystery Quest",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Neucha",variants:["regular"],subsets:["cyrillic","latin"]},{kind:"webfonts#webfont",family:"Neuton",variants:["200","300","regular","italic","700","800"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"News Cycle",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Niconne",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Nixie One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nobile",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nokora",variants:["regular","700"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Norican",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Nosifer",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Nothing You Could Do",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Noticia Text",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin","vietnamese"]},{kind:"webfonts#webfont",family:"Nova Cut",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nova Flat",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nova Mono",variants:["regular"],subsets:["latin","greek"]},{kind:"webfonts#webfont",family:"Nova Oval",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nova Round",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nova Script",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nova Slim",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nova Square",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Numans",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Nunito",variants:["300","regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Odor Mean Chey",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Offside",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Old Standard TT",variants:["regular","italic","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Oldenburg",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Oleo Script",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Oleo Script Swash Caps",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Open Sans",variants:["300","300italic","regular","italic","600","600italic","700","700italic","800","800italic"],subsets:["cyrillic","greek-ext","latin-ext","latin","vietnamese","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Open Sans Condensed",variants:["300","300italic","700"],subsets:["cyrillic","greek-ext","latin-ext","latin","vietnamese","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Oranienbaum",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Orbitron",variants:["regular","500","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Oregano",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Orienta",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Original Surfer",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Oswald",variants:["300","regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Over the Rainbow",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Overlock",variants:["regular","italic","700","700italic","900","900italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Overlock SC",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ovo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Oxygen",variants:["300","regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Oxygen Mono",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"PT Mono",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"PT Sans",variants:["regular","italic","700","700italic"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"PT Sans Caption",variants:["regular","700"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"PT Sans Narrow",variants:["regular","700"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"PT Serif",variants:["regular","italic","700","700italic"],subsets:["cyrillic","latin"]},{kind:"webfonts#webfont",family:"PT Serif Caption",variants:["regular","italic"],subsets:["cyrillic","latin"]},{kind:"webfonts#webfont",family:"Pacifico",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Paprika",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Parisienne",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Passero One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Passion One",variants:["regular","700","900"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Patrick Hand",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Patua One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Paytone One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Peralta",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Permanent Marker",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Petit Formal Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Petrona",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Philosopher",variants:["regular","italic","700","700italic"],subsets:["cyrillic","latin"]},{kind:"webfonts#webfont",family:"Piedra",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Pinyon Script",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Pirata One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Plaster",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Play",variants:["regular","700"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Playball",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Playfair Display",variants:["regular","italic","700","700italic","900","900italic"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Playfair Display SC",variants:["regular","italic","700","700italic","900","900italic"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Podkova",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Poiret One",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Poller One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Poly",variants:["regular","italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Pompiere",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Pontano Sans",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Port Lligat Sans",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Port Lligat Slab",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Prata",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Preahvihear",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Press Start 2P",variants:["regular"],subsets:["cyrillic","latin-ext","latin","greek"]},{kind:"webfonts#webfont",family:"Princess Sofia",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Prociono",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Prosto One",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Puritan",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Purple Purse",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Quando",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Quantico",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Quattrocento",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Quattrocento Sans",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Questrial",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Quicksand",variants:["300","regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Quintessential",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Qwigley",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Racing Sans One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Radley",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Raleway",variants:["100","200","300","regular","500","600","700","800","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Raleway Dots",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rambla",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rammetto One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ranchers",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rancho",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Rationale",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Redressed",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Reenie Beanie",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Revalia",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ribeye",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ribeye Marrow",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Righteous",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Risque",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rochester",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Rock Salt",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Rokkitt",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Romanesco",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ropa Sans",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rosario",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Rosarivo",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rouge Script",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Ruda",variants:["regular","700","900"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rufina",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ruge Boogie",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ruluko",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rum Raisin",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ruslan Display",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Russo One",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Ruthie",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Rye",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sacramento",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sail",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Salsa",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sanchez",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sancreek",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sansita One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sarina",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Satisfy",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Scada",variants:["regular","italic","700","700italic"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Schoolbell",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Seaweed Script",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sevillana",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Seymour One",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Shadows Into Light",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Shadows Into Light Two",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Shanti",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Share",variants:["regular","italic","700","700italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Share Tech",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Share Tech Mono",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Shojumaru",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Short Stack",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Siemreap",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Sigmar One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Signika",variants:["300","regular","600","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Signika Negative",variants:["300","regular","600","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Simonetta",variants:["regular","italic","900","900italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sirin Stencil",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Six Caps",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Skranji",variants:["regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Slackey",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Smokum",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Smythe",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sniglet",variants:["800"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Snippet",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Snowburst One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sofadi One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sofia",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sonsie One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Sorts Mill Goudy",variants:["regular","italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Source Code Pro",variants:["200","300","regular","600","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Source Sans Pro",variants:["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","900","900italic"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Special Elite",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Spicy Rice",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Spinnaker",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Spirax",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Squada One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Stalemate",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Stalinist One",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Stardos Stencil",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Stint Ultra Condensed",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Stint Ultra Expanded",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Stoke",variants:["300","regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Strait",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sue Ellen Francisco",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Sunshiney",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Supermercado One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Suwannaphum",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Swanky and Moo Moo",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Syncopate",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Tangerine",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Taprom",variants:["regular"],subsets:["khmer"]},{kind:"webfonts#webfont",family:"Telex",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Tenor Sans",variants:["regular"],subsets:["cyrillic","latin-ext","latin","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Text Me One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"The Girl Next Door",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Tienne",variants:["regular","700","900"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Tinos",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Titan One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Titillium Web",variants:["200","200italic","300","300italic","regular","italic","600","600italic","700","700italic","900"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Trade Winds",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Trocchi",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Trochut",variants:["regular","italic","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Trykker",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Tulpen One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Ubuntu",variants:["300","300italic","regular","italic","500","500italic","700","700italic"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Ubuntu Condensed",variants:["regular"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Ubuntu Mono",variants:["regular","italic","700","700italic"],subsets:["cyrillic","greek-ext","latin-ext","latin","greek","cyrillic-ext"]},{kind:"webfonts#webfont",family:"Ultra",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Uncial Antiqua",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Underdog",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Unica One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"UnifrakturCook",variants:["700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"UnifrakturMaguntia",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Unkempt",variants:["regular","700"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Unlock",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Unna",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"VT323",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Vampiro One",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Varela",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Varela Round",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Vast Shadow",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Vibur",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Vidaloka",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Viga",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Voces",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Volkhov",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Vollkorn",variants:["regular","italic","700","700italic"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Voltaire",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Waiting for the Sunrise",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Wallpoet",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Walter Turncoat",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Warnes",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Wellfleet",variants:["regular"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Wire One",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Yanone Kaffeesatz",variants:["200","300","regular","700"],subsets:["latin-ext","latin"]},{kind:"webfonts#webfont",family:"Yellowtail",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Yeseva One",variants:["regular"],subsets:["cyrillic","latin-ext","latin"]},{kind:"webfonts#webfont",family:"Yesteryear",variants:["regular"],subsets:["latin"]},{kind:"webfonts#webfont",family:"Zeyada",variants:["regular"],subsets:["latin"]}]},BFHLanguagesList={om:"Afaan Oromoo",aa:"Afaraf",af:"Afrikaans",ak:"Akan",an:"aragonés",ig:"Asụsụ Igbo",gn:"Avañe'ẽ",ae:"avesta",ay:"aymar aru",az:"azərbaycan dili",id:"Bahasa Indonesia",ms:"bahasa Melayu",bm:"bamanankan",jv:"basa Jawa",su:"Basa Sunda",bi:"Bislama",bs:"bosanski jezik",br:"brezhoneg",ca:"català",ch:"Chamoru",ny:"chiCheŵa",sn:"chiShona",co:"corsu",cy:"Cymraeg",da:"dansk",se:"Davvisámegiella",de:"Deutsch",nv:"Diné bizaad",et:"eesti",na:"Ekakairũ Naoero",en:"English",es:"español",eo:"Esperanto",eu:"euskara",ee:"Eʋegbe",to:"faka Tonga",mg:"fiteny malagasy",fr:"français",fy:"Frysk",ff:"Fulfulde",fo:"føroyskt",ga:"Gaeilge",gv:"Gaelg",sm:"gagana fa'a Samoa",gl:"galego",sq:"gjuha shqipe",gd:"Gàidhlig",ki:"Gĩkũyũ",ha:"Hausa",ho:"Hiri Motu",hr:"hrvatski jezik",io:"Ido",rw:"Ikinyarwanda",rn:"Ikirundi",ia:"Interlingua",nd:"isiNdebele",nr:"isiNdebele",xh:"isiXhosa",zu:"isiZulu",it:"italiano",ik:"Iñupiaq",pl:"polski",mh:"Kajin M̧ajeļ",kl:"kalaallisut",kr:"Kanuri",kw:"Kernewek",kg:"KiKongo",sw:"Kiswahili",ht:"Kreyòl ayisyen",kj:"Kuanyama",ku:"Kurdî",la:"latine",lv:"latviešu valoda",lt:"lietuvių kalba",ro:"limba română",li:"Limburgs",ln:"Lingála",lg:"Luganda",lb:"Lëtzebuergesch",hu:"magyar",mt:"Malti",nl:"Nederlands",no:"Norsk",nb:"Norsk bokmål",nn:"Norsk nynorsk",uz:"O'zbek",oc:"occitan",ie:"Interlingue",hz:"Otjiherero",ng:"Owambo",pt:"português",ty:"Reo Tahiti",rm:"rumantsch grischun",qu:"Runa Simi",sc:"sardu",za:"Saɯ cueŋƅ",st:"Sesotho",tn:"Setswana",ss:"SiSwati",sl:"slovenski jezik",sk:"slovenčina",so:"Soomaaliga",fi:"suomi",sv:"Svenska",mi:"te reo Māori",vi:"Tiếng Việt",lu:"Tshiluba",ve:"Tshivenḓa",tw:"Twi",tk:"Türkmen",tr:"Türkçe",ug:"Uyƣurqə",vo:"Volapük",fj:"vosa Vakaviti",wa:"walon",tl:"Wikang Tagalog",wo:"Wollof",ts:"Xitsonga",yo:"Yorùbá",sg:"yângâ tî sängö",is:"Íslenska",cs:"čeština",el:"ελληνικά",av:"авар мацӀ",ab:"аҧсуа бызшәа",ba:"башҡорт теле",be:"беларуская мова",bg:"български език",os:"ирон æвзаг",kv:"коми кыв",ky:"Кыргызча",mk:"македонски јазик",mn:"монгол",ce:"нохчийн мотт",ru:"русский язык",sr:"српски језик",tt:"татар теле",tg:"тоҷикӣ",uk:"українська мова",cv:"чӑваш чӗлхи",cu:"ѩзыкъ словѣньскъ",kk:"қазақ тілі",hy:"Հայերեն",yi:"ייִדיש",he:"עברית",ur:"اردو",ar:"العربية",fa:"فارسی",ps:"پښتو",ks:"कश्मीरी",ne:"नेपाली",pi:"पाऴि",bh:"भोजपुरी",mr:"मराठी",sa:"संस्कृतम्",sd:"सिन्धी",hi:"हिन्दी",as:"অসমীয়া",bn:"বাংলা",pa:"ਪੰਜਾਬੀ",gu:"ગુજરાતી",or:"ଓଡ଼ିଆ",ta:"தமிழ்",te:"తెలుగు",kn:"ಕನ್ನಡ",ml:"മലയാളം",si:"සිංහල",th:"ไทย",lo:"ພາສາລາວ",bo:"བོད་ཡིག",dz:"རྫོང་ཁ",my:"ဗမာစာ",ka:"ქართული",ti:"ትግርኛ",am:"አማርኛ",iu:"ᐃᓄᒃᑎᑐᑦ",oj:"ᐊᓂᔑᓈᐯᒧᐎᓐ",cr:"ᓀᐦᐃᔭᐍᐏᐣ",km:"ខ្មែរ",zh:"中文 (Zhōngwén)",ja:"日本語 (にほんご)",ii:"ꆈꌠ꒿ Nuosuhxop",ko:"한국어 (韓國語)"},BFHPhoneFormatList={AF:"+93 0dd ddd dddd",AL:"+355 0dd ddd ddd",DZ:"+213 0ddd dd dd dd",AS:"+1 (ddd) ddd-dddd",AD:"+376 ddddddddd",AO:"+244 ddd ddd ddd",AI:"+1 (ddd) ddd-dddd",AQ:"+672 ddddddddd",AG:"+1 (ddd) ddd-dddd",AR:"+54 ddddddddd",AM:"+374 0dd dddddd",AW:"+297 ddd dddd",AU:"+61 ddd ddd ddd",AT:"+43 0dddd ddddddddd",AZ:"+994 ddddddddd",BH:"+973 ddddddddd",BD:"+880 ddddddddd",BB:"+1 ddddddddd",BY:"+375 ddddddddd",BE:"+32 ddddddddd",BZ:"+501 ddddddddd",BJ:"+229 ddddddddd",BM:"+1 (ddd) ddd-dddd",BT:"+975 ddddddddd",BO:"+591 ddddddddd",BA:"+387 ddddddddd",BW:"+267 ddddddddd",BV:"+0 ddddddddd",BR:"+55 ddddddddd",IO:"+0 ddddddddd",VG:"+1 (ddd) ddd-dddd",BN:"+673 ddddddddd",BG:"+359 ddddddddd",BF:"+226 ddddddddd",BI:"+257 ddddddddd",CI:"+225 ddddddddd",KH:"+855 ddddddddd",CM:"+237 ddddddddd",CA:"+1 (ddd) ddd-dddd",CV:"+238 ddddddddd",KY:"+1 (ddd) ddd-dddd",CF:"+236 ddddddddd",TD:"+235 ddddddddd",CL:"+56 ddddddddd",CN:"+86 ddddddddd",CX:"+61 ddddddddd",CC:"+61 ddddddddd",CO:"+57 ddddddddd",KM:"+269 ddddddddd",CG:"+242 ddddddddd",CK:"+682 ddddddddd",CR:"+506 ddddddddd",HR:"+385 ddddddddd",CU:"+53 ddddddddd",CY:"+357 ddddddddd",CZ:"+420 ddddddddd",CD:"+243 ddddddddd",DK:"+45 ddddddddd",DJ:"+253 ddddddddd",DM:"+1 (ddd) ddd-dddd",DO:"+1 (ddd) ddd-dddd",TL:"+670 ddddddddd",EC:"+593 ddddddddd",EG:"+20 ddddddddd",SV:"+503 ddddddddd",GQ:"+240 ddddddddd",ER:"+291 ddddddddd",EE:"+372 ddddddddd",ET:"+251 ddddddddd",FO:"+298 ddddddddd",FK:"+500 ddddddddd",FJ:"+679 ddddddddd",FI:"+358 ddddddddd",MK:"+389 ddddddddd",FR:"+33 d dd dd dd dd",GF:"+594 ddddddddd",PF:"+689 ddddddddd",TF:"+262 ddddddddd",GA:"+241 ddddddddd",GE:"+995 ddddddddd",DE:"+49 ddddddddd",GH:"+233 ddddddddd",GI:"+350 ddddddddd",GR:"+30 ddddddddd",GL:"+299 ddddddddd",GD:"+1 (ddd) ddd-dddd",GP:"+590 ddddddddd",GU:"+1 (ddd) ddd-dddd",GT:"+502 ddddddddd",GN:"+224 ddddddddd",GW:"+245 ddddddddd",GY:"+592 ddddddddd",HT:"+509 ddddddddd",HM:"+0 ddddddddd",HN:"+504 ddddddddd",HK:"+852 ddddddddd",HU:"+36 ddddddddd",IS:"+354 ddddddddd",IN:"+91 ddddddddd",ID:"+62 ddddddddd",IR:"+98 ddddddddd",IQ:"+964 ddddddddd",IE:"+353 ddddddddd",IL:"+972 ddddddddd",IT:"+39 ddddddddd",JM:"+1 (ddd) ddd-dddd",JP:"+81 ddddddddd",JO:"+962 ddddddddd",KZ:"+7 ddddddddd",KE:"+254 ddddddddd",KI:"+686 ddddddddd",KW:"+965 ddddddddd",KG:"+996 ddddddddd",LA:"+856 ddddddddd",LV:"+371 ddddddddd",LB:"+961 ddddddddd",LS:"+266 ddddddddd",LR:"+231 ddddddddd",LY:"+218 ddddddddd",LI:"+423 ddddddddd",LT:"+370 ddddddddd",LU:"+352 ddddddddd",MO:"+853 ddddddddd",MG:"+261 ddddddddd",MW:"+265 ddddddddd",MY:"+60 ddddddddd",MV:"+960 ddddddddd",ML:"+223 ddddddddd",MT:"+356 ddddddddd",MH:"+692 ddddddddd",MQ:"+596 ddddddddd",MR:"+222 ddddddddd",MU:"+230 ddddddddd",YT:"+262 ddddddddd",MX:"+52 ddddddddd",FM:"+691 ddddddddd",MD:"+373 ddddddddd",MC:"+377 ddddddddd",MN:"+976 ddddddddd",MS:"+1 (ddd) ddd-dddd",MA:"+212 ddddddddd",MZ:"+258 ddddddddd",MM:"+95 ddddddddd",NA:"+264 ddddddddd",NR:"+674 ddddddddd",NP:"+977 ddddddddd",NL:"+31 ddddddddd",AN:"+599 ddddddddd",NC:"+687 ddddddddd",NZ:"+64 ddddddddd",NI:"+505 ddddddddd",NE:"+227 ddddddddd",NG:"+234 ddddddddd",NU:"+683 ddddddddd",NF:"+672 ddddddddd",KP:"+850 ddddddddd",MP:"+1 (ddd) ddd-dddd",NO:"+47 ddddddddd",OM:"+968 ddddddddd",PK:"+92 ddddddddd",PW:"+680 ddddddddd",PA:"+507 ddddddddd",PG:"+675 ddddddddd",PY:"+595 ddddddddd",PE:"+51 ddddddddd",PH:"+63 ddddddddd",PN:"+870 ddddddddd",PL:"+48 ddddddddd",PT:"+351 ddddddddd",PR:"+1 (ddd) ddd-dddd",QA:"+974 ddddddddd",RE:"+262 ddddddddd",RO:"+40 ddddddddd",RU:"+7 ddddddddd",RW:"+250 ddddddddd",ST:"+239 ddddddddd",SH:"+290 ddddddddd",KN:"+1 (ddd) ddd-dddd",LC:"+1 (ddd) ddd-dddd",PM:"+508 ddddddddd",VC:"+1 (ddd) ddd-dddd",WS:"+685 ddddddddd",SM:"+378 ddddddddd",SA:"+966 ddddddddd",SN:"+221 ddddddddd",SC:"+248 ddddddddd",SL:"+232 ddddddddd",SG:"+65 ddddddddd",SK:"+421 ddddddddd",SI:"+386 ddddddddd",SB:"+677 ddddddddd",SO:"+252 ddddddddd",ZA:"+27 ddddddddd",GS:"+0 ddddddddd",KR:"+82 ddddddddd",ES:"+34 ddddddddd",LK:"+94 ddddddddd",SD:"+249 ddddddddd",SR:"+597 ddddddddd",SJ:"+0 ddddddddd",SZ:"+268 ddddddddd",SE:"+46 ddddddddd",CH:"+41 ddddddddd",SY:"+963 ddddddddd",TW:"+886 ddddddddd",TJ:"+992 ddddddddd",TZ:"+255 ddddddddd",TH:"+66 ddddddddd",BS:"+1 (ddd) ddd-dddd",GM:"+220 ddddddddd",TG:"+228 ddddddddd",TK:"+690 ddddddddd",TO:"+676 ddddddddd",TT:"+1 (ddd) ddd-dddd",TN:"+216 ddddddddd",TR:"+90 ddddddddd",TM:"+993 ddddddddd",TC:"+1 (ddd) ddd-dddd",TV:"+688 ddddddddd",VI:"+1 (ddd) ddd-dddd",UG:"+256 ddddddddd",UA:"+380 ddddddddd",AE:"+971 ddddddddd",GB:"+44 (ddd) dddd dddd",US:"+1 (ddd) ddd-dddd",UM:"+0 ddddddddd",UY:"+598 ddddddddd",UZ:"+998 ddddddddd",VU:"+678 ddddddddd",VA:"+39 ddddddddd",VE:"+58 ddddddddd",VN:"+84 ddddddddd",WF:"+681 ddddddddd",EH:"+0 ddddddddd",YE:"+967 ddddddddd",YU:"+0 ddddddddd",ZM:"+260 ddddddddd",ZW:"+263 ddddddddd"},BFHStatesList={AF:{1:{code:"BAL",name:"Balkh"},2:{code:"BAM",name:"Bamian"},3:{code:"BDG",name:"Badghis"},4:{code:"BDS",name:"Badakhshan"},5:{code:"BGL",name:"Baghlan"},6:{code:"FRA",name:"Farah"},7:{code:"FYB",name:"Faryab"},8:{code:"GHA",name:"Ghazni"},9:{code:"GHO",name:"Ghowr"},10:{code:"HEL",name:"Helmand"},11:{code:"HER",name:"Herat"},12:{code:"JOW",name:"Jowzjan"},13:{code:"KAB",name:"Kabul"},14:{code:"KAN",name:"Kandahar"},15:{code:"KAP",name:"Kapisa"},16:{code:"KDZ",name:"Kondoz"},17:{code:"KHO",name:"Khost"},18:{code:"KNR",name:"Konar"},19:{code:"LAG",name:"Laghman"},20:{code:"LOW",name:"Lowgar"},21:{code:"NAN",name:"Nangrahar"},22:{code:"NIM",name:"Nimruz"},23:{code:"NUR",name:"Nurestan"},24:{code:"ORU",name:"Oruzgan"},25:{code:"PAR",name:"Parwan"},26:{code:"PIA",name:"Paktia"},27:{code:"PKA",name:"Paktika"},28:{code:"SAM",name:"Samangan"},29:{code:"SAR",name:"Sar-e Pol"},30:{code:"TAK",name:"Takhar"},31:{code:"WAR",name:"Wardak"},32:{code:"ZAB",name:"Zabol"}},AL:{1:{code:"BR",name:"Berat"},2:{code:"BU",name:"Bulqize"},3:{code:"DI",name:"Diber"},4:{code:"DL",name:"Delvine"},5:{code:"DR",name:"Durres"},6:{code:"DV",name:"Devoll"},7:{code:"EL",name:"Elbasan"},8:{code:"ER",name:"Kolonje"},9:{code:"FR",name:"Fier"},10:{code:"GJ",name:"Gjirokaster"},11:{code:"GR",name:"Gramsh"},12:{code:"HA",name:"Has"},13:{code:"KA",name:"Kavaje"},14:{code:"KB",name:"Kurbin"},15:{code:"KC",name:"Kucove"},16:{code:"KO",name:"Korce"},17:{code:"KR",name:"Kruje"},18:{code:"KU",name:"Kukes"},19:{code:"LB",name:"Librazhd"},20:{code:"LE",name:"Lezhe"},21:{code:"LU",name:"Lushnje"},22:{code:"MK",name:"Mallakaster"},23:{code:"MM",name:"Malesi e Madhe"},24:{code:"MR",name:"Mirdite"},25:{code:"MT",name:"Mat"},26:{code:"PG",name:"Pogradec"},27:{code:"PQ",name:"Peqin"},28:{code:"PR",name:"Permet"},29:{code:"PU",name:"Puke"},30:{code:"SH",name:"Shkoder"},31:{code:"SK",name:"Skrapar"},32:{code:"SR",name:"Sarande"},33:{code:"TE",name:"Tepelene"},34:{code:"TP",name:"Tropoje"},35:{code:"TR",name:"Tirane"},36:{code:"VL",name:"Vlore"}},DZ:{1:{code:"ADE",name:"Ain Defla"},2:{code:"ADR",name:"Adrar"},3:{code:"ALG",name:"Alger"},4:{code:"ANN",name:"Annaba"},5:{code:"ATE",name:"Ain Temouchent"},6:{code:"BAT",name:"Batna"},7:{code:"BBA",name:"Bordj Bou Arreridj"},8:{code:"BEC",name:"Bechar"},9:{code:"BEJ",name:"Bejaia"},10:{code:"BIS",name:"Biskra"},11:{code:"BLI",name:"Blida"},12:{code:"BMD",name:"Boumerdes"},13:{code:"BOA",name:"Bouira"},14:{code:"CHL",name:"Chlef"},15:{code:"CON",name:"Constantine"},16:{code:"DJE",name:"Djelfa"},17:{code:"EBA",name:"El Bayadh"},18:{code:"EOU",name:"El Oued"},19:{code:"ETA",name:"El Tarf"},20:{code:"GHA",name:"Ghardaia"},21:{code:"GUE",name:"Guelma"},22:{code:"ILL",name:"Illizi"},23:{code:"JIJ",name:"Jijel"},24:{code:"KHE",name:"Khenchela"},25:{code:"LAG",name:"Laghouat"},26:{code:"MED",name:"Medea"},27:{code:"MIL",name:"Mila"},28:{code:"MOS",name:"Mostaganem"},29:{code:"MSI",name:"M'Sila"},30:{code:"MUA",name:"Muaskar"},31:{code:"NAA",name:"Naama"},32:{code:"OEB",name:"Oum el-Bouaghi"},33:{code:"ORA",name:"Oran"},34:{code:"OUA",name:"Ouargla"},35:{code:"REL",name:"Relizane"},36:{code:"SAH",name:"Souk Ahras"},37:{code:"SAI",name:"Saida"},38:{code:"SBA",name:"Sidi Bel Abbes"},39:{code:"SET",name:"Setif"},40:{code:"SKI",name:"Skikda"},41:{code:"TAM",name:"Tamanghasset"},42:{code:"TEB",name:"Tebessa"},43:{code:"TIA",name:"Tiaret"},44:{code:"TIN",name:"Tindouf"},45:{code:"TIP",name:"Tipaza"},46:{code:"TIS",name:"Tissemsilt"},47:{code:"TLE",name:"Tlemcen"},48:{code:"TOU",name:"Tizi Ouzou"}},AS:{1:{code:"E",name:"Eastern"},2:{code:"M",name:"Manu'a"},3:{code:"R",name:"Rose Island"},4:{code:"S",name:"Swains Island"},5:{code:"W",name:"Western"}},AD:{1:{code:"ALV",name:"Andorra la Vella"},2:{code:"CAN",name:"Canillo"},3:{code:"ENC",name:"Encamp"},4:{code:"ESE",name:"Escaldes-Engordany"},5:{code:"LMA",name:"La Massana"},6:{code:"ORD",name:"Ordino"},7:{code:"SJL",name:"Sant Julià de Lòria"}},AO:{1:{code:"BGO",name:"Bengo"},2:{code:"BGU",name:"Benguela"},3:{code:"BIE",name:"Bie"},4:{code:"CAB",name:"Cabinda"},5:{code:"CCU",name:"Cuando-Cubango"},6:{code:"CNO",name:"Cuanza Norte"},7:{code:"CUS",name:"Cuanza Sul"},8:{code:"CNN",name:"Cunene"},9:{code:"HUA",name:"Huambo"},10:{code:"HUI",name:"Huila"},11:{code:"LUA",name:"Luanda"},12:{code:"LNO",name:"Lunda Norte"},13:{code:"LSU",name:"Lunda Sul"},14:{code:"MAL",name:"Malange"},15:{code:"MOX",name:"Moxico"},16:{code:"NAM",name:"Namibe"},17:{code:"UIG",name:"Uige"},18:{code:"ZAI",name:"Zaire"}},AI:{1:{code:"ANG",name:"Anguillita"},2:{code:"ANG",name:"Anguila"},3:{code:"DOG",name:"Dog"},4:{code:"LIT",name:"Little Scrub"},5:{code:"PRI",name:"Prickly Pear"},6:{code:"SAN",name:"Sandy"},7:{code:"SCR",name:"Scrub"},8:{code:"SEA",name:"Seal"},9:{code:"SOM",name:"Sombrero"}},AQ:{1:{code:"ASG",name:"Saint George"},2:{code:"ASH",name:"Saint Philip"},3:{code:"ASJ",name:"Saint John"},4:{code:"ASL",name:"Saint Paul"},5:{code:"ASM",name:"Saint Mary"},6:{code:"ASR",name:"Saint Peter"},7:{code:"BAR",name:"Barbuda"},8:{code:"RED",name:"Redonda"}},AR:{1:{code:"AN",name:"Antartida e Islas del Atlantico"},2:{code:"BA",name:"Buenos Aires"},3:{code:"CA",name:"Catamarca"},4:{code:"CH",name:"Chaco"},5:{code:"CU",name:"Chubut"},6:{code:"CO",name:"Cordoba"},7:{code:"CR",name:"Corrientes"},8:{code:"CF",name:"Capital Federal"},9:{code:"ER",name:"Entre Rios"},10:{code:"FO",name:"Formosa"},11:{code:"JU",name:"Jujuy"},12:{code:"LP",name:"La Pampa"},13:{code:"LR",name:"La Rioja"},14:{code:"ME",name:"Mendoza"},15:{code:"MI",name:"Misiones"},16:{code:"NE",name:"Neuquen"},17:{code:"RN",name:"Rio Negro"},18:{code:"SA",name:"Salta"},19:{code:"SJ",name:"San Juan"},20:{code:"SL",name:"San Luis"},21:{code:"SC",name:"Santa Cruz"},22:{code:"SF",name:"Santa Fe"},23:{code:"SD",name:"Santiago del Estero"},24:{code:"TF",name:"Tierra del Fuego"},25:{code:"TU",name:"Tucuman"}},AM:{1:{code:"AGT",name:"Aragatsotn"},2:{code:"ARR",name:"Ararat"},3:{code:"ARM",name:"Armavir"},4:{code:"GEG",name:"Geghark 'unik'"},5:{code:"KOT",name:"Kotayk'"},6:{code:"LOR",name:"Lorri"},7:{code:"SHI",name:"Shirak"},8:{code:"SYU",name:"Syunik'"},9:{code:"TAV",name:"Tavush"},10:{code:"VAY",name:"Vayots' Dzor"},11:{code:"YER",name:"Yerevan"}},AW:{1:{code:"ARU",name:"Aruba"},2:{code:"DRU",name:"Druif Beach"},3:{code:"MAN",name:"Manchebo Beach"},4:{code:"NOO",name:"Noord"},5:{code:"ORA",name:"Oranjestad"},6:{code:"PAL",name:"Palm Beach"},7:{code:"ROO",name:"Rooi Thomas"},8:{code:"SIN",name:"Sint Nicolaas"},9:{code:"SIN",name:"Sint Nicolas"},10:{code:"WAY",name:"Wayaca"}},AU:{1:{code:"ACT",name:"Australian Capital Territory"},2:{code:"NSW",name:"New South Wales"},3:{code:"NT",name:"Northern Territory"},4:{code:"QLD",name:"Queensland"},5:{code:"SA",name:"South Australia"},6:{code:"TAS",name:"Tasmania"},7:{code:"VIC",name:"Victoria"},8:{code:"WA",name:"Western Australia"}},AT:{1:{code:"BUR",name:"Burgenland"},2:{code:"KAR",name:"Krnten"},3:{code:"NOS",name:"Niederöesterreich"},4:{code:"OOS",name:"Oberöesterreich"},5:{code:"SAL",name:"Salzburg"},6:{code:"STE",name:"Steiermark"},7:{code:"TIR",name:"Tirol"},8:{code:"VOR",name:"Vorarlberg"},9:{code:"WIE",name:"Wien"}},AZ:{1:{code:"AB",name:"Ali Bayramli"},2:{code:"ABS",name:"Abseron"},3:{code:"AGC",name:"AgcabAdi"},4:{code:"AGM",name:"Agdam"},5:{code:"AGS",name:"Agdas"},6:{code:"AGA",name:"Agstafa"},7:{code:"AGU",name:"Agsu"},8:{code:"AST",name:"Astara"},9:{code:"BA",name:"Baki"},10:{code:"BAB",name:"BabAk"},11:{code:"BAL",name:"BalakAn"},12:{code:"BAR",name:"BArdA"},13:{code:"BEY",name:"Beylaqan"},14:{code:"BIL",name:"Bilasuvar"},15:{code:"CAB",name:"Cabrayil"},16:{code:"CAL",name:"Calilabab"},17:{code:"CUL",name:"Culfa"},18:{code:"DAS",name:"Daskasan"},19:{code:"DAV",name:"Davaci"},20:{code:"FUZ",name:"Fuzuli"},21:{code:"GA",name:"Ganca"},22:{code:"GAD",name:"Gadabay"},23:{code:"GOR",name:"Goranboy"},24:{code:"GOY",name:"Goycay"},25:{code:"HAC",name:"Haciqabul"},26:{code:"IMI",name:"Imisli"},27:{code:"ISM",name:"Ismayilli"},28:{code:"KAL",name:"Kalbacar"},29:{code:"KUR",name:"Kurdamir"},30:{code:"LA",name:"Lankaran"},31:{code:"LAC",name:"Lacin"},32:{code:"LAN",name:"Lankaran"},33:{code:"LER",name:"Lerik"},34:{code:"MAS",name:"Masalli"},35:{code:"MI",name:"Mingacevir"},36:{code:"NA",name:"Naftalan"},37:{code:"NX",name:"Naxcivan"},38:{code:"NEF",name:"Neftcala"},39:{code:"OGU",name:"Oguz"},40:{code:"ORD",name:"Ordubad"},41:{code:"QAB",name:"Qabala"},42:{code:"QAX",name:"Qax"},43:{code:"QAZ",name:"Qazax"},44:{code:"QOB",name:"Qobustan"},45:{code:"QBA",name:"Quba"},46:{code:"QBI",name:"Qubadli"},47:{code:"QUS",name:"Qusar"},48:{code:"SA",name:"Saki"},49:{code:"SAT",name:"Saatli"},50:{code:"SAB",name:"Sabirabad"},51:{code:"SAD",name:"Sadarak"},52:{code:"SAH",name:"Sahbuz"},53:{code:"SAK",name:"Saki"},54:{code:"SAL",name:"Salyan"},55:{code:"SM",name:"Sumqayit"},56:{code:"SMI",name:"Samaxi"},57:{code:"SKR",name:"Samkir"},58:{code:"SMX",name:"Samux"},59:{code:"SAR",name:"Sarur"},60:{code:"SIY",name:"Siyazan"},61:{code:"SS",name:"Susa"},62:{code:"SUS",name:"Susa"},63:{code:"TAR",name:"Tartar"},64:{code:"TOV",name:"Tovuz"},65:{code:"UCA",name:"Ucar"},66:{code:"XA",name:"Xankandi"},67:{code:"XAC",name:"Xacmaz"},68:{code:"XAN",name:"Xanlar"},69:{code:"XIZ",name:"Xizi"},70:{code:"XCI",name:"Xocali"},71:{code:"XVD",name:"Xocavand"},72:{code:"YAR",name:"Yardimli"},73:{code:"YEV",name:"Yevlax"},74:{code:"ZAN",name:"Zangilan"},75:{code:"ZAQ",name:"Zaqatala"},76:{code:"ZAR",name:"Zardab"}},BS:{1:{code:"ACK",name:"Acklins"},2:{code:"BER",name:"Berry Islands"},3:{code:"BIM",name:"Bimini"},4:{code:"BLK",name:"Black Point"},5:{code:"CAT",name:"Cat Island"},6:{code:"CAB",name:"Central Abaco"},7:{code:"CAN",name:"Central Andros"},8:{code:"CEL",name:"Central Eleuthera"},9:{code:"FRE",name:"City of Freeport"},10:{code:"CRO",name:"Crooked Island"},11:{code:"EGB",name:"East Grand Bahama"},12:{code:"EXU",name:"Exuma"},13:{code:"GRD",name:"Grand Cay"},14:{code:"HAR",name:"Harbour Island"},15:{code:"HOP",name:"Hope Town"},16:{code:"INA",name:"Inagua"},17:{code:"LNG",name:"Long Island"},18:{code:"MAN",name:"Mangrove Cay"},19:{code:"MAY",name:"Mayaguana"},20:{code:"MOO",name:"Moore's Island"},21:{code:"NAB",name:"North Abaco"},22:{code:"NAN",name:"North Andros"},23:{code:"NEL",name:"North Eleuthera"},24:{code:"RAG",name:"Ragged Island"},25:{code:"RUM",name:"Rum Cay"},26:{code:"SAL",name:"San Salvador"},27:{code:"SAB",name:"South Abaco"},28:{code:"SAN",name:"South Andros"},29:{code:"SEL",name:"South Eleuthera"},30:{code:"SWE",name:"Spanish Wells"},31:{code:"WGB",name:"West Grand Bahama"}},BH:{1:{code:"CAP",name:"Capital"},2:{code:"CEN",name:"Central"},3:{code:"MUH",name:"Muharraq"},4:{code:"NOR",name:"Northern"},5:{code:"SOU",name:"Southern"}},BD:{1:{code:"BAR",name:"Barisal"},2:{code:"CHI",name:"Chittagong"},3:{code:"DHA",name:"Dhaka"},4:{code:"KHU",name:"Khulna"},5:{code:"RAJ",name:"Rajshahi"},6:{code:"SYL",name:"Sylhet"}},BB:{1:{code:"CC",name:"Christ Church"},2:{code:"AND",name:"Saint Andrew"},3:{code:"GEO",name:"Saint George"},4:{code:"JAM",name:"Saint James"},5:{code:"JOH",name:"Saint John"},6:{code:"JOS",name:"Saint Joseph"},7:{code:"LUC",name:"Saint Lucy"},8:{code:"MIC",name:"Saint Michael"},9:{code:"PET",name:"Saint Peter"},10:{code:"PHI",name:"Saint Philip"},11:{code:"THO",name:"Saint Thomas"}},BY:{1:{code:"BR",name:"Brestskaya (Brest)"},2:{code:"HO",name:"Homyel'skaya (Homyel')"},3:{code:"HM",name:"Horad Minsk"},4:{code:"HR",name:"Hrodzyenskaya (Hrodna)"},5:{code:"MA",name:"Mahilyowskaya (Mahilyow)"},6:{code:"MI",name:"Minskaya"},7:{code:"VI",name:"Vitsyebskaya (Vitsyebsk)"}},BE:{1:{code:"VAN",name:"Antwerpen"},2:{code:"WBR",name:"Brabant Wallon"},3:{code:"WHT",name:"Hainaut"},4:{code:"WLG",name:"Liege"},5:{code:"VLI",name:"Limburg"},6:{code:"WLX",name:"Luxembourg"},7:{code:"WNA",name:"Namur"},8:{code:"VOV",name:"Oost-Vlaanderen"},9:{code:"VBR",name:"Vlaams Brabant"},10:{code:"VWV",name:"West-Vlaanderen"}},BZ:{1:{code:"BZ",name:"Belize"},2:{code:"CY",name:"Cayo"},3:{code:"CR",name:"Corozal"},4:{code:"OW",name:"Orange Walk"},5:{code:"SC",name:"Stann Creek"},6:{code:"TO",name:"Toledo"}},BJ:{1:{code:"AL",name:"Alibori"},2:{code:"AK",name:"Atakora"},3:{code:"AQ",name:"Atlantique"},4:{code:"BO",name:"Borgou"},5:{code:"CO",name:"Collines"},6:{code:"DO",name:"Donga"},7:{code:"KO",name:"Kouffo"},8:{code:"LI",name:"Littoral"},9:{code:"MO",name:"Mono"},10:{code:"OU",name:"Oueme"},11:{code:"PL",name:"Plateau"},12:{code:"ZO",name:"Zou"}},BM:{1:{code:"DS",name:"Devonshire"},2:{code:"HC",name:"Hamilton City"},3:{code:"HA",name:"Hamilton"},4:{code:"PG",name:"Paget"},5:{code:"PB",name:"Pembroke"},6:{code:"GC",name:"Saint George City"},7:{code:"SG",name:"Saint George's"},8:{code:"SA",name:"Sandys"},9:{code:"SM",name:"Smith's"},10:{code:"SH",name:"Southampton"},11:{code:"WA",name:"Warwick"}},BT:{1:{code:"BUM",name:"Bumthang"},2:{code:"CHU",name:"Chukha"},3:{code:"DAG",name:"Dagana"},4:{code:"GAS",name:"Gasa"},5:{code:"HAA",name:"Haa"},6:{code:"LHU",name:"Lhuntse"},7:{code:"MON",name:"Mongar"},8:{code:"PAR",name:"Paro"},9:{code:"PEM",name:"Pemagatshel"},10:{code:"PUN",name:"Punakha"},11:{code:"SJO",name:"Samdrup Jongkhar"},12:{code:"SAT",name:"Samtse"},13:{code:"SAR",name:"Sarpang"},14:{code:"THI",name:"Thimphu"},15:{code:"TRG",name:"Trashigang"},16:{code:"TRY",name:"Trashiyangste"},17:{code:"TRO",name:"Trongsa"},18:{code:"TSI",name:"Tsirang"},19:{code:"WPH",name:"Wangdue Phodrang"},20:{code:"ZHE",name:"Zhemgang"}},BO:{1:{code:"BEN",name:"Beni"},2:{code:"CHU",name:"Chuquisaca"},3:{code:"COC",name:"Cochabamba"},4:{code:"LPZ",name:"La Paz"},5:{code:"ORU",name:"Oruro"},6:{code:"PAN",name:"Pando"},7:{code:"POT",name:"Potosi"},8:{code:"SCZ",name:"Santa Cruz"},9:{code:"TAR",name:"Tarija"}},BA:{1:{code:"BRO",name:"Brcko district"},2:{code:"FBP",name:"Bosanskopodrinjski Kanton"},3:{code:"FHN",name:"Hercegovacko-neretvanski Kanton"},4:{code:"FPO",name:"Posavski Kanton"},5:{code:"FSA",name:"Kanton Sarajevo"},6:{code:"FSB",name:"Srednjebosanski Kanton"},7:{code:"FTU",name:"Tuzlanski Kanton"},8:{code:"FUS",name:"Unsko-Sanski Kanton"},9:{code:"FZA",name:"Zapadnobosanska"},10:{code:"FZE",name:"Zenicko-Dobojski Kanton"},11:{code:"FZH",name:"Zapadnohercegovacka Zupanija"},12:{code:"SBI",name:"Bijeljina"},13:{code:"SBL",name:"Banja Luka"},14:{code:"SDO",name:"Doboj"},15:{code:"SFO",name:"Foca"},16:{code:"SSR",name:"Sarajevo-Romanija or Sokolac"},17:{code:"STR",name:"Trebinje"},18:{code:"SVL",name:"Vlasenica"}},BW:{1:{code:"CE",name:"Central"},2:{code:"GH",name:"Ghanzi"},3:{code:"KD",name:"Kgalagadi"},4:{code:"KT",name:"Kgatleng"},5:{code:"KW",name:"Kweneng"},6:{code:"NG",name:"Ngamiland"},7:{code:"NE",name:"North East"},8:{code:"NW",name:"North West"},9:{code:"SE",name:"South East"},10:{code:"SO",name:"Southern"}},BR:{1:{code:"AC",name:"Acre"},2:{code:"AL",name:"Alagoas"},3:{code:"AP",name:"Amapa"},4:{code:"AM",name:"Amazonas"},5:{code:"BA",name:"Bahia"},6:{code:"CE",name:"Ceara"},7:{code:"DF",name:"Distrito Federal"},8:{code:"ES",name:"Espirito Santo"},9:{code:"GO",name:"Goias"},10:{code:"MA",name:"Maranhao"},11:{code:"MT",name:"Mato Grosso"},12:{code:"MS",name:"Mato Grosso do Sul"},13:{code:"MG",name:"Minas Gerais"},14:{code:"PA",name:"Para"},15:{code:"PB",name:"Paraiba"},16:{code:"PR",name:"Parana"},17:{code:"PE",name:"Pernambuco"},18:{code:"PI",name:"Piaui"},19:{code:"RJ",name:"Rio de Janeiro"},20:{code:"RN",name:"Rio Grande do Norte"},21:{code:"RS",name:"Rio Grande do Sul"},22:{code:"RO",name:"Rondonia"},23:{code:"RR",name:"Roraima"},24:{code:"SC",name:"Santa Catarina"},25:{code:"SP",name:"Sao Paulo"},26:{code:"SE",name:"Sergipe"},27:{code:"TO",name:"Tocantins"}},IO:{1:{code:"DG",name:"Diego Garcia"},2:{code:"DI",name:"Danger Island"},3:{code:"EA",name:"Eagle Islands"},4:{code:"EG",name:"Egmont Islands"},5:{code:"NI",name:"Nelsons Island"},6:{code:"PB",name:"Peros Banhos"},7:{code:"SI",name:"Salomon Islands"},8:{code:"TB",name:"Three Brothers"}},BN:{1:{code:"BEL",name:"Belait"},2:{code:"BRM",name:"Brunei and Muara"},3:{code:"TEM",name:"Temburong"},4:{code:"TUT",name:"Tutong"}},BG:{1:{code:"BG-01",name:"Blagoevgrad"},2:{code:"BG-02",name:"Burgas"},3:{code:"BG-03",name:"Dobrich"},4:{code:"BG-04",name:"Gabrovo"},5:{code:"BG-05",name:"Haskovo"},6:{code:"BG-06",name:"Kardjali"},7:{code:"BG-07",name:"Kyustendil"},8:{code:"BG-08",name:"Lovech"},9:{code:"BG-09",name:"Montana"},10:{code:"BG-10",name:"Pazardjik"},11:{code:"BG-11",name:"Pernik"},12:{code:"BG-12",name:"Pleven"},13:{code:"BG-13",name:"Plovdiv"},14:{code:"BG-14",name:"Razgrad"},15:{code:"BG-15",name:"Shumen"},16:{code:"BG-16",name:"Silistra"},17:{code:"BG-17",name:"Sliven"},18:{code:"BG-18",name:"Smolyan"},19:{code:"BG-19",name:"Sofia"},20:{code:"BG-20",name:"Sofia - town"},21:{code:"BG-21",name:"Stara Zagora"},22:{code:"BG-22",name:"Targovishte"},23:{code:"BG-23",name:"Varna"},24:{code:"BG-24",name:"Veliko Tarnovo"},25:{code:"BG-25",name:"Vidin"},26:{code:"BG-26",name:"Vratza"},27:{code:"BG-27",name:"Yambol"}},BF:{1:{code:"BAL",name:"Bale"},2:{code:"BAM",name:"Bam"},3:{code:"BAN",name:"Banwa"},4:{code:"BAZ",name:"Bazega"},5:{code:"BOR",name:"Bougouriba"},6:{code:"BLG",name:"Boulgou"},7:{code:"BOK",name:"Boulkiemde"},8:{code:"COM",name:"Comoe"},9:{code:"GAN",name:"Ganzourgou"},10:{code:"GNA",name:"Gnagna"},11:{code:"GOU",name:"Gourma"},12:{code:"HOU",name:"Houet"},13:{code:"IOA",name:"Ioba"},14:{code:"KAD",name:"Kadiogo"},15:{code:"KEN",name:"Kenedougou"},16:{code:"KOD",name:"Komondjari"},17:{code:"KOP",name:"Kompienga"},18:{code:"KOS",name:"Kossi"},19:{code:"KOL",name:"Koulpelogo"},20:{code:"KOT",name:"Kouritenga"},21:{code:"KOW",name:"Kourweogo"},22:{code:"LER",name:"Leraba"},23:{code:"LOR",name:"Loroum"},24:{code:"MOU",name:"Mouhoun"},25:{code:"NAH",name:"Nahouri"},26:{code:"NAM",name:"Namentenga"},27:{code:"NAY",name:"Nayala"},28:{code:"NOU",name:"Noumbiel"},29:{code:"OUB",name:"Oubritenga"},30:{code:"OUD",name:"Oudalan"},31:{code:"PAS",name:"Passore"},32:{code:"PON",name:"Poni"},33:{code:"SAG",name:"Sanguie"},34:{code:"SAM",name:"Sanmatenga"},35:{code:"SEN",name:"Seno"},36:{code:"SIS",name:"Sissili"},37:{code:"SOM",name:"Soum"},38:{code:"SOR",name:"Sourou"},39:{code:"TAP",name:"Tapoa"},40:{code:"TUY",name:"Tuy"},41:{code:"YAG",name:"Yagha"},42:{code:"YAT",name:"Yatenga"},43:{code:"ZIR",name:"Ziro"},44:{code:"ZOD",name:"Zondoma"},45:{code:"ZOW",name:"Zoundweogo"}},BI:{1:{code:"BB",name:"Bubanza"},2:{code:"BJ",name:"Bujumbura"},3:{code:"BR",name:"Bururi"},4:{code:"CA",name:"Cankuzo"},5:{code:"CI",name:"Cibitoke"},6:{code:"GI",name:"Gitega"},7:{code:"KR",name:"Karuzi"},8:{code:"KY",name:"Kayanza"},9:{code:"KI",name:"Kirundo"},10:{code:"MA",name:"Makamba"},11:{code:"MU",name:"Muramvya"},12:{code:"MY",name:"Muyinga"},13:{code:"MW",name:"Mwaro"},14:{code:"NG",name:"Ngozi"},15:{code:"RT",name:"Rutana"},16:{code:"RY",name:"Ruyigi"}},KH:{1:{code:"BA",name:"Battambang"},2:{code:"BM",name:"Banteay Meanchey"},3:{code:"KB",name:"Keb"},4:{code:"KK",name:"Kaoh Kong"},5:{code:"KL",name:"Kandal"},6:{code:"KM",name:"Kampong Cham"},7:{code:"KN",name:"Kampong Chhnang"},8:{code:"KO",name:"Kampong Som"},9:{code:"KP",name:"Kampot"},10:{code:"KR",name:"Kratie"},11:{code:"KT",name:"Kampong Thom"},12:{code:"KU",name:"Kampong Speu"},13:{code:"MK",name:"Mondul Kiri"},14:{code:"OM",name:"Oddar Meancheay"},15:{code:"PA",name:"Pailin"},16:{code:"PG",name:"Prey Veng"},17:{code:"PP",name:"Phnom Penh"},18:{code:"PR",name:"Preah Vihear"},19:{code:"PS",name:"Preah Seihanu (Kompong Som or Si)"},20:{code:"PU",name:"Pursat"},21:{code:"RK",name:"Ratanak Kiri"},22:{code:"SI",name:"Siemreap"},23:{code:"SR",name:"Svay Rieng"},24:{code:"ST",name:"Stung Treng"},25:{code:"TK",name:"Takeo"}},CM:{1:{code:"ADA",name:"Adamawa (Adamaoua)"},2:{code:"CEN",name:"Centre"},3:{code:"EST",name:"East (Est)"},4:{code:"EXN",name:"Extrême-Nord"},5:{code:"LIT",name:"Littoral"},6:{code:"NOR",name:"North (Nord)"},7:{code:"NOT",name:"Northwest (Nord-Ouest)"},8:{code:"OUE",name:"West (Ouest)"},9:{code:"SUD",name:"South (Sud)"},10:{code:"SOU",name:"Southwest (Sud-Ouest)"}},CA:{1:{code:"AB",name:"Alberta"},2:{code:"BC",name:"British Columbia"},3:{code:"MB",name:"Manitoba"},4:{code:"NB",name:"New Brunswick"},5:{code:"NL",name:"Newfoundland and Labrador"},6:{code:"NT",name:"Northwest Territories"},7:{code:"NS",name:"Nova Scotia"},8:{code:"NU",name:"Nunavut"},9:{code:"ON",name:"Ontario"},10:{code:"PE",name:"Prince Edward Island"},11:{code:"QC",name:"Québec"},12:{code:"SK",name:"Saskatchewan"},13:{code:"YT",name:"Yukon Territory"}},CV:{1:{code:"BV",name:"Boa Vista"},2:{code:"BR",name:"Brava"},3:{code:"CS",name:"Calheta de Sao Miguel"},4:{code:"MA",name:"Maio"},5:{code:"MO",name:"Mosteiros"},6:{code:"PA",name:"Paul"},7:{code:"PN",name:"Porto Novo"},8:{code:"PR",name:"Praia"},9:{code:"RG",name:"Ribeira Grande"},10:{code:"SL",name:"Sal"},11:{code:"CA",name:"Santa Catarina"},12:{code:"CR",name:"Santa Cruz"},13:{code:"SD",name:"Sao Domingos"},14:{code:"SF",name:"Sao Filipe"},15:{code:"SN",name:"Sao Nicolau"},16:{code:"SV",name:"Sao Vicente"},17:{code:"TA",name:"Tarrafal"}},KY:{1:{code:"CR",name:"Creek"},2:{code:"EA",name:"Eastern"},3:{code:"ML",name:"Midland"},4:{code:"ST",name:"South Town"},5:{code:"SP",name:"Spot Bay"},6:{code:"SK",name:"Stake Bay"},7:{code:"WD",name:"West End"},8:{code:"WN",name:"Western"}},CF:{1:{code:"BAN",name:"Bangui"},2:{code:"BBA",name:"Bamingui-Bangoran"},3:{code:"BKO",name:"Basse-Kotto"},4:{code:"HKO",name:"Haute-Kotto"},5:{code:"HMB",name:"Haut-Mbomou"},6:{code:"KEM",name:"Kemo"},7:{code:"LOB",name:"Lobaye"},8:{code:"MBO",name:"Mbomou"},9:{code:"MKD",name:"Mambéré-Kadéï"},10:{code:"NGR",name:"Nana-Grebizi"},11:{code:"NMM",name:"Nana-Mambere"},12:{code:"OMP",name:"Ombella-M'Poko"},13:{code:"OPE",name:"Ouham-Pende"},14:{code:"OUH",name:"Ouham"},15:{code:"OUK",name:"Ouaka"},16:{code:"SMB",name:"Sangha-Mbaere"},17:{code:"VAK",name:"Vakaga"}},TD:{1:{code:"BA",name:"Batha"},2:{code:"BI",name:"Biltine"},3:{code:"BE",name:"Borkou-Ennedi-Tibesti"},4:{code:"CB",name:"Chari-Baguirmi"},5:{code:"GU",name:"Guera"},6:{code:"KA",name:"Kanem"},7:{code:"LA",name:"Lac"},8:{code:"LC",name:"Logone Occidental"},9:{code:"LR",name:"Logone Oriental"},10:{code:"MK",name:"Mayo-Kebbi"},11:{code:"MC",name:"Moyen-Chari"},12:{code:"OU",name:"Ouaddai"},13:{code:"SA",name:"Salamat"},14:{code:"TA",name:"Tandjile"}},CL:{1:{code:"AI",name:"Aisen del General Carlos Ibanez"},2:{code:"AN",name:"Antofagasta"},3:{code:"AR",name:"Araucania"},4:{code:"AT",name:"Atacama"},5:{code:"BI",name:"Bio-Bio"},6:{code:"CO",name:"Coquimbo"},7:{code:"LI",name:"Libertador General Bernardo O'Hi"},8:{code:"LL",name:"Los Lagos"},9:{code:"MA",name:"Magallanes y de la Antartica Chi"},10:{code:"ML",name:"Maule"},11:{code:"RM",name:"Region Metropolitana"},12:{code:"TA",name:"Tarapaca"},13:{code:"VS",name:"Valparaiso"}},CN:{1:{code:"AN",name:"Anhui"},2:{code:"BE",name:"Beijing"},3:{code:"CH",name:"Chongqing"},4:{code:"FU",name:"Fujian"},5:{code:"GA",name:"Gansu"},6:{code:"GU",name:"Guangdong"},7:{code:"GX",name:"Guangxi"},8:{code:"GZ",name:"Guizhou"},9:{code:"HA",name:"Hainan"},10:{code:"HB",name:"Hebei"},11:{code:"HL",name:"Heilongjiang"},12:{code:"HE",name:"Henan"},13:{code:"HK",name:"Hong Kong"},14:{code:"HU",name:"Hubei"},15:{code:"HN",name:"Hunan"},16:{code:"IM",name:"Inner Mongolia"},17:{code:"JI",name:"Jiangsu"},18:{code:"JX",name:"Jiangxi"},19:{code:"JL",name:"Jilin"},20:{code:"LI",name:"Liaoning"},21:{code:"MA",name:"Macau"},22:{code:"NI",name:"Ningxia"},23:{code:"SH",name:"Shaanxi"},24:{code:"SA",name:"Shandong"},25:{code:"SG",name:"Shanghai"},26:{code:"SX",name:"Shanxi"},27:{code:"SI",name:"Sichuan"},28:{code:"TI",name:"Tianjin"},29:{code:"XI",name:"Xinjiang"},30:{code:"YU",name:"Yunnan"},31:{code:"ZH",name:"Zhejiang"}},CC:{1:{code:"D",name:"Direction Island"},2:{code:"H",name:"Home Island"},3:{code:"O",name:"Horsburgh Island"},4:{code:"S",name:"South Island"},5:{code:"W",name:"West Island"}},CO:{1:{code:"AMZ",name:"Amazonas"},2:{code:"ANT",name:"Antioquia"},3:{code:"ARA",name:"Arauca"},4:{code:"ATL",name:"Atlantico"},5:{code:"BDC",name:"Bogota D.C."},6:{code:"BOL",name:"Bolivar"},7:{code:"BOY",name:"Boyaca"},8:{code:"CAL",name:"Caldas"},9:{code:"CAQ",name:"Caqueta"},10:{code:"CAS",name:"Casanare"},11:{code:"CAU",name:"Cauca"},12:{code:"CES",name:"Cesar"},13:{code:"CHO",name:"Choco"},14:{code:"COR",name:"Cordoba"},15:{code:"CAM",name:"Cundinamarca"},16:{code:"GNA",name:"Guainia"},17:{code:"GJR",name:"Guajira"},18:{code:"GVR",name:"Guaviare"},19:{code:"HUI",name:"Huila"},20:{code:"MAG",name:"Magdalena"},21:{code:"MET",name:"Meta"},22:{code:"NAR",name:"Narino"},23:{code:"NDS",name:"Norte de Santander"},24:{code:"PUT",name:"Putumayo"},25:{code:"QUI",name:"Quindio"},26:{code:"RIS",name:"Risaralda"},27:{code:"SAP",name:"San Andres y Providencia"},28:{code:"SAN",name:"Santander"},29:{code:"SUC",name:"Sucre"},30:{code:"TOL",name:"Tolima"},31:{code:"VDC",name:"Valle del Cauca"},32:{code:"VAU",name:"Vaupes"},33:{code:"VIC",name:"Vichada"}},KM:{1:{code:"G",name:"Grande Comore"},2:{code:"A",name:"Anjouan"},3:{code:"M",name:"Moheli"}},CG:{1:{code:"BO",name:"Bouenza"},2:{code:"BR",name:"Brazzaville"},3:{code:"CU",name:"Cuvette"},4:{code:"CO",name:"Cuvette-Ouest"},5:{code:"KO",name:"Kouilou"},6:{code:"LE",name:"Lekoumou"},7:{code:"LI",name:"Likouala"},8:{code:"NI",name:"Niari"},9:{code:"PL",name:"Plateaux"},10:{code:"PO",name:"Pool"},11:{code:"SA",name:"Sangha"}},CK:{1:{code:"AI",name:"Aitutaki"},2:{code:"AT",name:"Atiu"},3:{code:"MA",name:"Manuae"},4:{code:"MG",name:"Mangaia"},5:{code:"MK",name:"Manihiki"},6:{code:"MT",name:"Mitiaro"},7:{code:"MU",name:"Mauke"},8:{code:"NI",name:"Nassau Island"},9:{code:"PA",name:"Palmerston"},10:{code:"PE",name:"Penrhyn"},11:{code:"PU",name:"Pukapuka"},12:{code:"RK",name:"Rakahanga"},13:{code:"RR",name:"Rarotonga"},14:{code:"SU",name:"Surwarrow"},15:{code:"TA",name:"Takutea"}},CR:{1:{code:"AL",name:"Alajuela"},2:{code:"CA",name:"Cartago"},3:{code:"GU",name:"Guanacaste"},4:{code:"HE",name:"Heredia"},5:{code:"LI",name:"Limon"},6:{code:"PU",name:"Puntarenas"},7:{code:"SJ",name:"San Jose"}},CI:{1:{code:"ABE",name:"Abengourou"},2:{code:"ABI",name:"Abidjan"},3:{code:"ABO",name:"Aboisso"},4:{code:"ADI",name:"Adiake"},5:{code:"ADZ",name:"Adzope"},6:{code:"AGB",name:"Agboville"},7:{code:"AGN",name:"Agnibilekrou"},8:{code:"ALE",name:"Alepe"},9:{code:"BOC",name:"Bocanda"},10:{code:"BAN",name:"Bangolo"},11:{code:"BEO",name:"Beoumi"},12:{code:"BIA",name:"Biankouma"},13:{code:"BDK",name:"Bondoukou"},14:{code:"BGN",name:"Bongouanou"},15:{code:"BFL",name:"Bouafle"},16:{code:"BKE",name:"Bouake"},17:{code:"BNA",name:"Bouna"},18:{code:"BDL",name:"Boundiali"},19:{code:"DKL",name:"Dabakala"},20:{code:"DBU",name:"Dabou"},21:{code:"DAL",name:"Daloa"},22:{code:"DAN",name:"Danane"},23:{code:"DAO",name:"Daoukro"},24:{code:"DIM",name:"Dimbokro"},25:{code:"DIV",name:"Divo"},26:{code:"DUE",name:"Duekoue"},27:{code:"FER",name:"Ferkessedougou"},28:{code:"GAG",name:"Gagnoa"},29:{code:"GBA",name:"Grand-Bassam"},30:{code:"GLA",name:"Grand-Lahou"},31:{code:"GUI",name:"Guiglo"},32:{code:"ISS",name:"Issia"},33:{code:"JAC",name:"Jacqueville"},34:{code:"KAT",name:"Katiola"},35:{code:"KOR",name:"Korhogo"},36:{code:"LAK",name:"Lakota"},37:{code:"MAN",name:"Man"},38:{code:"MKN",name:"Mankono"},39:{code:"MBA",name:"Mbahiakro"},40:{code:"ODI",name:"Odienne"},41:{code:"OUM",name:"Oume"},42:{code:"SAK",name:"Sakassou"},43:{code:"SPE",name:"San-Pedro"},44:{code:"SAS",name:"Sassandra"},45:{code:"SEG",name:"Seguela"},46:{code:"SIN",name:"Sinfra"},47:{code:"SOU",name:"Soubre"},48:{code:"TAB",name:"Tabou"},49:{code:"TAN",name:"Tanda"},50:{code:"TIE",name:"Tiebissou"},51:{code:"TIN",name:"Tingrela"},52:{code:"TIA",name:"Tiassale"},53:{code:"TBA",name:"Touba"},54:{code:"TLP",name:"Toulepleu"},55:{code:"TMD",name:"Toumodi"},56:{code:"VAV",name:"Vavoua"},57:{code:"YAM",name:"Yamoussoukro"},58:{code:"ZUE",name:"Zuenoula"}},HR:{1:{code:"BB",name:"Bjelovar-Bilogora"},2:{code:"CZ",name:"City of Zagreb"},3:{code:"DN",name:"Dubrovnik-Neretva"},4:{code:"IS",name:"Istra"},5:{code:"KA",name:"Karlovac"},6:{code:"KK",name:"Koprivnica-Krizevci"},7:{code:"KZ",name:"Krapina-Zagorje"},8:{code:"LS",name:"Lika-Senj"},9:{code:"ME",name:"Medimurje"},10:{code:"OB",name:"Osijek-Baranja"},11:{code:"PS",name:"Pozega-Slavonia"},12:{code:"PG",name:"Primorje-Gorski Kotar"},13:{code:"SI",name:"Sibenik"},14:{code:"SM",name:"Sisak-Moslavina"},15:{code:"SB",name:"Slavonski Brod-Posavina"},16:{code:"SD",name:"Split-Dalmatia"},17:{code:"VA",name:"Varazdin"},18:{code:"VP",name:"Virovitica-Podravina"},19:{code:"VS",name:"Vukovar-Srijem"},20:{code:"ZK",name:"Zadar-Knin"},21:{code:"ZA",name:"Zagreb"}},CU:{1:{code:"CA",name:"Camaguey"},2:{code:"CD",name:"Ciego de Avila"},3:{code:"CI",name:"Cienfuegos"},4:{code:"CH",name:"Ciudad de La Habana"},5:{code:"GR",name:"Granma"},6:{code:"GU",name:"Guantanamo"},7:{code:"HO",name:"Holguin"},8:{code:"IJ",name:"Isla de la Juventud"},9:{code:"LH",name:"La Habana"},10:{code:"LT",name:"Las Tunas"},11:{code:"MA",name:"Matanzas"},12:{code:"PR",name:"Pinar del Rio"},13:{code:"SS",name:"Sancti Spiritus"},14:{code:"SC",name:"Santiago de Cuba"},15:{code:"VC",name:"Villa Clara"}},CY:{1:{code:"F",name:"Famagusta"},2:{code:"K",name:"Kyrenia"},3:{code:"A",name:"Larnaca"},4:{code:"I",name:"Limassol"},5:{code:"N",name:"Nicosia"},6:{code:"P",name:"Paphos"}},CZ:{1:{code:"A",name:"Hlavní město Praha"},2:{code:"B",name:"Jihomoravský"},3:{code:"C",name:"Jihočeský"},4:{code:"E",name:"Pardubický"},5:{code:"H",name:"Královéhradecký"},6:{code:"J",name:"Vysočina"},7:{code:"K",name:"Karlovarský"},8:{code:"L",name:"Liberecký"},9:{code:"M",name:"Olomoucký"},10:{code:"P",name:"Plzeňský"},11:{code:"S",name:"Středočeský"},12:{code:"T",name:"Moravskoslezský"},13:{code:"U",name:"Ústecký"},14:{code:"Z",name:"Zlínský"}},DK:{1:{code:"AR",name:"Arhus"},2:{code:"BH",name:"Bornholm"},3:{code:"CO",name:"Copenhagen"},4:{code:"FO",name:"Faroe Islands"},5:{code:"FR",name:"Frederiksborg"},6:{code:"FY",name:"Fyn"},7:{code:"KO",name:"Kobenhavn"},8:{code:"NO",name:"Nordjylland"},9:{code:"RI",name:"Ribe"},10:{code:"RK",name:"Ringkobing"},11:{code:"RO",name:"Roskilde"},12:{code:"SO",name:"Sonderjylland"},13:{code:"ST",name:"Storstrom"},14:{code:"VK",name:"Vejle"},15:{code:"VJ",name:"Vestjælland"},16:{code:"VB",name:"Viborg"}},DJ:{1:{code:"S",name:"'Ali Sabih"},2:{code:"K",name:"Dikhil"},3:{code:"J",name:"Djibouti"},4:{code:"O",name:"Obock"},5:{code:"T",name:"Tadjoura"}},DM:{1:{code:"AND",name:"Saint Andrew Parish"},2:{code:"DAV",name:"Saint David Parish"},3:{code:"GEO",name:"Saint George Parish"},4:{code:"JOH",name:"Saint John Parish"},5:{code:"JOS",name:"Saint Joseph Parish"},6:{code:"LUK",name:"Saint Luke Parish"},7:{code:"MAR",name:"Saint Mark Parish"},8:{code:"PAT",name:"Saint Patrick Parish"},9:{code:"PAU",name:"Saint Paul Parish"},10:{code:"PET",name:"Saint Peter Parish"}},DO:{1:{code:"DN",name:"Distrito Nacional"},2:{code:"AZ",name:"Azua"},3:{code:"BC",name:"Baoruco"},4:{code:"BH",name:"Barahona"},5:{code:"DJ",name:"Dajabon"},6:{code:"DU",name:"Duarte"},7:{code:"EL",name:"Elias Pina"},8:{code:"SY",name:"El Seybo"},9:{code:"ET",name:"Espaillat"},10:{code:"HM",name:"Hato Mayor"},11:{code:"IN",name:"Independencia"},12:{code:"AL",name:"La Altagracia"},13:{code:"RO",name:"La Romana"},14:{code:"VE",name:"La Vega"},15:{code:"MT",name:"Maria Trinidad Sanchez"},16:{code:"MN",name:"Monsenor Nouel"},17:{code:"MC",name:"Monte Cristi"},18:{code:"MP",name:"Monte Plata"},19:{code:"PD",name:"Pedernales"},20:{code:"PR",name:"Peravia (Bani)"},21:{code:"PP",name:"Puerto Plata"},22:{code:"SL",name:"Salcedo"},23:{code:"SM",name:"Samana"},24:{code:"SH",name:"Sanchez Ramirez"},25:{code:"SC",name:"San Cristobal"},26:{code:"JO",name:"San Jose de Ocoa"},27:{code:"SJ",name:"San Juan"},28:{code:"PM",name:"San Pedro de Macoris"},29:{code:"SA",name:"Santiago"},30:{code:"ST",name:"Santiago Rodriguez"},31:{code:"SD",name:"Santo Domingo"},32:{code:"VA",name:"Valverde"}},TP:{1:{code:"AL",name:"Aileu"},2:{code:"AN",name:"Ainaro"},3:{code:"BA",name:"Baucau"},4:{code:"BO",name:"Bobonaro"},5:{code:"CO",name:"Cova Lima"},6:{code:"DI",name:"Dili"},7:{code:"ER",name:"Ermera"},8:{code:"LA",name:"Lautem"},9:{code:"LI",name:"Liquica"},10:{code:"MT",name:"Manatuto"},11:{code:"MF",name:"Manufahi"},12:{code:"OE",name:"Oecussi"},13:{code:"VI",name:"Viqueque"}},EC:{1:{code:"AZU",name:"Azuay"},2:{code:"BOL",name:"Bolivar"},3:{code:"CAN",name:"Cañar"},4:{code:"CAR",name:"Carchi"},5:{code:"CHI",name:"Chimborazo"},6:{code:"COT",name:"Cotopaxi"},7:{code:"EOR",name:"El Oro"},8:{code:"ESM",name:"Esmeraldas"},9:{code:"GPS",name:"Galápagos"},10:{code:"GUA",name:"Guayas"},11:{code:"IMB",name:"Imbabura"},12:{code:"LOJ",name:"Loja"},13:{code:"LRO",name:"Los Ríos"},14:{code:"MAN",name:"Manabí"},15:{code:"MSA",name:"Morona Santiago"},16:{code:"NAP",name:"Napo"},17:{code:"ORE",name:"Orellana"},18:{code:"PAS",name:"Pastaza"},19:{code:"PIC",name:"Pichincha"},20:{code:"SUC",name:"Sucumbíos"},21:{code:"TUN",name:"Tungurahua"},22:{code:"ZCH",name:"Zamora Chinchipe"}},EG:{1:{code:"DHY",name:"Ad Daqahliyah"},2:{code:"BAM",name:"Al Bahr al Ahmar"},3:{code:"BHY",name:"Al Buhayrah"},4:{code:"FYM",name:"Al Fayyum"},5:{code:"GBY",name:"Al Gharbiyah"},6:{code:"IDR",name:"Al Iskandariyah"},7:{code:"IML",name:"Al Isma 'iliyah"},8:{code:"JZH",name:"Al Jizah"},9:{code:"MFY",name:"Al Minufiyah"},10:{code:"MNY",name:"Al Minya"},11:{code:"QHR",name:"Al Qahirah"},12:{code:"QLY",name:"Al Qalyubiyah"},13:{code:"WJD",name:"Al Wadi al Jadid"},14:{code:"SHQ",name:"Ash Sharqiyah"},15:{code:"SWY",name:"As Suways"},16:{code:"ASW",name:"Aswan"},17:{code:"ASY",name:"Asyut"},18:{code:"BSW",name:"Bani Suwayf"},19:{code:"BSD",name:"Bur Sa'id"},20:{code:"DMY",name:"Dumyat"},21:{code:"JNS",name:"Janub Sina'"},22:{code:"KSH",name:"Kafr ash Shaykh"},23:{code:"MAT",name:"Matruh"},24:{code:"QIN",name:"Qina"},25:{code:"SHS",name:"Shamal Sina'"},26:{code:"SUH",name:"Suhaj"}},SV:{1:{code:"AH",name:"Ahuachapan"},2:{code:"CA",name:"Cabanas"},3:{code:"CH",name:"Chalatenango"},4:{code:"CU",name:"Cuscatlan"},5:{code:"LB",name:"La Libertad"},6:{code:"PZ",name:"La Paz"},7:{code:"UN",name:"La Union"},8:{code:"MO",name:"Morazan"},9:{code:"SM",name:"San Miguel"},10:{code:"SS",name:"San Salvador"},11:{code:"SV",name:"San Vicente"},12:{code:"SA",name:"Santa Ana"},13:{code:"SO",name:"Sonsonate"},14:{code:"US",name:"Usulutan"}},GQ:{1:{code:"AN",name:"Provincia Annobon"},2:{code:"BN",name:"Provincia Bioko Norte"},3:{code:"BS",name:"Provincia Bioko Sur"},4:{code:"CS",name:"Provincia Centro Sur"},5:{code:"KN",name:"Provincia Kie-Ntem"},6:{code:"LI",name:"Provincia Litoral"},7:{code:"WN",name:"Provincia Wele-Nzas"}},ER:{1:{code:"MA",name:"Central (Maekel)"},2:{code:"KE",name:"Anseba (Keren)"},3:{code:"DK",name:"Southern Red Sea (Debub-Keih-Bah)"},4:{code:"SK",name:"Northern Red Sea (Semien-Keih-Ba)"},5:{code:"DE",name:"Southern (Debub)"},6:{code:"BR",name:"Gash-Barka (Barentu)"}},EE:{1:{code:"HA",name:"Harjumaa (Tallinn)"},2:{code:"HI",name:"Hiiumaa (Kardla)"},3:{code:"IV",name:"Ida-Virumaa (Johvi)"},4:{code:"JA",name:"Jarvamaa (Paide)"},5:{code:"JO",name:"Jogevamaa (Jogeva)"},6:{code:"LV",name:"Laane-Virumaa (Rakvere)"},7:{code:"LA",name:"Laanemaa (Haapsalu)"},8:{code:"PA",name:"Parnumaa (Parnu)"},9:{code:"PO",name:"Polvamaa (Polva)"},10:{code:"RA",name:"Raplamaa (Rapla)"},11:{code:"SA",name:"Saaremaa (Kuessaare)"},12:{code:"TA",name:"Tartumaa (Tartu)"},13:{code:"VA",name:"Valgamaa (Valga)"},14:{code:"VI",name:"Viljandimaa (Viljandi)"},15:{code:"VO",name:"Vorumaa (Voru)"}},ET:{1:{code:"AF",name:"Afar"},2:{code:"AH",name:"Amhara"},3:{code:"BG",name:"Benishangul-Gumaz"},4:{code:"GB",name:"Gambela"},5:{code:"HR",name:"Hariai"},6:{code:"OR",name:"Oromia"},7:{code:"SM",name:"Somali"},8:{code:"SN",name:"Southern Nations - Nationalities"},9:{code:"TG",name:"Tigray"},10:{code:"AA",name:"Addis Ababa"},11:{code:"DD",name:"Dire Dawa"}},FO:{1:{code:"TÛR",name:"Tûrshavnar Kommuna"},2:{code:"KLA",name:"Klaksvík"},3:{code:"RUN",name:"Runavík"},4:{code:"TVØ",name:"Tvøroyri"},5:{code:"FUG",name:"Fuglafjørður"},6:{code:"SUN",name:"Sunda Kommuna"},7:{code:"VáG",name:"Vágur"},8:{code:"NES",name:"Nes"},9:{code:"VES",name:"Vestmanna"},10:{code:"MIð",name:"Miðvágur"},11:{code:"SØR",name:"Sørvágur"},12:{code:"GØT",name:"Gøtu Kommuna"},13:{code:"SJû",name:"Sjûvar Kommuna"},14:{code:"LEI",name:"Leirvík"},15:{code:"SAN",name:"Sandavágur"},16:{code:"HVA",name:"Hvalba"},17:{code:"EIð",name:"Eiði"},18:{code:"KVí",name:"Kvívík"},19:{code:"SAN",name:"Sandur"},20:{code:"SKO",name:"Skopun"},21:{code:"HVA",name:"Hvannasund"},22:{code:"SUM",name:"Sumba"},23:{code:"VIð",name:"Viðareiði"},24:{code:"POR",name:"Porkeri"},25:{code:"SKá",name:"Skálavík"},26:{code:"KUN",name:"Kunoy"},27:{code:"HÚS",name:"HÚsavík"},28:{code:"HOV",name:"Hov"},29:{code:"FáM",name:"Fámjin"},30:{code:"FUN",name:"Funningur"},31:{code:"HÚS",name:"HÚsar"},32:{code:"SKÚ",name:"SkÚvoy"},33:{code:"SVí",name:"Svínoy"},34:{code:"FUG",name:"Fugloy"}},FJ:{1:{code:"C",name:"Central Division"},2:{code:"E",name:"Eastern Division"},3:{code:"N",name:"Northern Division"},4:{code:"R",name:"Rotuma"},5:{code:"W",name:"Western Division"}},FI:{1:{code:"AL",name:"Ahvenanmaan Laani"},2:{code:"ES",name:"Etela-Suomen Laani"},3:{code:"IS",name:"Ita-Suomen Laani"},4:{code:"LS",name:"Lansi-Suomen Laani"},5:{code:"LA",name:"Lapin Lanani"},6:{code:"OU",name:"Oulun Laani"}},FR:{1:{code:"AL",name:"Alsace"},2:{code:"AQ",name:"Aquitaine"},3:{code:"AU",name:"Auvergne"},4:{code:"BR",name:"Brittany"},5:{code:"BU",name:"Burgundy"},6:{code:"CE",name:"Center Loire Valley"},7:{code:"CH",name:"Champagne"},8:{code:"CO",name:"Corse"},9:{code:"FR",name:"France Comte"},10:{code:"LA",name:"Languedoc Roussillon"},11:{code:"LI",name:"Limousin"},12:{code:"LO",name:"Lorraine"},13:{code:"MI",name:"Midi Pyrenees"},14:{code:"NO",name:"Nord Pas de Calais"},15:{code:"NR",name:"Normandy"},16:{code:"PA",name:"Paris / Ile de France"},17:{code:"PI",name:"Picardie"},18:{code:"PO",name:"Poitou Charente"},19:{code:"PR",name:"Provence"},20:{code:"RH",name:"Rhone Alps"},21:{code:"RI",name:"Riviera"},22:{code:"WE",name:"Western Loire Valley"}},FX:{1:{code:"Et",name:"Etranger"},2:{code:"01",name:"Ain"},3:{code:"02",name:"Aisne"},4:{code:"03",name:"Allier"},5:{code:"04",name:"Alpes de Haute Provence"},6:{code:"05",name:"Hautes-Alpes"},7:{code:"06",name:"Alpes Maritimes"},8:{code:"07",name:"Ardèche"},9:{code:"08",name:"Ardennes"},10:{code:"09",name:"Ariège"},11:{code:"10",name:"Aube"},12:{code:"11",name:"Aude"},13:{code:"12",name:"Aveyron"},14:{code:"13",name:"Bouches du Rhône"},15:{code:"14",name:"Calvados"},16:{code:"15",name:"Cantal"},17:{code:"16",name:"Charente"},18:{code:"17",name:"Charente Maritime"},19:{code:"18",name:"Cher"},20:{code:"19",name:"Corrèze"},21:{code:"2A",name:"Corse du Sud"},22:{code:"2B",name:"Haute Corse"},23:{code:"21",name:"Côte d'or"},24:{code:"22",name:"Côtes d'Armor"},25:{code:"23",name:"Creuse"},26:{code:"24",name:"Dordogne"},27:{code:"25",name:"Doubs"},28:{code:"26",name:"Drôme"},29:{code:"27",name:"Eure"},30:{code:"28",name:"Eure et Loir"},31:{code:"29",name:"Finistère"},32:{code:"30",name:"Gard"},33:{code:"31",name:"Haute Garonne"},34:{code:"32",name:"Gers"},35:{code:"33",name:"Gironde"},36:{code:"34",name:"Hérault"},37:{code:"35",name:"Ille et Vilaine"},38:{code:"36",name:"Indre"},39:{code:"37",name:"Indre et Loire"},40:{code:"38",name:"Isére"},41:{code:"39",name:"Jura"},42:{code:"40",name:"Landes"},43:{code:"41",name:"Loir et Cher"},44:{code:"42",name:"Loire"},45:{code:"43",name:"Haute Loire"},46:{code:"44",name:"Loire Atlantique"},47:{code:"45",name:"Loiret"},48:{code:"46",name:"Lot"},49:{code:"47",name:"Lot et Garonne"},50:{code:"48",name:"Lozère"},51:{code:"49",name:"Maine et Loire"},52:{code:"50",name:"Manche"},53:{code:"51",name:"Marne"},54:{code:"52",name:"Haute Marne"},55:{code:"53",name:"Mayenne"},56:{code:"54",name:"Meurthe et Moselle"},57:{code:"55",name:"Meuse"},58:{code:"56",name:"Morbihan"},59:{code:"57",name:"Moselle"},60:{code:"58",name:"Nièvre"},61:{code:"59",name:"Nord"},62:{code:"60",name:"Oise"},63:{code:"61",name:"Orne"},64:{code:"62",name:"Pas de Calais"},65:{code:"63",name:"Puy de Dôme"},66:{code:"64",name:"Pyrenees Atlantique"},67:{code:"65",name:"Hautes Pyrenees"},68:{code:"66",name:"Pyrenees Orientale"},69:{code:"67",name:"Bas Rhin"},70:{code:"68",name:"Haut Rhin"},71:{code:"69",name:"Rhône"},72:{code:"70",name:"Haute Saône"},73:{code:"71",name:"Saône et Loire"},74:{code:"72",name:"Sarthe"},75:{code:"73",name:"Savoie"},76:{code:"74",name:"Haute Savoie"},77:{code:"75",name:"Paris"},78:{code:"76",name:"Seine Martitime"},79:{code:"77",name:"Seine et Marne"},80:{code:"78",name:"Yvelines"},81:{code:"79",name:"Deux Sèvres"},82:{code:"80",name:"Somme"},83:{code:"81",name:"Tarn"},84:{code:"82",name:"Tarn et Garonne"},85:{code:"83",name:"Var"},86:{code:"84",name:"Vaucluse"},87:{code:"85",name:"Vendée"},88:{code:"86",name:"Vienne"},89:{code:"87",name:"Haute Vienne"},90:{code:"88",name:"Vosges"},91:{code:"89",name:"Yonne"},92:{code:"90",name:"Territoire de Belfort"},93:{code:"91",name:"Essonne"},94:{code:"92",name:"Hauts de Seine"},95:{code:"93",name:"Seine St-Denis"},96:{code:"94",name:"Val de Marne"},97:{code:"95",name:"Val d'oise"}},GF:{1:{code:"AWA",name:"Awala-Yalimapo"},2:{code:"MAN",name:"Mana"},3:{code:"SAI",name:"Saint-Laurent-Du-Maroni"},4:{code:"APA",name:"Apatou"},5:{code:"GRA",name:"Grand-Santi"},6:{code:"PAP",name:"Papaïchton"},7:{code:"SAÜ",name:"SaÜl"},8:{code:"MAR",name:"Maripasoula"},9:{code:"CAM",name:"Camopi"},10:{code:"SAI",name:"Saint-Georges"},11:{code:"OUA",name:"Ouanary"},12:{code:"RéG",name:"Régina"},13:{code:"ROU",name:"Roura"},14:{code:"SAI",name:"Saint-élie"},15:{code:"IRA",name:"Iracoubo"},16:{code:"SIN",name:"Sinnamary"},17:{code:"KOU",name:"Kourou"},18:{code:"MAC",name:"Macouria"},19:{code:"MON",name:"Montsinéry-Tonnegrande"},20:{code:"MAT",name:"Matoury"},21:{code:"CAY",name:"Cayenne"},22:{code:"REM",name:"Remire-Montjoly"}},PF:{1:{code:"M",name:"Archipel des Marquises"},2:{code:"T",name:"Archipel des Tuamotu"},3:{code:"I",name:"Archipel des Tubuai"},4:{code:"V",name:"Iles du Vent"},5:{code:"S",name:"Iles Sous-le-Vent"}},TF:{1:{code:"C",name:"Iles Crozet"},2:{code:"K",name:"Iles Kerguelen"},3:{code:"A",name:"Ile Amsterdam"},4:{code:"P",name:"Ile Saint-Paul"},5:{code:"D",name:"Adelie Land"}},GA:{1:{code:"ES",name:"Estuaire"},2:{code:"HO",name:"Haut-Ogooue"},3:{code:"MO",name:"Moyen-Ogooue"},4:{code:"NG",name:"Ngounie"},5:{code:"NY",name:"Nyanga"},6:{code:"OI",name:"Ogooue-Ivindo"},7:{code:"OL",name:"Ogooue-Lolo"},8:{code:"OM",name:"Ogooue-Maritime"},9:{code:"WN",name:"Woleu-Ntem"}},GM:{1:{code:"BJ",name:"Banjul"},2:{code:"BS",name:"Basse"},3:{code:"BR",name:"Brikama"},4:{code:"JA",name:"Janjangbure"},5:{code:"KA",name:"Kanifeng"},6:{code:"KE",name:"Kerewan"},7:{code:"KU",name:"Kuntaur"},8:{code:"MA",name:"Mansakonko"},9:{code:"LR",name:"Lower River"},10:{code:"CR",name:"Central River"},11:{code:"NB",name:"North Bank"},12:{code:"UR",name:"Upper River"},13:{code:"WE",name:"Western"}},GE:{1:{code:"AB",name:"Abkhazia"},2:{code:"AJ",name:"Ajaria"},3:{code:"GU",name:"Guria"},4:{code:"IM",name:"Imereti"},5:{code:"KA",name:"Kakheti"},6:{code:"KK",name:"Kvemo Kartli"},7:{code:"MM",name:"Mtskheta-Mtianeti"},8:{code:"RL",name:"Racha Lechkhumi and Kvemo Svanet"},9:{code:"SJ",name:"Samtskhe-Javakheti"},10:{code:"SK",name:"Shida Kartli"},11:{code:"SZ",name:"Samegrelo-Zemo Svaneti"},12:{code:"TB",name:"Tbilisi"}},DE:{1:{code:"BAW",name:"Baden-Württemberg"},2:{code:"BAY",name:"Bayern"},3:{code:"BER",name:"Berlin"},4:{code:"BRG",name:"Brandenburg"},5:{code:"BRE",name:"Bremen"},6:{code:"HAM",name:"Hamburg"},7:{code:"HES",name:"Hessen"},8:{code:"MEC",name:"Mecklenburg-Vorpommern"},9:{code:"NDS",name:"Niedersachsen"},10:{code:"NRW",name:"Nordrhein-Westfalen"},11:{code:"RHE",name:"Rheinland-Pfalz"},12:{code:"SAR",name:"Saarland"},13:{code:"SAS",name:"Sachsen"},14:{code:"SAC",name:"Sachsen-Anhalt"},15:{code:"SCN",name:"Schleswig-Holstein"},16:{code:"THE",name:"Thüringen"}},GH:{1:{code:"AS",name:"Ashanti Region"},2:{code:"BA",name:"Brong-Ahafo Region"},3:{code:"CE",name:"Central Region"},4:{code:"EA",name:"Eastern Region"},5:{code:"GA",name:"Greater Accra Region"},6:{code:"NO",name:"Northern Region"},7:{code:"UE",name:"Upper East Region"},8:{code:"UW",name:"Upper West Region"},9:{code:"VO",name:"Volta Region"},10:{code:"WE",name:"Western Region"}},GI:{1:{code:"EAS",name:"East Side"},2:{code:"NOR",name:"North District"},3:{code:"REC",name:"Reclamation Areas"},4:{code:"SAN",name:"Sandpits Area"},5:{code:"SOU",name:"South District"},6:{code:"TOW",name:"Town Area"},7:{code:"UPP",name:"Upper Town"},8:{code:"OTH",name:"Other"}},GR:{1:{code:"AT",name:"Attica"},2:{code:"CN",name:"Central Greece"},3:{code:"CM",name:"Central Macedonia"},4:{code:"CR",name:"Crete"},5:{code:"EM",name:"East Macedonia and Thrace"},6:{code:"EP",name:"Epirus"},7:{code:"II",name:"Ionian Islands"},8:{code:"NA",name:"North Aegean"},9:{code:"PP",name:"Peloponnesos"},10:{code:"SA",name:"South Aegean"},11:{code:"TH",name:"Thessaly"},12:{code:"WG",name:"West Greece"},13:{code:"WM",name:"West Macedonia"}},GL:{1:{code:"A",name:"Avannaa"},2:{code:"T",name:"Tunu"},3:{code:"K",name:"Kitaa"}},86:{1:{code:"A",name:"Saint Andrew"},2:{code:"D",name:"Saint David"},3:{code:"G",name:"Saint George"},4:{code:"J",name:"Saint John"},5:{code:"M",name:"Saint Mark"},6:{code:"P",name:"Saint Patrick"},7:{code:"C",name:"Carriacou"},8:{code:"Q",name:"Petit Martinique"}},GP:{1:{code:"ARR",name:"Arrondissements Of The Guadeloup"},2:{code:"CAN",name:"Cantons Of The Guadeloup Depart"},3:{code:"COM",name:"Communes Of The Guadeloup Depart"}},GU:{1:{code:"AGA",name:"Agana Heights"},2:{code:"AGA",name:"Agat"},3:{code:"ASA",name:"Asan Maina"},4:{code:"BAR",name:"Barrigada"},5:{code:"CHA",name:"Chalan Pago Ordot"},6:{code:"DED",name:"Dededo"},7:{code:"HAG",name:"HagÅtña"},8:{code:"INA",name:"Inarajan"},9:{code:"MAN",name:"Mangilao"},10:{code:"MER",name:"Merizo"},11:{code:"MON",name:"Mongmong Toto Maite"},12:{code:"PIT",name:"Piti"},13:{code:"SAN",name:"Santa Rita"},14:{code:"SIN",name:"Sinajana"},15:{code:"TAL",name:"Talofofo"},16:{code:"TAM",name:"Tamuning"},17:{code:"UMA",name:"Umatac"},18:{code:"YIG",name:"Yigo"},19:{code:"YON",name:"Yona"}},GT:{1:{code:"AV",name:"Alta Verapaz"},2:{code:"BV",name:"Baja Verapaz"},3:{code:"CM",name:"Chimaltenango"},4:{code:"CQ",name:"Chiquimula"},5:{code:"PE",name:"El Peten"},6:{code:"PR",name:"El Progreso"},7:{code:"QC",name:"El Quiche"},8:{code:"ES",name:"Escuintla"},9:{code:"GU",name:"Guatemala"},10:{code:"HU",name:"Huehuetenango"},11:{code:"IZ",name:"Izabal"},12:{code:"JA",name:"Jalapa"},13:{code:"JU",name:"Jutiapa"},14:{code:"QZ",name:"Quetzaltenango"},15:{code:"RE",name:"Retalhuleu"},16:{code:"ST",name:"Sacatepequez"},17:{code:"SM",name:"San Marcos"},18:{code:"SR",name:"Santa Rosa"},19:{code:"SO",name:"Solola"},20:{code:"SU",name:"Suchitepequez"},21:{code:"TO",name:"Totonicapan"},22:{code:"ZA",name:"Zacapa"}},GN:{1:{code:"CNK",name:"Conakry"},2:{code:"BYL",name:"Beyla"},3:{code:"BFA",name:"Boffa"},4:{code:"BOK",name:"Boke"},5:{code:"COY",name:"Coyah"},6:{code:"DBL",name:"Dabola"},7:{code:"DLB",name:"Dalaba"},8:{code:"DGR",name:"Dinguiraye"},9:{code:"DBR",name:"Dubreka"},10:{code:"FRN",name:"Faranah"},11:{code:"FRC",name:"Forecariah"},12:{code:"FRI",name:"Fria"},13:{code:"GAO",name:"Gaoual"},14:{code:"GCD",name:"Gueckedou"},15:{code:"KNK",name:"Kankan"},16:{code:"KRN",name:"Kerouane"},17:{code:"KND",name:"Kindia"},18:{code:"KSD",name:"Kissidougou"},19:{code:"KBA",name:"Koubia"},20:{code:"KDA",name:"Koundara"},21:{code:"KRA",name:"Kouroussa"},22:{code:"LAB",name:"Labe"},23:{code:"LLM",name:"Lelouma"},24:{code:"LOL",name:"Lola"},25:{code:"MCT",name:"Macenta"},26:{code:"MAL",name:"Mali"},27:{code:"MAM",name:"Mamou"},28:{code:"MAN",name:"Mandiana"},29:{code:"NZR",name:"Nzerekore"},30:{code:"PIT",name:"Pita"},31:{code:"SIG",name:"Siguiri"},32:{code:"TLM",name:"Telimele"},33:{code:"TOG",name:"Tougue"},34:{code:"YOM",name:"Yomou"}},GW:{1:{code:"BF",name:"Bafata Region"},2:{code:"BB",name:"Biombo Region"},3:{code:"BS",name:"Bissau Region"},4:{code:"BL",name:"Bolama Region"},5:{code:"CA",name:"Cacheu Region"},6:{code:"GA",name:"Gabu Region"},7:{code:"OI",name:"Oio Region"},8:{code:"QU",name:"Quinara Region"},9:{code:"TO",name:"Tombali Region"}},GY:{1:{code:"BW",name:"Barima-Waini"},2:{code:"CM",name:"Cuyuni-Mazaruni"},3:{code:"DM",name:"Demerara-Mahaica"},4:{code:"EC",name:"East Berbice-Corentyne"},5:{code:"EW",name:"Essequibo Islands-West Demerara"},6:{code:"MB",name:"Mahaica-Berbice"},7:{code:"PM",name:"Pomeroon-Supenaam"},8:{code:"PI",name:"Potaro-Siparuni"},9:{code:"UD",name:"Upper Demerara-Berbice"},10:{code:"UT",name:"Upper Takutu-Upper Essequibo"}},HT:{1:{code:"AR",name:"Artibonite"},2:{code:"CE",name:"Centre"},3:{code:"GA",name:"Grand'Anse"},4:{code:"ND",name:"Nord"},5:{code:"NE",name:"Nord-Est"},6:{code:"NO",name:"Nord-Ouest"},7:{code:"OU",name:"Ouest"},8:{code:"SD",name:"Sud"},9:{code:"SE",name:"Sud-Est"}},HM:{1:{code:"F",name:"Flat Island"},2:{code:"M",name:"McDonald Island"},3:{code:"S",name:"Shag Island"},4:{code:"H",name:"Heard Island"}},HN:{1:{code:"AT",name:"Atlantida"},2:{code:"CH",name:"Choluteca"},3:{code:"CL",name:"Colon"},4:{code:"CM",name:"Comayagua"},5:{code:"CP",name:"Copan"},6:{code:"CR",name:"Cortes"},7:{code:"PA",name:"El Paraiso"},8:{code:"FM",name:"Francisco Morazan"},9:{code:"GD",name:"Gracias a Dios"},10:{code:"IN",name:"Intibuca"},11:{code:"IB",name:"Islas de la Bahia (Bay Islands)"},12:{code:"PZ",name:"La Paz"},13:{code:"LE",name:"Lempira"},14:{code:"OC",name:"Ocotepeque"},15:{code:"OL",name:"Olancho"},16:{code:"SB",name:"Santa Barbara"},17:{code:"VA",name:"Valle"},18:{code:"YO",name:"Yoro"}},HK:{1:{code:"HCW",name:"Central and Western Hong Kong Is"},2:{code:"HEA",name:"Eastern Hong Kong Island"},3:{code:"HSO",name:"Southern Hong Kong Island"},4:{code:"HWC",name:"Wan Chai Hong Kong Island"},5:{code:"KKC",name:"Kowloon City Kowloon"},6:{code:"KKT",name:"Kwun Tong Kowloon"},7:{code:"KSS",name:"Sham Shui Po Kowloon"},8:{code:"KWT",name:"Wong Tai Sin Kowloon"},9:{code:"KYT",name:"Yau Tsim Mong Kowloon"},10:{code:"NIS",name:"Islands New Territories"},11:{code:"NKT",name:"Kwai Tsing New Territories"},12:{code:"NNO",name:"North New Territories"},13:{code:"NSK",name:"Sai Kung New Territories"},14:{code:"NST",name:"Sha Tin New Territories"},15:{code:"NTP",name:"Tai Po New Territories"},16:{code:"NTW",name:"Tsuen Wan New Territories"},17:{code:"NTM",name:"Tuen Mun New Territories"},18:{code:"NYL",name:"Yuen Long New Territories"}},HU:{1:{code:"BK",name:"Bacs-Kiskun"},2:{code:"BA",name:"Baranya"},3:{code:"BE",name:"Bekes"},4:{code:"BS",name:"Bekescsaba"},5:{code:"BZ",name:"Borsod-Abauj-Zemplen"},6:{code:"BU",name:"Budapest"},7:{code:"CS",name:"Csongrad"},8:{code:"DE",name:"Debrecen"},9:{code:"DU",name:"Dunaujvaros"},10:{code:"EG",name:"Eger"},11:{code:"FE",name:"Fejer"},12:{code:"GY",name:"Gyor"},13:{code:"GM",name:"Gyor-Moson-Sopron"},14:{code:"HB",name:"Hajdu-Bihar"},15:{code:"HE",name:"Heves"},16:{code:"HO",name:"Hodmezovasarhely"},17:{code:"JN",name:"Jasz-Nagykun-Szolnok"},18:{code:"KA",name:"Kaposvar"},19:{code:"KE",name:"Kecskemet"},20:{code:"KO",name:"Komarom-Esztergom"},21:{code:"MI",name:"Miskolc"},22:{code:"NA",name:"Nagykanizsa"},23:{code:"NO",name:"Nograd"},24:{code:"NY",name:"Nyiregyhaza"},25:{code:"PE",name:"Pecs"},26:{code:"PS",name:"Pest"},27:{code:"SO",name:"Somogy"},28:{code:"SP",name:"Sopron"},29:{code:"SS",name:"Szabolcs-Szatmar-Bereg"},30:{code:"SZ",name:"Szeged"},31:{code:"SE",name:"Szekesfehervar"},32:{code:"SL",name:"Szolnok"},33:{code:"SM",name:"Szombathely"},34:{code:"TA",name:"Tatabanya"},35:{code:"TO",name:"Tolna"},36:{code:"VA",name:"Vas"},37:{code:"VE",name:"Veszprem"},38:{code:"ZA",name:"Zala"},39:{code:"ZZ",name:"Zalaegerszeg"}},IS:{1:{code:"AL",name:"Austurland"},2:{code:"HF",name:"Hofuoborgarsvaeoi"},3:{code:"NE",name:"Norourland eystra"},4:{code:"NV",name:"Norourland vestra"},5:{code:"SL",name:"Suourland"},6:{code:"SN",name:"Suournes"},7:{code:"VF",name:"Vestfiroir"},8:{code:"VL",name:"Vesturland"}},IN:{1:{code:"AN",name:"Andaman and Nicobar Islands"},2:{code:"AP",name:"Andhra Pradesh"},3:{code:"AR",name:"Arunachal Pradesh"},4:{code:"AS",name:"Assam"},5:{code:"BI",name:"Bihar"},6:{code:"CH",name:"Chandigarh"},7:{code:"DA",name:"Dadra and Nagar Haveli"},8:{code:"DM",name:"Daman and Diu"},9:{code:"DE",name:"Delhi"},10:{code:"GO",name:"Goa"},11:{code:"GU",name:"Gujarat"},12:{code:"HA",name:"Haryana"},13:{code:"HP",name:"Himachal Pradesh"},14:{code:"JA",name:"Jammu and Kashmir"},15:{code:"KA",name:"Karnataka"},16:{code:"KE",name:"Kerala"},17:{code:"LI",name:"Lakshadweep Islands"},18:{code:"MP",name:"Madhya Pradesh"},19:{code:"MA",name:"Maharashtra"},20:{code:"MN",name:"Manipur"},21:{code:"ME",name:"Meghalaya"},22:{code:"MI",name:"Mizoram"},23:{code:"NA",name:"Nagaland"},24:{code:"OR",name:"Orissa"},25:{code:"PO",name:"Pondicherry"},26:{code:"PU",name:"Punjab"},27:{code:"RA",name:"Rajasthan"},28:{code:"SI",name:"Sikkim"},29:{code:"TN",name:"Tamil Nadu"},30:{code:"TR",name:"Tripura"},31:{code:"UP",name:"Uttar Pradesh"},32:{code:"WB",name:"West Bengal"}},ID:{1:{code:"DA",name:"Daista Aceh"},2:{code:"SU",name:"Sumatera Utara"},3:{code:"SB",name:"Sumatera Barat"},4:{code:"SI",name:"Riau"},5:{code:"JA",name:"Jambi"},6:{code:"SS",name:"Sumatera Selatan"},7:{code:"BE",name:"Bengkulu"},8:{code:"LA",name:"Lampung"},9:{code:"JK",name:"Dki Jakarta"},10:{code:"JB",name:"Jawa Barat"},11:{code:"JT",name:"Jawa Tengah"},12:{code:"DY",name:"Daista Yogyakarta"},13:{code:"JT",name:"Jawa Timur"},14:{code:"KB",name:"Kalimantan Barat"},15:{code:"KT",name:"Kalimantan Tengah"},16:{code:"KI",name:"Kalimantan Timur"},17:{code:"KS",name:"Kalimantan Selatan"},18:{code:"BA",name:"Bali"},19:{code:"NB",name:"Nusa Tenggara Barat"},20:{code:"NT",name:"Nusa Tenggara Timur"},21:{code:"SN",name:"Sulawesi Selatan"},22:{code:"ST",name:"Sulawesi Tengah"},23:{code:"SA",name:"Sulawesi Utara"},24:{code:"SG",name:"Sulawesi Tenggara"},25:{code:"MA",name:"Maluku"},26:{code:"MU",name:"Maluku Utara"},27:{code:"IJ",name:"Irian Jaya Timur"},28:{code:"IT",name:"Irian Jaya Tengah"},29:{code:"IB",name:"Irian Jawa Barat"},30:{code:"BT",name:"Banten"},31:{code:"BB",name:"Bangka Belitung"},32:{code:"GO",name:"Gorontalo"}},IR:{1:{code:"ARD",name:"Ardabil"},2:{code:"BSH",name:"Bushehr"},3:{code:"CMB",name:"Chahar Mahaal and Bakhtiari"},4:{code:"EAZ",name:"East Azarbaijan"},5:{code:"EFH",name:"Esfahan"},6:{code:"FAR",name:"Fars"},7:{code:"GIL",name:"Gilan"},8:{code:"GLS",name:"Golestan"},9:{code:"HMD",name:"Hamadan"},10:{code:"HRM",name:"Hormozgan"},11:{code:"ILM",name:"Ilam"},12:{code:"KBA",name:"Kohkiluyeh and Buyer Ahmad"},13:{code:"KRB",name:"Kerman"},14:{code:"KRD",name:"Kurdistan"},15:{code:"KRM",name:"Kermanshah"},16:{code:"KZT",name:"Khuzestan"},17:{code:"LRS",name:"Lorestan"},18:{code:"MKZ",name:"Markazi"},19:{code:"MZD",name:"Mazandaran"},20:{code:"NKH",name:"North Khorasan"},21:{code:"QAZ",name:"Qazvin"},22:{code:"QOM",name:"Qom"},23:{code:"RKH",name:"Razavi Khorasan"},24:{code:"SBL",name:"Sistan and Baluchistan"},25:{code:"SKH",name:"South Khorasan"},26:{code:"SMN",name:"Semnan"},27:{code:"TEH",name:"Tehran"},28:{code:"WEZ",name:"West Azarbaijan"},29:{code:"YZD",name:"Yazd"},30:{code:"ZAN",name:"Zanjan"}},IQ:{1:{code:"AB",name:"Al Anbar"},2:{code:"AL",name:"Arbil"},3:{code:"BA",name:"Al Basrah"},4:{code:"BB",name:"Babil"},5:{code:"BD",name:"Baghdad"},6:{code:"DH",name:"Dahuk"},7:{code:"DQ",name:"Dhi Qar"},8:{code:"DY",name:"Diyala"},9:{code:"KB",name:"Al Karbala"},10:{code:"MU",name:"Al Muthanna"},11:{code:"MY",name:"Maysan"},12:{code:"NJ",name:"An Najaf"},13:{code:"NN",name:"Ninawa"},14:{code:"QA",name:"Al Qadisyah"},15:{code:"SD",name:"Salah ad Din"},16:{code:"SL",name:"As Sulaymaniyah"},17:{code:"TM",name:"At Ta'mim"},18:{code:"WS",name:"Wasit"}},IE:{1:{code:"CA",name:"Carlow"},2:{code:"CV",name:"Cavan"},3:{code:"CL",name:"Clare"},4:{code:"CO",name:"Cork"},5:{code:"DO",name:"Donegal"},6:{code:"DU",name:"Dublin"},7:{code:"GA",name:"Galway"},8:{code:"KE",name:"Kerry"},9:{code:"KI",name:"Kildare"},10:{code:"KL",name:"Kilkenny"},11:{code:"LA",name:"Laois"},12:{code:"LE",name:"Leitrim"},13:{code:"LI",name:"Limerick"},14:{code:"LO",name:"Longford"},15:{code:"LU",name:"Louth"},16:{code:"MA",name:"Mayo"},17:{code:"ME",name:"Meath"},18:{code:"MO",name:"Monaghan"},19:{code:"OF",name:"Offaly"},20:{code:"RO",name:"Roscommon"},21:{code:"SL",name:"Sligo"},22:{code:"TI",name:"Tipperary"},23:{code:"WA",name:"Waterford"},24:{code:"WE",name:"Westmeath"},25:{code:"WX",name:"Wexford"},26:{code:"WI",name:"Wicklow"}},IL:{1:{code:"BS",name:"Be'er Sheva"},2:{code:"BH",name:"Bika'at Hayarden"},3:{code:"EA",name:"Eilat and Arava"},4:{code:"GA",name:"Galil"},5:{code:"HA",name:"Haifa"},6:{code:"JM",name:"Jehuda Mountains"},7:{code:"JE",name:"Jerusalem"},8:{code:"NE",name:"Negev"},10:{code:"SE",name:"Semaria"},11:{code:"SH",name:"Sharon"},12:{code:"TA",name:"Tel Aviv (Gosh Dan)"}},IT:{1:{code:"AG",name:"Agrigento"},2:{code:"AL",name:"Alessandria"},3:{code:"AN",name:"Ancona"},4:{code:"AO",name:"Aosta"},5:{code:"AR",name:"Arezzo"},6:{code:"AP",name:"Ascoli Piceno"},7:{code:"AT",name:"Asti"},8:{code:"AV",name:"Avellino"},9:{code:"BA",name:"Bari"},10:{code:"BL",name:"Belluno"},11:{code:"BN",name:"Benevento"},12:{code:"BG",name:"Bergamo"},13:{code:"BI",name:"Biella"},14:{code:"BO",name:"Bologna"},15:{code:"BZ",name:"Bolzano"},16:{code:"BS",name:"Brescia"},17:{code:"BR",name:"Brindisi"},18:{code:"CA",name:"Cagliari"},19:{code:"CL",name:"Caltanissetta"},20:{code:"CB",name:"Campobasso"},21:{code:"CE",name:"Caserta"},22:{code:"CT",name:"Catania"},23:{code:"CZ",name:"Catanzaro"},24:{code:"CH",name:"Chieti"},25:{code:"CO",name:"Como"},26:{code:"CS",name:"Cosenza"},27:{code:"CR",name:"Cremona"},28:{code:"KR",name:"Crotone"},29:{code:"CN",name:"Cuneo"},30:{code:"EN",name:"Enna"},31:{code:"FE",name:"Ferrara"},32:{code:"FI",name:"Firenze"},33:{code:"FG",name:"Foggia"},34:{code:"FO",name:"Forlì"},35:{code:"FR",name:"Frosinone"},36:{code:"GE",name:"Genova"},37:{code:"GO",name:"Gorizia"},38:{code:"GR",name:"Grosseto"},39:{code:"IM",name:"Imperia"},40:{code:"IS",name:"Isernia"},41:{code:"AQ",name:"Aquila"},42:{code:"SP",name:"La Spezia"},43:{code:"LT",name:"Latina"},44:{code:"LE",name:"Lecce"},45:{code:"LC",name:"Lecco"},46:{code:"LI",name:"Livorno"},47:{code:"LO",name:"Lodi"},48:{code:"LU",name:"Lucca"},49:{code:"MC",name:"Macerata"},50:{code:"MN",name:"Mantova"},51:{code:"MS",name:"Massa-Carrara"},52:{code:"MT",name:"Matera"},53:{code:"ME",name:"Messina"},54:{code:"MI",name:"Milano"},55:{code:"MO",name:"Modena"},56:{code:"NA",name:"Napoli"},57:{code:"NO",name:"Novara"},58:{code:"NU",name:"Nuoro"},59:{code:"OR",name:"Oristano"},60:{code:"PD",name:"Padova"},61:{code:"PA",name:"Palermo"},62:{code:"PR",name:"Parma"},63:{code:"PG",name:"Perugia"},64:{code:"PV",name:"Pavia"},65:{code:"PU",name:"Pesaro Urbino"},66:{code:"PE",name:"Pescara"},67:{code:"PC",name:"Piacenza"},68:{code:"PI",name:"Pisa"},69:{code:"PT",name:"Pistoia"},70:{code:"PN",name:"Pordenone"},71:{code:"PZ",name:"Potenza"},72:{code:"PO",name:"Prato"},73:{code:"RG",name:"Ragusa"},74:{code:"RA",name:"Ravenna"},75:{code:"RC",name:"Reggio Calabria"},76:{code:"RE",name:"Reggio Emilia"},77:{code:"RI",name:"Rieti"},78:{code:"RN",name:"Rimini"},79:{code:"RM",name:"Roma"},80:{code:"RO",name:"Rovigo"},81:{code:"SA",name:"Salerno"},82:{code:"SS",name:"Sassari"},83:{code:"SV",name:"Savona"},84:{code:"SI",name:"Siena"},85:{code:"SR",name:"Siracusa"},86:{code:"SO",name:"Sondrio"},87:{code:"TA",name:"Taranto"},88:{code:"TE",name:"Teramo"},89:{code:"TR",name:"Terni"},90:{code:"TO",name:"Torino"},91:{code:"TP",name:"Trapani"},92:{code:"TN",name:"Trento"},93:{code:"TV",name:"Treviso"},94:{code:"TS",name:"Trieste"},95:{code:"UD",name:"Udine"},96:{code:"VA",name:"Varese"},97:{code:"VE",name:"Venezia"},98:{code:"VB",name:"Verbania"},99:{code:"VC",name:"Vercelli"},100:{code:"VR",name:"Verona"},101:{code:"VV",name:"Vibo Valentia"},102:{code:"VI",name:"Vicenza"},103:{code:"VT",name:"Viterbo"},104:{code:"CI",name:"Carbonia-Iglesias"},105:{code:"VS",name:"Medio Campidano"},106:{code:"OG",name:"Ogliastra"},107:{code:"OT",name:"Olbia-Tempio"},108:{code:"MB",name:"Monza e Brianza"},109:{code:"FM",name:"Fermo"},110:{code:"BT",name:"Barletta-Andria-Trani"}},JM:{1:{code:"CLA",name:"Clarendon Parish"},2:{code:"HAN",name:"Hanover Parish"},3:{code:"KIN",name:"Kingston Parish"},4:{code:"MAN",name:"Manchester Parish"},5:{code:"POR",name:"Portland Parish"},6:{code:"AND",name:"Saint Andrew Parish"},7:{code:"ANN",name:"Saint Ann Parish"},8:{code:"CAT",name:"Saint Catherine Parish"},9:{code:"ELI",name:"Saint Elizabeth Parish"},10:{code:"JAM",name:"Saint James Parish"},11:{code:"MAR",name:"Saint Mary Parish"},12:{code:"THO",name:"Saint Thomas Parish"},13:{code:"TRL",name:"Trelawny Parish"},14:{code:"WML",name:"Westmoreland Parish"}},JP:{1:{code:"AI",name:"Aichi"},2:{code:"AK",name:"Akita"},3:{code:"AO",name:"Aomori"},4:{code:"CH",name:"Chiba"},5:{code:"EH",name:"Ehime"},6:{code:"FK",name:"Fukui"},7:{code:"FU",name:"Fukuoka"},8:{code:"FS",name:"Fukushima"},9:{code:"GI",name:"Gifu"},10:{code:"GU",name:"Gumma"},11:{code:"HI",name:"Hiroshima"},12:{code:"HO",name:"Hokkaido"},13:{code:"HY",name:"Hyogo"},14:{code:"IB",name:"Ibaraki"},15:{code:"IS",name:"Ishikawa"},16:{code:"IW",name:"Iwate"},17:{code:"KA",name:"Kagawa"},18:{code:"KG",name:"Kagoshima"},19:{code:"KN",name:"Kanagawa"},20:{code:"KO",name:"Kochi"},21:{code:"KU",name:"Kumamoto"},22:{code:"KY",name:"Kyoto"},23:{code:"MI",name:"Mie"},24:{code:"MY",name:"Miyagi"},25:{code:"MZ",name:"Miyazaki"},26:{code:"NA",name:"Nagano"},27:{code:"NG",name:"Nagasaki"},28:{code:"NR",name:"Nara"},29:{code:"NI",name:"Niigata"},30:{code:"OI",name:"Oita"},31:{code:"OK",name:"Okayama"},32:{code:"ON",name:"Okinawa"},33:{code:"OS",name:"Osaka"},34:{code:"SA",name:"Saga"},35:{code:"SI",name:"Saitama"},36:{code:"SH",name:"Shiga"},37:{code:"SM",name:"Shimane"},38:{code:"SZ",name:"Shizuoka"},39:{code:"TO",name:"Tochigi"},40:{code:"TS",name:"Tokushima"},41:{code:"TK",name:"Tokyo"},42:{code:"TT",name:"Tottori"},43:{code:"TY",name:"Toyama"},44:{code:"WA",name:"Wakayama"},45:{code:"YA",name:"Yamagata"},46:{code:"YM",name:"Yamaguchi"},47:{code:"YN",name:"Yamanashi"}},JO:{1:{code:"AM",name:"'Amman"},2:{code:"AJ",name:"Ajlun"},3:{code:"AA",name:"Al'Aqabah"},4:{code:"AB",name:"Al Balqa'"},5:{code:"AK",name:"Al Karak"},6:{code:"AL",name:"Al Mafraq"},7:{code:"AT",name:"At Tafilah"},8:{code:"AZ",name:"Az Zarqa'"},9:{code:"IR",name:"Irbid"},10:{code:"JA",name:"Jarash"},11:{code:"MA",name:"Ma'an"},12:{code:"MD",name:"Madaba"}},KZ:{1:{code:"AL",name:"Almaty"},2:{code:"AC",name:"Almaty City"},3:{code:"AM",name:"Aqmola"},4:{code:"AQ",name:"Aqtobe"},5:{code:"AS",name:"Astana City"},6:{code:"AT",name:"Atyrau"},7:{code:"BA",name:"Batys Qazaqstan"},8:{code:"BY",name:"Bayqongyr City"},9:{code:"MA",name:"Mangghystau"},10:{code:"ON",name:"Ongtustik Qazaqstan"},11:{code:"PA",name:"Pavlodar"},12:{code:"QA",name:"Qaraghandy"},13:{code:"QO",name:"Qostanay"},14:{code:"QY",name:"Qyzylorda"},15:{code:"SH",name:"Shyghys Qazaqstan"},16:{code:"SO",name:"Soltustik Qazaqstan"},17:{code:"ZH",name:"Zhambyl"}},KE:{1:{code:"CE",name:"Central"},2:{code:"CO",name:"Coast"},3:{code:"EA",name:"Eastern"},4:{code:"NA",name:"Nairobi Area"},5:{code:"NE",name:"North Eastern"},6:{code:"NY",name:"Nyanza"},7:{code:"RV",name:"Rift Valley"},8:{code:"WE",name:"Western"}},KI:{1:{code:"AG",name:"Abaiang"},2:{code:"AM",name:"Abemama"},3:{code:"AK",name:"Aranuka"},4:{code:"AO",name:"Arorae"},5:{code:"BA",name:"Banaba"},6:{code:"BE",name:"Beru"},7:{code:"bT",name:"Butaritari"},8:{code:"KA",name:"Kanton"},9:{code:"KR",name:"Kiritimati"},10:{code:"KU",name:"Kuria"},11:{code:"MI",name:"Maiana"},12:{code:"MN",name:"Makin"},13:{code:"ME",name:"Marakei"},14:{code:"NI",name:"Nikunau"},15:{code:"NO",name:"Nonouti"},16:{code:"ON",name:"Onotoa"},17:{code:"TT",name:"Tabiteuea"},18:{code:"TR",name:"Tabuaeran"},19:{code:"TM",name:"Tamana"},20:{code:"TW",name:"Tarawa"},21:{code:"TE",name:"Teraina"}},KP:{1:{code:"CHA",name:"Chagang-do"},2:{code:"HAB",name:"Hamgyong-bukto"},3:{code:"HAN",name:"Hamgyong-namdo"},4:{code:"HWB",name:"Hwanghae-bukto"},5:{code:"HWN",name:"Hwanghae-namdo"},6:{code:"KAN",name:"Kangwon-do"},7:{code:"PYB",name:"P'yongan-bukto"},8:{code:"PYN",name:"P'yongan-namdo"},9:{code:"YAN",name:"Ryanggang-do (Yanggang-do)"},10:{code:"NAJ",name:"Rason Directly Governed City"},11:{code:"PYO",name:"P'yongyang Special City"}},KR:{1:{code:"CO",name:"Ch'ungch'ong-bukto"},2:{code:"CH",name:"Ch'ungch'ong-namdo"},3:{code:"CD",name:"Cheju-do"},4:{code:"CB",name:"Cholla-bukto"},5:{code:"CN",name:"Cholla-namdo"},6:{code:"IG",name:"Inch'on-gwangyoksi"},7:{code:"KA",name:"Kangwon-do"},8:{code:"KG",name:"Kwangju-gwangyoksi"},9:{code:"KD",name:"Kyonggi-do"},10:{code:"KB",name:"Kyongsang-bukto"},11:{code:"KN",name:"Kyongsang-namdo"},12:{code:"PG",name:"Pusan-gwangyoksi"},13:{code:"SO",name:"Soul-t'ukpyolsi"},14:{code:"TA",name:"Taegu-gwangyoksi"},15:{code:"TG",name:"Taejon-gwangyoksi"}},KW:{1:{code:"AL",name:"Al'Asimah"},2:{code:"AA",name:"Al Ahmadi"},3:{code:"AF",name:"Al Farwaniyah"},4:{code:"AJ",name:"Al Jahra'"},5:{code:"HA",name:"Hawalli"}},KG:{1:{code:"GB",name:"Bishkek"},2:{code:"B",name:"Batken"},3:{code:"C",name:"Chu"},4:{code:"J",name:"Jalal-Abad"},5:{code:"N",name:"Naryn"},6:{code:"O",name:"Osh"},7:{code:"T",name:"Talas"},8:{code:"Y",name:"Ysyk-Kol"}},LA:{1:{code:"VT",name:"Vientiane"},2:{code:"AT",name:"Attapu"},3:{code:"BK",name:"Bokeo"},4:{code:"BL",name:"Bolikhamxai"},5:{code:"CH",name:"Champasak"},6:{code:"HO",name:"Houaphan"},7:{code:"KH",name:"Khammouan"},8:{code:"LM",name:"Louang Namtha"},9:{code:"LP",name:"Louangphabang"},10:{code:"OU",name:"Oudomxai"},11:{code:"PH",name:"Phongsali"},12:{code:"SL",name:"Salavan"},13:{code:"SV",name:"Savannakhet"},14:{code:"VI",name:"Vientiane"},15:{code:"XA",name:"Xaignabouli"},16:{code:"XE",name:"Xekong"},17:{code:"XI",name:"Xiangkhoang"},18:{code:"XN",name:"Xaisomboun"}},LV:{1:{code:"AIZ",name:"Aizkraukles Rajons"},2:{code:"ALU",name:"Aluksnes Rajons"},3:{code:"BAL",name:"Balvu Rajons"},4:{code:"BAU",name:"Bauskas Rajons"},5:{code:"CES",name:"Cesu Rajons"},6:{code:"DGR",name:"Daugavpils Rajons"},7:{code:"DOB",name:"Dobeles Rajons"},8:{code:"GUL",name:"Gulbenes Rajons"},9:{code:"JEK",name:"Jekabpils Rajons"},10:{code:"JGR",name:"Jelgavas Rajons"},11:{code:"KRA",name:"Kraslavas Rajons"},12:{code:"KUL",name:"Kuldigas Rajons"},13:{code:"LPR",name:"Liepajas Rajons"},14:{code:"LIM",name:"Limbazu Rajons"},15:{code:"LUD",name:"Ludzas Rajons"},16:{code:"MAD",name:"Madonas Rajons"},17:{code:"OGR",name:"Ogres Rajons"},18:{code:"PRE",name:"Preilu Rajons"},19:{code:"RZR",name:"Rezeknes Rajons"},20:{code:"RGR",name:"Rigas Rajons"},21:{code:"SAL",name:"Saldus Rajons"},22:{code:"TAL",name:"Talsu Rajons"},23:{code:"TUK",name:"Tukuma Rajons"},24:{code:"VLK",name:"Valkas Rajons"},25:{code:"VLM",name:"Valmieras Rajons"},26:{code:"VSR",name:"Ventspils Rajons"},27:{code:"DGV",name:"Daugavpils"},28:{code:"JGV",name:"Jelgava"},29:{code:"JUR",name:"Jurmala"},30:{code:"LPK",name:"Liepaja"},31:{code:"RZK",name:"Rezekne"},32:{code:"RGA",name:"Riga"},33:{code:"VSL",name:"Ventspils"}},LB:{1:{code:"BIN",name:"Bint Jbeil"},2:{code:"HAS",name:"Hasbaya"},3:{code:"MAR",name:"Marjeyoun"},4:{code:"NAB",name:"Nabatieh"},5:{code:"BAA",name:"Baalbek"},6:{code:"HER",name:"Hermel"},7:{code:"RAS",name:"Rashaya"},8:{code:"WES",name:"Western Beqaa"},9:{code:"ZAH",name:"Zahle"},10:{code:"AKK",name:"Akkar"},11:{code:"BAT",name:"Batroun"},12:{code:"BSH",name:"Bsharri"},13:{code:"KOU",name:"Koura"},14:{code:"MIN",name:"Miniyeh-Danniyeh"},15:{code:"TRI",name:"Tripoli"},16:{code:"ZGH",name:"Zgharta"},17:{code:"ALE",name:"Aley"},18:{code:"BAA",name:"Baabda"},19:{code:"BYB",name:"Byblos"},20:{code:"CHO",name:"Chouf"},21:{code:"KES",name:"Kesrwan"},22:{code:"MAT",name:"Matn"},23:{code:"JEZ",name:"Jezzine"},24:{code:"SID",name:"Sidon"},25:{code:"TYR",name:"Tyre"}},LS:{1:{code:"BE",name:"Berea"},2:{code:"BB",name:"Butha-Buthe"},3:{code:"LE",name:"Leribe"},4:{code:"MF",name:"Mafeteng"},5:{code:"MS",name:"Maseru"},6:{code:"MH",name:"Mohale's Hoek"},7:{code:"MK",name:"Mokhotlong"},8:{code:"QN",name:"Qacha's Nek"},9:{code:"QT",name:"Quthing"},10:{code:"TT",name:"Thaba-Tseka"}},LR:{1:{code:"BI",name:"Bomi"},2:{code:"BG",name:"Bong"},3:{code:"GB",name:"Grand Bassa"},4:{code:"CM",name:"Grand Cape Mount"},5:{code:"GG",name:"Grand Gedeh"},6:{code:"GK",name:"Grand Kru"},7:{code:"LO",name:"Lofa"},8:{code:"MG",name:"Margibi"},9:{code:"ML",name:"Maryland"},10:{code:"MS",name:"Montserrado"},11:{code:"NB",name:"Nimba"},12:{code:"RC",name:"River Cess"},13:{code:"SN",name:"Sinoe"}},LY:{1:{code:"AJ",name:"Ajdabiya"},2:{code:"AZ",name:"Al 'Aziziyah"},3:{code:"FA",name:"Al Fatih"},4:{code:"JA",name:"Al Jabal al Akhdar"},5:{code:"JU",name:"Al Jufrah"},6:{code:"KH",name:"Al Khums"},7:{code:"KU",name:"Al Kufrah"},8:{code:"NK",name:"An Nuqat al Khams"},9:{code:"AS",name:"Ash Shati'"},10:{code:"AW",name:"Awbari"},11:{code:"ZA",name:"Az Zawiyah"},12:{code:"BA",name:"Banghazi"},13:{code:"DA",name:"Darnah"},14:{code:"GD",name:"Ghadamis"},15:{code:"GY",name:"Gharyan"},16:{code:"MI",name:"Misratah"},17:{code:"MZ",name:"Murzuq"},18:{code:"SB",name:"Sabha"},19:{code:"SW",name:"Sawfajjin"},20:{code:"SU",name:"Surt"},21:{code:"TL",name:"Tarabulus (Tripoli)"},22:{code:"TH",name:"Tarhunah"},23:{code:"TU",name:"Tubruq"},24:{code:"YA",name:"Yafran"},25:{code:"ZL",name:"Zlitan"}},LI:{1:{code:"V",name:"Vaduz"},2:{code:"A",name:"Schaan"},3:{code:"B",name:"Balzers"},4:{code:"N",name:"Triesen"},5:{code:"E",name:"Eschen"},6:{code:"M",name:"Mauren"},7:{code:"T",name:"Triesenberg"},8:{code:"R",name:"Ruggell"},9:{code:"G",name:"Gamprin"},10:{code:"L",name:"Schellenberg"},11:{code:"P",name:"Planken"}},LT:{1:{code:"AL",name:"Alytus"},2:{code:"KA",name:"Kaunas"},3:{code:"KL",name:"Klaipeda"},4:{code:"MA",name:"Marijampole"},5:{code:"PA",name:"Panevezys"},6:{code:"SI",name:"Siauliai"},7:{code:"TA",name:"Taurage"},8:{code:"TE",name:"Telsiai"},9:{code:"UT",name:"Utena"},10:{code:"VI",name:"Vilnius"}},LU:{1:{code:"DD",name:"Diekirch"},2:{code:"DC",name:"Clervaux"},3:{code:"DR",name:"Redange"},4:{code:"DV",name:"Vianden"},5:{code:"DW",name:"Wiltz"},6:{code:"GG",name:"Grevenmacher"},7:{code:"GE",name:"Echternach"},8:{code:"GR",name:"Remich"},9:{code:"LL",name:"Luxembourg"},10:{code:"LC",name:"Capellen"},11:{code:"LE",name:"Esch-sur-Alzette"},12:{code:"LM",name:"Mersch"}},MO:{1:{code:"OLF",name:"Our Lady Fatima Parish"},2:{code:"ANT",name:"St. Anthony Parish"},3:{code:"LAZ",name:"St. Lazarus Parish"},4:{code:"CAT",name:"Cathedral Parish"},5:{code:"LAW",name:"St. Lawrence Parish"}},MK:{1:{code:"AER",name:"Aerodrom"},2:{code:"ARA",name:"Aračinovo"},3:{code:"BER",name:"Berovo"},4:{code:"BIT",name:"Bitola"},5:{code:"BOG",name:"Bogdanci"},6:{code:"BOG",name:"Bogovinje"},7:{code:"BOS",name:"Bosilovo"},8:{code:"BRV",name:"Brvenica"},9:{code:"BUT",name:"Butel"},10:{code:"ČAI",name:"Čair"},11:{code:"ČAš",name:"Čaška"},12:{code:"CEN",name:"Centar"},13:{code:"CEN",name:"Centar Župa"},14:{code:"Češ",name:"Češinovo-Obleš"},15:{code:"ČUČ",name:"Čučer-Sandevo"},16:{code:"DEB",name:"Debar"},17:{code:"DEB",name:"Debarca"},18:{code:"DEL",name:"Delčevo"},19:{code:"DEM",name:"Demir Hisar"},20:{code:"DEM",name:"Demir Kapija"},21:{code:"DOL",name:"Dolneni"},22:{code:"DRU",name:"Drugovo"},23:{code:"GAZ",name:"Gazi Baba"},24:{code:"GEV",name:"Gevgelija"},25:{code:"GJO",name:"Gjorče Petrov"},26:{code:"GOS",name:"Gostivar"},27:{code:"GRA",name:"Gradsko"},28:{code:"ILI",name:"Ilinden"},29:{code:"JEG",name:"Jegunovce"},30:{code:"KAR",name:"Karbinci"},31:{code:"KAR",name:"Karpoš"},32:{code:"KAV",name:"Kavadarci"},33:{code:"KIČ",name:"Kičevo"},34:{code:"KIS",name:"Kisela Voda"},35:{code:"KOč",name:"Kočani"},36:{code:"KON",name:"Konče"},37:{code:"KRA",name:"Kratovo"},38:{code:"KRI",name:"Kriva Palanka"},39:{code:"KRI",name:"Krivogaštani"},40:{code:"KRU",name:"Kruševo"},41:{code:"KUM",name:"Kumanovo"},42:{code:"LIP",name:"Lipkovo"},43:{code:"LOZ",name:"Lozovo"},44:{code:"MAK",name:"Makedonska Kamenica"},45:{code:"MAK",name:"Makedonski Brod"},46:{code:"MAV",name:"Mavrovo and Rostuša"},47:{code:"MOG",name:"Mogila"},48:{code:"NEG",name:"Negotino"},49:{code:"NOV",name:"Novaci"},50:{code:"NOV",name:"Novo Selo"},51:{code:"OHR",name:"Ohrid"},52:{code:"OSL",name:"Oslomej"},53:{code:"PEH",name:"Pehčevo"},54:{code:"PET",name:"Petrovec"},55:{code:"PLA",name:"Plasnica"},56:{code:"PRI",name:"Prilep"},57:{code:"PRO",name:"Probištip"},58:{code:"RAD",name:"Radoviš"},59:{code:"RAN",name:"Rankovce"},60:{code:"RES",name:"Resen"},61:{code:"ROS",name:"Rosoman"},62:{code:"SAR",name:"Saraj"},63:{code:"SOP",name:"Sopište"},64:{code:"STA",name:"Star Dojran"},65:{code:"STA",name:"Staro Nagoričane"},66:{code:"ŠTI",name:"Štip"},67:{code:"STR",name:"Struga"},68:{code:"STR",name:"Strumica"},69:{code:"STU",name:"Studeničani"},70:{code:"ŠUT",name:"Šuto Orizari"},71:{code:"SVE",name:"Sveti Nikole"},72:{code:"TEA",name:"Tearce"},73:{code:"TET",name:"Tetovo"},74:{code:"VAL",name:"Valandovo"},75:{code:"VAS",name:"Vasilevo"},76:{code:"VEL",name:"Veles"},77:{code:"VEV",name:"Vevčani"},78:{code:"VIN",name:"Vinica"},79:{code:"VRA",name:"Vraneštica"},80:{code:"VRA",name:"Vrapčište"},81:{code:"ZAJ",name:"Zajas"},82:{code:"ZEL",name:"Zelenikovo"},83:{code:"ŽEL",name:"Želino"},84:{code:"ZRN",name:"Zrnovci"}},MG:{1:{code:"AN",name:"Antananarivo"},2:{code:"AS",name:"Antsiranana"},3:{code:"FN",name:"Fianarantsoa"},4:{code:"MJ",name:"Mahajanga"},5:{code:"TM",name:"Toamasina"},6:{code:"TL",name:"Toliara"}},MW:{1:{code:"BLK",name:"Balaka"},2:{code:"BLT",name:"Blantyre"},3:{code:"CKW",name:"Chikwawa"},4:{code:"CRD",name:"Chiradzulu"},5:{code:"CTP",name:"Chitipa"},6:{code:"DDZ",name:"Dedza"},7:{code:"DWA",name:"Dowa"},8:{code:"KRG",name:"Karonga"},9:{code:"KSG",name:"Kasungu"},10:{code:"LKM",name:"Likoma"},11:{code:"LLG",name:"Lilongwe"},12:{code:"MCG",name:"Machinga"},13:{code:"MGC",name:"Mangochi"},14:{code:"MCH",name:"Mchinji"},15:{code:"MLJ",name:"Mulanje"},16:{code:"MWZ",name:"Mwanza"},17:{code:"MZM",name:"Mzimba"},18:{code:"NTU",name:"Ntcheu"},19:{code:"NKB",name:"Nkhata Bay"},20:{code:"NKH",name:"Nkhotakota"},21:{code:"NSJ",name:"Nsanje"},22:{code:"NTI",name:"Ntchisi"},23:{code:"PHL",name:"Phalombe"},24:{code:"RMP",name:"Rumphi"},25:{code:"SLM",name:"Salima"},26:{code:"THY",name:"Thyolo"},27:{code:"ZBA",name:"Zomba"}},MY:{1:{code:"Johor",name:"Johor"},2:{code:"Kedah",name:"Kedah"},3:{code:"Kelantan",name:"Kelantan"},4:{code:"Labuan",name:"Labuan"},5:{code:"Melaka",name:"Melaka"},6:{code:"Negeri Sembilan",name:"Negeri Sembilan"},7:{code:"Pahang",name:"Pahang"},8:{code:"Perak",name:"Perak"},9:{code:"Perlis",name:"Perlis"},10:{code:"Pulau Pinang",name:"Pulau Pinang"},11:{code:"Sabah",name:"Sabah"},12:{code:"Sarawak",name:"Sarawak"},13:{code:"Selangor",name:"Selangor"},14:{code:"Terengganu",name:"Terengganu"},15:{code:"Kuala Lumpur",name:"Kuala Lumpur"}},MV:{1:{code:"AAD",name:"Ari Atoll Dheknu"},2:{code:"AAU",name:"Ari Atoll Uthuru"},3:{code:"ADD",name:"Addu"},4:{code:"FAA",name:"Faadhippolhu"},5:{code:"FEA",name:"Felidhe Atoll"},6:{code:"FMU",name:"Fua Mulaku"},7:{code:"HAD",name:"Huvadhu Atoll Dhekunu"},8:{code:"HAU",name:"Huvadhu Atoll Uthuru"},9:{code:"HDH",name:"Hadhdhunmathi"},10:{code:"KLH",name:"Kolhumadulu"},11:{code:"MAA",name:"Male Atoll"},12:{code:"MAD",name:"Maalhosmadulu Dhekunu"},13:{code:"MAU",name:"Maalhosmadulu Uthuru"},14:{code:"MLD",name:"Miladhunmadulu Dhekunu"},15:{code:"MLU",name:"Miladhunmadulu Uthuru"},16:{code:"MUA",name:"Mulaku Atoll"},17:{code:"NAD",name:"Nilandhe Atoll Dhekunu"},18:{code:"NAU",name:"Nilandhe Atoll Uthuru"},19:{code:"THD",name:"Thiladhunmathi Dhekunu"},20:{code:"THU",name:"Thiladhunmathi Uthuru"}},ML:{1:{code:"GA",name:"Gao"},2:{code:"KY",name:"Kayes"},3:{code:"KD",name:"Kidal"},4:{code:"KL",name:"Koulikoro"},5:{code:"MP",name:"Mopti"},6:{code:"SG",name:"Segou"},7:{code:"SK",name:"Sikasso"},8:{code:"TB",name:"Tombouctou"},9:{code:"CD",name:"Bamako Capital District"}},MT:{1:{code:"ATT",name:"Attard"},2:{code:"BAL",name:"Balzan"},3:{code:"BGU",name:"Birgu"},4:{code:"BKK",name:"Birkirkara"},5:{code:"BRZ",name:"Birzebbuga"},6:{code:"BOR",name:"Bormla"},7:{code:"DIN",name:"Dingli"},8:{code:"FGU",name:"Fgura"},9:{code:"FLO",name:"Floriana"},10:{code:"GDJ",name:"Gudja"},11:{code:"GZR",name:"Gzira"},12:{code:"GRG",name:"Gargur"},13:{code:"GXQ",name:"Gaxaq"},14:{code:"HMR",name:"Hamrun"},15:{code:"IKL",name:"Iklin"},16:{code:"ISL",name:"Isla"},17:{code:"KLK",name:"Kalkara"},18:{code:"KRK",name:"Kirkop"},19:{code:"LIJ",name:"Lija"},20:{code:"LUQ",name:"Luqa"},21:{code:"MRS",name:"Marsa"},22:{code:"MKL",name:"Marsaskala"},23:{code:"MXL",name:"Marsaxlokk"},24:{code:"MDN",name:"Mdina"},25:{code:"MEL",name:"Melliea"},26:{code:"MGR",name:"Mgarr"},27:{code:"MST",name:"Mosta"},28:{code:"MQA",name:"Mqabba"},29:{code:"MSI",name:"Msida"},30:{code:"MTF",name:"Mtarfa"},31:{code:"NAX",name:"Naxxar"},32:{code:"PAO",name:"Paola"},33:{code:"PEM",name:"Pembroke"},34:{code:"PIE",name:"Pieta"},35:{code:"QOR",name:"Qormi"},36:{code:"QRE",name:"Qrendi"},37:{code:"RAB",name:"Rabat"},38:{code:"SAF",name:"Safi"},39:{code:"SGI",name:"San Giljan"},40:{code:"SLU",name:"Santa Lucija"},41:{code:"SPB",name:"San Pawl il-Bahar"},42:{code:"SGW",name:"San Gwann"},43:{code:"SVE",name:"Santa Venera"},44:{code:"SIG",name:"Siggiewi"},45:{code:"SLM",name:"Sliema"},46:{code:"SWQ",name:"Swieqi"},47:{code:"TXB",name:"Ta Xbiex"},48:{code:"TRX",name:"Tarxien"},49:{code:"VLT",name:"Valletta"},50:{code:"XGJ",name:"Xgajra"},51:{code:"ZBR",name:"Zabbar"},52:{code:"ZBG",name:"Zebbug"},53:{code:"ZJT",name:"Zejtun"},54:{code:"ZRQ",name:"Zurrieq"},55:{code:"FNT",name:"Fontana"},56:{code:"GHJ",name:"Ghajnsielem"},57:{code:"GHR",name:"Gharb"},58:{code:"GHS",name:"Ghasri"},59:{code:"KRC",name:"Kercem"},60:{code:"MUN",name:"Munxar"},61:{code:"NAD",name:"Nadur"},62:{code:"QAL",name:"Qala"},63:{code:"VIC",name:"Victoria"},64:{code:"SLA",name:"San Lawrenz"},65:{code:"SNT",name:"Sannat"},66:{code:"ZAG",name:"Xagra"},67:{code:"XEW",name:"Xewkija"},68:{code:"ZEB",name:"Zebbug"}},MH:{1:{code:"ALG",name:"Ailinginae"},2:{code:"ALL",name:"Ailinglaplap"},3:{code:"ALK",name:"Ailuk"},4:{code:"ARN",name:"Arno"},5:{code:"AUR",name:"Aur"},6:{code:"BKR",name:"Bikar"},7:{code:"BKN",name:"Bikini"},8:{code:"BKK",name:"Bokak"},9:{code:"EBN",name:"Ebon"},10:{code:"ENT",name:"Enewetak"},11:{code:"EKB",name:"Erikub"},12:{code:"JBT",name:"Jabat"},13:{code:"JLT",name:"Jaluit"},14:{code:"JEM",name:"Jemo"},15:{code:"KIL",name:"Kili"},16:{code:"KWJ",name:"Kwajalein"},17:{code:"LAE",name:"Lae"},18:{code:"LIB",name:"Lib"},19:{code:"LKP",name:"Likiep"},20:{code:"MJR",name:"Majuro"},21:{code:"MLP",name:"Maloelap"},22:{code:"MJT",name:"Mejit"},23:{code:"MIL",name:"Mili"},24:{code:"NMK",name:"Namorik"},25:{code:"NAM",name:"Namu"},26:{code:"RGL",name:"Rongelap"},27:{code:"RGK",name:"Rongrik"},28:{code:"TOK",name:"Toke"},29:{code:"UJA",name:"Ujae"},30:{code:"UJL",name:"Ujelang"},31:{code:"UTK",name:"Utirik"},32:{code:"WTH",name:"Wotho"},33:{code:"WTJ",name:"Wotje"}},MQ:{1:{code:"LAJ",name:"L'Ajoupa-Bouillon"},2:{code:"LES",name:"Les Anses-d'Arlet"},3:{code:"BAS",name:"Basse-Pointe"},4:{code:"BEL",name:"Bellefontaine"},5:{code:"LE",name:"Le Carbet"},6:{code:"CAS",name:"Case-Pilote"},7:{code:"LE",name:"Le Diamant"},8:{code:"DUC",name:"Ducos"},9:{code:"FON",name:"Fonds-Saint-Denis"},10:{code:"FOR",name:"Fort-De-France"},11:{code:"LE",name:"Le François"},12:{code:"GRA",name:"Grand'Rivière"},13:{code:"GRO",name:"Gros-Morne"},14:{code:"LE",name:"Le Lamentin"},15:{code:"LE",name:"Le Lorrain"},16:{code:"MAC",name:"Macouba"},17:{code:"LE",name:"Le Marigot"},18:{code:"LE",name:"Le Marin"},19:{code:"LE",name:"Le Morne-Rouge"},20:{code:"LE",name:"Le Morne-Vert"},21:{code:"LE",name:"Le Prêcheur"},22:{code:"RIV",name:"Rivière-Pilote"},23:{code:"RIV",name:"Rivière-Salée"},24:{code:"LE",name:"Le Robert"},25:{code:"SAI",name:"Sainte-Anne"},26:{code:"SAI",name:"Sainte-Luce"},27:{code:"SAI",name:"Sainte-Marie"},28:{code:"SAI",name:"Saint-Esprit"},29:{code:"SAI",name:"Saint-Joseph"},30:{code:"SAI",name:"Saint-Pierre"},31:{code:"SCH",name:"Schœlcher"},32:{code:"LA",name:"La Trinité"},33:{code:"LES",name:"Les Trois-Îlets"},34:{code:"LE",name:"Le Vauclin"}},MR:{1:{code:"AD",name:"Adrar"},2:{code:"AS",name:"Assaba"},3:{code:"BR",name:"Brakna"},4:{code:"DN",name:"Dakhlet Nouadhibou"},5:{code:"GO",name:"Gorgol"},6:{code:"GM",name:"Guidimaka"},7:{code:"HC",name:"Hodh Ech Chargui"},8:{code:"HG",name:"Hodh El Gharbi"},9:{code:"IN",name:"Inchiri"},10:{code:"TA",name:"Tagant"},11:{code:"TZ",name:"Tiris Zemmour"},12:{code:"TR",name:"Trarza"},13:{code:"NO",name:"Nouakchott"}},MU:{1:{code:"AG",name:"Agalega Islands"},2:{code:"BL",name:"Black River"},3:{code:"BR",name:"Beau Bassin-Rose Hill"},4:{code:"CC",name:"Cargados Carajos Shoals (Saint B)"},5:{code:"CU",name:"Curepipe"},6:{code:"FL",name:"Flacq"},7:{code:"GP",name:"Grand Port"},8:{code:"MO",name:"Moka"},9:{code:"PA",name:"Pamplemousses"},10:{code:"PL",name:"Port Louis"},11:{code:"PU",name:"Port Louis"},12:{code:"PW",name:"Plaines Wilhems"},13:{code:"QB",name:"Quatre Bornes"},14:{code:"RO",name:"Rodrigues"},15:{code:"RR",name:"Riviere du Rempart"},16:{code:"SA",name:"Savanne"},17:{code:"VP",name:"Vacoas-Phoenix"}},YT:{1:{code:"DZA",name:"Dzaoudzi"},2:{code:"PAM",name:"Pamandzi"},3:{code:"MAM",name:"Mamoudzou"},4:{code:"DEM",name:"Dembeni"},5:{code:"BAN",name:"Bandrele"},6:{code:"KAN",name:"Kani-Kéli"},7:{code:"BOU",name:"Bouéni"},8:{code:"CHI",name:"Chirongui"},9:{code:"SAD",name:"Sada"},10:{code:"OUA",name:"Ouangani"},11:{code:"CHI",name:"Chiconi"},12:{code:"TSI",name:"Tsingoni"},13:{code:"MTS",name:"M'Tsangamouji"},14:{code:"ACO",name:"Acoua"},15:{code:"MTS",name:"Mtsamboro"},16:{code:"BAN",name:"Bandraboua"},17:{code:"KOU",name:"Koungou"}},MX:{1:{code:"AGU",name:"Aguascalientes"},2:{code:"BCN",name:"Baja California Norte"},3:{code:"BCS",name:"Baja California Sur"},4:{code:"CAM",name:"Campeche"},5:{code:"CHP",name:"Chiapas"},6:{code:"CHH",name:"Chihuahua"},7:{code:"COA",name:"Coahuila de Zaragoza"},8:{code:"COL",name:"Colima"},9:{code:"DIF",name:"Distrito Federal"},10:{code:"DUR",name:"Durango"},11:{code:"GUA",name:"Guanajuato"},12:{code:"GRO",name:"Guerrero"},13:{code:"HID",name:"Hidalgo"},14:{code:"JAL",name:"Jalisco"},15:{code:"MEX",name:"Mexico"},16:{code:"MIC",name:"Michoacan de Ocampo"},17:{code:"MOR",name:"Morelos"},18:{code:"NAY",name:"Nayarit"},19:{code:"NLE",name:"Nuevo Leon"},20:{code:"OAX",name:"Oaxaca"},21:{code:"PUE",name:"Puebla"},22:{code:"QUE",name:"Queretaro de Arteaga"},23:{code:"ROO",name:"Quintana Roo"},24:{code:"SLP",name:"San Luis Potosi"},25:{code:"SIN",name:"Sinaloa"},26:{code:"SON",name:"Sonora"},27:{code:"TAB",name:"Tabasco"},28:{code:"TAM",name:"Tamaulipas"},29:{code:"TLA",name:"Tlaxcala"},30:{code:"VER",name:"Veracruz-Llave"},31:{code:"YUC",name:"Yucatan"},32:{code:"ZAC",name:"Zacatecas"}},FM:{1:{code:"C",name:"Chuuk"},2:{code:"K",name:"Kosrae"},3:{code:"P",name:"Pohnpei"},4:{code:"Y",name:"Yap"}},MD:{1:{code:"GA",name:"Gagauzia"},2:{code:"CU",name:"Chisinau"},3:{code:"BA",name:"Balti"},4:{code:"CA",name:"Cahul"},5:{code:"ED",name:"Edinet"},6:{code:"LA",name:"Lapusna"},7:{code:"OR",name:"Orhei"},8:{code:"SO",name:"Soroca"},9:{code:"TI",name:"Tighina"},10:{code:"UN",name:"Ungheni"},11:{code:"SN",name:"Stânga Nistrului"}},MC:{1:{code:"FV",name:"Fontvieille"},2:{code:"LC",name:"La Condamine"},3:{code:"MV",name:"Monaco-Ville"},4:{code:"MC",name:"Monte-Carlo"}},MN:{1:{code:"1",name:"Ulanbaatar"},2:{code:"035",name:"Orhon"},3:{code:"037",name:"Darhan uul"},4:{code:"039",name:"Hentiy"},5:{code:"041",name:"Hovsgol"},6:{code:"043",name:"Hovd"},7:{code:"046",name:"Uvs"},8:{code:"047",name:"Tov"},9:{code:"049",name:"Selenge"},10:{code:"051",name:"Suhbaatar"},11:{code:"053",name:"Omnogovi"},12:{code:"055",name:"Ovorhangay"},13:{code:"057",name:"Dzavhan"},14:{code:"059",name:"DundgovL"},15:{code:"061",name:"Dornod"},16:{code:"063",name:"Dornogov"},17:{code:"064",name:"Govi-Sumber"},18:{code:"065",name:"Govi-Altay"},19:{code:"067",name:"Bulgan"},20:{code:"069",name:"Bayanhongor"},21:{code:"071",name:"Bayan-Olgiy"},22:{code:"073",name:"Arhangay"}},MS:{1:{code:"A",name:"Saint Anthony"},2:{code:"G",name:"Saint Georges"},3:{code:"P",name:"Saint Peter"}},MA:{1:{code:"AGD",name:"Agadir"},2:{code:"HOC",name:"Al Hoceima"},3:{code:"AZI",name:"Azilal"},4:{code:"BME",name:"Beni Mellal"},5:{code:"BSL",name:"Ben Slimane"},6:{code:"BLM",name:"Boulemane"},7:{code:"CBL",name:"Casablanca"},8:{code:"CHA",name:"Chaouen"},9:{code:"EJA",name:"El Jadida"},10:{code:"EKS",name:"El Kelaa des Sraghna"},11:{code:"ERA",name:"Er Rachidia"},12:{code:"ESS",name:"Essaouira"},13:{code:"FES",name:"Fes"},14:{code:"FIG",name:"Figuig"},15:{code:"GLM",name:"Guelmim"},16:{code:"IFR",name:"Ifrane"},17:{code:"KEN",name:"Kenitra"},18:{code:"KHM",name:"Khemisset"},19:{code:"KHN",name:"Khenifra"},20:{code:"KHO",name:"Khouribga"},21:{code:"LYN",name:"Laayoune"},22:{code:"LAR",name:"Larache"},23:{code:"MRK",name:"Marrakech"},24:{code:"MKN",name:"Meknes"},25:{code:"NAD",name:"Nador"},26:{code:"ORZ",name:"Ouarzazate"},27:{code:"OUJ",name:"Oujda"},28:{code:"RSA",name:"Rabat-Sale"},29:{code:"SAF",name:"Safi"},30:{code:"SET",name:"Settat"},31:{code:"SKA",name:"Sidi Kacem"},32:{code:"TGR",name:"Tangier"},33:{code:"TAN",name:"Tan-Tan"},34:{code:"TAO",name:"Taounate"},35:{code:"TRD",name:"Taroudannt"},36:{code:"TAT",name:"Tata"},37:{code:"TAZ",name:"Taza"},38:{code:"TET",name:"Tetouan"},39:{code:"TIZ",name:"Tiznit"},40:{code:"ADK",name:"Ad Dakhla"},41:{code:"BJD",name:"Boujdour"},42:{code:"ESM",name:"Es Smara"}},MZ:{1:{code:"CD",name:"Cabo Delgado"},2:{code:"GZ",name:"Gaza"},3:{code:"IN",name:"Inhambane"},4:{code:"MN",name:"Manica"},5:{code:"MC",name:"Maputo (city)"},6:{code:"MP",name:"Maputo"},7:{code:"NA",name:"Nampula"},8:{code:"NI",name:"Niassa"},9:{code:"SO",name:"Sofala"},10:{code:"TE",name:"Tete"},11:{code:"ZA",name:"Zambezia"}},MM:{1:{code:"AY",name:"Ayeyarwady"},2:{code:"BG",name:"Bago"},3:{code:"MG",name:"Magway"},4:{code:"MD",name:"Mandalay"},5:{code:"SG",name:"Sagaing"},6:{code:"TN",name:"Tanintharyi"},7:{code:"YG",name:"Yangon"},8:{code:"CH",name:"Chin State"},9:{code:"KC",name:"Kachin State"},10:{code:"KH",name:"Kayah State"},11:{code:"KN",name:"Kayin State"},12:{code:"MN",name:"Mon State"},13:{code:"RK",name:"Rakhine State"},14:{code:"SH",name:"Shan State"}},NA:{1:{code:"CA",name:"Caprivi"},2:{code:"ER",name:"Erongo"},3:{code:"HA",name:"Hardap"},4:{code:"KR",name:"Karas"},5:{code:"KV",name:"Kavango"},6:{code:"KH",name:"Khomas"},7:{code:"KU",name:"Kunene"},8:{code:"OW",name:"Ohangwena"},9:{code:"OK",name:"Omaheke"},10:{code:"OT",name:"Omusati"},11:{code:"ON",name:"Oshana"},12:{code:"OO",name:"Oshikoto"},13:{code:"OJ",name:"Otjozondjupa"}},NR:{1:{code:"AO",name:"Aiwo"},2:{code:"AA",name:"Anabar"},3:{code:"AT",name:"Anetan"},4:{code:"AI",name:"Anibare"},5:{code:"BA",name:"Baiti"},6:{code:"BO",name:"Boe"},7:{code:"BU",name:"Buada"},8:{code:"DE",name:"Denigomodu"},9:{code:"EW",name:"Ewa"},10:{code:"IJ",name:"Ijuw"},11:{code:"ME",name:"Meneng"},12:{code:"NI",name:"Nibok"},13:{code:"UA",name:"Uaboe"},14:{code:"YA",name:"Yaren"}},NP:{1:{code:"BA",name:"Bagmati"},2:{code:"BH",name:"Bheri"},3:{code:"DH",name:"Dhawalagiri"},4:{code:"GA",name:"Gandaki"},5:{code:"JA",name:"Janakpur"},6:{code:"KA",name:"Karnali"},7:{code:"KO",name:"Kosi"},8:{code:"LU",name:"Lumbini"},9:{code:"MA",name:"Mahakali"},10:{code:"ME",name:"Mechi"},11:{code:"NA",name:"Narayani"},12:{code:"RA",name:"Rapti"},13:{code:"SA",name:"Sagarmatha"},14:{code:"SE",name:"Seti"}},NL:{1:{code:"DR",name:"Drenthe"},2:{code:"FL",name:"Flevoland"},3:{code:"FR",name:"Friesland"},4:{code:"GE",name:"Gelderland"},5:{code:"GR",name:"Groningen"},6:{code:"LI",name:"Limburg"},7:{code:"NB",name:"Noord Brabant"},8:{code:"NH",name:"Noord Holland"},9:{code:"OV",name:"Overijssel"},10:{code:"UT",name:"Utrecht"},11:{code:"ZE",name:"Zeeland"},12:{code:"ZH",name:"Zuid Holland"}},AN:{1:{code:"BON",name:"Bonaire"},2:{code:"CUR",name:"Curaçao"},3:{code:"SAB",name:"Saba"},4:{code:"SEU",name:"Sint Eustatius"},5:{code:"SMA",name:"Sint Maarten"}},NC:{1:{code:"L",name:"Iles Loyaute"},2:{code:"N",name:"Nord"},3:{code:"S",name:"Sud"}},NZ:{1:{code:"AUK",name:"Auckland"},2:{code:"BOP",name:"Bay of Plenty"},3:{code:"CAN",name:"Canterbury"},4:{code:"COR",name:"Coromandel"},5:{code:"GIS",name:"Gisborne"},6:{code:"FIO",name:"Fiordland"},7:{code:"HKB",name:"Hawke's Bay"},8:{code:"MBH",name:"Marlborough"},9:{code:"MWT",name:"Manawatu-Wanganui"},10:{code:"MCM",name:"Mt Cook-Mackenzie"},11:{code:"NSN",name:"Nelson"},12:{code:"NTL",name:"Northland"},13:{code:"OTA",name:"Otago"},14:{code:"STL",name:"Southland"},15:{code:"TKI",name:"Taranaki"},16:{code:"WGN",name:"Wellington"},17:{code:"WKO",name:"Waikato"},18:{code:"WAI",name:"Wairprarapa"},19:{code:"WTC",name:"West Coast"}},NI:{1:{code:"AN",name:"Atlantico Norte"},2:{code:"AS",name:"Atlantico Sur"},3:{code:"BO",name:"Boaco"},4:{code:"CA",name:"Carazo"},5:{code:"CI",name:"Chinandega"},6:{code:"CO",name:"Chontales"},7:{code:"ES",name:"Esteli"},8:{code:"GR",name:"Granada"},9:{code:"JI",name:"Jinotega"},10:{code:"LE",name:"Leon"},11:{code:"MD",name:"Madriz"},12:{code:"MN",name:"Managua"},13:{code:"MS",name:"Masaya"},14:{code:"MT",name:"Matagalpa"},15:{code:"NS",name:"Nuevo Segovia"},16:{code:"RS",name:"Rio San Juan"},17:{code:"RI",name:"Rivas"}},NE:{1:{code:"AG",name:"Agadez"},2:{code:"DF",name:"Diffa"},3:{code:"DS",name:"Dosso"},4:{code:"MA",name:"Maradi"},5:{code:"NM",name:"Niamey"},6:{code:"TH",name:"Tahoua"},7:{code:"TL",name:"Tillaberi"},8:{code:"ZD",name:"Zinder"}},NG:{1:{code:"AB",name:"Abia"},2:{code:"CT",name:"Abuja Federal Capital Territory"},3:{code:"AD",name:"Adamawa"},4:{code:"AK",name:"Akwa Ibom"},5:{code:"AN",name:"Anambra"},6:{code:"BC",name:"Bauchi"},7:{code:"BY",name:"Bayelsa"},8:{code:"BN",name:"Benue"},9:{code:"BO",name:"Borno"},10:{code:"CR",name:"Cross River"},11:{code:"DE",name:"Delta"},12:{code:"EB",name:"Ebonyi"},13:{code:"ED",name:"Edo"},14:{code:"EK",name:"Ekiti"},15:{code:"EN",name:"Enugu"},16:{code:"GO",name:"Gombe"},17:{code:"IM",name:"Imo"},18:{code:"JI",name:"Jigawa"},19:{code:"KD",name:"Kaduna"},20:{code:"KN",name:"Kano"},21:{code:"KT",name:"Katsina"},22:{code:"KE",name:"Kebbi"},23:{code:"KO",name:"Kogi"},24:{code:"KW",name:"Kwara"},25:{code:"LA",name:"Lagos"},26:{code:"NA",name:"Nassarawa"},27:{code:"NI",name:"Niger"},28:{code:"OG",name:"Ogun"},29:{code:"ONG",name:"Ondo"},30:{code:"OS",name:"Osun"},31:{code:"OY",name:"Oyo"},32:{code:"PL",name:"Plateau"},33:{code:"RI",name:"Rivers"},34:{code:"SO",name:"Sokoto"},35:{code:"TA",name:"Taraba"},36:{code:"YO",name:"Yobe"},37:{code:"ZA",name:"Zamfara"}},NU:{1:{code:"MAK",name:"Makefu"},2:{code:"TUA",name:"Tuapa"},3:{code:"NAM",name:"Namukulu"},4:{code:"HIK",name:"Hikutavake"},5:{code:"TOI",name:"Toi"},6:{code:"MUT",name:"Mutalau"},7:{code:"LAK",name:"Lakepa"},8:{code:"LIK",name:"Liku"},9:{code:"HAK",name:"Hakupu"},10:{code:"VAI",name:"Vaiea"},11:{code:"AVA",name:"Avatele"},12:{code:"TAM",name:"Tamakautoga"},13:{code:"ALO",name:"Alofi South"},14:{code:"ALO",name:"Alofi North"}},NF:{1:{code:"NOR",name:"Norfolk Island"}},MP:{1:{code:"N",name:"Northern Islands"},2:{code:"R",name:"Rota"},3:{code:"S",name:"Saipan"},4:{code:"T",name:"Tinian"}},NO:{1:{code:"AK",name:"Akershus"},2:{code:"AA",name:"Aust-Agder"},3:{code:"BU",name:"Buskerud"},4:{code:"FM",name:"Finnmark"},5:{code:"HM",name:"Hedmark"},6:{code:"HL",name:"Hordaland"},7:{code:"MR",name:"Møre og Romsdal"},8:{code:"NL",name:"Nordland"},9:{code:"NT",name:"Nord-Trøndelag"},10:{code:"OP",name:"Oppland"},11:{code:"OL",name:"Oslo"},12:{code:"RL",name:"Rogaland"},13:{code:"SJ",name:"Sogn og Fjordane"},14:{code:"ST",name:"Sør-Trøndelag"},15:{code:"SV",name:"Svalbard"},16:{code:"TM",name:"Telemark"},17:{code:"TR",name:"Troms"},18:{code:"VA",name:"Vest-Agder"},19:{code:"VF",name:"Vestfold"},20:{code:"OF",name:"Østfold"}},OM:{1:{code:"DA",name:"Ad Dakhiliyah"},2:{code:"BA",name:"Al Batinah"},3:{code:"WU",name:"Al Wusta"},4:{code:"SH",name:"Ash Sharqiyah"},5:{code:"ZA",name:"Az Zahirah"},6:{code:"MA",name:"Masqat"},7:{code:"MU",name:"Musandam"},8:{code:"ZU",name:"Zufar"}},PK:{1:{code:"B",name:"Balochistan"},2:{code:"T",name:"Federally Administered Tribal Ar"},3:{code:"I",name:"Islamabad Capital Territory"},4:{code:"N",name:"North-West Frontier"},5:{code:"P",name:"Punjab"},6:{code:"S",name:"Sindh"}},PW:{1:{code:"AM",name:"Aimeliik"},2:{code:"AR",name:"Airai"},3:{code:"AN",name:"Angaur"},4:{code:"HA",name:"Hatohobei"},5:{code:"KA",name:"Kayangel"},6:{code:"KO",name:"Koror"},7:{code:"ME",name:"Melekeok"},8:{code:"NA",name:"Ngaraard"},9:{code:"NG",name:"Ngarchelong"},10:{code:"ND",name:"Ngardmau"},11:{code:"NT",name:"Ngatpang"},12:{code:"NC",name:"Ngchesar"},13:{code:"NR",name:"Ngeremlengui"},14:{code:"NW",name:"Ngiwal"},15:{code:"PE",name:"Peleliu"},16:{code:"SO",name:"Sonsorol"}},PA:{1:{code:"BT",name:"Bocas del Toro"},2:{code:"CH",name:"Chiriqui"},3:{code:"CC",name:"Cocle"},4:{code:"CL",name:"Colon"},5:{code:"DA",name:"Darien"},6:{code:"HE",name:"Herrera"},7:{code:"LS",name:"Los Santos"},8:{code:"PA",name:"Panama"},9:{code:"SB",name:"San Blas"},10:{code:"VG",name:"Veraguas"}},PG:{1:{code:"BV",name:"Bougainville"},2:{code:"CE",name:"Central"},3:{code:"CH",name:"Chimbu"},4:{code:"EH",name:"Eastern Highlands"},5:{code:"EB",name:"East New Britain"},6:{code:"ES",name:"East Sepik"},7:{code:"EN",name:"Enga"},8:{code:"GU",name:"Gulf"},9:{code:"MD",name:"Madang"},10:{code:"MN",name:"Manus"},11:{code:"MB",name:"Milne Bay"},12:{code:"MR",name:"Morobe"},13:{code:"NC",name:"National Capital"},14:{code:"NI",name:"New Ireland"},15:{code:"NO",name:"Northern"},16:{code:"SA",name:"Sandaun"},17:{code:"SH",name:"Southern Highlands"},18:{code:"WE",name:"Western"},19:{code:"WH",name:"Western Highlands"},20:{code:"WB",name:"West New Britain"}},PY:{1:{code:"AG",name:"Alto Paraguay"},2:{code:"AN",name:"Alto Parana"},3:{code:"AM",name:"Amambay"},4:{code:"AS",name:"Asuncion"},5:{code:"BO",name:"Boqueron"},6:{code:"CG",name:"Caaguazu"},7:{code:"CZ",name:"Caazapa"},8:{code:"CN",name:"Canindeyu"},9:{code:"CE",name:"Central"},10:{code:"CC",name:"Concepcion"},11:{code:"CD",name:"Cordillera"},12:{code:"GU",name:"Guaira"},13:{code:"IT",name:"Itapua"},14:{code:"MI",name:"Misiones"},15:{code:"NE",name:"Neembucu"},16:{code:"PA",name:"Paraguari"},17:{code:"PH",name:"Presidente Hayes"},18:{code:"SP",name:"San Pedro"}},PE:{1:{code:"AM",name:"Amazonas"},2:{code:"AN",name:"Ancash"},3:{code:"AP",name:"Apurimac"},4:{code:"AR",name:"Arequipa"},5:{code:"AY",name:"Ayacucho"},6:{code:"CJ",name:"Cajamarca"},7:{code:"CL",name:"Callao"},8:{code:"CU",name:"Cusco"},9:{code:"HV",name:"Huancavelica"},10:{code:"HO",name:"Huanuco"},11:{code:"IC",name:"Ica"},12:{code:"JU",name:"Junin"},13:{code:"LD",name:"La Libertad"},14:{code:"LY",name:"Lambayeque"},15:{code:"LI",name:"Lima"},16:{code:"LO",name:"Loreto"},17:{code:"MD",name:"Madre de Dios"},18:{code:"MO",name:"Moquegua"},19:{code:"PA",name:"Pasco"},20:{code:"PI",name:"Piura"},21:{code:"PU",name:"Puno"},22:{code:"SM",name:"San Martin"},23:{code:"TA",name:"Tacna"},24:{code:"TU",name:"Tumbes"},25:{code:"UC",name:"Ucayali"}},PH:{1:{code:"ABR",name:"Abra"},2:{code:"ANO",name:"Agusan del Norte"},3:{code:"ASU",name:"Agusan del Sur"},4:{code:"AKL",name:"Aklan"},5:{code:"ALB",name:"Albay"},6:{code:"ANT",name:"Antique"},7:{code:"APY",name:"Apayao"},8:{code:"AUR",name:"Aurora"},9:{code:"BAS",name:"Basilan"},10:{code:"BTA",name:"Bataan"},11:{code:"BTE",name:"Batanes"},12:{code:"BTG",name:"Batangas"},13:{code:"BLR",name:"Biliran"},14:{code:"BEN",name:"Benguet"},15:{code:"BOL",name:"Bohol"},16:{code:"BUK",name:"Bukidnon"},17:{code:"BUL",name:"Bulacan"},18:{code:"CAG",name:"Cagayan"},19:{code:"CNO",name:"Camarines Norte"},20:{code:"CSU",name:"Camarines Sur"},21:{code:"CAM",name:"Camiguin"},22:{code:"CAP",name:"Capiz"},23:{code:"CAT",name:"Catanduanes"},24:{code:"CAV",name:"Cavite"},25:{code:"CEB",name:"Cebu"},26:{code:"CMP",name:"Compostela"},27:{code:"DNO",name:"Davao del Norte"},28:{code:"DSU",name:"Davao del Sur"},29:{code:"DOR",name:"Davao Oriental"},30:{code:"ESA",name:"Eastern Samar"},31:{code:"GUI",name:"Guimaras"},32:{code:"IFU",name:"Ifugao"},33:{code:"INO",name:"Ilocos Norte"},34:{code:"ISU",name:"Ilocos Sur"},35:{code:"ILO",name:"Iloilo"},36:{code:"ISA",name:"Isabela"},37:{code:"KAL",name:"Kalinga"},38:{code:"LAG",name:"Laguna"},39:{code:"LNO",name:"Lanao del Norte"},40:{code:"LSU",name:"Lanao del Sur"},41:{code:"UNI",name:"La Union"},42:{code:"LEY",name:"Leyte"},43:{code:"MAG",name:"Maguindanao"},44:{code:"MRN",name:"Marinduque"},45:{code:"MSB",name:"Masbate"},46:{code:"MIC",name:"Mindoro Occidental"},47:{code:"MIR",name:"Mindoro Oriental"},48:{code:"MSC",name:"Misamis Occidental"},49:{code:"MOR",name:"Misamis Oriental"},50:{code:"MOP",name:"Mountain"},51:{code:"NOC",name:"Negros Occidental"},52:{code:"NOR",name:"Negros Oriental"},53:{code:"NCT",name:"North Cotabato"},54:{code:"NSM",name:"Northern Samar"},55:{code:"NEC",name:"Nueva Ecija"},56:{code:"NVZ",name:"Nueva Vizcaya"},57:{code:"PLW",name:"Palawan"},58:{code:"PMP",name:"Pampanga"},59:{code:"PNG",name:"Pangasinan"},60:{code:"QZN",name:"Quezon"},61:{code:"QRN",name:"Quirino"},62:{code:"RIZ",name:"Rizal"},63:{code:"ROM",name:"Romblon"},64:{code:"SMR",name:"Samar"},65:{code:"SRG",name:"Sarangani"},66:{code:"SQJ",name:"Siquijor"},67:{code:"SRS",name:"Sorsogon"},68:{code:"SCO",name:"South Cotabato"},69:{code:"SLE",name:"Southern Leyte"},70:{code:"SKU",name:"Sultan Kudarat"},71:{code:"SLU",name:"Sulu"},72:{code:"SNO",name:"Surigao del Norte"},73:{code:"SSU",name:"Surigao del Sur"},74:{code:"TAR",name:"Tarlac"},75:{code:"TAW",name:"Tawi-Tawi"},76:{code:"ZBL",name:"Zambales"},77:{code:"ZNO",name:"Zamboanga del Norte"},78:{code:"ZSU",name:"Zamboanga del Sur"},79:{code:"ZSI",name:"Zamboanga Sibugay"}},PN:{1:{code:"PIT",name:"Pitcairn Island"}},PL:{1:{code:"DO",name:"Dolnośląskie"},2:{code:"KP",name:"Kujawsko-Pomorskie"},3:{code:"LL",name:"Lubelskie"},4:{code:"LU",name:"Lubuskie"},5:{code:"LO",name:"Łódzkie"},6:{code:"ML",name:"Małopolskie"},7:{code:"MZ",name:"Mazowieckie"},8:{code:"OP",name:"Opolskie"},9:{code:"PP",name:"Podkarpackie"},10:{code:"PL",name:"Podlaskie"},11:{code:"PM",name:"Pomorskie"},12:{code:"SL",name:"Śląskie"},13:{code:"SW",name:"Świętokrzyskie"},14:{code:"WM",name:"Warmińsko-Mazurskie"},15:{code:"WP",name:"Wielkopolskie"},16:{code:"ZA",name:"Zachodniopomorskie"}},PT:{1:{code:"AC",name:"Açores"},2:{code:"AV",name:"Aveiro"},3:{code:"BE",name:"Beja"},4:{code:"BR",name:"Braga"},5:{code:"BA",name:"Bragança"},6:{code:"CB",name:"Castelo Branco"},7:{code:"CO",name:"Coimbra"},8:{code:"EV",name:"évora"},9:{code:"FA",name:"Faro"},10:{code:"GU",name:"Guarda"},12:{code:"LE",name:"Leiria"},13:{code:"LI",name:"Lisboa"},14:{code:"ME",name:"Madeira"},15:{code:"PO",name:"Portalegre"},16:{code:"PR",name:"Porto"},17:{code:"SA",name:"Santarém"},18:{code:"SE",name:"SetÚbal"},19:{code:"VC",name:"Viana do Castelo"},20:{code:"VR",name:"Vila Real"},21:{code:"VI",name:"Viseu"}},PR:{1:{code:"A-A",name:"Añasco"},2:{code:"ADJ",name:"Adjuntas"},3:{code:"AGU",name:"Aguada"},4:{code:"AGU",name:"Aguadilla"},5:{code:"AGU",name:"Aguas Buenas"},6:{code:"AIB",name:"Aibonito"},7:{code:"ARE",name:"Arecibo"},8:{code:"ARR",name:"Arroyo"},9:{code:"BAR",name:"Barceloneta"},10:{code:"BAR",name:"Barranquitas"},11:{code:"BAY",name:"Bayamón"},12:{code:"CAB",name:"Cabo Rojo"},13:{code:"CAG",name:"Caguas"},14:{code:"CAM",name:"Camuy"},15:{code:"CAN",name:"Canóvanas"},16:{code:"CAR",name:"Carolina"},17:{code:"CAT",name:"Cataño"},18:{code:"CAY",name:"Cayey"},19:{code:"CEI",name:"Ceiba"},20:{code:"CIA",name:"Ciales"},21:{code:"CID",name:"Cidra"},22:{code:"COA",name:"Coamo"},23:{code:"COM",name:"Comerío"},24:{code:"COR",name:"Corozal"},25:{code:"CUL",name:"Culebra"},26:{code:"DOR",name:"Dorado"},27:{code:"FAJ",name:"Fajardo"},28:{code:"FLO",name:"Florida"},29:{code:"GUA",name:"Guayama"},30:{code:"GUA",name:"Guayanilla"},31:{code:"GUA",name:"Guaynabo"},32:{code:"GUR",name:"Gurabo"},33:{code:"GU¡",name:"Guánica"},34:{code:"HAT",name:"Hatillo"},35:{code:"HOR",name:"Hormigueros"},36:{code:"HUM",name:"Humacao"},37:{code:"ISA",name:"Isabela"},38:{code:"JAY",name:"Jayuya"},39:{code:"JUA",name:"Juana Díaz"},40:{code:"JUN",name:"Juncos"},41:{code:"LAJ",name:"Lajas"},42:{code:"LAR",name:"Lares"},43:{code:"LAS",name:"Las Marías"},44:{code:"LAS",name:"Las Piedras"},45:{code:"LOÕ",name:"Loíza"},46:{code:"LUQ",name:"Luquillo"},47:{code:"MAN",name:"Manatí"},48:{code:"MAR",name:"Maricao"},49:{code:"MAU",name:"Maunabo"},50:{code:"MAY",name:"Mayagüez"},51:{code:"MOC",name:"Moca"},52:{code:"MOR",name:"Morovis"},53:{code:"NAG",name:"Naguabo"},54:{code:"NAR",name:"Naranjito"},55:{code:"ORO",name:"Orocovis"},56:{code:"PAT",name:"Patillas"},57:{code:"PE-",name:"Peñuelas"},58:{code:"PON",name:"Ponce"},59:{code:"QUE",name:"Quebradillas"},60:{code:"RIN",name:"Rincón"},61:{code:"RIO",name:"Rio Grande"},62:{code:"SAB",name:"Sabana Grande"},63:{code:"SAL",name:"Salinas"},64:{code:"SAN",name:"San Germàn"},65:{code:"SAN",name:"San Juan"},66:{code:"SAN",name:"San Lorenzo"},67:{code:"SAN",name:"San Sebastiàn"},68:{code:"SAN",name:"Santa Isabel"},69:{code:"TOA",name:"Toa Alta"},70:{code:"TOA",name:"Toa Baja"},71:{code:"TRU",name:"Trujillo Alto"},72:{code:"UTU",name:"Utuado"},73:{code:"VEG",name:"Vega Alta"},74:{code:"VEG",name:"Vega Baja"},75:{code:"VIE",name:"Vieques"},76:{code:"VIL",name:"Villalba"},77:{code:"YAB",name:"Yabucoa"},78:{code:"YAU",name:"Yauco"}},QA:{1:{code:"DW",name:"Ad Dawhah"},2:{code:"GW",name:"Al Ghuwayriyah"},3:{code:"JM",name:"Al Jumayliyah"},4:{code:"KR",name:"Al Khawr"},5:{code:"WK",name:"Al Wakrah"},6:{code:"RN",name:"Ar Rayyan"},7:{code:"JB",name:"Jarayan al Batinah"},8:{code:"MS",name:"Madinat ash Shamal"},9:{code:"UD",name:"Umm Sa'id"},10:{code:"UL",name:"Umm Salal"}},RO:{1:{code:"AB",name:"Alba"},2:{code:"AR",name:"Arad"},3:{code:"AG",name:"Arges"},4:{code:"BC",name:"Bacau"},5:{code:"BH",name:"Bihor"},6:{code:"BN",name:"Bistrita-Nasaud"},7:{code:"BT",name:"Botosani"},8:{code:"BV",name:"Brasov"},9:{code:"BR",name:"Braila"},10:{code:"B",name:"Bucuresti"},11:{code:"BZ",name:"Buzau"},12:{code:"CS",name:"Caras-Severin"},13:{code:"CL",name:"Calarasi"},14:{code:"CJ",name:"Cluj"},15:{code:"CT",name:"Constanta"},16:{code:"CV",name:"Covasna"},17:{code:"DB",name:"Dimbovita"},18:{code:"DJ",name:"Dolj"},19:{code:"GL",name:"Galati"},20:{code:"GR",name:"Giurgiu"},21:{code:"GJ",name:"Gorj"},22:{code:"HR",name:"Harghita"},23:{code:"HD",name:"Hunedoara"},24:{code:"IL",name:"Ialomita"},25:{code:"IS",name:"Iasi"},26:{code:"IF",name:"Ilfov"},27:{code:"MM",name:"Maramures"},28:{code:"MH",name:"Mehedinti"},29:{code:"MS",name:"Mures"},30:{code:"NT",name:"Neamt"},31:{code:"OT",name:"Olt"},32:{code:"PH",name:"Prahova"},33:{code:"SM",name:"Satu-Mare"},34:{code:"SJ",name:"Salaj"},35:{code:"SB",name:"Sibiu"},36:{code:"SV",name:"Suceava"},37:{code:"TR",name:"Teleorman"},38:{code:"TM",name:"Timis"},39:{code:"TL",name:"Tulcea"},40:{code:"VS",name:"Vaslui"},41:{code:"VL",name:"Valcea"},42:{code:"VN",name:"Vrancea"}},RU:{1:{code:"AB",name:"Abakan"},2:{code:"AG",name:"Aginskoye"},3:{code:"AN",name:"Anadyr"},4:{code:"AR",name:"Arkahangelsk"},5:{code:"AS",name:"Astrakhan"},6:{code:"BA",name:"Barnaul"},7:{code:"BE",name:"Belgorod"},8:{code:"BI",name:"Birobidzhan"},9:{code:"BL",name:"Blagoveshchensk"},10:{code:"BR",name:"Bryansk"},11:{code:"CH",name:"Cheboksary"},12:{code:"CL",name:"Chelyabinsk"},13:{code:"CR",name:"Cherkessk"},14:{code:"CI",name:"Chita"},15:{code:"DU",name:"Dudinka"},16:{code:"EL",name:"Elista"},17:{code:"GO",name:"Gomo-Altaysk"},18:{code:"GA",name:"Gorno-Altaysk"},19:{code:"GR",name:"Groznyy"},20:{code:"IR",name:"Irkutsk"},21:{code:"IV",name:"Ivanovo"},22:{code:"IZ",name:"Izhevsk"},23:{code:"KA",name:"Kalinigrad"},24:{code:"KL",name:"Kaluga"},25:{code:"KS",name:"Kasnodar"},26:{code:"KZ",name:"Kazan"},27:{code:"KE",name:"Kemerovo"},28:{code:"KH",name:"Khabarovsk"},29:{code:"KM",name:"Khanty-Mansiysk"},30:{code:"KO",name:"Kostroma"},31:{code:"KR",name:"Krasnodar"},32:{code:"KN",name:"Krasnoyarsk"},33:{code:"KU",name:"Kudymkar"},34:{code:"KG",name:"Kurgan"},35:{code:"KK",name:"Kursk"},36:{code:"KY",name:"Kyzyl"},37:{code:"LI",name:"Lipetsk"},38:{code:"MA",name:"Magadan"},39:{code:"MK",name:"Makhachkala"},40:{code:"MY",name:"Maykop"},41:{code:"MO",name:"Moscow"},42:{code:"MU",name:"Murmansk"},43:{code:"NA",name:"Nalchik"},44:{code:"NR",name:"Naryan Mar"},45:{code:"NZ",name:"Nazran"},46:{code:"NI",name:"Nizhniy Novgorod"},47:{code:"NO",name:"Novgorod"},48:{code:"NV",name:"Novosibirsk"},49:{code:"OM",name:"Omsk"},50:{code:"OR",name:"Orel"},51:{code:"OE",name:"Orenburg"},52:{code:"PA",name:"Palana"},53:{code:"PE",name:"Penza"},54:{code:"PR",name:"Perm"},55:{code:"PK",name:"Petropavlovsk-Kamchatskiy"},56:{code:"PT",name:"Petrozavodsk"},57:{code:"PS",name:"Pskov"},58:{code:"RO",name:"Rostov-na-Donu"},59:{code:"RY",name:"Ryazan"},60:{code:"SL",name:"Salekhard"},61:{code:"SA",name:"Samara"},62:{code:"SR",name:"Saransk"},63:{code:"SV",name:"Saratov"},64:{code:"SM",name:"Smolensk"},65:{code:"SP",name:"St. Petersburg"},66:{code:"ST",name:"Stavropol"},67:{code:"SY",name:"Syktyvkar"},68:{code:"TA",name:"Tambov"},69:{code:"TO",name:"Tomsk"},70:{code:"TU",name:"Tula"},71:{code:"TR",name:"Tura"},72:{code:"TV",name:"Tver"},73:{code:"TY",name:"Tyumen"},74:{code:"UF",name:"Ufa"},75:{code:"UL",name:"Ul'yanovsk"},76:{code:"UU",name:"Ulan-Ude"},77:{code:"US",name:"Ust'-Ordynskiy"},78:{code:"VL",name:"Vladikavkaz"},79:{code:"VA",name:"Vladimir"},80:{code:"VV",name:"Vladivostok"},81:{code:"VG",name:"Volgograd"},82:{code:"VD",name:"Vologda"},83:{code:"VO",name:"Voronezh"},84:{code:"VY",name:"Vyatka"},85:{code:"YA",name:"Yakutsk"},86:{code:"YR",name:"Yaroslavl"},87:{code:"YE",name:"Yekaterinburg"},88:{code:"YO",name:"Yoshkar-Ola"}},RW:{1:{code:"BU",name:"Butare"},2:{code:"BY",name:"Byumba"},3:{code:"CY",name:"Cyangugu"},4:{code:"GK",name:"Gikongoro"},5:{code:"GS",name:"Gisenyi"},6:{code:"GT",name:"Gitarama"},7:{code:"KG",name:"Kibungo"},8:{code:"KY",name:"Kibuye"},9:{code:"KR",name:"Kigali Rurale"},10:{code:"KV",name:"Kigali-ville"},11:{code:"RU",name:"Ruhengeri"},12:{code:"UM",name:"Umutara"}},KN:{1:{code:"CCN",name:"Christ Church Nichola Town"},2:{code:"SAS",name:"Saint Anne Sandy Point"},3:{code:"SGB",name:"Saint George Basseterre"},4:{code:"SGG",name:"Saint George Gingerland"},5:{code:"SJW",name:"Saint James Windward"},6:{code:"SJC",name:"Saint John Capesterre"},7:{code:"SJF",name:"Saint John Figtree"},8:{code:"SMC",name:"Saint Mary Cayon"},9:{code:"CAP",name:"Saint Paul Capesterre"},10:{code:"CHA",name:"Saint Paul Charlestown"},11:{code:"SPB",name:"Saint Peter Basseterre"},12:{code:"STL",name:"Saint Thomas Lowland"},13:{code:"STM",name:"Saint Thomas Middle Island"},14:{code:"TPP",name:"Trinity Palmetto Point"}},LC:{1:{code:"AR",name:"Anse-la-Raye"},2:{code:"CA",name:"Castries"},3:{code:"CH",name:"Choiseul"},4:{code:"DA",name:"Dauphin"},5:{code:"DE",name:"Dennery"},6:{code:"GI",name:"Gros-Islet"},7:{code:"LA",name:"Laborie"},8:{code:"MI",name:"Micoud"},9:{code:"PR",name:"Praslin"},10:{code:"SO",name:"Soufriere"},11:{code:"VF",name:"Vieux-Fort"}},VC:{1:{code:"C",name:"Charlotte"},2:{code:"R",name:"Grenadines"},3:{code:"A",name:"Saint Andrew"},4:{code:"D",name:"Saint David"},5:{code:"G",name:"Saint George"},6:{code:"P",name:"Saint Patrick"}},WS:{1:{code:"AN",name:"A'ana"},2:{code:"AI",name:"Aiga-i-le-Tai"},3:{code:"AT",name:"Atua"},4:{code:"FA",name:"Fa'asaleleaga"},5:{code:"GE",name:"Gaga'emauga"},6:{code:"GF",name:"Gagaifomauga"},7:{code:"PA",name:"Palauli"},8:{code:"SA",name:"Satupa'itea"},9:{code:"TU",name:"Tuamasaga"},10:{code:"VF",name:"Va'a-o-Fonoti"},11:{code:"VS",name:"Vaisigano"}},SM:{1:{code:"AC",name:"Acquaviva"},2:{code:"BM",name:"Borgo Maggiore"},3:{code:"CH",name:"Chiesanuova"},4:{code:"DO",name:"Domagnano"},5:{code:"FA",name:"Faetano"},6:{code:"FI",name:"Fiorentino"},7:{code:"MO",name:"Montegiardino"},8:{code:"SM",name:"Citta di San Marino"},9:{code:"SE",name:"Serravalle"}},ST:{1:{code:"S",name:"Sao Tome"},2:{code:"P",name:"Principe"}},SA:{1:{code:"BH",name:"Al Bahah"},2:{code:"HS",name:"Al Hudud ash Shamaliyah"},3:{code:"JF",name:"Al Jawf"},4:{code:"MD",name:"Al Madinah"},5:{code:"QS",name:"Al Qasim"},6:{code:"RD",name:"Ar Riyad"},7:{code:"AQ",name:"Ash Sharqiyah (Eastern)"},8:{code:"AS",name:"'Asir"},9:{code:"HL",name:"Ha'il"},10:{code:"JZ",name:"Jizan"},11:{code:"ML",name:"Makkah"},12:{code:"NR",name:"Najran"},13:{code:"TB",name:"Tabuk"}},SN:{1:{code:"DA",name:"Dakar"},2:{code:"DI",name:"Diourbel"},3:{code:"FA",name:"Fatick"},4:{code:"KA",name:"Kaolack"},5:{code:"KO",name:"Kolda"},6:{code:"LO",name:"Louga"},7:{code:"MA",name:"Matam"},8:{code:"SL",name:"Saint-Louis"},9:{code:"TA",name:"Tambacounda"},10:{code:"TH",name:"Thies"},11:{code:"ZI",name:"Ziguinchor"}},SC:{1:{code:"AP",name:"Anse aux Pins"},2:{code:"AB",name:"Anse Boileau"},3:{code:"AE",name:"Anse Etoile"},4:{code:"AL",name:"Anse Louis"},5:{code:"AR",name:"Anse Royale"},6:{code:"BL",name:"Baie Lazare"},7:{code:"BS",name:"Baie Sainte Anne"},8:{code:"BV",name:"Beau Vallon"},9:{code:"BA",name:"Bel Air"},10:{code:"BO",name:"Bel Ombre"},11:{code:"CA",name:"Cascade"},12:{code:"GL",name:"Glacis"},13:{code:"GM",name:"Grand' Anse (on Mahe)"},14:{code:"GP",name:"Grand' Anse (on Praslin)"},15:{code:"DG",name:"La Digue"},16:{code:"RA",name:"La Riviere Anglaise"},17:{code:"MB",name:"Mont Buxton"},18:{code:"MF",name:"Mont Fleuri"},19:{code:"PL",name:"Plaisance"},20:{code:"PR",name:"Pointe La Rue"},21:{code:"PG",name:"Port Glaud"},22:{code:"SL",name:"Saint Louis"},23:{code:"TA",name:"Takamaka"}},SL:{1:{code:"E",name:"Eastern"},2:{code:"N",name:"Northern"},3:{code:"S",name:"Southern"},4:{code:"W",name:"Western"}},SK:{1:{code:"BA",name:"Banskobystricky"},2:{code:"BR",name:"Bratislavsky"},3:{code:"KO",name:"Kosicky"},4:{code:"NI",name:"Nitriansky"},5:{code:"PR",name:"Presovsky"},6:{code:"TC",name:"Trenciansky"},7:{code:"TV",name:"Trnavsky"},8:{code:"ZI",name:"Zilinsky"}},SI:{1:{code:"4",name:"Štajerska"},2:{code:"2A",name:"Gorenjska"},3:{code:"5",name:"Prekmurje"},4:{code:"3",name:"Koroška"},5:{code:"2B",name:"Notranjska"},6:{code:"1",name:"Primorska"},7:{code:"2C",name:"Dolenjska"},8:{code:"2C",name:"Bela Krajina"}},SB:{1:{code:"CE",name:"Central"},2:{code:"CH",name:"Choiseul"},3:{code:"GC",name:"Guadalcanal"},4:{code:"HO",name:"Honiara"},5:{code:"IS",name:"Isabel"},6:{code:"MK",name:"Makira"},7:{code:"ML",name:"Malaita"},8:{code:"RB",name:"Rennell and Bellona"},9:{code:"TM",name:"Temotu"},10:{code:"WE",name:"Western"}},SO:{1:{code:"AW",name:"Awdal"},2:{code:"BK",name:"Bakool"},3:{code:"BN",name:"Banaadir"},4:{code:"BR",name:"Bari"},5:{code:"BY",name:"Bay"},6:{code:"GA",name:"Galguduud"},7:{code:"GE",name:"Gedo"},8:{code:"HI",name:"Hiiraan"},9:{code:"JD",name:"Jubbada Dhexe"},10:{code:"JH",name:"Jubbada Hoose"},11:{code:"MU",name:"Mudug"},12:{code:"NU",name:"Nugaal"},13:{code:"SA",name:"Sanaag"},14:{code:"SD",name:"Shabeellaha Dhexe"},15:{code:"SH",name:"Shabeellaha Hoose"},16:{code:"SL",name:"Sool"},17:{code:"TO",name:"Togdheer"},18:{code:"WG",name:"Woqooyi Galbeed"}},ZA:{1:{code:"EC",name:"Eastern Cape"},2:{code:"FS",name:"Free State"},3:{code:"GT",name:"Gauteng"},4:{code:"KN",name:"KwaZulu-Natal"},5:{code:"LP",name:"Limpopo"},6:{code:"MP",name:"Mpumalanga"},7:{code:"NW",name:"North West"},8:{code:"NC",name:"Northern Cape"},9:{code:"WC",name:"Western Cape"}},ES:{1:{code:"CA",name:"La Coruña"},2:{code:"AL",name:"Álava"},3:{code:"AB",name:"Albacete"},4:{code:"AC",name:"Alicante"},5:{code:"AM",name:"Almeria"},6:{code:"AS",name:"Asturias"},7:{code:"AV",name:"Ávila"},8:{code:"BJ",name:"Badajoz"},9:{code:"IB",name:"Baleares"},10:{code:"BA",name:"Barcelona"},11:{code:"BU",name:"Burgos"},12:{code:"CC",name:"Cáceres"},13:{code:"CZ",name:"Cádiz"},14:{code:"CT",name:"Cantabria"},15:{code:"CL",name:"Castellón"},16:{code:"CE",name:"Ceuta"},17:{code:"CR",name:"Ciudad Real"},18:{code:"CD",name:"Córdoba"},19:{code:"CU",name:"Cuenca"},20:{code:"GI",name:"Gerona"},21:{code:"GD",name:"Granada"},22:{code:"GJ",name:"Guadalajara"},23:{code:"GP",name:"Guipúzcoa"},24:{code:"HL",name:"Huelva"},25:{code:"HS",name:"Huesca"},26:{code:"JN",name:"Jaén"},27:{code:"RJ",name:"La Rioja"},28:{code:"PM",name:"Las Palmas"},29:{code:"LE",name:"León"},30:{code:"LL",name:"Lérida"},31:{code:"LG",name:"Lugo"},32:{code:"MD",name:"Madrid"},33:{code:"MA",name:"Málaga"},34:{code:"ML",name:"Melilla"},35:{code:"MU",name:"Murcia"},36:{code:"NV",name:"Navarra"},37:{code:"OU",name:"Ourense"},38:{code:"PL",name:"Palencia"},39:{code:"PO",name:"Pontevedra"},40:{code:"SL",name:"Salamanca"},41:{code:"SC",name:"Santa Cruz de Tenerife"},42:{code:"SG",name:"Segovia"},43:{code:"SV",name:"Sevilla"},44:{code:"SO",name:"Soria"},45:{code:"TA",name:"Tarragona"},46:{code:"TE",name:"Teruel"},47:{code:"TO",name:"Toledo"},48:{code:"VC",name:"Valencia"},49:{code:"VD",name:"Valladolid"},50:{code:"VZ",name:"Vizcaya"},51:{code:"ZM",name:"Zamora"},52:{code:"ZR",name:"Zaragoza"}},LK:{1:{code:"CE",name:"Central"},2:{code:"EA",name:"Eastern"},3:{code:"NC",name:"North Central"},4:{code:"NO",name:"Northern"},5:{code:"NW",name:"North Western"},6:{code:"SA",name:"Sabaragamuwa"},7:{code:"SO",name:"Southern"},8:{code:"UV",name:"Uva"},9:{code:"WE",name:"Western"}},SH:{1:{code:"A",name:"Ascension"},2:{code:"S",name:"Saint Helena"},3:{code:"T",name:"Tristan da Cunha"}},PM:{1:{code:"P",name:"Saint Pierre"},2:{code:"M",name:"Miquelon"}},SD:{1:{code:"ANL",name:"A'ali an Nil"},2:{code:"BAM",name:"Al Bahr al Ahmar"},3:{code:"BRT",name:"Al Buhayrat"},4:{code:"JZR",name:"Al Jazirah"},5:{code:"KRT",name:"Al Khartum"},6:{code:"QDR",name:"Al Qadarif"},7:{code:"WDH",name:"Al Wahdah"},8:{code:"ANB",name:"An Nil al Abyad"},9:{code:"ANZ",name:"An Nil al Azraq"},10:{code:"ASH",name:"Ash Shamaliyah"},11:{code:"BJA",name:"Bahr al Jabal"},12:{code:"GIS",name:"Gharb al Istiwa'iyah"},13:{code:"GBG",name:"Gharb Bahr al Ghazal"},14:{code:"GDA",name:"Gharb Darfur"},15:{code:"GKU",name:"Gharb Kurdufan"},16:{code:"JDA",name:"Janub Darfur"},17:{code:"JKU",name:"Janub Kurdufan"},18:{code:"JQL",name:"Junqali"},19:{code:"KSL",name:"Kassala"},20:{code:"NNL",name:"Nahr an Nil"},21:{code:"SBG",name:"Shamal Bahr al Ghazal"},22:{code:"SDA",name:"Shamal Darfur"},23:{code:"SKU",name:"Shamal Kurdufan"},24:{code:"SIS",name:"Sharq al Istiwa'iyah"},25:{code:"SNR",name:"Sinnar"},26:{code:"WRB",name:"Warab"}},SR:{1:{code:"BR",name:"Brokopondo"},2:{code:"CM",name:"Commewijne"},3:{code:"CR",name:"Coronie"},4:{code:"MA",name:"Marowijne"},5:{code:"NI",name:"Nickerie"},6:{code:"PA",name:"Para"},7:{code:"PM",name:"Paramaribo"},9:{code:"SA",name:"Saramacca"},10:{code:"SI",name:"Sipaliwini"},11:{code:"WA",name:"Wanica"}},SZ:{1:{code:"H",name:"Hhohho"},2:{code:"L",name:"Lubombo"},3:{code:"M",name:"Manzini"},4:{code:"S",name:"Shishelweni"}},SE:{1:{code:"K",name:"Blekinge"},2:{code:"W",name:"Dalama"},3:{code:"I",name:"Gotland"},4:{code:"X",name:"Gävleborg"},5:{code:"N",name:"Halland"},6:{code:"Z",name:"Jämtland"},7:{code:"F",name:"Jönköping"},8:{code:"H",name:"Kalmar"},9:{code:"G",name:"Kronoberg"},10:{code:"BD",name:"Norrbotten"},11:{code:"M",name:"Skåne"},12:{code:"AB",name:"Stockholm"},13:{code:"D",name:"Södermanland"},14:{code:"C",name:"Uppsala"},15:{code:"S",name:"Värmland"},16:{code:"AC",name:"Västerbotten"},17:{code:"Y",name:"Västernorrland"},18:{code:"U",name:"Västmanland"},19:{code:"O",name:"Västra Götaland"},20:{code:"T",name:"Örebro"},21:{code:"E",name:"Östergötland"}},CH:{1:{code:"AG",name:"Aargau"},2:{code:"AR",name:"Appenzell Ausserrhoden"},3:{code:"AI",name:"Appenzell Innerrhoden"},4:{code:"BS",name:"Basel-Stadt"},5:{code:"BL",name:"Basel-Landschaft"},6:{code:"BE",name:"Bern"},7:{code:"FR",name:"Fribourg"},8:{code:"GE",name:"Genève"},9:{code:"GL",name:"Glarus"},10:{code:"GR",name:"Graubünden"},11:{code:"JU",name:"Jura"},12:{code:"LU",name:"Lucerne"},13:{code:"NE",name:"Neuchâtel"},14:{code:"NW",name:"Nidwalden"},15:{code:"OW",name:"Obwalden"},16:{code:"SG",name:"St. Gallen"},17:{code:"SH",name:"Schaffhausen"},18:{code:"SZ",name:"Schwyz"},19:{code:"SO",name:"Solothurn"},20:{code:"TG",name:"Thurgau"},21:{code:"TI",name:"Ticino"},22:{code:"UR",name:"Uri"},23:{code:"VS",name:"Valais"},24:{code:"VD",name:"Vaud"},25:{code:"ZG",name:"Zug"},26:{code:"ZH",name:"Zürich"}},SY:{1:{code:"HA",name:"Al Hasakah"},2:{code:"LA",name:"Al Ladhiqiyah"},3:{code:"QU",name:"Al Qunaytirah"},4:{code:"RQ",name:"Ar Raqqah"},5:{code:"SU",name:"As Suwayda"},6:{code:"DA",name:"Dara"},7:{code:"DZ",name:"Dayr az Zawr"},8:{code:"DI",name:"Dimashq"},9:{code:"HL",name:"Halab"},10:{code:"HM",name:"Hamah"},11:{code:"HI",name:"Hims"},12:{code:"ID",name:"Idlib"},13:{code:"RD",name:"Rif Dimashq"},14:{code:"TA",name:"Tartus"}},TW:{1:{code:"CH",name:"Chang-hua"},2:{code:"CI",name:"Chia-i"},3:{code:"HS",name:"Hsin-chu"},4:{code:"HL",name:"Hua-lien"},5:{code:"IL",name:"I-lan"},6:{code:"KH",name:"Kao-hsiung county"},7:{code:"KM",name:"Kin-men"},8:{code:"LC",name:"Lien-chiang"},9:{code:"ML",name:"Miao-li"},10:{code:"NT",name:"Nan-t'ou"},11:{code:"PH",name:"P'eng-hu"},12:{code:"PT",name:"P'ing-tung"},13:{code:"TG",name:"T'ai-chung"},14:{code:"TA",name:"T'ai-nan"},15:{code:"TP",name:"T'ai-pei county"},16:{code:"TT",name:"T'ai-tung"},17:{code:"TY",name:"T'ao-yuan"},18:{code:"YL",name:"Yun-lin"},19:{code:"CC",name:"Chia-i city"},20:{code:"CL",name:"Chi-lung"},21:{code:"HC",name:"Hsin-chu"},22:{code:"TH",name:"T'ai-chung"},23:{code:"TN",name:"T'ai-nan"},24:{code:"KC",name:"Kao-hsiung city"},25:{code:"TC",name:"T'ai-pei city"}},TJ:{1:{code:"GB",name:"Gorno-Badakhstan"},2:{code:"KT",name:"Khatlon"},3:{code:"SU",name:"Sughd"}},TZ:{1:{code:"AR",name:"Arusha"},2:{code:"DS",name:"Dar es Salaam"},3:{code:"DO",name:"Dodoma"},4:{code:"IR",name:"Iringa"},5:{code:"KA",name:"Kagera"},6:{code:"KI",name:"Kigoma"},7:{code:"KJ",name:"Kilimanjaro"},8:{code:"LN",name:"Lindi"},9:{code:"MY",name:"Manyara"},10:{code:"MR",name:"Mara"},11:{code:"MB",name:"Mbeya"},12:{code:"MO",name:"Morogoro"},13:{code:"MT",name:"Mtwara"},14:{code:"MW",name:"Mwanza"},15:{code:"PN",name:"Pemba North"},16:{code:"PS",name:"Pemba South"},17:{code:"PW",name:"Pwani"},18:{code:"RK",name:"Rukwa"},19:{code:"RV",name:"Ruvuma"},20:{code:"SH",name:"Shinyanga"},21:{code:"SI",name:"Singida"},22:{code:"TB",name:"Tabora"},23:{code:"TN",name:"Tanga"},24:{code:"ZC",name:"Zanzibar Central/South"},25:{code:"ZN",name:"Zanzibar North"},26:{code:"ZU",name:"Zanzibar Urban/West"}},TH:{1:{code:"Amnat Charoen",name:"Amnat Charoen"},2:{code:"Ang Thong",name:"Ang Thong"},3:{code:"Ayutthaya",name:"Ayutthaya"},4:{code:"Bangkok",name:"Bangkok"},5:{code:"Buriram",name:"Buriram"},6:{code:"Chachoengsao",name:"Chachoengsao"},7:{code:"Chai Nat",name:"Chai Nat"},8:{code:"Chaiyaphum",name:"Chaiyaphum"},9:{code:"Chanthaburi",name:"Chanthaburi"},10:{code:"Chiang Mai",name:"Chiang Mai"},11:{code:"Chiang Rai",name:"Chiang Rai"},12:{code:"Chon Buri",name:"Chon Buri"},13:{code:"Chumphon",name:"Chumphon"},14:{code:"Kalasin",name:"Kalasin"},15:{code:"Kamphaeng Phet",name:"Kamphaeng Phet"},16:{code:"Kanchanaburi",name:"Kanchanaburi"},17:{code:"Khon Kaen",name:"Khon Kaen"},18:{code:"Krabi",name:"Krabi"},19:{code:"Lampang",name:"Lampang"},20:{code:"Lamphun",name:"Lamphun"},21:{code:"Loei",name:"Loei"},22:{code:"Lop Buri",name:"Lop Buri"},23:{code:"Mae Hong Son",name:"Mae Hong Son"},24:{code:"Maha Sarakham",name:"Maha Sarakham"},25:{code:"Mukdahan",name:"Mukdahan"},26:{code:"Nakhon Nayok",name:"Nakhon Nayok"},27:{code:"Nakhon Pathom",name:"Nakhon Pathom"},28:{code:"Nakhon Phanom",name:"Nakhon Phanom"},29:{code:"Nakhon Ratchasima",name:"Nakhon Ratchasima"},30:{code:"Nakhon Sawan",name:"Nakhon Sawan"},31:{code:"Nakhon Si Thammarat",name:"Nakhon Si Thammarat"},32:{code:"Nan",name:"Nan"},33:{code:"Narathiwat",name:"Narathiwat"},34:{code:"Nong Bua Lamphu",name:"Nong Bua Lamphu"},35:{code:"Nong Khai",name:"Nong Khai"},36:{code:"Nonthaburi",name:"Nonthaburi"},37:{code:"Pathum Thani",name:"Pathum Thani"},38:{code:"Pattani",name:"Pattani"},39:{code:"Phangnga",name:"Phangnga"},40:{code:"Phatthalung",name:"Phatthalung"},41:{code:"Phayao",name:"Phayao"},42:{code:"Phetchabun",name:"Phetchabun"},43:{code:"Phetchaburi",name:"Phetchaburi"},44:{code:"Phichit",name:"Phichit"},45:{code:"Phitsanulok",name:"Phitsanulok"},46:{code:"Phrae",name:"Phrae"},47:{code:"Phuket",name:"Phuket"},48:{code:"Prachin Buri",name:"Prachin Buri"},49:{code:"Prachuap Khiri Khan",name:"Prachuap Khiri Khan"},50:{code:"Ranong",name:"Ranong"},51:{code:"Ratchaburi",name:"Ratchaburi"},52:{code:"Rayong",name:"Rayong"},53:{code:"Roi Et",name:"Roi Et"},54:{code:"Sa Kaeo",name:"Sa Kaeo"},55:{code:"Sakon Nakhon",name:"Sakon Nakhon"},56:{code:"Samut Prakan",name:"Samut Prakan"},57:{code:"Samut Sakhon",name:"Samut Sakhon"},58:{code:"Samut Songkhram",name:"Samut Songkhram"},59:{code:"Sara Buri",name:"Sara Buri"},60:{code:"Satun",name:"Satun"},61:{code:"Sing Buri",name:"Sing Buri"},62:{code:"Sisaket",name:"Sisaket"},63:{code:"Songkhla",name:"Songkhla"},64:{code:"Sukhothai",name:"Sukhothai"},65:{code:"Suphan Buri",name:"Suphan Buri"},66:{code:"Surat Thani",name:"Surat Thani"},67:{code:"Surin",name:"Surin"},68:{code:"Tak",name:"Tak"},69:{code:"Trang",name:"Trang"},70:{code:"Trat",name:"Trat"},71:{code:"Ubon Ratchathani",name:"Ubon Ratchathani"},72:{code:"Udon Thani",name:"Udon Thani"},73:{code:"Uthai Thani",name:"Uthai Thani"},74:{code:"Uttaradit",name:"Uttaradit"},75:{code:"Yala",name:"Yala"},76:{code:"Yasothon",name:"Yasothon"}},TG:{1:{code:"K",name:"Kara"},2:{code:"P",name:"Plateaux"},3:{code:"S",name:"Savanes"},4:{code:"C",name:"Centrale"},5:{code:"M",name:"Maritime"}},TK:{1:{code:"A",name:"Atafu"},2:{code:"F",name:"Fakaofo"},3:{code:"N",name:"Nukunonu"}},TO:{1:{code:"H",name:"Ha'apai"},2:{code:"T",name:"Tongatapu"},3:{code:"V",name:"Vava'u"}},TT:{1:{code:"CT",name:"Couva/Tabaquite/Talparo"},2:{code:"DM",name:"Diego Martin"},3:{code:"MR",name:"Mayaro/Rio Claro"},4:{code:"PD",name:"Penal/Debe"},5:{code:"PT",name:"Princes Town"},6:{code:"SG",name:"Sangre Grande"},7:{code:"SL",name:"San Juan/Laventille"},8:{code:"SI",name:"Siparia"},9:{code:"TP",name:"Tunapuna/Piarco"},10:{code:"PS",name:"Port of Spain"},11:{code:"SF",name:"San Fernando"},12:{code:"AR",name:"Arima"},13:{code:"PF",name:"Point Fortin"},14:{code:"CH",name:"Chaguanas"},15:{code:"TO",name:"Tobago"}},TN:{1:{code:"AR",name:"Ariana"},2:{code:"BJ",name:"Beja"},3:{code:"BA",name:"Ben Arous"},4:{code:"BI",name:"Bizerte"},5:{code:"GB",name:"Gabes"},6:{code:"GF",name:"Gafsa"},7:{code:"JE",name:"Jendouba"},8:{code:"KR",name:"Kairouan"},9:{code:"KS",name:"Kasserine"},10:{code:"KB",name:"Kebili"},11:{code:"KF",name:"Kef"},12:{code:"MH",name:"Mahdia"},13:{code:"MN",name:"Manouba"},14:{code:"ME",name:"Medenine"},15:{code:"MO",name:"Monastir"},16:{code:"NA",name:"Nabeul"},17:{code:"SF",name:"Sfax"},18:{code:"SD",name:"Sidi"},19:{code:"SL",name:"Siliana"},20:{code:"SO",name:"Sousse"},21:{code:"TA",name:"Tataouine"},22:{code:"TO",name:"Tozeur"},23:{code:"TU",name:"Tunis"},24:{code:"ZA",name:"Zaghouan"}},TR:{1:{code:"ADA",name:"Adana"},2:{code:"ADI",name:"Adiyaman"},3:{code:"AFY",name:"Afyonkarahisar"},4:{code:"AGR",name:"Agri"},5:{code:"AKS",name:"Aksaray"},6:{code:"AMA",name:"Amasya"},7:{code:"ANK",name:"Ankara"},8:{code:"ANT",name:"Antalya"},9:{code:"ARD",name:"Ardahan"},10:{code:"ART",name:"Artvin"},11:{code:"AYI",name:"Aydin"},12:{code:"BAL",name:"Balikesir"},13:{code:"BAR",name:"Bartin"},14:{code:"BAT",name:"Batman"},15:{code:"BAY",name:"Bayburt"},16:{code:"BIL",name:"Bilecik"},17:{code:"BIN",name:"Bingol"},18:{code:"BIT",name:"Bitlis"},19:{code:"BOL",name:"Bolu"},20:{code:"BRD",name:"Burdur"},21:{code:"BRS",name:"Bursa"},22:{code:"CKL",name:"Canakkale"},23:{code:"CKR",name:"Cankiri"},24:{code:"COR",name:"Corum"},25:{code:"DEN",name:"Denizli"},26:{code:"DIY",name:"Diyarbakir"},27:{code:"DUZ",name:"Duzce"},28:{code:"EDI",name:"Edirne"},29:{code:"ELA",name:"Elazig"},30:{code:"EZC",name:"Erzincan"},31:{code:"EZR",name:"Erzurum"},32:{code:"ESK",name:"Eskisehir"},33:{code:"GAZ",name:"Gaziantep"},34:{code:"GIR",name:"Giresun"},35:{code:"GMS",name:"Gumushane"},36:{code:"HKR",name:"Hakkari"},37:{code:"HTY",name:"Hatay"},38:{code:"IGD",name:"Igdir"},39:{code:"ISP",name:"Isparta"},40:{code:"IST",name:"Istanbul"},41:{code:"IZM",name:"Izmir"},42:{code:"KAH",name:"Kahramanmaras"},43:{code:"KRB",name:"Karabuk"},44:{code:"KRM",name:"Karaman"},45:{code:"KRS",name:"Kars"},46:{code:"KAS",name:"Kastamonu"},47:{code:"KAY",name:"Kayseri"},48:{code:"KLS",name:"Kilis"},49:{code:"KRK",name:"Kirikkale"},50:{code:"KLR",name:"Kirklareli"},51:{code:"KRH",name:"Kirsehir"},52:{code:"KOC",name:"Kocaeli"},53:{code:"KON",name:"Konya"},54:{code:"KUT",name:"Kutahya"},55:{code:"MAL",name:"Malatya"},56:{code:"MAN",name:"Manisa"},57:{code:"MAR",name:"Mardin"},58:{code:"MER",name:"Mersin"},59:{code:"MUG",name:"Mugla"},60:{code:"MUS",name:"Mus"},61:{code:"NEV",name:"Nevsehir"},62:{code:"NIG",name:"Nigde"},63:{code:"ORD",name:"Ordu"},64:{code:"OSM",name:"Osmaniye"},65:{code:"RIZ",name:"Rize"},66:{code:"SAK",name:"Sakarya"},67:{code:"SAM",name:"Samsun"},68:{code:"SAN",name:"Sanliurfa"},69:{code:"SII",name:"Siirt"},70:{code:"SIN",name:"Sinop"},71:{code:"SIR",name:"Sirnak"},72:{code:"SIV",name:"Sivas"},73:{code:"TEL",name:"Tekirdag"},74:{code:"TOK",name:"Tokat"},75:{code:"TRA",name:"Trabzon"},76:{code:"TUN",name:"Tunceli"},77:{code:"USK",name:"Usak"},78:{code:"VAN",name:"Van"},79:{code:"YAL",name:"Yalova"},80:{code:"YOZ",name:"Yozgat"},81:{code:"ZON",name:"Zonguldak"}},TM:{1:{code:"A",name:"Ahal Welayaty"},2:{code:"B",name:"Balkan Welayaty"},3:{code:"D",name:"Dashhowuz Welayaty"},4:{code:"L",name:"Lebap Welayaty"},5:{code:"M",name:"Mary Welayaty"}},TC:{1:{code:"AC",name:"Ambergris Cays"},2:{code:"DC",name:"Dellis Cay"},3:{code:"FC",name:"French Cay"},4:{code:"LW",name:"Little Water Cay"},5:{code:"RC",name:"Parrot Cay"},6:{code:"PN",name:"Pine Cay"},7:{code:"SL",name:"Salt Cay"},8:{code:"GT",name:"Grand Turk"},9:{code:"SC",name:"South Caicos"},10:{code:"EC",name:"East Caicos"},11:{code:"MC",name:"Middle Caicos"},12:{code:"NC",name:"North Caicos"},13:{code:"PR",name:"Providenciales"},14:{code:"WC",name:"West Caicos"}},TV:{1:{code:"NMG",name:"Nanumanga"},2:{code:"NLK",name:"Niulakita"},3:{code:"NTO",name:"Niutao"},4:{code:"FUN",name:"Funafuti"},5:{code:"NME",name:"Nanumea"},6:{code:"NUI",name:"Nui"},7:{code:"NFT",name:"Nukufetau"},8:{code:"NLL",name:"Nukulaelae"},9:{code:"VAI",name:"Vaitupu"}},UG:{1:{code:"KAL",name:"Kalangala"},2:{code:"KMP",name:"Kampala"},3:{code:"KAY",name:"Kayunga"},4:{code:"KIB",name:"Kiboga"},5:{code:"LUW",name:"Luwero"},6:{code:"MAS",name:"Masaka"},7:{code:"MPI",name:"Mpigi"},8:{code:"MUB",name:"Mubende"},9:{code:"MUK",name:"Mukono"},10:{code:"NKS",name:"Nakasongola"},11:{code:"RAK",name:"Rakai"},12:{code:"SEM",name:"Sembabule"},13:{code:"WAK",name:"Wakiso"},14:{code:"BUG",name:"Bugiri"},15:{code:"BUS",name:"Busia"},16:{code:"IGA",name:"Iganga"},17:{code:"JIN",name:"Jinja"},18:{code:"KAB",name:"Kaberamaido"},19:{code:"KML",name:"Kamuli"},20:{code:"KPC",name:"Kapchorwa"},21:{code:"KTK",name:"Katakwi"},22:{code:"KUM",name:"Kumi"},23:{code:"MAY",name:"Mayuge"},24:{code:"MBA",name:"Mbale"},25:{code:"PAL",name:"Pallisa"},26:{code:"SIR",name:"Sironko"},27:{code:"SOR",name:"Soroti"},28:{code:"TOR",name:"Tororo"},29:{code:"ADJ",name:"Adjumani"},30:{code:"APC",name:"Apac"},31:{code:"ARU",name:"Arua"},32:{code:"GUL",name:"Gulu"},33:{code:"KIT",name:"Kitgum"},34:{code:"KOT",name:"Kotido"},35:{code:"LIR",name:"Lira"},36:{code:"MRT",name:"Moroto"},37:{code:"MOY",name:"Moyo"},38:{code:"NAK",name:"Nakapiripirit"},39:{code:"NEB",name:"Nebbi"},40:{code:"PAD",name:"Pader"},41:{code:"YUM",name:"Yumbe"},42:{code:"BUN",name:"Bundibugyo"},43:{code:"BSH",name:"Bushenyi"},44:{code:"HOI",name:"Hoima"},45:{code:"KBL",name:"Kabale"},46:{code:"KAR",name:"Kabarole"},47:{code:"KAM",name:"Kamwenge"},48:{code:"KAN",name:"Kanungu"},49:{code:"KAS",name:"Kasese"},50:{code:"KBA",name:"Kibaale"},51:{code:"KIS",name:"Kisoro"},52:{code:"KYE",name:"Kyenjojo"},53:{code:"MSN",name:"Masindi"},54:{code:"MBR",name:"Mbarara"},55:{code:"NTU",name:"Ntungamo"},56:{code:"RUK",name:"Rukungiri"}},UA:{1:{code:"CK",name:"Cherkasy"},2:{code:"CH",name:"Chernihiv"},3:{code:"CV",name:"Chernivtsi"},4:{code:"CR",name:"Crimea"},5:{code:"DN",name:"Dnipropetrovs'k"},6:{code:"DO",name:"Donets'k"},7:{code:"IV",name:"Ivano-Frankivs'k"},8:{code:"KL",name:"Kharkiv Kherson"},9:{code:"KM",name:"Khmel'nyts'kyy"},10:{code:"KR",name:"Kirovohrad"},11:{code:"KV",name:"Kiev"},12:{code:"KY",name:"Kyyiv"},13:{code:"LU",name:"Luhans'k"},14:{code:"LV",name:"L'viv"},15:{code:"MY",name:"Mykolayiv"},16:{code:"OD",name:"Odesa"},17:{code:"PO",name:"Poltava"},18:{code:"RI",name:"Rivne"},19:{code:"SE",name:"Sevastopol"},20:{code:"SU",name:"Sumy"},21:{code:"TE",name:"Ternopil'"},22:{code:"VI",name:"Vinnytsya"},23:{code:"VO",name:"Volyn'"},24:{code:"ZK",name:"Zakarpattya"},25:{code:"ZA",name:"Zaporizhzhya"},26:{code:"ZH",name:"Zhytomyr"}},AE:{1:{code:"AZ",name:"Abu Zaby"},2:{code:"AJ",name:"'Ajman"},3:{code:"FU",name:"Al Fujayrah"},4:{code:"SH",name:"Ash Shariqah"},5:{code:"DU",name:"Dubayy"},6:{code:"RK",name:"R'as al Khaymah"},7:{code:"UQ",name:"Umm al Qaywayn"}},GB:{1:{code:"ABN",name:"Aberdeen"},2:{code:"ABNS",name:"Aberdeenshire"},3:{code:"ANG",name:"Anglesey"},4:{code:"AGS",name:"Angus"},5:{code:"ARY",name:"Argyll and Bute"},6:{code:"BEDS",name:"Bedfordshire"},7:{code:"BERKS",name:"Berkshire"},8:{code:"BLA",name:"Blaenau Gwent"},9:{code:"BRI",name:"Bridgend"},10:{code:"BSTL",name:"Bristol"},11:{code:"BUCKS",name:"Buckinghamshire"},12:{code:"CAE",name:"Caerphilly"},13:{code:"CAMBS",name:"Cambridgeshire"},14:{code:"CDF",name:"Cardiff"},15:{code:"CARM",name:"Carmarthenshire"},16:{code:"CDGN",name:"Ceredigion"},17:{code:"CHES",name:"Cheshire"},18:{code:"CLACK",name:"Clackmannanshire"},19:{code:"CON",name:"Conwy"},20:{code:"CORN",name:"Cornwall"},21:{code:"DNBG",name:"Denbighshire"},22:{code:"DERBY",name:"Derbyshire"},23:{code:"DVN",name:"Devon"},24:{code:"DOR",name:"Dorset"},25:{code:"DGL",name:"Dumfries and Galloway"},26:{code:"DUND",name:"Dundee"},27:{code:"DHM",name:"Durham"},28:{code:"ARYE",name:"East Ayrshire"},29:{code:"DUNBE",name:"East Dunbartonshire"},30:{code:"LOTE",name:"East Lothian"},31:{code:"RENE",name:"East Renfrewshire"},32:{code:"ERYS",name:"East Riding of Yorkshire"},33:{code:"SXE",name:"East Sussex"},34:{code:"EDIN",name:"Edinburgh"},35:{code:"ESX",name:"Essex"},36:{code:"FALK",name:"Falkirk"},37:{code:"FFE",name:"Fife"},38:{code:"FLINT",name:"Flintshire"},39:{code:"GLAS",name:"Glasgow"},40:{code:"GLOS",name:"Gloucestershire"},41:{code:"LDN",name:"Greater London"},42:{code:"MCH",name:"Greater Manchester"},43:{code:"GDD",name:"Gwynedd"},44:{code:"HANTS",name:"Hampshire"},45:{code:"HWR",name:"Herefordshire"},46:{code:"HERTS",name:"Hertfordshire"},47:{code:"HLD",name:"Highlands"},48:{code:"IVER",name:"Inverclyde"},49:{code:"IOW",name:"Isle of Wight"},50:{code:"KNT",name:"Kent"},51:{code:"LANCS",name:"Lancashire"},52:{code:"LEICS",name:"Leicestershire"},53:{code:"LINCS",name:"Lincolnshire"},54:{code:"MSY",name:"Merseyside"},55:{code:"MERT",name:"Merthyr Tydfil"},56:{code:"MLOT",name:"Midlothian"},57:{code:"MMOUTH",name:"Monmouthshire"},58:{code:"MORAY",name:"Moray"},59:{code:"NPRTAL",name:"Neath Port Talbot"},60:{code:"NEWPT",name:"Newport"},61:{code:"NOR",name:"Norfolk"},62:{code:"ARYN",name:"North Ayrshire"},63:{code:"LANN",name:"North Lanarkshire"},64:{code:"YSN",name:"North Yorkshire"},65:{code:"NHM",name:"Northamptonshire"},66:{code:"NLD",name:"Northumberland"},67:{code:"NOT",name:"Nottinghamshire"},68:{code:"ORK",name:"Orkney Islands"},69:{code:"OFE",name:"Oxfordshire"},70:{code:"PEM",name:"Pembrokeshire"},71:{code:"PERTH",name:"Perth and Kinross"},72:{code:"PWS",name:"Powys"},73:{code:"REN",name:"Renfrewshire"},74:{code:"RHON",name:"Rhondda Cynon Taff"},75:{code:"RUT",name:"Rutland"},76:{code:"BOR",name:"Scottish Borders"},77:{code:"SHET",name:"Shetland Islands"},78:{code:"SPE",name:"Shropshire"},79:{code:"SOM",name:"Somerset"},80:{code:"ARYS",name:"South Ayrshire"},81:{code:"LANS",name:"South Lanarkshire"},82:{code:"YSS",name:"South Yorkshire"},83:{code:"SFD",name:"Staffordshire"},84:{code:"STIR",name:"Stirling"},85:{code:"SFK",name:"Suffolk"},86:{code:"SRY",name:"Surrey"},87:{code:"SWAN",name:"Swansea"},88:{code:"TORF",name:"Torfaen"},89:{code:"TWR",name:"Tyne and Wear"},90:{code:"VGLAM",name:"Vale of Glamorgan"},91:{code:"WARKS",name:"Warwickshire"},92:{code:"WDUN",name:"West Dunbartonshire"},93:{code:"WLOT",name:"West Lothian"},94:{code:"WMD",name:"West Midlands"},95:{code:"SXW",name:"West Sussex"},96:{code:"YSW",name:"West Yorkshire"},97:{code:"WIL",name:"Western Isles"},98:{code:"WLT",name:"Wiltshire"},99:{code:"WORCS",name:"Worcestershire"},100:{code:"WRX",name:"Wrexham"}},US:{1:{code:"AL",name:"Alabama"},2:{code:"AK",name:"Alaska"},3:{code:"AS",name:"American Samoa"},4:{code:"AZ",name:"Arizona"},5:{code:"AR",name:"Arkansas"},6:{code:"AF",name:"Armed Forces Africa"},7:{code:"AA",name:"Armed Forces Americas"},8:{code:"AC",name:"Armed Forces Canada"},9:{code:"AE",name:"Armed Forces Europe"},10:{code:"AM",name:"Armed Forces Middle East"},11:{code:"AP",name:"Armed Forces Pacific"},12:{code:"CA",name:"California"},13:{code:"CO",name:"Colorado"},14:{code:"CT",name:"Connecticut"},15:{code:"DE",name:"Delaware"},16:{code:"DC",name:"District of Columbia"},17:{code:"FM",name:"Federated States Of Micronesia"},18:{code:"FL",name:"Florida"},19:{code:"GA",name:"Georgia"},20:{code:"GU",name:"Guam"},21:{code:"HI",name:"Hawaii"},22:{code:"ID",name:"Idaho"},23:{code:"IL",name:"Illinois"},24:{code:"IN",name:"Indiana"},25:{code:"IA",name:"Iowa"},26:{code:"KS",name:"Kansas"},27:{code:"KY",name:"Kentucky"},28:{code:"LA",name:"Louisiana"},29:{code:"ME",name:"Maine"},30:{code:"MH",name:"Marshall Islands"},31:{code:"MD",name:"Maryland"},32:{code:"MA",name:"Massachusetts"},33:{code:"MI",name:"Michigan"},34:{code:"MN",name:"Minnesota"},35:{code:"MS",name:"Mississippi"},36:{code:"MO",name:"Missouri"},37:{code:"MT",name:"Montana"},38:{code:"NE",name:"Nebraska"},39:{code:"NV",name:"Nevada"},40:{code:"NH",name:"New Hampshire"},41:{code:"NJ",name:"New Jersey"},42:{code:"NM",name:"New Mexico"},43:{code:"NY",name:"New York"},44:{code:"NC",name:"North Carolina"},45:{code:"ND",name:"North Dakota"},46:{code:"MP",name:"Northern Mariana Islands"},47:{code:"OH",name:"Ohio"},48:{code:"OK",name:"Oklahoma"},49:{code:"OR",name:"Oregon"},50:{code:"PW",name:"Palau"},51:{code:"PA",name:"Pennsylvania"},52:{code:"PR",name:"Puerto Rico"},53:{code:"RI",name:"Rhode Island"},54:{code:"SC",name:"South Carolina"},55:{code:"SD",name:"South Dakota"},56:{code:"TN",name:"Tennessee"},57:{code:"TX",name:"Texas"},58:{code:"UT",name:"Utah"},59:{code:"VT",name:"Vermont"},60:{code:"VI",name:"Virgin Islands"},61:{code:"VA",name:"Virginia"},62:{code:"WA",name:"Washington"},63:{code:"WV",name:"West Virginia"},64:{code:"WI",name:"Wisconsin"},65:{code:"WY",name:"Wyoming"}},UM:{1:{code:"BI",name:"Baker Island"},2:{code:"HI",name:"Howland Island"},3:{code:"JI",name:"Jarvis Island"},4:{code:"JA",name:"Johnston Atoll"},5:{code:"KR",name:"Kingman Reef"},6:{code:"MA",name:"Midway Atoll"},7:{code:"NI",name:"Navassa Island"},8:{code:"PA",name:"Palmyra Atoll"},9:{code:"WI",name:"Wake Island"}},UY:{1:{code:"AR",name:"Artigas"},2:{code:"CA",name:"Canelones"},3:{code:"CL",name:"Cerro Largo"},4:{code:"CO",name:"Colonia"},5:{code:"DU",name:"Durazno"},6:{code:"FS",name:"Flores"},7:{code:"FA",name:"Florida"},8:{code:"LA",name:"Lavalleja"},9:{code:"MA",name:"Maldonado"},10:{code:"MO",name:"Montevideo"},11:{code:"PA",name:"Paysandu"},12:{code:"RN",name:"Rio Negro"},13:{code:"RV",name:"Rivera"},14:{code:"RO",name:"Rocha"},15:{code:"SL",name:"Salto"},16:{code:"SJ",name:"San Jose"},17:{code:"SO",name:"Soriano"},18:{code:"TA",name:"Tacuarembo"},19:{code:"TT",name:"Treinta y Tres"}},UZ:{1:{code:"AN",name:"Andijon"},2:{code:"BU",name:"Buxoro"},3:{code:"FA",name:"Farg'ona"},4:{code:"JI",name:"Jizzax"},5:{code:"NG",name:"Namangan"},6:{code:"NW",name:"Navoiy"},7:{code:"QA",name:"Qashqadaryo"},8:{code:"QR",name:"Qoraqalpog'iston Republikasi"},9:{code:"SA",name:"Samarqand"},10:{code:"SI",name:"Sirdaryo"},11:{code:"SU",name:"Surxondaryo"},12:{code:"TK",name:"Toshkent City"},13:{code:"TO",name:"Toshkent Region"},14:{code:"XO",name:"Xorazm"}},VU:{1:{code:"MA",name:"Malampa"},2:{code:"PE",name:"Penama"},3:{code:"SA",name:"Sanma"},4:{code:"SH",name:"Shefa"},5:{code:"TA",name:"Tafea"},6:{code:"TO",name:"Torba"}},VE:{1:{code:"AM",name:"Amazonas"},2:{code:"AN",name:"Anzoategui"},3:{code:"AP",name:"Apure"},4:{code:"AR",name:"Aragua"},5:{code:"BA",name:"Barinas"},6:{code:"BO",name:"Bolivar"},7:{code:"CA",name:"Carabobo"},8:{code:"CO",name:"Cojedes"},9:{code:"DA",name:"Delta Amacuro"},10:{code:"DF",name:"Dependencias Federales"},11:{code:"DI",name:"Distrito Federal"},12:{code:"FA",name:"Falcon"},13:{code:"GU",name:"Guarico"},14:{code:"LA",name:"Lara"},15:{code:"ME",name:"Merida"},16:{code:"MI",name:"Miranda"},17:{code:"MO",name:"Monagas"},18:{code:"NE",name:"Nueva Esparta"},19:{code:"PO",name:"Portuguesa"},20:{code:"SU",name:"Sucre"},21:{code:"TA",name:"Tachira"},22:{code:"TR",name:"Trujillo"},23:{code:"VA",name:"Vargas"},24:{code:"YA",name:"Yaracuy"},25:{code:"ZU",name:"Zulia"}},VN:{1:{code:"AG",name:"An Giang"},2:{code:"BG",name:"Bac Giang"},3:{code:"BK",name:"Bac Kan"},4:{code:"BL",name:"Bac Lieu"},5:{code:"BC",name:"Bac Ninh"},6:{code:"BR",name:"Ba Ria-Vung Tau"},7:{code:"BN",name:"Ben Tre"},8:{code:"BH",name:"Binh Dinh"},9:{code:"BU",name:"Binh Duong"},10:{code:"BP",name:"Binh Phuoc"},11:{code:"BT",name:"Binh Thuan"},12:{code:"CM",name:"Ca Mau"},13:{code:"CT",name:"Can Tho"},14:{code:"CB",name:"Cao Bang"},15:{code:"DL",name:"Dak Lak"},16:{code:"DG",name:"Dak Nong"},17:{code:"DN",name:"Da Nang"},18:{code:"DB",name:"Dien Bien"},19:{code:"DI",name:"Dong Nai"},20:{code:"DT",name:"Dong Thap"},21:{code:"GL",name:"Gia Lai"},22:{code:"HG",name:"Ha Giang"},23:{code:"HD",name:"Hai Duong"},24:{code:"HP",name:"Hai Phong"},25:{code:"HM",name:"Ha Nam"},26:{code:"HI",name:"Ha Noi"},27:{code:"HT",name:"Ha Tay"},28:{code:"HH",name:"Ha Tinh"},29:{code:"HB",name:"Hoa Binh"},30:{code:"HC",name:"Ho Chin Minh"},31:{code:"HU",name:"Hau Giang"},32:{code:"HY",name:"Hung Yen"}},VI:{1:{code:"C",name:"Saint Croix"},2:{code:"J",name:"Saint John"},3:{code:"T",name:"Saint Thomas"}},WF:{1:{code:"A",name:"Alo"},2:{code:"S",name:"Sigave"},3:{code:"W",name:"Wallis"}},YE:{1:{code:"AB",name:"Abyan"},2:{code:"AD",name:"Adan"},3:{code:"AM",name:"Amran"},4:{code:"BA",name:"Al Bayda"},5:{code:"DA",name:"Ad Dali"},6:{code:"DH",name:"Dhamar"},7:{code:"HD",name:"Hadramawt"},8:{code:"HJ",name:"Hajjah"},9:{code:"HU",name:"Al Hudaydah"},10:{code:"IB",name:"Ibb"},11:{code:"JA",name:"Al Jawf"},12:{code:"LA",name:"Lahij"},13:{code:"MA",name:"Ma'rib"},14:{code:"MR",name:"Al Mahrah"},15:{code:"MW",name:"Al Mahwit"},16:{code:"SD",name:"Sa'dah"},17:{code:"SN",name:"San'a"},18:{code:"SH",name:"Shabwah"},19:{code:"TA",name:"Ta'izz"}},YU:{1:{code:"KOS",name:"Kosovo"},2:{code:"MON",name:"Montenegro"},3:{code:"SER",name:"Serbia"},4:{code:"VOJ",name:"Vojvodina"}},ZR:{1:{code:"BC",name:"Bas-Congo"},2:{code:"BN",name:"Bandundu"},3:{code:"EQ",name:"Equateur"},4:{code:"KA",name:"Katanga"},5:{code:"KE",name:"Kasai-Oriental"},6:{code:"KN",name:"Kinshasa"},7:{code:"KW",name:"Kasai-Occidental"},8:{code:"MA",name:"Maniema"},9:{code:"NK",name:"Nord-Kivu"},10:{code:"OR",name:"Orientale"},11:{code:"SK",name:"Sud-Kivu"}},ZM:{1:{code:"CE",name:"Central"},2:{code:"CB",name:"Copperbelt"},3:{code:"EA",name:"Eastern"},4:{code:"LP",name:"Luapula"},5:{code:"LK",name:"Lusaka"},6:{code:"NO",name:"Northern"},7:{code:"NW",name:"North-Western"},8:{code:"SO",name:"Southern"},9:{code:"WE",name:"Western"}},ZW:{1:{code:"BU",name:"Bulawayo"},2:{code:"HA",name:"Harare"},3:{code:"ML",name:"Manicaland"},4:{code:"MC",name:"Mashonaland Central"},5:{code:"ME",name:"Mashonaland East"},6:{code:"MW",name:"Mashonaland West"},7:{code:"MV",name:"Masvingo"},8:{code:"MN",name:"Matabeleland North"},9:{code:"MS",name:"Matabeleland South"},10:{code:"MD",name:"Midlands"}}},BFHTimePickerDelimiter=":",BFHTimePickerModes={am:"AM",pm:"PM"},BFHTimezonesList={AF:{"Asia/Kabul":"Kabul"},AL:{"Europe/Tirane":"Tirane"},DZ:{"Africa/Algiers":"Algiers"},AS:{"Pacific/Pago_Pago":"Pago Pago"},AD:{"Europe/Andorra":"Andorra"},AO:{"Africa/Luanda":"Luanda"},AI:{"America/Anguilla":"Anguilla"},AQ:{"Antarctica/Casey":"Casey","Antarctica/Davis":"Davis","Antarctica/DumontDUrville":"DumontDUrville","Antarctica/Macquarie":"Macquarie","Antarctica/Mawson":"Mawson","Antarctica/McMurdo":"McMurdo","Antarctica/Palmer":"Palmer","Antarctica/Rothera":"Rothera","Antarctica/South_Pole":"South Pole","Antarctica/Syowa":"Syowa","Antarctica/Vostok":"Vostok"},AG:{"America/Antigua":"Antigua"},AR:{"America/Argentina/Buenos_Aires":"Argentina / Buenos Aires","America/Argentina/Catamarca":"Argentina / Catamarca","America/Argentina/Cordoba":"Argentina / Cordoba","America/Argentina/Jujuy":"Argentina / Jujuy","America/Argentina/La_Rioja":"Argentina / La Rioja","America/Argentina/Mendoza":"Argentina / Mendoza","America/Argentina/Rio_Gallegos":"Argentina / Rio Gallegos","America/Argentina/Salta":"Argentina / Salta","America/Argentina/San_Juan":"Argentina / San Juan","America/Argentina/San_Luis":"Argentina / San Luis","America/Argentina/Tucuman":"Argentina / Tucuman","America/Argentina/Ushuaia":"Argentina / Ushuaia"},AM:{"Asia/Yerevan":"Yerevan"},AW:{"America/Aruba":"Aruba"},AU:{"Australia/Adelaide":"Adelaide","Australia/Brisbane":"Brisbane","Australia/Broken_Hill":"Broken Hill","Australia/Currie":"Currie","Australia/Darwin":"Darwin","Australia/Eucla":"Eucla","Australia/Hobart":"Hobart","Australia/Lindeman":"Lindeman","Australia/Lord_Howe":"Lord Howe","Australia/Melbourne":"Melbourne","Australia/Perth":"Perth","Australia/Sydney":"Sydney"},AT:{"Europe/Vienna":"Vienna"},AZ:{"Asia/Baku":"Baku"},BH:{"Asia/Bahrain":"Bahrain"},BD:{"Asia/Dhaka":"Dhaka"},BB:{"America/Barbados":"Barbados"},BY:{"Europe/Minsk":"Minsk"},BE:{"Europe/Brussels":"Brussels"},BZ:{"America/Belize":"Belize"},BJ:{"Africa/Porto-Novo":"Porto-Novo"},BM:{"Atlantic/Bermuda":"Bermuda"},BT:{"Asia/Thimphu":"Thimphu"},BO:{"America/La_Paz":"La Paz"},BA:{"Europe/Sarajevo":"Sarajevo"},BW:{"Africa/Gaborone":"Gaborone"},BR:{"America/Araguaina":"Araguaina","America/Bahia":"Bahia","America/Belem":"Belem","America/Boa_Vista":"Boa Vista","America/Campo_Grande":"Campo Grande","America/Cuiaba":"Cuiaba","America/Eirunepe":"Eirunepe","America/Fortaleza":"Fortaleza","America/Maceio":"Maceio","America/Manaus":"Manaus","America/Noronha":"Noronha","America/Porto_Velho":"Porto Velho","America/Recife":"Recife","America/Rio_Branco":"Rio Branco","America/Santarem":"Santarem","America/Sao_Paulo":"Sao Paulo"},VG:{"America/Tortola":"Tortola"},BN:{"Asia/Brunei":"Brunei"},BG:{"Europe/Sofia":"Sofia"},BF:{"Africa/Ouagadougou":"Ouagadougou"},BI:{"Africa/Bujumbura":"Bujumbura"},CI:{"Africa/Abidjan":"Abidjan"},KH:{"Asia/Phnom_Penh":"Phnom Penh"},CM:{"Africa/Douala":"Douala"},CA:{"America/Atikokan":"Atikokan","America/Blanc-Sablon":"Blanc-Sablon","America/Cambridge_Bay":"Cambridge Bay","America/Creston":"Creston","America/Dawson":"Dawson","America/Dawson_Creek":"Dawson Creek","America/Edmonton":"Edmonton","America/Glace_Bay":"Glace Bay","America/Goose_Bay":"Goose Bay","America/Halifax":"Halifax","America/Inuvik":"Inuvik","America/Iqaluit":"Iqaluit","America/Moncton":"Moncton","America/Montreal":"Montreal","America/Nipigon":"Nipigon","America/Pangnirtung":"Pangnirtung","America/Rainy_River":"Rainy River","America/Rankin_Inlet":"Rankin Inlet","America/Regina":"Regina","America/Resolute":"Resolute","America/St_Johns":"St Johns","America/Swift_Current":"Swift Current","America/Thunder_Bay":"Thunder Bay","America/Toronto":"Toronto","America/Vancouver":"Vancouver","America/Whitehorse":"Whitehorse","America/Winnipeg":"Winnipeg","America/Yellowknife":"Yellowknife"},CV:{"Atlantic/Cape_Verde":"Cape Verde"},KY:{"America/Cayman":"Cayman"},CF:{"Africa/Bangui":"Bangui"},TD:{"Africa/Ndjamena":"Ndjamena"},CL:{"America/Santiago":"Santiago","Pacific/Easter":"Easter"},CN:{"Asia/Chongqing":"Chongqing","Asia/Harbin":"Harbin","Asia/Kashgar":"Kashgar","Asia/Shanghai":"Shanghai","Asia/Urumqi":"Urumqi"},CO:{"America/Bogota":"Bogota"},KM:{"Indian/Comoro":"Comoro"},CG:{"Africa/Brazzaville":"Brazzaville"},CR:{"America/Costa_Rica":"Costa Rica"},HR:{"Europe/Zagreb":"Zagreb"},CU:{"America/Havana":"Havana"},CY:{"Asia/Nicosia":"Nicosia"},CZ:{"Europe/Prague":"Prague"},CD:{"Africa/Kinshasa":"Kinshasa","Africa/Lubumbashi":"Lubumbashi"},DK:{"Europe/Copenhagen":"Copenhagen"},DJ:{"Africa/Djibouti":"Djibouti"},DM:{"America/Dominica":"Dominica"},DO:{"America/Santo_Domingo":"Santo Domingo"},TP:{},EC:{"America/Guayaquil":"Guayaquil","Pacific/Galapagos":"Galapagos"},EG:{"Africa/Cairo":"Cairo"},SV:{"America/El_Salvador":"El Salvador"},GQ:{"Africa/Malabo":"Malabo"},ER:{"Africa/Asmara":"Asmara"},EE:{"Europe/Tallinn":"Tallinn"},ET:{"Africa/Addis_Ababa":"Addis Ababa"},FO:{"Atlantic/Faroe":"Faroe"},FK:{"Atlantic/Stanley":"Stanley"},FJ:{"Pacific/Fiji":"Fiji"},FI:{"Europe/Helsinki":"Helsinki"},MK:{"Europe/Skopje":"Skopje"},FR:{"Europe/Paris":"Paris"},GA:{"Africa/Libreville":"Libreville"},GE:{"Asia/Tbilisi":"Tbilisi"},DE:{"Europe/Berlin":"Berlin"},GH:{"Africa/Accra":"Accra"},GR:{"Europe/Athens":"Athens"},GL:{"America/Danmarkshavn":"Danmarkshavn","America/Godthab":"Godthab","America/Scoresbysund":"Scoresbysund","America/Thule":"Thule"},GD:{"America/Grenada":"Grenada"},GU:{"Pacific/Guam":"Guam"},GT:{"America/Guatemala":"Guatemala"},GN:{"Africa/Conakry":"Conakry"},GW:{"Africa/Bissau":"Bissau"},GY:{"America/Guyana":"Guyana"},HT:{"America/Port-au-Prince":"Port-au-Prince"},HN:{"America/Tegucigalpa":"Tegucigalpa"},HK:{"Asia/Hong_Kong":"Hong Kong"},HU:{"Europe/Budapest":"Budapest"},IS:{"Atlantic/Reykjavik":"Reykjavik"},IN:{"Asia/Kolkata":"Kolkata"},ID:{"Asia/Jakarta":"Jakarta","Asia/Jayapura":"Jayapura","Asia/Makassar":"Makassar","Asia/Pontianak":"Pontianak"},IR:{"Asia/Tehran":"Tehran"},IQ:{"Asia/Baghdad":"Baghdad"},IE:{"Europe/Dublin":"Dublin"},IL:{"Asia/Jerusalem":"Jerusalem"},IT:{"Europe/Rome":"Rome"},JM:{"America/Jamaica":"Jamaica"},JP:{"Asia/Tokyo":"Tokyo"},JO:{"Asia/Amman":"Amman"},KZ:{"Asia/Almaty":"Almaty","Asia/Aqtau":"Aqtau","Asia/Aqtobe":"Aqtobe","Asia/Oral":"Oral","Asia/Qyzylorda":"Qyzylorda"},KE:{"Africa/Nairobi":"Nairobi"},KI:{"Pacific/Enderbury":"Enderbury","Pacific/Kiritimati":"Kiritimati","Pacific/Tarawa":"Tarawa"},KW:{"Asia/Kuwait":"Kuwait"},KG:{"Asia/Bishkek":"Bishkek"},LA:{"Asia/Vientiane":"Vientiane"},LV:{"Europe/Riga":"Riga"},LB:{"Asia/Beirut":"Beirut"},LS:{"Africa/Maseru":"Maseru"},LR:{"Africa/Monrovia":"Monrovia"},LY:{"Africa/Tripoli":"Tripoli"},LI:{"Europe/Vaduz":"Vaduz"},LT:{"Europe/Vilnius":"Vilnius"},LU:{"Europe/Luxembourg":"Luxembourg"},MO:{"Asia/Macau":"Macau"},MG:{"Indian/Antananarivo":"Antananarivo"},MW:{"Africa/Blantyre":"Blantyre"},MY:{"Asia/Kuala_Lumpur":"Kuala Lumpur","Asia/Kuching":"Kuching"},MV:{"Indian/Maldives":"Maldives"},ML:{"Africa/Bamako":"Bamako"},MT:{"Europe/Malta":"Malta"},MH:{"Pacific/Kwajalein":"Kwajalein","Pacific/Majuro":"Majuro"},MR:{"Africa/Nouakchott":"Nouakchott"},MU:{"Indian/Mauritius":"Mauritius"},MX:{"America/Bahia_Banderas":"Bahia Banderas","America/Cancun":"Cancun","America/Chihuahua":"Chihuahua","America/Hermosillo":"Hermosillo","America/Matamoros":"Matamoros","America/Mazatlan":"Mazatlan","America/Merida":"Merida","America/Mexico_City":"Mexico City","America/Monterrey":"Monterrey","America/Ojinaga":"Ojinaga","America/Santa_Isabel":"Santa Isabel","America/Tijuana":"Tijuana"},FM:{"Pacific/Chuuk":"Chuuk","Pacific/Kosrae":"Kosrae","Pacific/Pohnpei":"Pohnpei"},MD:{"Europe/Chisinau":"Chisinau"},MC:{"Europe/Monaco":"Monaco"},MN:{"Asia/Choibalsan":"Choibalsan","Asia/Hovd":"Hovd","Asia/Ulaanbaatar":"Ulaanbaatar"},ME:{"Europe/Podgorica":"Podgorica"},MS:{"America/Montserrat":"Montserrat"},MA:{"Africa/Casablanca":"Casablanca"},MZ:{"Africa/Maputo":"Maputo"},MM:{"Asia/Rangoon":"Rangoon"},NA:{"Africa/Windhoek":"Windhoek"},NR:{"Pacific/Nauru":"Nauru"},NP:{"Asia/Kathmandu":"Kathmandu"},NL:{"Europe/Amsterdam":"Amsterdam"},AN:{},NZ:{"Pacific/Auckland":"Auckland","Pacific/Chatham":"Chatham"},NI:{"America/Managua":"Managua"},NE:{"Africa/Niamey":"Niamey"},NG:{"Africa/Lagos":"Lagos"},NF:{"Pacific/Norfolk":"Norfolk"},KP:{"Asia/Pyongyang":"Pyongyang"},MP:{"Pacific/Saipan":"Saipan"},NO:{"Europe/Oslo":"Oslo"},OM:{"Asia/Muscat":"Muscat"},PK:{"Asia/Karachi":"Karachi"},PW:{"Pacific/Palau":"Palau"},PA:{"America/Panama":"Panama"},PG:{"Pacific/Port_Moresby":"Port Moresby"},PY:{"America/Asuncion":"Asuncion"},PE:{"America/Lima":"Lima"},PH:{"Asia/Manila":"Manila"},PN:{"Pacific/Pitcairn":"Pitcairn"},PL:{"Europe/Warsaw":"Warsaw"},PT:{"Atlantic/Azores":"Azores","Atlantic/Madeira":"Madeira","Europe/Lisbon":"Lisbon"},PR:{"America/Puerto_Rico":"Puerto Rico"},QA:{"Asia/Qatar":"Qatar"},RO:{"Europe/Bucharest":"Bucharest"},RU:{"Asia/Anadyr":"Anadyr","Asia/Irkutsk":"Irkutsk","Asia/Kamchatka":"Kamchatka","Asia/Krasnoyarsk":"Krasnoyarsk","Asia/Magadan":"Magadan","Asia/Novokuznetsk":"Novokuznetsk","Asia/Novosibirsk":"Novosibirsk","Asia/Omsk":"Omsk","Asia/Sakhalin":"Sakhalin","Asia/Vladivostok":"Vladivostok","Asia/Yakutsk":"Yakutsk","Asia/Yekaterinburg":"Yekaterinburg","Europe/Kaliningrad":"Kaliningrad","Europe/Moscow":"Moscow","Europe/Samara":"Samara","Europe/Volgograd":"Volgograd"},RW:{"Africa/Kigali":"Kigali"},ST:{"Africa/Sao_Tome":"Sao Tome"},SH:{"Atlantic/St_Helena":"St Helena"},KN:{"America/St_Kitts":"St Kitts"},LC:{"America/St_Lucia":"St Lucia"},VC:{"America/St_Vincent":"St Vincent"},WS:{"Pacific/Apia":"Apia"},SM:{"Europe/San_Marino":"San Marino"},SA:{"Asia/Riyadh":"Riyadh"},SN:{"Africa/Dakar":"Dakar"},RS:{"Europe/Belgrade":"Belgrade"},SC:{"Indian/Mahe":"Mahe"},SL:{"Africa/Freetown":"Freetown"},SG:{"Asia/Singapore":"Singapore"},SK:{"Europe/Bratislava":"Bratislava"},SI:{"Europe/Ljubljana":"Ljubljana"},SB:{"Pacific/Guadalcanal":"Guadalcanal"},SO:{"Africa/Mogadishu":"Mogadishu"},ZA:{"Africa/Johannesburg":"Johannesburg"},GS:{"Atlantic/South_Georgia":"South Georgia"},KR:{"Asia/Seoul":"Seoul"},ES:{"Africa/Ceuta":"Ceuta","Atlantic/Canary":"Canary","Europe/Madrid":"Madrid"},LK:{"Asia/Colombo":"Colombo"},SD:{"Africa/Khartoum":"Khartoum"},SR:{"America/Paramaribo":"Paramaribo"},SZ:{"Africa/Mbabane":"Mbabane"},SE:{"Europe/Stockholm":"Stockholm"},CH:{"Europe/Zurich":"Zurich"},SY:{"Asia/Damascus":"Damascus"},TW:{"Asia/Taipei":"Taipei"},TJ:{"Asia/Dushanbe":"Dushanbe"},TZ:{"Africa/Dar_es_Salaam":"Dar es Salaam"},TH:{"Asia/Bangkok":"Bangkok"},BS:{"America/Nassau":"Nassau"},GM:{"Africa/Banjul":"Banjul"},TG:{"Africa/Lome":"Lome"},TO:{"Pacific/Tongatapu":"Tongatapu"},TT:{"America/Port_of_Spain":"Port of Spain"},TN:{"Africa/Tunis":"Tunis"},TR:{"Europe/Istanbul":"Istanbul"},TM:{"Asia/Ashgabat":"Ashgabat"},TC:{"America/Grand_Turk":"Grand Turk"},TV:{"Pacific/Funafuti":"Funafuti"},VI:{"America/St_Thomas":"St Thomas"},UG:{"Africa/Kampala":"Kampala"},UA:{"Europe/Kiev":"Kiev","Europe/Simferopol":"Simferopol","Europe/Uzhgorod":"Uzhgorod","Europe/Zaporozhye":"Zaporozhye"},AE:{"Asia/Dubai":"Dubai"},GB:{"Europe/London":"London"},US:{"America/Adak":"Adak","America/Anchorage":"Anchorage","America/Boise":"Boise","America/Chicago":"Chicago","America/Denver":"Denver","America/Detroit":"Detroit","America/Indiana/Indianapolis":"Indiana / Indianapolis","America/Indiana/Knox":"Indiana / Knox","America/Indiana/Marengo":"Indiana / Marengo","America/Indiana/Petersburg":"Indiana / Petersburg","America/Indiana/Tell_City":"Indiana / Tell City","America/Indiana/Vevay":"Indiana / Vevay","America/Indiana/Vincennes":"Indiana / Vincennes","America/Indiana/Winamac":"Indiana / Winamac","America/Juneau":"Juneau","America/Kentucky/Louisville":"Kentucky / Louisville","America/Kentucky/Monticello":"Kentucky / Monticello","America/Los_Angeles":"Los Angeles","America/Menominee":"Menominee","America/Metlakatla":"Metlakatla","America/New_York":"New York","America/Nome":"Nome","America/North_Dakota/Beulah":"North Dakota / Beulah","America/North_Dakota/Center":"North Dakota / Center","America/North_Dakota/New_Salem":"North Dakota / New Salem","America/Phoenix":"Phoenix","America/Shiprock":"Shiprock","America/Sitka":"Sitka","America/Yakutat":"Yakutat","Pacific/Honolulu":"Honolulu"},UY:{"America/Montevideo":"Montevideo"},UZ:{"Asia/Samarkand":"Samarkand","Asia/Tashkent":"Tashkent"},VU:{"Pacific/Efate":"Efate"},VA:{"Europe/Vatican":"Vatican"},VE:{"America/Caracas":"Caracas"},VN:{"Asia/Ho_Chi_Minh":"Ho Chi Minh"},EH:{"Africa/El_Aaiun":"El Aaiun"},YE:{"Asia/Aden":"Aden"},ZM:{"Africa/Lusaka":"Lusaka"},ZW:{"Africa/Harare":"Harare"}}; -+function(a){"use strict";function b(a){var b=a.toString(16);return 1===b.length?"0"+b:b}function c(a,c,d){return"#"+b(a)+b(c)+b(d)}function d(){var b;a(f).each(function(c){return b=e(a(this)),b.hasClass("open")?(b.trigger(c=a.Event("hide.bfhcolorpicker")),c.isDefaultPrevented()?!0:(b.removeClass("open").trigger("hidden.bfhcolorpicker"),void 0)):!0})}function e(a){return a.closest(".bfh-colorpicker")}var f="[data-toggle=bfh-colorpicker]",g=function(b,c){this.options=a.extend({},a.fn.bfhcolorpicker.defaults,c),this.$element=a(b),this.initPopover()};g.prototype={constructor:g,initPalette:function(){var a,b,c;a=this.$element.find("canvas"),b=a[0].getContext("2d"),c=b.createLinearGradient(0,0,a.width(),0),c.addColorStop(0,"rgb(255, 255, 255)"),c.addColorStop(.1,"rgb(255, 0, 0)"),c.addColorStop(.25,"rgb(255, 0, 255)"),c.addColorStop(.4,"rgb(0, 0, 255)"),c.addColorStop(.55,"rgb(0, 255, 255)"),c.addColorStop(.7,"rgb(0, 255, 0)"),c.addColorStop(.85,"rgb(255, 255, 0)"),c.addColorStop(1,"rgb(255, 0, 0)"),b.fillStyle=c,b.fillRect(0,0,b.canvas.width,b.canvas.height),c=b.createLinearGradient(0,0,0,a.height()),c.addColorStop(0,"rgba(255, 255, 255, 1)"),c.addColorStop(.5,"rgba(255, 255, 255, 0)"),c.addColorStop(.5,"rgba(0, 0, 0, 0)"),c.addColorStop(1,"rgba(0, 0, 0, 1)"),b.fillStyle=c,b.fillRect(0,0,b.canvas.width,b.canvas.height)},initPopover:function(){var a,b;a="",b="","right"===this.options.align?b='<span class="input-group-addon"><span class="bfh-colorpicker-icon"></span></span>':a='<span class="input-group-addon"><span class="bfh-colorpicker-icon"></span></span>',this.$element.html('<div class="input-group bfh-colorpicker-toggle" data-toggle="bfh-colorpicker">'+a+'<input type="text" name="'+this.options.name+'" class="'+this.options.input+'" placeholder="'+this.options.placeholder+'" readonly>'+b+"</div>"+'<div class="bfh-colorpicker-popover">'+'<canvas class="bfh-colorpicker-palette" width="384" height="256"></canvas>'+"</div>"),this.$element.on("click.bfhcolorpicker.data-api touchstart.bfhcolorpicker.data-api",f,g.prototype.toggle).on("mousedown.bfhcolorpicker.data-api","canvas",g.prototype.mouseDown).on("click.bfhcolorpicker.data-api touchstart.bfhcolorpicker.data-api",".bfh-colorpicker-popover",function(){return!1}),this.initPalette(),this.$element.val(this.options.color)},updateVal:function(a,b){var d,e,f,g,h,i,j;h=5,d=this.$element.find("canvas"),e=d[0].getContext("2d"),f=a-d.offset().left,g=b-d.offset().top,f=Math.round(f/h)*h,g=Math.round(g/h)*h,0>f&&(f=0),f>=d.width()&&(f=d.width()-1),0>g&&(g=0),g>d.height()&&(g=d.height()),i=e.getImageData(f,g,1,1),j=c(i.data[0],i.data[1],i.data[2]),j!==this.$element.val()&&(this.$element.val(j),this.$element.trigger("change.bfhcolorpicker"))},mouseDown:function(){var b,c;b=a(this),c=e(b),a(document).on("mousemove.bfhcolorpicker.data-api",{colorpicker:c},g.prototype.mouseMove).one("mouseup.bfhcolorpicker.data-api",{colorpicker:c},g.prototype.mouseUp)},mouseMove:function(a){var b;b=a.data.colorpicker,b.data("bfhcolorpicker").updateVal(a.pageX,a.pageY)},mouseUp:function(b){var c;c=b.data.colorpicker,c.data("bfhcolorpicker").updateVal(b.pageX,b.pageY),a(document).off("mousemove.bfhcolorpicker.data-api"),c.data("bfhcolorpicker").options.close===!0&&d()},toggle:function(b){var c,f,g;if(c=a(this),f=e(c),f.is(".disabled")||void 0!==f.attr("disabled"))return!0;if(g=f.hasClass("open"),d(),!g){if(f.trigger(b=a.Event("show.bfhcolorpicker")),b.isDefaultPrevented())return!0;f.toggleClass("open").trigger("shown.bfhcolorpicker"),c.focus()}return!1}};var h=a.fn.bfhcolorpicker;a.fn.bfhcolorpicker=function(b){return this.each(function(){var c,d,e;c=a(this),d=c.data("bfhcolorpicker"),e="object"==typeof b&&b,this.type="bfhcolorpicker",d||c.data("bfhcolorpicker",d=new g(this,e)),"string"==typeof b&&d[b].call(c)})},a.fn.bfhcolorpicker.Constructor=g,a.fn.bfhcolorpicker.defaults={align:"left",input:"form-control",placeholder:"",name:"",color:"#000000",close:!0},a.fn.bfhcolorpicker.noConflict=function(){return a.fn.bfhcolorpicker=h,this};var i;a.valHooks.div&&(i=a.valHooks.div),a.valHooks.div={get:function(b){return a(b).hasClass("bfh-colorpicker")?a(b).find('input[type="text"]').val():i?i.get(b):void 0},set:function(b,c){if(a(b).hasClass("bfh-colorpicker"))a(b).find(".bfh-colorpicker-icon").css("background-color",c),a(b).find('input[type="text"]').val(c);else if(i)return i.set(b,c)}},a(document).ready(function(){a("div.bfh-colorpicker").each(function(){var b;b=a(this),b.bfhcolorpicker(b.data())})}),a(document).on("click.bfhcolorpicker.data-api",d)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhcountries.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addCountries(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapCountries(),this.$element.is("span")&&this.displayCountry()};b.prototype={constructor:b,getCountries:function(){var b,c;if(this.options.available){if("string"==typeof this.options.available){c=[],this.options.available=this.options.available.split(",");for(b in BFHCountriesList)BFHCountriesList.hasOwnProperty(b)&&a.inArray(b,this.options.available)>=0&&(c[b]=BFHCountriesList[b])}else c=this.options.available;return c}return BFHCountriesList},addCountries:function(){var a,b,c;a=this.options.country,c=this.getCountries(),this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(b in c)c.hasOwnProperty(b)&&this.$element.append('<option value="'+b+'">'+c[b]+"</option>");this.$element.val(a)},addBootstrapCountries:function(){var a,b,c,d,e,f;d=this.options.country,a=this.$element.find('input[type="hidden"]'),b=this.$element.find(".bfh-selectbox-option"),c=this.$element.find("[role=option]"),f=this.getCountries(),c.html(""),this.options.blank===!0&&c.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(e in f)f.hasOwnProperty(e)&&(this.options.flags===!0?c.append('<li><a tabindex="-1" href="#" data-option="'+e+'"><i class="glyphicon bfh-flag-'+e+'"></i>'+f[e]+"</a></li>"):c.append('<li><a tabindex="-1" href="#" data-option="'+e+'">'+f[e]+"</a></li>"));this.$element.val(d)},displayCountry:function(){var a;a=this.options.country,this.options.flags===!0?this.$element.html('<i class="glyphicon bfh-flag-'+a+'"></i> '+BFHCountriesList[a]):this.$element.html(BFHCountriesList[a])}};var c=a.fn.bfhcountries;a.fn.bfhcountries=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhcountries"),f="object"==typeof c&&c,e||d.data("bfhcountries",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhcountries.Constructor=b,a.fn.bfhcountries.defaults={country:"",available:"",flags:!1,blank:!0},a.fn.bfhcountries.noConflict=function(){return a.fn.bfhcountries=c,this},a(document).ready(function(){a("form select.bfh-countries, span.bfh-countries, div.bfh-countries").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhcountries(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhcurrencies.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addCurrencies(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapCurrencies(),this.$element.is("span")&&this.displayCurrency()};b.prototype={constructor:b,getCurrencies:function(){var b,c;if(this.options.available){c=[],this.options.available=this.options.available.split(",");for(b in BFHCurrenciesList)BFHCurrenciesList.hasOwnProperty(b)&&a.inArray(b,this.options.available)>=0&&(c[b]=BFHCurrenciesList[b]);return c}return BFHCurrenciesList},addCurrencies:function(){var a,b,c;a=this.options.currency,c=this.getCurrencies(),this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(b in c)c.hasOwnProperty(b)&&this.$element.append('<option value="'+b+'">'+c[b].label+"</option>");this.$element.val(a)},addBootstrapCurrencies:function(){var a,b,c,d,e,f,g;d=this.options.currency,a=this.$element.find('input[type="hidden"]'),b=this.$element.find(".bfh-selectbox-option"),c=this.$element.find("[role=option]"),f=this.getCurrencies(),c.html(""),this.options.blank===!0&&c.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(e in f)f.hasOwnProperty(e)&&(this.options.flags===!0?(g=f[e].currencyflag?f[e].currencyflag:e.substr(0,2),c.append('<li><a tabindex="-1" href="#" data-option="'+e+'"><i class="glyphicon bfh-flag-'+g+'"></i>'+f[e].label+"</a></li>")):c.append('<li><a tabindex="-1" href="#" data-option="'+e+'">'+f[e].label+"</a></li>"));this.$element.val(d)},displayCurrency:function(){var a,b;a=this.options.currency,this.options.flags===!0?(b=BFHCurrenciesList[a].currencyflag?BFHCurrenciesList[a].currencyflag:a.substr(0,2),this.$element.html('<i class="glyphicon bfh-flag-'+b+'"></i> '+BFHCurrenciesList[a].label)):this.$element.html(BFHCurrenciesList[a].label)}};var c=a.fn.bfhcurrencies;a.fn.bfhcurrencies=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhcurrencies"),f="object"==typeof c&&c,e||d.data("bfhcurrencies",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhcurrencies.Constructor=b,a.fn.bfhcurrencies.defaults={currency:"",available:"",flags:!1,blank:!0},a.fn.bfhcurrencies.noConflict=function(){return a.fn.bfhcurrencies=c,this},a(document).ready(function(){a("form select.bfh-currencies, span.bfh-currencies, div.bfh-currencies").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhcurrencies(b.data())})})}(window.jQuery),+function(a){"use strict";function b(a,b){return new Date(b,a,0).getDate()}function c(a,b,c){return new Date(b,a,c).getDay()}function d(a,b,c,d){return b+=1,b=String(b),d=String(d),1===b.length&&(b="0"+b),1===d.length&&(d="0"+d),a.replace("m",b).replace("y",c).replace("d",d)}function e(a,b,c){var d,e,f;d=[{part:"m",position:a.indexOf("m")},{part:"y",position:a.indexOf("y")},{part:"d",position:a.indexOf("d")}],d.sort(function(a,b){return a.position-b.position}),f=b.match(/(\d+)/g);for(e in d)if(d.hasOwnProperty(e)&&d[e].part===c)return Number(f[e]).toString()}function f(){var b;a(h).each(function(c){return b=g(a(this)),b.hasClass("open")?(b.trigger(c=a.Event("hide.bfhdatepicker")),c.isDefaultPrevented()?!0:(b.removeClass("open").trigger("hidden.bfhdatepicker"),void 0)):!0})}function g(a){return a.closest(".bfh-datepicker")}var h="[data-toggle=bfh-datepicker]",i=function(b,c){this.options=a.extend({},a.fn.bfhdatepicker.defaults,c),this.$element=a(b),this.initCalendar()};i.prototype={constructor:i,setDate:function(){var a,b,c;a=this.options.date,c=this.options.format,""===a||"today"===a||void 0===a?(b=new Date,"today"===a&&this.$element.val(d(c,b.getMonth(),b.getFullYear(),b.getDate())),this.$element.data("month",b.getMonth()),this.$element.data("year",b.getFullYear())):(this.$element.val(a),this.$element.data("month",Number(e(c,a,"m")-1)),this.$element.data("year",Number(e(c,a,"y"))))},setDateLimit:function(a,b){var c,d;d=this.options.format,""!==a?(this.$element.data(b+"limit",!0),"today"===a?(c=new Date,this.$element.data(b+"day",c.getDate()),this.$element.data(b+"month",c.getMonth()),this.$element.data(b+"year",c.getFullYear())):(this.$element.data(b+"day",Number(e(d,a,"d"))),this.$element.data(b+"month",Number(e(d,a,"m")-1)),this.$element.data(b+"year",Number(e(d,a,"y"))))):this.$element.data(b+"limit",!1)},initCalendar:function(){var a,b,c;a="",b="",c="",""!==this.options.icon&&("right"===this.options.align?b='<span class="input-group-addon"><i class="'+this.options.icon+'"></i></span>':a='<span class="input-group-addon"><i class="'+this.options.icon+'"></i></span>',c="input-group"),this.$element.html('<div class="'+c+' bfh-datepicker-toggle" data-toggle="bfh-datepicker">'+a+'<input type="text" name="'+this.options.name+'" class="'+this.options.input+'" placeholder="'+this.options.placeholder+'" readonly>'+b+"</div>"+'<div class="bfh-datepicker-calendar">'+'<table class="calendar table table-bordered">'+"<thead>"+'<tr class="months-header">'+'<th class="month" colspan="4">'+'<a class="previous" href="#"><i class="glyphicon glyphicon-chevron-left"></i></a>'+"<span></span>"+'<a class="next" href="#"><i class="glyphicon glyphicon-chevron-right"></i></a>'+"</th>"+'<th class="year" colspan="3">'+'<a class="previous" href="#"><i class="glyphicon glyphicon-chevron-left"></i></a>'+"<span></span>"+'<a class="next" href="#"><i class="glyphicon glyphicon-chevron-right"></i></a>'+"</th>"+"</tr>"+'<tr class="days-header">'+"</tr>"+"</thead>"+"<tbody>"+"</tbody>"+"</table>"+"</div>"),this.$element.on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",h,i.prototype.toggle).on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",".bfh-datepicker-calendar > table.calendar .month > .previous",i.prototype.previousMonth).on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",".bfh-datepicker-calendar > table.calendar .month > .next",i.prototype.nextMonth).on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",".bfh-datepicker-calendar > table.calendar .year > .previous",i.prototype.previousYear).on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",".bfh-datepicker-calendar > table.calendar .year > .next",i.prototype.nextYear).on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",".bfh-datepicker-calendar > table.calendar td:not(.off)",i.prototype.select).on("click.bfhdatepicker.data-api touchstart.bfhdatepicker.data-api",".bfh-datepicker-calendar > table.calendar",function(){return!1}),this.setDate(),this.setDateLimit(this.options.min,"lower"),this.setDateLimit(this.options.max,"higher"),this.updateCalendar()},updateCalendarHeader:function(a,b,c){var d,e;for(a.find("table > thead > tr > th.month > span").text(BFHMonthsList[b]),a.find("table > thead > tr > th.year > span").text(c),d=a.find("table > thead > tr.days-header"),d.html(""),e=BFHDayOfWeekStart;e<BFHDaysList.length;e+=1)d.append("<th>"+BFHDaysList[e]+"</th>");for(e=0;BFHDayOfWeekStart>e;e+=1)d.append("<th>"+BFHDaysList[e]+"</th>")},checkMinDate:function(a,b,c){var d,e,f,g;return d=this.$element.data("lowerlimit"),d===!0&&(e=this.$element.data("lowerday"),f=this.$element.data("lowermonth"),g=this.$element.data("loweryear"),e>a&&b===f&&c===g||f>b&&c===g||g>c)?!0:!1},checkMaxDate:function(a,b,c){var d,e,f,g;return d=this.$element.data("higherlimit"),d===!0&&(e=this.$element.data("higherday"),f=this.$element.data("highermonth"),g=this.$element.data("higheryear"),a>e&&b===f&&c===g||b>f&&c===g||c>g)?!0:!1},checkToday:function(a,b,c){var d;return d=new Date,a===d.getDate()&&b===d.getMonth()&&c===d.getFullYear()?!0:!1},updateCalendarDays:function(a,d,e){var f,g,h,i,j,k,l;for(f=a.find("table > tbody").html(""),g=b(d,e),h=b(d+1,e),i=c(d,e,1),j=c(d,e,h),k="",l=0;(i-BFHDayOfWeekStart+7)%7>l;l+=1)k+='<td class="off">'+(g-(i-BFHDayOfWeekStart+7)%7+l+1)+"</td>";for(l=1;h>=l;l+=1)k+=this.checkMinDate(l,d,e)?'<td data-day="'+l+'" class="off">'+l+"</td>":this.checkMaxDate(l,d,e)?'<td data-day="'+l+'" class="off">'+l+"</td>":this.checkToday(l,d,e)?'<td data-day="'+l+'" class="today">'+l+"</td>":'<td data-day="'+l+'">'+l+"</td>",c(d,e,l)===(6+BFHDayOfWeekStart)%7&&(f.append("<tr>"+k+"</tr>"),k="");for(l=1;(7-(j+1-BFHDayOfWeekStart+7)%7)%7+1>=l;l+=1)k+='<td class="off">'+l+"</td>",l===(7-(j+1-BFHDayOfWeekStart+7)%7)%7&&f.append("<tr>"+k+"</tr>")},updateCalendar:function(){var a,b,c;a=this.$element.find(".bfh-datepicker-calendar"),b=this.$element.data("month"),c=this.$element.data("year"),this.updateCalendarHeader(a,b,c),this.updateCalendarDays(a,b,c)},previousMonth:function(){var b,c,d;return b=a(this),c=g(b),0===Number(c.data("month"))?(c.data("month",11),c.data("year",Number(c.data("year"))-1)):c.data("month",Number(c.data("month"))-1),d=c.data("bfhdatepicker"),d.updateCalendar(),!1},nextMonth:function(){var b,c,d;return b=a(this),c=g(b),11===Number(c.data("month"))?(c.data("month",0),c.data("year",Number(c.data("year"))+1)):c.data("month",Number(c.data("month"))+1),d=c.data("bfhdatepicker"),d.updateCalendar(),!1},previousYear:function(){var b,c,d;return b=a(this),c=g(b),c.data("year",Number(c.data("year"))-1),d=c.data("bfhdatepicker"),d.updateCalendar(),!1},nextYear:function(){var b,c,d;return b=a(this),c=g(b),c.data("year",Number(c.data("year"))+1),d=c.data("bfhdatepicker"),d.updateCalendar(),!1},select:function(b){var c,e,h,i,j,k;c=a(this),b.preventDefault(),b.stopPropagation(),e=g(c),h=e.data("bfhdatepicker"),i=e.data("month"),j=e.data("year"),k=c.data("day"),e.val(d(h.options.format,i,j,k)),e.trigger("change.bfhdatepicker"),h.options.close===!0&&f()},toggle:function(b){var c,d,e;if(c=a(this),d=g(c),d.is(".disabled")||void 0!==d.attr("disabled"))return!0;if(e=d.hasClass("open"),f(),!e){if(d.trigger(b=a.Event("show.bfhdatepicker")),b.isDefaultPrevented())return!0;d.toggleClass("open").trigger("shown.bfhdatepicker"),c.focus()}return!1}};var j=a.fn.bfhdatepicker;a.fn.bfhdatepicker=function(b){return this.each(function(){var c,d,e;c=a(this),d=c.data("bfhdatepicker"),e="object"==typeof b&&b,this.type="bfhdatepicker",d||c.data("bfhdatepicker",d=new i(this,e)),"string"==typeof b&&d[b].call(c)})},a.fn.bfhdatepicker.Constructor=i,a.fn.bfhdatepicker.defaults={icon:"glyphicon glyphicon-calendar",align:"left",input:"form-control",placeholder:"",name:"",date:"today",format:"m/d/y",min:"",max:"",close:!0},a.fn.bfhdatepicker.noConflict=function(){return a.fn.bfhdatepicker=j,this};var k;a.valHooks.div&&(k=a.valHooks.div),a.valHooks.div={get:function(b){return a(b).hasClass("bfh-datepicker")?a(b).find('input[type="text"]').val():k?k.get(b):void 0},set:function(b,c){if(a(b).hasClass("bfh-datepicker"))a(b).find('input[type="text"]').val(c);else if(k)return k.set(b,c)}},a(document).ready(function(){a("div.bfh-datepicker").each(function(){var b;b=a(this),b.bfhdatepicker(b.data())})}),a(document).on("click.bfhdatepicker.data-api",f)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhfonts.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addFonts(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapFonts()};b.prototype={constructor:b,getFonts:function(){var b,c;if(this.options.available){c=[],this.options.available=this.options.available.split(",");for(b in BFHFontsList)BFHFontsList.hasOwnProperty(b)&&a.inArray(b,this.options.available)>=0&&(c[b]=BFHFontsList[b]);return c}return BFHFontsList},addFonts:function(){var a,b,c;a=this.options.font,c=this.getFonts(),this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(b in c)c.hasOwnProperty(b)&&this.$element.append('<option value="'+b+'">'+b+"</option>");this.$element.val(a)},addBootstrapFonts:function(){var a,b,c,d,e,f;d=this.options.font,a=this.$element.find('input[type="hidden"]'),b=this.$element.find(".bfh-selectbox-option"),c=this.$element.find("[role=option]"),f=this.getFonts(),c.html(""),this.options.blank===!0&&c.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(e in f)f.hasOwnProperty(e)&&c.append('<li><a tabindex="-1" href="#" style=\'font-family: '+f[e]+"' data-option=\""+e+'">'+e+"</a></li>");this.$element.val(d)}};var c=a.fn.bfhfonts;a.fn.bfhfonts=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhfonts"),f="object"==typeof c&&c,e||d.data("bfhfonts",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhfonts.Constructor=b,a.fn.bfhfonts.defaults={font:"",available:"",blank:!0},a.fn.bfhfonts.noConflict=function(){return a.fn.bfhfonts=c,this},a(document).ready(function(){a("form select.bfh-fonts, span.bfh-fonts, div.bfh-fonts").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhfonts(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhfontsizes.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addFontSizes(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapFontSizes()};b.prototype={constructor:b,getFontsizes:function(){var b,c;if(this.options.available){c=[],this.options.available=this.options.available.split(",");for(b in BFHFontSizesList)BFHFontSizesList.hasOwnProperty(b)&&a.inArray(b,this.options.available)>=0&&(c[b]=BFHFontSizesList[b]);return c}return BFHFontSizesList},addFontSizes:function(){var a,b,c;a=this.options.fontsize,c=this.getFontsizes(),this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(b in c)c.hasOwnProperty(b)&&this.$element.append('<option value="'+b+'">'+c[b]+"</option>");this.$element.val(a)},addBootstrapFontSizes:function(){var a,b,c,d,e,f;d=this.options.fontsize,a=this.$element.find('input[type="hidden"]'),b=this.$element.find(".bfh-selectbox-option"),c=this.$element.find("[role=option]"),f=this.getFontsizes(),c.html(""),this.options.blank===!0&&c.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(e in f)f.hasOwnProperty(e)&&c.append('<li><a tabindex="-1" href="#" data-option="'+e+'">'+f[e]+"</a></li>");this.$element.val(d)}};var c=a.fn.bfhfontsizes;a.fn.bfhfontsizes=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhfontsizes"),f="object"==typeof c&&c,e||d.data("bfhfontsizes",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhfontsizes.Constructor=b,a.fn.bfhfontsizes.defaults={fontsize:"",available:"",blank:!0},a.fn.bfhfontsizes.noConflict=function(){return a.fn.bfhfontsizes=c,this},a(document).ready(function(){a("form select.bfh-fontsizes, span.bfh-fontsizes, div.bfh-fontsizes").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhfontsizes(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhgooglefonts.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addFonts(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapFonts()};b.prototype={constructor:b,getFonts:function(){var b,c;if(c=[],this.options.subset)for(b in BFHGoogleFontsList.items)BFHGoogleFontsList.items.hasOwnProperty(b)&&a.inArray(this.options.subset,BFHGoogleFontsList.items[b].subsets)>=0&&(c[BFHGoogleFontsList.items[b].family]={info:BFHGoogleFontsList.items[b],index:parseInt(b,10)});else if(this.options.available){this.options.available=this.options.available.split(",");for(b in BFHGoogleFontsList.items)BFHGoogleFontsList.items.hasOwnProperty(b)&&a.inArray(BFHGoogleFontsList.items[b].family,this.options.available)>=0&&(c[BFHGoogleFontsList.items[b].family]={info:BFHGoogleFontsList.items[b],index:parseInt(b,10)})}else for(b in BFHGoogleFontsList.items)BFHGoogleFontsList.items.hasOwnProperty(b)&&(c[BFHGoogleFontsList.items[b].family]={info:BFHGoogleFontsList.items[b],index:parseInt(b,10)});return c},addFonts:function(){var a,b,c;a=this.options.font,c=this.getFonts(),this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(b in c)c.hasOwnProperty(b)&&this.$element.append('<option value="'+c[b].info.family+'">'+c[b].info.family+"</option>");this.$element.val(a)},addBootstrapFonts:function(){var a,b,c,d,e,f;d=this.options.font,a=this.$element.find('input[type="hidden"]'),b=this.$element.find(".bfh-selectbox-option"),c=this.$element.find("[role=option]"),f=this.getFonts(),c.html(""),this.options.blank===!0&&c.append('<li><a tabindex="-1" href="#" data-option="" style="background-image: none;"></a></li>');for(e in f)f.hasOwnProperty(e)&&c.append('<li><a tabindex="-1" href="#" style="background-position: 0 -'+(30*f[e].index-2)+'px;" data-option="'+f[e].info.family+'">'+f[e].info.family+"</a></li>");this.$element.val(d)}};var c=a.fn.bfhgooglefonts;a.fn.bfhgooglefonts=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhgooglefonts"),f="object"==typeof c&&c,e||d.data("bfhgooglefonts",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhgooglefonts.Constructor=b,a.fn.bfhgooglefonts.defaults={font:"",available:"",subset:"",blank:!0},a.fn.bfhgooglefonts.noConflict=function(){return a.fn.bfhgooglefonts=c,this},a(document).ready(function(){a("form select.bfh-googlefonts, span.bfh-googlefonts, div.bfh-googlefonts").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhgooglefonts(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhlanguages.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addLanguages(),this.$element.is("span")&&this.displayLanguage(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapLanguages()};b.prototype={constructor:b,getLanguages:function(){var a,b,c;if(this.options.available){c=[],this.options.available=this.options.available.split(",");for(b in this.options.available)this.options.available.hasOwnProperty(b)&&(-1!==this.options.available[b].indexOf("_")?(a=this.options.available[b].split("_"),c[a[0]]={name:BFHLanguagesList[a[0]],country:a[1]}):c[this.options.available[b]]=BFHLanguagesList[this.options.available[b]]);return c}return BFHLanguagesList},addLanguages:function(){var a,b,c;a=this.options.language,b=this.getLanguages(),this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(c in b)b.hasOwnProperty(c)&&(b[c].hasOwnProperty("name")?this.$element.append('<option value="'+c+"_"+b[c].country+'">'+b[c].name.toProperCase()+" ("+BFHCountriesList[b[c].country]+")</option>"):this.$element.append('<option value="'+c+'">'+b[c].toProperCase()+"</option>"));this.$element.val(a)},addBootstrapLanguages:function(){var a,b,c,d,e,f;d=this.options.language,a=this.$element.find('input[type="hidden"]'),b=this.$element.find(".bfh-selectbox-option"),c=this.$element.find("[role=option]"),e=this.getLanguages(),c.html(""),this.options.blank===!0&&c.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(f in e)e.hasOwnProperty(f)&&(e[f].hasOwnProperty("name")?this.options.flags===!0?c.append('<li><a tabindex="-1" href="#" data-option="'+f+"_"+e[f].country+'"><i class="glyphicon bfh-flag-'+e[f].country+'"></i>'+e[f].name.toProperCase()+"</a></li>"):c.append('<li><a tabindex="-1" href="#" data-option="'+f+"_"+e[f].country+'">'+e[f].name.toProperCase()+" ("+BFHCountriesList[e[f].country]+")</a></li>"):c.append('<li><a tabindex="-1" href="#" data-option="'+f+'">'+e[f]+"</a></li>"));this.$element.val(d)},displayLanguage:function(){var a;a=this.options.language,-1!==a.indexOf("_")?(a=a.split("_"),this.options.flags===!0?this.$element.html('<i class="glyphicon bfh-flag-'+a[1]+'"></i> '+BFHLanguagesList[a[0]].toProperCase()):this.$element.html(BFHLanguagesList[a[0]].toProperCase()+" ("+BFHCountriesList[a[1]]+")")):this.$element.html(BFHLanguagesList[a].toProperCase())}};var c=a.fn.bfhlanguages;a.fn.bfhlanguages=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhlanguages"),f="object"==typeof c&&c,e||d.data("bfhlanguages",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhlanguages.Constructor=b,a.fn.bfhlanguages.defaults={language:"",available:"",flags:!1,blank:!0},a.fn.bfhlanguages.noConflict=function(){return a.fn.bfhlanguages=c,this},a(document).ready(function(){a("form select.bfh-languages, span.bfh-languages, div.bfh-languages").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhlanguages(b.data())})}),String.prototype.toProperCase=function(){return this.replace(/\w\S*/g,function(a){return a.charAt(0).toUpperCase()+a.substr(1).toLowerCase()})}}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhnumber.defaults,c),this.$element=a(b),this.initInput()};b.prototype={constructor:b,initInput:function(){this.options.buttons===!0&&(this.$element.wrap('<div class="input-group"></div>'),this.$element.parent().append('<span class="input-group-addon bfh-number-btn inc"><span class="glyphicon glyphicon-chevron-up"></span></span>'),this.$element.parent().append('<span class="input-group-addon bfh-number-btn dec"><span class="glyphicon glyphicon-chevron-down"></span></span>')),this.$element.on("change.bfhnumber.data-api",b.prototype.change),this.options.keyboard===!0&&this.$element.on("keydown.bfhnumber.data-api",b.prototype.keydown),this.options.buttons===!0&&this.$element.parent().on("mousedown.bfhnumber.data-api",".inc",b.prototype.btninc).on("mousedown.bfhnumber.data-api",".dec",b.prototype.btndec),this.formatNumber()},keydown:function(b){var c;if(c=a(this).data("bfhnumber"),c.$element.is(".disabled")||void 0!==c.$element.attr("disabled"))return!0;switch(b.which){case 38:c.increment();break;case 40:c.decrement()}return!0},mouseup:function(a){var b,c,d;b=a.data.btn,c=b.$element.data("timer"),d=b.$element.data("interval"),clearTimeout(c),clearInterval(d)},btninc:function(){var c,d;return c=a(this).parent().find(".bfh-number").data("bfhnumber"),c.$element.is(".disabled")||void 0!==c.$element.attr("disabled")?!0:(c.increment(),d=setTimeout(function(){var a;a=setInterval(function(){c.increment()},80),c.$element.data("interval",a)},750),c.$element.data("timer",d),a(document).one("mouseup",{btn:c},b.prototype.mouseup),!0)},btndec:function(){var c,d;return c=a(this).parent().find(".bfh-number").data("bfhnumber"),c.$element.is(".disabled")||void 0!==c.$element.attr("disabled")?!0:(c.decrement(),d=setTimeout(function(){var a;a=setInterval(function(){c.decrement()},80),c.$element.data("interval",a)},750),c.$element.data("timer",d),a(document).one("mouseup",{btn:c},b.prototype.mouseup),!0)},change:function(){var b;return b=a(this).data("bfhnumber"),b.$element.is(".disabled")||void 0!==b.$element.attr("disabled")?!0:(b.formatNumber(),!0)},increment:function(){var a;a=this.getValue(),a+=1,this.$element.val(a).change()},decrement:function(){var a;a=this.getValue(),a-=1,this.$element.val(a).change()},getValue:function(){var a;return a=this.$element.val(),"-1"!==a&&(a=String(a).replace(/\D/g,"")),0===String(a).length&&(a=this.options.min),parseInt(a)},formatNumber:function(){var a,b,c,d;if(a=this.getValue(),a>this.options.max&&(a=this.options.wrap===!0?this.options.min:this.options.max),a<this.options.min&&(a=this.options.wrap===!0?this.options.max:this.options.min),this.options.zeros===!0)for(b=String(this.options.max).length,c=String(a).length,d=c;b>d;d+=1)a="0"+a;a!==this.$element.val()&&this.$element.val(a)}};var c=a.fn.bfhnumber;a.fn.bfhnumber=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhnumber"),f="object"==typeof c&&c,e||d.data("bfhnumber",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhnumber.Constructor=b,a.fn.bfhnumber.defaults={min:0,max:9999,zeros:!1,keyboard:!0,buttons:!0,wrap:!1},a.fn.bfhnumber.noConflict=function(){return a.fn.bfhnumber=c,this},a(document).ready(function(){a('form input[type="text"].bfh-number, form input[type="number"].bfh-number').each(function(){var b;b=a(this),b.bfhnumber(b.data())})})}(window.jQuery),+function(a){"use strict";function b(a,b){var c,d,e,f;for(c="",b=String(b).replace(/\D/g,""),d=0,e=0;d<a.length;d+=1)/\d/g.test(a.charAt(d))?a.charAt(d)===b.charAt(e)?(c+=b.charAt(e),e+=1):c+=a.charAt(d):"d"!==a.charAt(d)?(""!==b.charAt(e)||"+"===a.charAt(d))&&(c+=a.charAt(d)):""===b.charAt(e)?c+="":(c+=b.charAt(e),e+=1);return f=a.charAt(c.length),"d"!==f&&(c+=f),c}function c(a){var b,c=0;return document.selection?(a.focus(),b=document.selection.createRange(),b.moveStart("character",-a.value.length),c=b.text.length):(a.selectionStart||0===a.selectionStart)&&(c=a.selectionStart),c}function d(a,b){var c;document.selection?(a.focus(),c=document.selection.createRange(),c.moveStart("character",-a.value.length),c.moveStart("character",b),c.moveEnd("character",0),c.select()):(a.selectionStart||0===a.selectionStart)&&(a.selectionStart=b,a.selectionEnd=b,a.focus())}var e=function(b,c){this.options=a.extend({},a.fn.bfhphone.defaults,c),this.$element=a(b),(this.$element.is('input[type="text"]')||this.$element.is('input[type="tel"]'))&&this.addFormatter(),this.$element.is("span")&&this.displayFormatter() -};e.prototype={constructor:e,addFormatter:function(){var b;""!==this.options.country&&(b=a(document).find("#"+this.options.country),0!==b.length?(this.options.format=BFHPhoneFormatList[b.val()],b.on("change",{phone:this},this.changeCountry)):this.options.format=BFHPhoneFormatList[this.options.country]),this.$element.on("keyup.bfhphone.data-api",e.prototype.change),this.loadFormatter()},loadFormatter:function(){var a;a=b(this.options.format,this.$element.val()),this.$element.val(a)},displayFormatter:function(){var a;""!==this.options.country&&(this.options.format=BFHPhoneFormatList[this.options.country]),a=b(this.options.format,this.options.number),this.$element.html(a)},changeCountry:function(b){var c,d;c=a(this),d=b.data.phone,d.$element.val(String(d.$element.val()).replace(/\+\d*/g,"")),d.options.format=BFHPhoneFormatList[c.val()],d.loadFormatter()},change:function(e){var f,g,h,i;return f=a(this).data("bfhphone"),f.$element.is(".disabled")||void 0!==f.$element.attr("disabled")?!0:(g=c(f.$element[0]),h=!1,g===f.$element.val().length&&(h=!0),8===e.which&&"d"!==f.options.format.charAt(f.$element.val().length)&&f.$element.val(String(f.$element.val()).substring(0,f.$element.val().length-1)),i=b(f.options.format,f.$element.val()),i===f.$element.val()?!0:(f.$element.val(i),h&&(g=f.$element.val().length),d(f.$element[0],g),!0))}};var f=a.fn.bfhphone;a.fn.bfhphone=function(b){return this.each(function(){var c,d,f;c=a(this),d=c.data("bfhphone"),f="object"==typeof b&&b,d||c.data("bfhphone",d=new e(this,f)),"string"==typeof b&&d[b].call(c)})},a.fn.bfhphone.Constructor=e,a.fn.bfhphone.defaults={format:"",number:"",country:""},a.fn.bfhphone.noConflict=function(){return a.fn.bfhphone=f,this},a(document).ready(function(){a('form input[type="text"].bfh-phone, form input[type="tel"].bfh-phone, span.bfh-phone').each(function(){var b;b=a(this),b.bfhphone(b.data())})})}(window.jQuery),+function(a){"use strict";function b(){var b;a(d).each(function(d){return b=c(a(this)),b.hasClass("open")?(b.trigger(d=a.Event("hide.bfhselectbox")),d.isDefaultPrevented()?!0:(b.removeClass("open").trigger("hidden.bfhselectbox"),void 0)):!0})}function c(a){return a.closest(".bfh-selectbox")}var d="[data-toggle=bfh-selectbox]",e=function(b,c){this.options=a.extend({},a.fn.bfhselectbox.defaults,c),this.$element=a(b),this.initSelectBox()};e.prototype={constructor:e,initSelectBox:function(){var b;b="",this.$element.find("div").each(function(){b=b+'<li><a tabindex="-1" href="#" data-option="'+a(this).data("value")+'">'+a(this).html()+"</a></li>"}),this.$element.html('<input type="hidden" name="'+this.options.name+'" value="">'+'<a class="bfh-selectbox-toggle '+this.options.input+'" role="button" data-toggle="bfh-selectbox" href="#">'+'<span class="bfh-selectbox-option"></span>'+'<span class="'+this.options.icon+' selectbox-caret"></span>'+"</a>"+'<div class="bfh-selectbox-options">'+'<div role="listbox">'+'<ul role="option">'+"</ul>"+"</div>"+"</div>"),this.$element.find("[role=option]").html(b),this.options.filter===!0&&this.$element.find(".bfh-selectbox-options").prepend('<div class="bfh-selectbox-filter-container"><input type="text" class="bfh-selectbox-filter form-control"></div>'),this.$element.val(this.options.value),this.$element.on("click.bfhselectbox.data-api touchstart.bfhselectbox.data-api",d,e.prototype.toggle).on("keydown.bfhselectbox.data-api",d+", [role=option]",e.prototype.keydown).on("mouseenter.bfhselectbox.data-api","[role=option] > li > a",e.prototype.mouseenter).on("click.bfhselectbox.data-api","[role=option] > li > a",e.prototype.select).on("click.bfhselectbox.data-api",".bfh-selectbox-filter",function(){return!1}).on("propertychange.bfhselectbox.data-api change.bfhselectbox.data-api input.bfhselectbox.data-api paste.bfhselectbox.data-api",".bfh-selectbox-filter",e.prototype.filter)},toggle:function(d){var e,f,g;if(e=a(this),f=c(e),f.is(".disabled")||void 0!==f.attr("disabled"))return!0;if(g=f.hasClass("open"),b(),!g){if(f.trigger(d=a.Event("show.bfhselectbox")),d.isDefaultPrevented())return!0;f.toggleClass("open").trigger("shown.bfhselectbox").find('[role=option] > li > [data-option="'+f.val()+'"]').focus()}return!1},filter:function(){var b,d,e;b=a(this),d=c(b),e=a("[role=option] li a",d),e.hide().filter(function(){return-1!==a(this).text().toUpperCase().indexOf(b.val().toUpperCase())}).show()},keydown:function(b){var f,g,h,i,j;return/(38|40|27)/.test(b.keyCode)?(f=a(this),b.preventDefault(),b.stopPropagation(),h=c(f),i=h.hasClass("open"),!i||i&&27===b.keyCode?(27===b.which&&h.find(d).focus(),f.click()):(g=a("[role=option] li:not(.divider) a:visible",h),g.length?(a("body").off("mouseenter.bfh-selectbox.data-api","[role=option] > li > a",e.prototype.mouseenter),j=g.index(g.filter(":focus")),38===b.keyCode&&j>0&&(j-=1),40===b.keyCode&&j<g.length-1&&(j+=1),j||(j=0),g.eq(j).focus(),a("body").on("mouseenter.bfh-selectbox.data-api","[role=option] > li > a",e.prototype.mouseenter),void 0):!0)):!0},mouseenter:function(){var b;b=a(this),b.focus()},select:function(d){var e,f;return e=a(this),d.preventDefault(),d.stopPropagation(),e.is(".disabled")||void 0!==e.attr("disabled")?!0:(f=c(e),f.val(e.data("option")),f.trigger("change.bfhselectbox"),b(),void 0)}};var f=a.fn.bfhselectbox;a.fn.bfhselectbox=function(b){return this.each(function(){var c,d,f;c=a(this),d=c.data("bfhselectbox"),f="object"==typeof b&&b,this.type="bfhselectbox",d||c.data("bfhselectbox",d=new e(this,f)),"string"==typeof b&&d[b].call(c)})},a.fn.bfhselectbox.Constructor=e,a.fn.bfhselectbox.defaults={icon:"caret",input:"form-control",name:"",value:"",filter:!1},a.fn.bfhselectbox.noConflict=function(){return a.fn.bfhselectbox=f,this};var g;a.valHooks.div&&(g=a.valHooks.div),a.valHooks.div={get:function(b){return a(b).hasClass("bfh-selectbox")?a(b).find('input[type="hidden"]').val():g?g.get(b):void 0},set:function(b,c){var d,e;if(a(b).hasClass("bfh-selectbox"))d=a(b),d.find("li a[data-option='"+c+"']").length>0?e=d.find("li a[data-option='"+c+"']").html():d.find("li a").length>0?e=d.find("li a").eq(0).html():(c="",e=""),d.find('input[type="hidden"]').val(c),d.find(".bfh-selectbox-option").html(e);else if(g)return g.set(b,c)}},a(document).ready(function(){a("div.bfh-selectbox").each(function(){var b;b=a(this),b.bfhselectbox(b.data())})}),a(document).on("click.bfhselectbox.data-api",b)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhslider.defaults,c),this.$element=a(b),this.initSlider()};b.prototype={constructor:b,initSlider:function(){""===this.options.value&&(this.options.value=this.options.min),this.$element.html('<input type="hidden" name="'+this.options.name+'" value="">'+'<div class="bfh-slider-handle"><div class="bfh-slider-value"></div></div>'),this.$element.find('input[type="hidden"]').val(this.options.value),this.updateHandle(this.options.value),this.$element.on("mousedown.bfhslider.data-api",b.prototype.mouseDown)},updateHandle:function(a){var b,c,d,e;e=this.options.max-this.options.min,c=this.$element.width(),d=this.$element.position().left,b=Math.round((a-this.options.min)*(c-20)/e+d),this.$element.find(".bfh-slider-handle").css("left",b+"px"),this.$element.find(".bfh-slider-value").text(a)},updateVal:function(a){var b,c,d,e,f;return f=this.options.max-this.options.min,b=this.$element.width(),c=this.$element.offset().left,d=c+b,c>a&&(a=c),a+20>d&&(a=d),e=(a-c)/b,e=Math.ceil(e*f+this.options.min),e===this.$element.val()?!0:(this.$element.val(e),this.$element.trigger("change.bfhslider"),void 0)},mouseDown:function(){var c;return c=a(this),c.is(".disabled")||void 0!==c.attr("disabled")?!0:(a(document).on("mousemove.bfhslider.data-api",{slider:c},b.prototype.mouseMove).one("mouseup.bfhslider.data-api",{slider:c},b.prototype.mouseUp),void 0)},mouseMove:function(a){var b;b=a.data.slider,b.data("bfhslider").updateVal(a.pageX)},mouseUp:function(b){var c;c=b.data.slider,c.data("bfhslider").updateVal(b.pageX),a(document).off("mousemove.bfhslider.data-api")}};var c=a.fn.bfhslider;a.fn.bfhslider=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhslider"),f="object"==typeof c&&c,this.type="bfhslider",e||d.data("bfhslider",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhslider.Constructor=b,a.fn.bfhslider.defaults={name:"",value:"",min:0,max:100},a.fn.bfhslider.noConflict=function(){return a.fn.bfhslider=c,this};var d;a.valHooks.div&&(d=a.valHooks.div),a.valHooks.div={get:function(b){return a(b).hasClass("bfh-slider")?a(b).find('input[type="hidden"]').val():d?d.get(b):void 0},set:function(b,c){if(a(b).hasClass("bfh-slider"))a(b).find('input[type="hidden"]').val(c),a(b).data("bfhslider").updateHandle(c);else if(d)return d.set(b,c)}},a(document).ready(function(){a("div.bfh-slider").each(function(){var b;b=a(this),b.bfhslider(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhstates.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addStates(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapStates(),this.$element.is("span")&&this.displayState()};b.prototype={constructor:b,addStates:function(){var b,c;b=this.options.country,""!==b&&(c=a(document).find("#"+b),0!==c.length&&(b=c.val(),c.on("change",{state:this},this.changeCountry))),this.loadStates(b)},loadStates:function(a){var b,c;b=this.options.state,this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(c in BFHStatesList[a])BFHStatesList[a].hasOwnProperty(c)&&this.$element.append('<option value="'+BFHStatesList[a][c].code+'">'+BFHStatesList[a][c].name+"</option>");this.$element.val(b)},changeCountry:function(b){var c,d,e;c=a(this),d=b.data.state,e=c.val(),d.loadStates(e)},addBootstrapStates:function(){var b,c;b=this.options.country,""!==b&&(c=a(document).find("#"+b),0!==c.length&&(b=c.find('input[type="hidden"]').val(),c.on("change.bfhselectbox",{state:this},this.changeBootstrapCountry))),this.loadBootstrapStates(b)},loadBootstrapStates:function(a){var b,c,d,e,f,g;e=this.options.state,f="",b=this.$element.find('input[type="hidden"]'),c=this.$element.find(".bfh-selectbox-option"),d=this.$element.find("[role=option]"),d.html(""),this.options.blank===!0&&d.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(g in BFHStatesList[a])BFHStatesList[a].hasOwnProperty(g)&&(d.append('<li><a tabindex="-1" href="#" data-option="'+BFHStatesList[a][g].code+'">'+BFHStatesList[a][g].name+"</a></li>"),BFHStatesList[a][g].code===e&&(f=BFHStatesList[a][g].name));this.$element.val(e)},changeBootstrapCountry:function(b){var c,d,e;c=a(this),d=b.data.state,e=c.val(),d.loadBootstrapStates(e)},displayState:function(){var a,b,c,d;a=this.options.country,b=this.options.state,c="";for(d in BFHStatesList[a])if(BFHStatesList[a].hasOwnProperty(d)&&BFHStatesList[a][d].code===b){c=BFHStatesList[a][d].name;break}this.$element.html(c)}};var c=a.fn.bfhstates;a.fn.bfhstates=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhstates"),f="object"==typeof c&&c,e||d.data("bfhstates",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhstates.Constructor=b,a.fn.bfhstates.defaults={country:"",state:"",blank:!0},a.fn.bfhstates.noConflict=function(){return a.fn.bfhstates=c,this},a(document).ready(function(){a("form select.bfh-states, span.bfh-states, div.bfh-states").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhstates(b.data())})})}(window.jQuery),+function(a){"use strict";function b(a,b){return a=String(a),1===a.length&&(a="0"+a),b=String(b),1===b.length&&(b="0"+b),a+BFHTimePickerDelimiter+b}function c(){var b;a(e).each(function(c){return b=d(a(this)),b.hasClass("open")?(b.trigger(c=a.Event("hide.bfhtimepicker")),c.isDefaultPrevented()?!0:(b.removeClass("open").trigger("hidden.bfhtimepicker"),void 0)):!0})}function d(a){return a.closest(".bfh-timepicker")}var e="[data-toggle=bfh-timepicker]",f=function(b,c){this.options=a.extend({},a.fn.bfhtimepicker.defaults,c),this.$element=a(b),this.initPopover()};f.prototype={constructor:f,setTime:function(){var a,c,d,e,f,g,h;a=this.options.time,g="",h="",""===a||"now"===a||void 0===a?(c=new Date,e=c.getHours(),f=c.getMinutes(),"12h"===this.options.mode&&(e>12?(e-=12,g=" "+BFHTimePickerModes.pm,h="pm"):(g=" "+BFHTimePickerModes.am,h="am")),"now"===a&&this.$element.find('.bfh-timepicker-toggle > input[type="text"]').val(b(e,f)+g),this.$element.data("hour",e),this.$element.data("minute",f),this.$element.data("mode",h)):(d=String(a).split(BFHTimePickerDelimiter),e=d[0],f=d[1],"12h"===this.options.mode&&(d=String(f).split(" "),f=d[0],h=d[1]===BFHTimePickerModes.pm?"pm":"am"),this.$element.find('.bfh-timepicker-toggle > input[type="text"]').val(a),this.$element.data("hour",e),this.$element.data("minute",f),this.$element.data("mode",h))},initPopover:function(){var b,c,d,g,h;b="",c="",d="",""!==this.options.icon&&("right"===this.options.align?c='<span class="input-group-addon"><i class="'+this.options.icon+'"></i></span>':b='<span class="input-group-addon"><i class="'+this.options.icon+'"></i></span>',d="input-group"),g="",h="23","12h"===this.options.mode&&(g='<td><div class="bfh-selectbox" data-input="'+this.options.input+'" data-value="am">'+'<div data-value="am">'+BFHTimePickerModes.am+"</div>"+'<div data-value="pm">'+BFHTimePickerModes.pm+"</div>"+"</div>",h="11"),this.$element.html('<div class="'+d+' bfh-timepicker-toggle" data-toggle="bfh-timepicker">'+b+'<input type="text" name="'+this.options.name+'" class="'+this.options.input+'" placeholder="'+this.options.placeholder+'" readonly>'+c+"</div>"+'<div class="bfh-timepicker-popover">'+'<table class="table">'+"<tbody>"+"<tr>"+'<td class="hour">'+'<input type="text" class="'+this.options.input+' bfh-number" data-min="0" data-max="'+h+'" data-zeros="true" data-wrap="true">'+"</td>"+'<td class="separator">'+BFHTimePickerDelimiter+"</td>"+'<td class="minute">'+'<input type="text" class="'+this.options.input+' bfh-number" data-min="0" data-max="59" data-zeros="true" data-wrap="true">'+"</td>"+g+"</tr>"+"</tbody>"+"</table>"+"</div>"),this.$element.on("click.bfhtimepicker.data-api touchstart.bfhtimepicker.data-api",e,f.prototype.toggle).on("click.bfhtimepicker.data-api touchstart.bfhtimepicker.data-api",".bfh-timepicker-popover > table",function(){return!1}),this.$element.find(".bfh-number").each(function(){var b;b=a(this),b.bfhnumber(b.data()),b.on("change",f.prototype.change)}),this.$element.find(".bfh-selectbox").each(function(){var b;b=a(this),b.bfhselectbox(b.data()),b.on("change.bfhselectbox",f.prototype.change)}),this.setTime(),this.updatePopover()},updatePopover:function(){var a,b,c;a=this.$element.data("hour"),b=this.$element.data("minute"),c=this.$element.data("mode"),this.$element.find(".hour input[type=text]").val(a).change(),this.$element.find(".minute input[type=text]").val(b).change(),this.$element.find(".bfh-selectbox").val(c)},change:function(){var b,c,e,f;return b=a(this),c=d(b),e=c.data("bfhtimepicker"),e&&"undefined"!==e&&(f="","12h"===e.options.mode&&(f=" "+BFHTimePickerModes[c.find(".bfh-selectbox").val()]),c.find('.bfh-timepicker-toggle > input[type="text"]').val(c.find(".hour input[type=text]").val()+BFHTimePickerDelimiter+c.find(".minute input[type=text]").val()+f),c.trigger("change.bfhtimepicker")),!1},toggle:function(b){var e,f,g;if(e=a(this),f=d(e),f.is(".disabled")||void 0!==f.attr("disabled"))return!0;if(g=f.hasClass("open"),c(),!g){if(f.trigger(b=a.Event("show.bfhtimepicker")),b.isDefaultPrevented())return!0;f.toggleClass("open").trigger("shown.bfhtimepicker"),e.focus()}return!1}};var g=a.fn.bfhtimepicker;a.fn.bfhtimepicker=function(b){return this.each(function(){var c,d,e;c=a(this),d=c.data("bfhtimepicker"),e="object"==typeof b&&b,this.type="bfhtimepicker",d||c.data("bfhtimepicker",d=new f(this,e)),"string"==typeof b&&d[b].call(c)})},a.fn.bfhtimepicker.Constructor=f,a.fn.bfhtimepicker.defaults={icon:"glyphicon glyphicon-time",align:"left",input:"form-control",placeholder:"",name:"",time:"now",mode:"24h"},a.fn.bfhtimepicker.noConflict=function(){return a.fn.bfhtimepicker=g,this};var h;a.valHooks.div&&(h=a.valHooks.div),a.valHooks.div={get:function(b){return a(b).hasClass("bfh-timepicker")?a(b).find('.bfh-timepicker-toggle > input[type="text"]').val():h?h.get(b):void 0},set:function(b,c){var d;if(a(b).hasClass("bfh-timepicker"))d=a(b).data("bfhtimepicker"),d.options.time=c,d.setTime(),d.updatePopover();else if(h)return h.set(b,c)}},a(document).ready(function(){a("div.bfh-timepicker").each(function(){var b;b=a(this),b.bfhtimepicker(b.data())})}),a(document).on("click.bfhtimepicker.data-api",c)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.bfhtimezones.defaults,c),this.$element=a(b),this.$element.is("select")&&this.addTimezones(),this.$element.hasClass("bfh-selectbox")&&this.addBootstrapTimezones()};b.prototype={constructor:b,addTimezones:function(){var b,c;b=this.options.country,""!==b&&(c=a(document).find("#"+b),0!==c.length&&(b=c.val(),c.on("change",{timezone:this},this.changeCountry))),this.loadTimezones(b)},loadTimezones:function(a){var b,c;b=this.options.timezone,this.$element.html(""),this.options.blank===!0&&this.$element.append('<option value=""></option>');for(c in BFHTimezonesList[a])BFHTimezonesList[a].hasOwnProperty(c)&&this.$element.append('<option value="'+c+'">'+BFHTimezonesList[a][c]+"</option>");this.$element.val(b)},changeCountry:function(b){var c,d,e;c=a(this),d=b.data.timezone,e=c.val(),d.loadTimezones(e)},addBootstrapTimezones:function(){var b,c;b=this.options.country,""!==b&&(c=a(document).find("#"+b),0!==c.length&&(b=c.find('input[type="hidden"]').val(),c.on("change.bfhselectbox",{timezone:this},this.changeBootstrapCountry))),this.loadBootstrapTimezones(b)},loadBootstrapTimezones:function(a){var b,c,d,e,f;e=this.options.timezone,b=this.$element.find('input[type="hidden"]'),c=this.$element.find(".bfh-selectbox-option"),d=this.$element.find("[role=option]"),d.html(""),this.options.blank===!0&&d.append('<li><a tabindex="-1" href="#" data-option=""></a></li>');for(f in BFHTimezonesList[a])BFHTimezonesList[a].hasOwnProperty(f)&&d.append('<li><a tabindex="-1" href="#" data-option="'+f+'">'+BFHTimezonesList[a][f]+"</a></li>");this.$element.val(e)},changeBootstrapCountry:function(b){var c,d,e;c=a(this),d=b.data.timezone,e=c.val(),d.loadBootstrapTimezones(e)}};var c=a.fn.bfhtimezones;a.fn.bfhtimezones=function(c){return this.each(function(){var d,e,f;d=a(this),e=d.data("bfhtimezones"),f="object"==typeof c&&c,e||d.data("bfhtimezones",e=new b(this,f)),"string"==typeof c&&e[c].call(d)})},a.fn.bfhtimezones.Constructor=b,a.fn.bfhtimezones.defaults={country:"",timezone:"",blank:!0},a.fn.bfhtimezones.noConflict=function(){return a.fn.bfhtimezones=c,this},a(document).ready(function(){a("form select.bfh-timezones, div.bfh-timezones").each(function(){var b;b=a(this),b.hasClass("bfh-selectbox")&&b.bfhselectbox(b.data()),b.bfhtimezones(b.data())})})}(window.jQuery); \ No newline at end of file diff --git a/gui/slick/js/lib/bootstrap-hover-dropdown.min.js b/gui/slick/js/lib/bootstrap-hover-dropdown.min.js deleted file mode 100644 index 0f5f1d1318116a86b4af68eb28adff332f4fe62d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1501 zcmdPb(&AFkQgA3JN-a(;DoX`%0*dmpQj<%p6rA$&ONvX15(^YO^2<_-6kLk(3sUmS z^FWFmOG`5Hi>wr!6LV9G^79me3sMt{KoVi8Ma7x<c~%N#MtTN%hK3+9=lr~qqRgby zlKi4#D+S-gl9J3s1)s#C)Vz|+Vvqut)PmH!l+?WB%+z8ed)15Kb}AI)l%{9q=_q6c zmZla}LNpa87iAWdfNgVBD9+3+$Vr8&Qz*$-NX<)3%1K4?MGDmY#UR<l<dV#?RE7LJ zg$%Ig67y0N3X1Z}GE-6&5*6|?lT#H+i&KjfQY#8li!xL5l2i3SmilBSr{)!>S}FK? zhJg4U`MIeDiRr0U3K=CO1y=g{$&dgk28D-Sa(=FUQcixleiAGwbzzRs&Ck;X+pG)m znLd|-mOhtaT4`P~$VVC~I(a&&n$=~AMGE=0DjJ&BDtc*odNAGK2(g7LPSva~N-ZfZ z%2UeEE6FcS&L}QPEGkjT%u`6oPcF?(%`34l$;d3W(#W^X*Go)E(E#!E3cxX-p{c0@ z=B6elXK28U)U1Xv6-qQxHLLUW(lYZ>G?c8;@{>!8l{EE|a!QLdG<7ocGV_W{67x!O zDxGuki&OneGE$3*ZEbB84b;@~^@>t+^UG45a}tY-HI(uTQuCBFb@KF*b5awFLNaqx z^Gi!Kk~MWQL5@OIRHRo@l$oBMTBMPvSqln<B3l)(vo&=xZHwS;*GaLhPD#y4th6#U zFwnu~6e~r8TAgB;DySKHDTyVC8cJZDN}Aa9p(;%Vc}_PU>^mjRTAf5&rQ(eIa=oNt zc%&%ll-ep~WTvE|3TD`<=%rSaq~@h)C>rQg*XpF`r0NuF>Lgod>VZ=LBGB_-@u-lg zmyuYE5+XG<MS7XV8hLspiACwDC7SkS`I#vSB^r5}U?0L_OGC3d*)~tFIJE>8zDP2e zSmOf`)TNrWIvIN4P|>W_)F~p(eVKUN2a01z0)hvZZgFW+ZfahslBOPd(gVeJDm=dP zty9q*qFIfWi1IacQuUHEGILUjQu8#F5SBn~0L7ICNKJ8OQch-Gda;HkKINcT)X=Qe zK?*yNn@Vi)Sz?`!GvG_~U?w7hw^p-OQ?ph_MFW;cHT8;86H_V?$w9MPMMFIrlvE)_ gg{=}S|0~6+Yr_2qE(|m@Yc*>%Af+QXKWkb806ez}@&Et; diff --git a/gui/slick/js/lib/bootstrap.min.js b/gui/slick/js/lib/bootstrap.min.js deleted file mode 100644 index 133aeecb98aa2b05d2dc1fcd623afcb37204828a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36816 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 diff --git a/gui/slick/js/lib/bootstrap3-typeahead.min.js b/gui/slick/js/lib/bootstrap3-typeahead.min.js deleted file mode 100644 index 89959ab83d2f84143b287846dcf0c5c41d39200d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6878 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 diff --git a/gui/slick/js/lib/jquery-2.1.4.min.js b/gui/slick/js/lib/jquery-2.1.4.min.js deleted file mode 100644 index 49990d6e14503798f142dcb0d5b23cb0c8f80244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84345 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�fvf>lq>~OBdj~DJggXw@YJ=|qL5M=~NfIbam*f{%LmLO6iNO2< zog|H9O_*z78=p|FY=az^11cLJ^8}ip)A|y@H%dT9F(J-^-UtS|uM9k7iMBTd<_OSY z8|dk~pmAc9d&0n5d_hP46&35GL%XV=Km@N|N!3gTAG{1A!QrT;mZAaTKpNT#pq@DR zxQKL2g#pmHy;M-*g=zw;2kq5P%}X!Iuuj$0wbo1noh|_yL4zJH4OtJP2r6N~QedBg zP67d)?gUZ`N?l;bfOZ`u*(w_9r0EqG<YXqNYNYBIYHC`8PIXWO?fb)e85|^SAmsvh z`iBLu2K=fu$Y?J1P}PB5z6K60(0RVmup8KvKx0M8a4vXEObOHm&V$ruppZ_nhn)y( zWdN>zLHl^XsZ!AZ-o*wPt&<3jUeMqd*w<=mpjE^9$h(U`n=z6Q!I}gK)}&Z)Qxv*g zSWPW0Iw=;O)<HAFU;#vEf=q#jWD+<eLGhJj3)*>;1m4yNI<Hnu4Mgfef)RxSskuRJ z)`TT^n5V!qJ)pzmAXCWD?xqf;L#YGlYNAghgEBqn+R3!M=%iR{@Me~zSVTDqI<X6B znh1QZ87MzsnY&5`EfL0CY!2Da0t$e{l2nZl(AE=B7(fgLwU0ofwaFP8)x|lPDXA{` z<#|>ii5d_$YwCanLkqw{pgy1yR44>IqzV>>dQ(#eRPuV}S;5Onh#9qDasSd1Bnhxd z5DBP32u)DqK<6bxmvMs!Osl~`lZX;DpmMkxGG+{JOzOdWnWO_*1Of3LB;SLUZ-HyT zlFa06L;yod576FH107I2Koo=1Dq@(>I>`oh6DT-^B-(;DL+B)eR-=Jfkc<nN08UQT zNYd5SF$7(b2Wj?#nggI(wIshl13dT$Del1a7PRGua8Dv=rUBvzSUUw|546Gt&A(}Y zW=~-%Kt@6h0$&?fmY8E}Xbc+=2hG;OOKZ()-^7|44c|oD;?xpP(BYJ2i8&hZAc5$C z8KMcgJr***k&m?USF;+thy||OH&Ii^7qUwi>Iz8v!nV3NC%@dv%)me=EwQ-7%E-V# z2R`XzVqgGP3@W&C5-XAX4%*KJjn71Ia|h~eaC;;gG|-(0-UbXBR0G{$3Ce|#%&w7y zSX_YA>p>a|P6F-12d%Ki;vY~)E5Ecv1H5SqX@eOwabRw>03T-tnn%Kvf}G|BUg(Fq z=O1IaI%JMcNmJ7rax{*u68K;o@TLst9!>u|TksmWM7=W5NjEy#puQXAw4YSa?X(cf zz?U4RWEO)K+k+Q;f|a?z1(HFdd0<H$#Kn;C{Uk8IK<%(qDpAsbIS6v0qfWLSm;v4k z1d<0Yzy!Of7JB_*WTH+~qK*nE)>119iojP`Lr$6lmuc|ZT@y=6ijZn0qzH#DSI7fv z#l0o~vS=N2k`<CM@X8IGAiymfq-385UDyuN1Zh2jR#8C82I%gFY7BS5d(NQIA@I}| zWONrak_TNpm!_r$S~HiXre*}5M1iJUSU&+Y1r4$id_|_Mt!*gi2KA!+0#I=VS^@z+ z3L_2FvPC*32y}gsZ4&BfO5m%kK@J30vEcqWxTjbEyBZHv89)xSNz$~BO0<duP4#d= zN*VAHx)j6`x)j(E{<a#awkaStg50C2X`gDP0Xq9SEi*3#90g!u=m>o(WTz8&nG|Hg z)i&84WGHkUS_<mAycEz{74X5KNf3h*K?3lw05yKKL9?*Q&?P)55d`YAfhO%!L8qR8 z^dQAED7k<uOwghTThOo&=sGIM1%Vo_;Kp1UWGg;mI9{_Hd{IlXZCZ3H=<FEKz2KmE zez(kuXwYu>WKe|-O0v1&dm0g832IwufQH;`6%9d$7$8y}I7UIOTOD|;SV4{lN1I0l zxfgVL6mtGiQ-fZU3OaoY6#Jl!=AaRJ(8@4qUWAl8$+ple3F`}@1ta8`IMCP=XdNO{ zEoduaQY{E*>O>`?PwawvDDcbzInL4^E%cK?lgh=ZC7_^(dK5Hnl?<MJ1!pZ#&jdB? z73Y^0C8t8;K|iKkTR&YBQ67V06gn5G0-49k12wE5$;=uogi;6SAa<6(e4YYo7TbcA z>VQdG&<H*xDJFwbs!j^%V6l>Xq*Iu{XS_mHr-3HfY9YI(;-Ry`;IOWNl%O@BQ)NIW zj@3XezW`sV3u<w|3ocNSK}(6y{0=X;KuQP|T%ch;BxB%lfwka*_NPE{(Rtu8EKs5a zSA((ewkC8a0%W;cW(8;=aDI`Jl~P7YZjM`ik&=#5a!z7#F=$~hhz2DzCD6e$$fI`1 zy*p5Gr<0Doz)Ob|c<GP=FC9A6tB__3n&M3d-++Zwl!0d&K&xb+P6HQQpsgqnufPg3 z$U*B0pf#|`_NkyF3m|J-Q<2M*6x&o#5dtq$QmjA;$u=2uODJq{FzCWi@M;TN4UqEm z)Dlp_0Bw5)D~5O)Y^zmuNn#RYF*U{l6lkP^&ZsR$WC76Gl9`~@*Ps=-@z6dWq>KTD zs3vGtN=8v?8tB+Xn9;h1kX#6^jA3<lO^pVU_o0_Lrlz2;AcYhFppG?S!38WYfQvkY zu$o#D(n&FJ6T#jC7vIo|4%#Pyx(;+%b82FWe_l={XunZng%7y13Q8`iIXTc>OHf__ zWY-!<OMZE9L1G?AJRhV8#40UL^-Tm_hz;J-?F8P^4OWl`+LG;>k_q0W1?m{Wn)9F* zE-X!e(l%;s7Ym+phUV48BwPLHn39;Hn7o*@Sp9Ug#zabrGbmA`WGGPm0NzatNy$1H zm}@mb!vi{*wgx&`V7uTG327QAgHnm`!CtT{!DS!3S&^h!4O`}y2z7==BBF1o16?r( z&V1k`qFD>BpEAHlLL}LOZ(&Eh@i*2w%P!M86LQ=gWZg(~W~@$%E#$llP(1-UTLyH@ zg&y2od(b$lb}~W$bfuIg{M3fTBpuK=s}+a<%_<>|QcHr|^_POUQ&K@mI~A-ObUma- zinc9;XAN4+T~d^p3mWl9vIw+w8r3bf>F^aEpb!IX>jYKe#KaMJ8FW!P_@W@#%uY=W zY}g2~LQ_pGk%}<~snWsj8`P1f1Uk_Keo-T6x;qWjl!3Htu*IOAt$`+J3>JED1~`p? zV-uVjtkZ2lqu9_m1+9@LEm|R6ba1dCWj#=12bB4eZDB27Xo;l+YEz{q<{?I_L7Re# z;X5;u?UNuwl8B519hO9iAE+2O8=~b?dw8}?Mr2DQSE58Nbj2$?2Z0(;Nt(3?pMWPa z5lPP$I`EmK16ltK&Gw+lUTBNQ6?7P6EOZ4_l5JXa3Mh6`^)eER!GWZaq-mcD?S#Mt ztWx#h-c5qc*J^;al!VsQAcdDLxDg7<Oo$8)x<wPV5K~7fJ|6Co_;@AA_$XWiI<g1n zLy9{%x27f$G9av^WQ9DijB2JPXrl`FAT*eN5J81>)=HACl7f<UBB%hta#|Mb_~6Vm zaJL8KBhUmNQke$Q4HJgD5M&xgVFoX;l0cW>L0ch;2GG=|Xb3x$JSoXmKc)!1(kM$r zJp~MuWTEv1ICwxuPl0zxp_N8ZdlW$Z2b9SjNSK3@C2}$ZnVV`2D!M_w0<Xh?mfoqh zDfY-!MY0YwNr5`~8k(9`iQszM);85X)fTj18oK!iUJ9n#r)q;FK)C?22mv(w4DP;x z&O1s)YI?&Pn4q>Y=pZ#EC96bjB_+`8A*gLumY4%>5<%85gEB67F)FGsD3(BV7+OUQ z8m?D@_5hQRT5Cz*rW(lCI;lEJ;9&w#vkBbw26?eG)izZVS{=eCgHarl3O?)z)g_SA zTyZ%Ax|;~u85+s9N#Oo1!V#LFx&CC^RER5d5P2Nr@%%Ie&?XL8k(rbPS}6?fM1Zaj zR#LJ`hHZL*4I02g2{f_^K9d5YH3>=tAfF-ks$n4lO|Re!_7rVFtB~_R*A3@tKu^<5 z1g%-of%H$%cQPXOq=1vIE%?lJ&_Z?a-7OG3sVR^)AZW8nYEEi$iEe&gDrl(@WN@dZ z#=tIBC*3y99+WgdO9(P-)9h2V4Xt29_MnQ^F4aE6D$PC>bVvts<0J*tGEvk}1g#tg znVp)VrUtq=GZlQReSQJx!cXvslRaYa2^^N7%^;vyL26sWMy`}Vo7PZ{EQHCRbd!-) z=qSO?npc9Iv1*&Ak*o=dV9@bJuuPj|oemjIO@g;j($SZA!|N~b-~u8<A;*Yir$TaC z5@^y6zS<H}1E=fiYJwJ9rpM}lw(WugI~80`<Uus0fZS7>s*?sTut1F_&_z<P1OPfB z3DmWRgd;f8Y;_Gmhc7{oX$6-p(a>Q79mFUh(p&<lO$|$q;Jh4*+4V=11xVX{KqXNI z_z-T;geBCy;3Z$6(P2#;a2X5RUskIFAD0AoWKeAcMJrNA9$_7L)&g=?2~xB}3kG|o z{5&Nq=;%c)Xz?a=LP802@tp$ro*xLAnFpcsOG^|$xA`d)r50yarGhTJ%+JYDfZQVo zx+*g{TOlPW2YgYT0{HqR&_(tTR%ro*2DM8eEYM<1D66yt!T?{z1Yv@&UQ$TTNX$!5 zRe<Cxh2qkr+{_Ztg`r?`vr{Vzic*V<K?0=(3aLd!`9%t#WrC>{CAq12rKs0$!a70V zK@rdh1Lz_lc)gJb8g_(rLD4E8I|E27DL)T-3>0XR1KKEp-tD201UhvLG?EV*qbUKM z##o&J@*q-;4NB%v8$d-g<Z?)`k2MlCAw00BLGz1=nzi72qfoRXIT36C_?j3{83G<$ zs?{mY16?(Rq6MB5AR5xrG$2(R=v+YX!Z^^Ki6}ZSr|iMrhED6~l;(lPMzH9D+XSk3 z;TKCmdw9_B16!}81v)<;?w%wa(5#x4mXZ#rl!puyC4)+C$X#$Lpr(YqzI7g`t6iMx z73}YaEv19RAu2RLl`MD;1-z#?!q*2yJ-A-bNd^rjD}pSBHii+?<FJAY6t3XIJd?pk zk-7N$27r!wDbh)@1($=xscuF2xxwJJG-v=3G>)ZTk(;BW2|cMZMY9@q>k)KUo(AZu z25`*?odPIEy7B_-+9GfohA(;spDG9z(opiuD@)ADOi_sN^|1mq_dut_fKMSwO|sQj z*3(ka*GWsV)z^r&SBuq*w~dZdi`CNCNl&uXkJHf8ve&eVR){Hy)zXNL1NG@+wKP@q z({pt)!1DH1iAnjTB{hi!1t6?jT#{dun4Vgrr>zUFaf>ta^J>yEb5d)HQj2TKGgH!2 zOEj%i^mQ_!+TC44YCK#WT|oOgvOr=n`Z4<YI@utmMs!TMp0;kRwv{I6$`*a_-7nE` zG5Yq(v04r_njjbH+bdheYJudfG-6V;HET3$H1&0Il0d89bHQX@lC6@Kz7lK^zLJ)b zrcOR+m?kGb8N5JB4>Ss-Q;=kvodh{3J|Ar`AJSETWq5_cBn`x#7?>z%fE?%5SfFdD zK=y(|9ke;XKqn1-#sIZn0^Q&VUtpB12^|wpfsKhPX@lAYDbWV8pu4Y9^oqgj3=Ban ze=Q{)$RIdqBpkH#N)x{7Dj9T&1W4ExL_p-gw@QPu5X>(MMM<DxI7og5CHquRXr|eM zdLFq+)^KI%8X1s5uS{6A2s(Dr7Q9RVT>mA4_tQrs)p?0JP%T-u8K5B3f$u<tHSFN| zDXXR?t)?b5IxE&b&0bL>(>4n_^<ZG7k)#K@KONLIFNS+9OH(IZBMY(wR8uDtnsXG= zkrhW9#A?>mD5ioJwt-Hv0>uhqv28Kf-w;26PIU!Mt|Vq9Rs^S(lw{_m7we_vB$hxI zeAd)dL$;WJSM(-nLZ)sMZNV3YtEp*dq(&#l+9z6phQU*8t7|niL95|FYklF1BSG^z zu)%6Y1JF%hD7U+mfL#MBx<PROUiu5W3nL#qP*)7THys`l(9W!q7ARq4g1nlk2U$V~ z8?ObetcD&tnVXplJ;xectOTVN7v$#^r+TC&rlb~WC_zta*98SJXtooyx*9wR23}N? z0b0SI0bYOuA|dlwDVmzqnef<1)wE73N=?kJ%}mn(xg|4CAz3rc7Q_VKz6Rd03^pto z+;>+5$$*Arlk@Y+Qj1Dbi;APcqaWHJiCEA$SSr*+&;`orpas+59RlgFh)%QDNK>>0 z+W@*h9=6U9bR$7@8e-=;JoT1BgBNM)0u;QUT{NKNo(;OOB(WqB6avN2+yx#D%#JpU z1qTJ>b~{kH0(G!vR&+XAe+zVR3Bp6^vDTog9-xr|jjuFNV1iDChQxqdW@=7KadaB! zR{7*;EaI`YNt)mbK2ktC{6MkqmI=B?Sxrp?RH`8aG?H`@;rT=pyzU!((*)FdkhPGs zk_L(xaI7d~rfDc?fp%DCLiz@2;K)h0&5F(h_3O3MVry!$qLs81l(f@gbrd0o<$|Lz z3uImfXv`nJQd9?YWrnS-Eol1!!U)g}83<FrJWb8&bkL}VfjvlBYOEFL(jG<7Qbo|Y zJhmV;I@$1~1u|6=DS4%XRf4QfS5r%jRw~IT$}cZgiq%ZAP1i_*E(j|rs;q|ap_Ob7 ztl3drTmo7WsDxaN>VT_Gt91JuD<!{tP|L6^wFp#~DWnzU=PD>^gF>Su9~26;wa^3z zGpD#TIXShsSV;#I6IMyJwTO0IVsc4lS*n$RPEKNRiEn;NW?E)yidA*3PHIVFI*3Lt zY^<tFi*l^;lXO5GT`MJb*AOM0%wnJX<is4Sj3h{&D*)XUrKtls2pDt-O+isU$a3)Y z8K5GixH2ypBo1!d=9PdFGx)IIoJ>gFr(dC4US6)7mS2>sTUwNpnwOlPlA2--YCRVf zr<T};hPdfkDCvN<rGVDTgLh2kCFy{gELPwvfAkA-5;OCZbU<@gP!SMQNv9$=2hFD3 z932IaMsQn4C#yI=4^;t31gat{u`CgKyG^YQ)a}Jq)gUuLy7eK}>4R+2hnS=f(yb2~ zzDCYQ5G_hY(9$i!*GCEJc9;<8SV1L-5pZRoCL!ozZg|GEs#ekhJ6*{N(rnWK`&|KK zzY-{TAzY9Xl&p~2n^0w-wjE43!q=x(2dNr?#Im9R#FrH%pd*56b)e}0`Jz&A=L6aa zNU|?Z(g0Uhd3sQ#;Q9&F^|LBY(m)l}0d)yL$^ziatqYSha*{N`)`S!#<`oy@7nN8Q zCTZkC1yS1dn$?&Ksv(7q4s3&_rcRP=61YYLRaM}sQwM$|x=yw&+(D%U8j!6QIkwrL zk`t63YHG4|auHlLHH{qj&|6JSj$T$_X=+g==){H`&@w9UtuH$Hwt0GpT`xKXwt0Ha zi8(o-b9jn1l=AbEQx$SkbMuQTl{9q<ZL>l9R!T~Xo%2&tLC(}E0u}MaAfm+9K&RAJ zDLFAOIW;FWMM<a3wz?=aF{LsXTr3#qq^Fjk){aPl18FKGf%*hSpyiC<(o!)ER9jWo zLd*9g+jMBVGF4L(bP$JOEP5r86m1k+3mSw@M3aFQE#UDc&>ae(t_5g4GwABMoE%hV z6(igQE7}ymj<Qb$kK%yGPJ&VkOH+$WAk{oV12}PkqYiZAH}Z@;tYueHQ=^e+TMTN$ zfQXu!M4ckg5#C9V@#<O~P?xnRGbPm*+OR+}9PS*DA=!GcrUz&nEvPdG+K`e6jT{tR zAP0fNHW5^~8`+hBt6lKsv_#E9P$xVZMCyR%m180GR~c+SL}GLqG|pq;?JbC9iAkWu z4r>O0n(|<KY!hp0N@2cD23<`AR;ZDrsZ*h00Ge<BYp(^xbv|ffAH2P&OcTCl-nIZV zJD^jh2dw~X%k;o|ILh?Em5FVc9%#b`s2(fIvDE<0C1&fD7Uk5`<R@u@me#=M|5CxD zm~d`Zk`B0-*H+TkR|1_$1*#8hlk{>^OEU6PYHE_e1FtnT*>I6;u!v4Jyz(yw-L(ap z4MYgl)PS14sL2hv3!<bH3mwtU)=MtRFD`b;&rQtC17Dm6>nDNTk7@+SeMrh}6*Uwy zYHC0=wymu#*c)nUpqsKFJR?veCj+u`UMZubq`(T)bOoulSF$irvQjcJF;>#l1f7&s zkc6%bY#NF>O_1%NT31ai8x%vZnh>-=0o>bGf_E+;0RcX*5TwBtTxcieYCyzwvh_+p ztLH!i#EChe6URa2rB1d^l1`bX4meZ6I{RhTpo_D>WfI6%NKFj73=1?nnx_Y;@wK%< zqoH6$pyA^5bWjr;R3Zn17Kb7t6%uiJD93{8Wb1+Ea3C#yTg6Oh%@0uu+II(z1r$}_ z@m!F%z-@i7ytb`I3RGu`roEDyl9iIZlBPD)yP$!Yl2io<4-|;tJE}k}GDC0>l@{gL zrXjS0P9cU|VUm`lqoiUOZ>yx8oTRO-X_cal)fy$Z3XtKMX|Sdb=&%j&^=L4G=#*GB zwKC9L1WG}rq2!sS3sa*ToSB!Ls-%;Lt`l^*HK-wl&k(=-yj0Lh70DSO1E8ukHFcm7 z4~jxWXoGmr#s{e31Zrj)g7O=Zm?n1TqI91?1F(?j1DT=;Dj`5s3Q|F=q2!pHoLW!< zI<OlQZy<HW(FU;~2SA%%(U8c2$;8@c>*0{mhPL2QHP|cZC@5*?C21>JD-_xq=ouI) zSt%)LS|N-9A58#WM4biNd6caOy4W_gs8|zAd}M*r8@Q`j9Gw*l=@#ihZiWa>%>$hY zkd4HJEV0PZDbvXY<z>)y%#b_;&qR8VvR2c&)K&@1RDwIC8d{uM8A2Q7hB~laN>+xo znq|>hu^QPhM<m-8ff_N;oT^z}riZA?Z4E)$G8Ziarskz6=|q?5WXFP%W+JG)3<`D7 zTJ8MO63~T;8tI_L*RbWr@OlGeIM}HgN>Ig0nxL_EC`VHhJOo%`YX~|v8Z@d~q*DPK z;46o;6Er|onkKlrqEK#Kp`mN2Q?6MH*@X_~f%+cs_8DmB9dsmGp#nTUlLjA5(J9g? z)+yB~*Qu~gvIebeEm2d`D6usHU4a5#{S9+|x~5JtbbmYO+<wqBu?|WgCE6L-n^=LC z*(BQ88W|X<sTms>*d^A~7#o;?mJowih?UxwBxz*pl<9yD<uA1@1#wDs%0Qbbv+Omp z^-ywnxosI}mLUk*28T2~G?aW2i%Z~n8gv<hnwkbimbNX|)WM-2ly~9UKpfDP?Q%^` z9V3WCYig80<BFgP1yWYpSAfo6faYB#E2w`Uq9wV|&X|&wMulxDxaE+lQ)F8Tu0nN+ zZA&4QxK5U>Vlik4t=P6g2ULYCR)99sRoE(l>v$y{1G_}f_HkPSP0-y5U~@`~Z4*Ix zz68|90d+TQLBsSFpgLbC%RV1v7juqIbdgSlPFbv`6-WZUK{f}JL@RWPK}YXG4Fxr2 zH3~tETgb>0YU0kaR|3~B(7vb@nCA+b=76Mjoh<tzE0A#o;FCGPyKo_v#DcGK)IiH8 zpd;o%`z0Z|V>NYjbzzkoXsZO)sx7|&G{FaJ!j{#7TGF7d6;c}yJpBOM4w45-Cg6mf ztfK_(OKF1j1cR@bM9~FrQNr{<!ypN9!w<?5I?z<Jj#5E>aS8IGHgKyKw1)?2oF6pk ziG0YL9@4r2@WKx8Svx79T~+X$1gdyIp{)V#u_r=0>`CDMKd8L6N(D1PJH#Q;VU+?~ z2@1Q@2gw0QUc)dGG6(>xA*^5*!0LdDEh|Ms_&|W64r~+z)Sm>;X&`O4EH6qd0Nv38 zFUt~P{TOKf60}GGKJ=UjxlIdguNl%>I;e3d3wDw~iv_H}%Ll;q7-&%`^q4h_JEJr~ z_fr{YLhpYAZFB;)v_Z;HS4<+`Lj*G!bXyE){RG@A5T8IUy@PhZ5<yA47<O4W_^5nM z(3a-3%pz1#SnEHr7JLZ^sL%$vL=)1*(X7=0`P4Hn4`ur_Jib6mA%TP*d~nC11sd2W zj9^0~bckP)Y@tg{bU=$EpygMw24b(0eX<_NVU9UDpuN(t4J;bq4HIA|BTR%vG-%$q z7%7HfK1cWg?q;ObSuk5bH<iQh&H`<VfLK+U2U38r3^imRajAiMy(s8dr<7FCA`x(; zg3dHesRS)PfqEO(5dxP{U<W2=WagxR?!GP7tks0<`i16p(4GLuKH*~Mu`1Yd7RuSJ zHns+!an$^@wBpnf$O+Fjw&2Z9;7u_w)4+EK<fLLTP7yS|S5O4qpA54X6#U@np0Xrc zeN`g^{dApj(1c`kOstB&P6dcrWFM2KpRQAx1e$2Gw}MPjLl?8xWafgV(TY-wQ%k_} zXQ0*XI#p1m*q6a)r&gw?=4t9@B4%hD(Z{$!y;o53gsgE$0$sffo~c3Eij}Haom^8> z4sGx!YTBo0B<iGUT7gW{R*F{A*1#ALO0`b{H7B)|VwH4KL1idttq}O`>dZ8a<eD0o z21Q#?SG2Mq6?AGT$XM9;ENDX~cpN!N6K+i^*tn$V)L4j#&`ugs9DpXqLA`g-Q3T*i z!{EslT(*NIgOSSbBu)Dy&`vz?+J+?1xt2*fDbcW{GqJXi(a+EzPf%@_pO>0fqLHYn ztz@gDjYTF&6Fd|Esdym!LO_Ka%6J^8*9R)Z;qynxy-FQKJb=!QO@xkfL5~&)01d19 zCxKc38j0{|LOESH6`Wu6@)C1XA?w+|t25vM4+>H6+*BecM3Z$u=P>9b>7>GkLsImz z@-y=^l+=_E%k|2Vbd<C~4O!4K2iV+Hb#ZD@W@1ie71G9ec;<#i3dAjNg^=_G+L4GV zgsXJGT82Yb-GfcmQ37qmPR%PRhM)NkKGh*N5w^%D5wfhJRuh^Lk&i<HB@sxK03I1Z zDeXYP2MTkrHJW;v#TrUhur*9dnrdoQ&};xMd0?yRG}Y7;E1?pgqawhX^}t&JQ&Vbc z6hk1x^NFBZ5cR%OaJmG!CmB|(gVq^oz#|1T!UtNr2BNJHDI^(mv?M5ylCdlltOohP zDhZMjz=^;LG;ajyqE{s8D1qkfl|ai(tgt9eh83_HC`!SNF_0b|_~0#gj9ITDqX>}$ zHLF1rE3jrmYB^|;fk#P60kr!Looh+dtgeOJ1ml!sYoOx{o|kt?vaL1%?=m$sGBUO@ zGBBytaRudAlpIr$QKSLdY?)XBy8X?yEH$qLR9qu*L8HBpbwo;tut6-gO9XXhos%@3 zlcE!2H9%{XKm*T3#kPuyuAnu|<(VZJ&PAyysd*)ti8;lfvz%O$bh5$u*w!@(tPC0i z@U9plZNVy3SdxO6T~h-xS}_rM<jlUh80B8;WTbgV+eA>PYJirhX=^)yhdk53cg<-) z*8S-uf<_8;67|3hJrJ)rwFngHpz~1^i;K(ii&8+_-6}GQAk&B7fl_dB3N{%g7@Z2b z;s>rOIyKfh5k4HNrj`ai<_&oe7n_&{LJP=Fq|v^bn&fDu2wiC0r>5wFs%$0Dv6xuJ zZIvQ?eUK6hsDqndqyctzvSu3QC{U_Sa&&5}rgah`{b5;%p;-+&v=KU_<qSUQ8gv9f zejaH3nQfY0ejd2520nH|2RhmS>e<?-!A2phpuIV;Xo?2tLMKq)4Ro3Vyc4Hsm7?L2 z6b+M$t*L=AQIuh>R|Q?!1eu}&^#$##K{Fs$sDic7wR<{gpiJn9G0+dXs};1@UJvT0 zB+#-+xWAG#pw0(P%7FcEo1_8tCuC3p6ttjAe~|_jL3s+)uYjC!0UM{t0FP57L5C<Z zYHM}CBOb_wIA~{+hGs3y$>8Jop&1x7*8?4+vZ{v6=0Rr&5z~7*3ZOfsV3U!!#8Z=V zq0@n=>ML{+GLQ*7(Eg=jxNZ6x_EsP>Ye330Ax_W-PbflX?5(OHGj|XvC4|Qi=_*eT zGN$VaT3eY2TA%@GYl1uppHS0)cf}A55Y1|M+W@q3JUIh&f+~~+-JXh+cR-^C;L6Ds z+{pu#Q;>2OQRrZ`BQp)ufj|t<L;DOm$<PuBt<(Wu*#zoQDA_>#Y^S6N8Y(Z)s0NoU zpvlbS4A645601beX~UTXCC(7OPH|DP6}TX()zr(+(@+BCC&<!CC7ooHESUt|I03%G z6I7GwB&w;U!qO!uTY<f5Z(?8qt^gpV9LUc(;891=sTlAp<3KlMX<|uvpg9^)%7bkk za7zLm7vT<C$!4n=W3ORvt5&0;SrcO)16~9Oim%|*5>TQ9jV%;dDS^5$p!q_`^lt%d z`Vf%_AYqwk>z1Tf06Me*JkkNaY9L=*DIPNB4Gm`SSr(xAFwmqs)&v5wQ~^X3AXQV~ zmEaI-V7Ij->46o22b<N@G~A)Bj3iJEplPpET9gAi`Vumo0pDE!Sr4VArl^qwnN@{M z^@E1@G~rt>K$raDpZ5o~cMukW$^%U`H6;*@Xmw@O)PM(P3P2-k5PLy`9H8N9dkxUl z17PRF0u!~P3H2LH614pnMYV>e6`B&A4ErR|9W)>U-cE4`&pIe+r^1!PLJJ&9NOK)v zKGJ*#)O1Lj9yE5444>nVhGs8t94R54SpskAf^Sa+*Bu(5l}Y7^#R_@(B?_Qql$xTX zsgoXU5L>H*8YH&huu=kTJOXuNK=-yGatdhG3w*t6txgJT?h;;xXjVfs=z#h_pec7q z+JJ?hZ89of2b54ti!(G*H8nvazo6zLyps<)^D<2X<VH|4BMmwTT&sx~F@x4R;36En z7{((6WeF@~unx30p78Qlr2SB!>B{^x1yH37IXw!rH6OfOAP3w*PO&Y6EW1nu9oPvv zj4c{|c|eMNbQ1I&Zs@{S4bT;Jnz2?Iptbs_SCU63#)A7dI^YwDAm_NKspV;;g1R@L z#pB>>5h3@1N5_JWI75shXhNE&9-#JTTAm)LXoKuq1+fq@2HkZHS|x?C{8vrQBMCO4 z;Q=0n!93Up;$g@xSMbgy@Xci4UCN+agcOjnnH^|c0_;ohp1(xs5;V|FJ)prW$Z}5u z@Xb9a@tmY-586ee16x6?X$5NK=7W2ZD7*PIQf-w2{DVV4DHpof8Z_MjsdZ3>G9lxa zpj-~wqYhu%1U<13o?by)%WUB(S|=THvwVs@=o0Ca%ra121G#7%w4oYQ$$(NAsCx@O zTR<a4(+V__1fNmYNLEurm<{Udr$YwVl6BH*YLM2(fm%|a!?I&RRS2k~20E(-JgyN9 z9{7e#v+6+E`JkQ8py~kB&4&zXgJqz@<6w3$WTaLJss}VngtCeiG?J$WKK}_RallIo zkP|>vB<TDaNM(RBmIOWW2>Ap<xYj(q^rF-P4fuInaQ`R4m4KGvCV@}Ts)e0#4N1M8 z;Prp`$>1Hi=+_b>28Fzk*Dr(8PIzWsN`ARUqNaVKl_j`#2K946@eOVkrluv9=9GkG zrk2;{LGK|1Z&dLI51ApVOK9c*b#CE{RY9vM!Rvn@SI2;c;KA2(DrxHE*n+mKfX^wn zRsyZT%S;AUDcRtb5cp7LJ=n#;wn{~*If<aPb4sA|@N=N905y9-NB)AZv{5Pn%{S<P zX5*oDfvzN0($vYa1+{*m7Z2Oo+Gf|(D5Ygqq^5vv15MwgX=ftWlAt>#H0^W^b+SM! zt8?J40Qb*Qz&G=Pj$r{A54t82`Npa=P0-1=smMZ^AR*8U0m?uWs4%xpf=rBpHb{W7 zHK?Ja2woNrIxsmGWD$g?n*m~Lr)z>&WPp@_>{e6L$khWeY?Hv0ZU&grPSw;=DlG=x z2Ln32+&)PU%z;^zt7(-3K0q-Sa_a-qv;brX6e&Kzt$%oShL#bqA`a2G1#i)S99ag= zbI3^+mS8}gIY@c|50!w9+yD(!fzk@N4FoO>L5GW{+E#;3F*MKt`OM0oRwoT~4OR;3 zo$R1d%ruxoK%G0ZTjq80z^$Of%)DZaB+xM<8qi7ze0YvieraAxW?s5;PG)LeNl<EX ziK4A-DEO*59P*$`=aX%{l0fG=gPoTOju6mpj`Y+>h`)4`^pe2_hU6DO91q%YmR6z- zQ5Auv3Uq}>E$9L>9athq1Uxw0L1hSN4LA4{7I4;rhfxYz7(v^hh*S+Zd_EaG;|0xb z_Mput>8T}{p4ZT{(tr+*K~g|KVi9QQ6V!bKIRcT{kVfhgL2(5>umm(xuaN@U%?K_I zKtTo0Bk((1!73padWGZ{KyLKX0nPG&242%ju&DzD4nm=(4miv~n=%S?!Dj2iJ(vr= zd^!YFq=SqECmLvWfEbUi6lAm#$a>I?E6Dyu4u0r(7TEWoK{t4chBVc&gjP+BXA*3> z2{f7rUcd;R(@4~T1`~J{Qep|Dl!JI65jlpyb5h7If<~)CBFJ#qj3GFOfqK*VIXNJ| zSSb}Grl&$vmy%9#a#4OxPDp+ML>!tnk#A5#I%y586{ZAq=oGlg16o%H_b}odL+Ft? zaG4}fD+UrC>7cBU1RuhLmkeq4>GtW-$+1?T<}0{$sgZ7<4(e5c-KYWDQjO$#t2CVy z`!uUWJ&+jGS(;$IwrQYEZ91tKSB`-TMCc$TIAo&1)qsu?C?Q}@^@0jM$kyqkSjdfc z1<3cKBZd!=_w*%$+EW$aW7rWF--5<tL3{6DnO8$IIw=->C#@Cige(K(jgi%mnI$XO z8TUHi<PEzO8R_^s@c1xvH)S>aM!ZbWq@$8{B4m|tUWpZGiJ+BIerZW+k&<>Il78^8 zB53d)v>XB+S>SFzsIW~#G|!;rIcR5V4dVO)_zF4jNw=VFt|_2(U<QyYd=(AsVYjAO zLGK<!G+8lI2-q<oYg1uq8L7DenvH=sQs4||Ge24hQkW`fC&q%?BuU^L1!|K(dYR}Y zKKzjSB)z2kluB@KE<Yy+q#tzE3nX8Fc`yZ#tOgcJjaEYCAuQK~Z8`$&ow0{xTTqRa z4qA!~ZlyrBF@X=@P0~rTPXQ-%1p}Qlc;W>2sM7NEKs#R%%|&>74qVJYx+|b|Yg(RO zVqQvcY7S@<Gl-Lt;*^-2t)m2sO++g`B{eNGFI7zqLhB{wroh-5N|064N;=59ui#eZ zLC@;(2DKQo0zvDmb$mc<6+}ek<vZu+rR8KMmmu7X)Ckp60bN4^Zmg-;`XoUP0@j0= l1($(xy^}O`@@m2BB0xPs(7}3OjZo=CJr&zLkP1y}E&$t`$YuZl diff --git a/gui/slick/js/lib/jquery.confirm.js b/gui/slick/js/lib/jquery.confirm.js deleted file mode 100644 index 7eb120243..000000000 --- a/gui/slick/js/lib/jquery.confirm.js +++ /dev/null @@ -1,56 +0,0 @@ -(function($){ - - $.confirm = function(params){ - - if($('#confirmOverlay').length){ - // A confirm is already shown on the page: - return false; - } - - var buttonHTML = ''; - $.each(params.buttons,function(name,obj){ - - // Generating the markup for the buttons: - - buttonHTML += '<a href="#" class="button '+obj['class']+'">'+name+'<span></span></a>'; - - if(!obj.action){ - obj.action = function(){}; - } - }); - - var markup = [ - '<div id="confirmOverlay">', - '<div id="confirmBox">', - '<h1>',params.title,'</h1>', - '<p>',params.message,'</p>', - '<div id="confirmButtons">', - buttonHTML, - '</div></div></div>' - ].join(''); - - $(markup).hide().appendTo('body').fadeIn(); - - var buttons = $('#confirmBox .button'), - i = 0; - - $.each(params.buttons,function(name,obj){ - buttons.eq(i++).click(function(){ - - // Calling the action attribute when a - // click occurs, and hiding the confirm. - - obj.action(); - $.confirm.hide(); - return false; - }); - }); - } - - $.confirm.hide = function(){ - $('#confirmOverlay').fadeOut(function(){ - $(this).remove(); - }); - } - -})(jQuery); \ No newline at end of file diff --git a/gui/slick/js/lib/jquery.cookie.js b/gui/slick/js/lib/jquery.cookie.js deleted file mode 100644 index dc031611f..000000000 --- a/gui/slick/js/lib/jquery.cookie.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * jQuery Cookie plugin - * - * Copyright (c) 2010 Klaus Hartl (stilbuero.de) - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - */ -(function($) { - $.cookie = function(key, value, options) { - - // key and at least value given, set cookie... - if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) { - options = $.extend({}, options); - - if (value === null || value === undefined) { - options.expires = -1; - } - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = String(value); - - return (document.cookie = [ - encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // key and possibly options given, get cookie... - options = value || {}; - var decode = options.raw ? function(s) { return s; } : decodeURIComponent; - - var pairs = document.cookie.split('; '); - for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) { - if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined - } - return null; - }; -})(jQuery); diff --git a/gui/slick/js/lib/jquery.timeago.js b/gui/slick/js/lib/jquery.timeago.js deleted file mode 100644 index a8ad067eb..000000000 --- a/gui/slick/js/lib/jquery.timeago.js +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Timeago is a jQuery plugin that makes it easy to support automatically - * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). - * - * @name timeago - * @version 1.4.2 - * @requires jQuery v1.2.3+ - * @author Ryan McGeary - * @license MIT License - http://www.opensource.org/licenses/mit-license.php - * - * For usage and examples, visit: - * http://timeago.yarp.com/ - * - * Copyright (c) 2008-2015, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) - */ - -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } if (typeof module === 'object' && typeof module.exports === 'object') { - factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - $.timeago = function(timestamp) { - if (timestamp instanceof Date) { - return inWords(timestamp); - } else if (typeof timestamp === "string") { - return inWords($.timeago.parse(timestamp)); - } else if (typeof timestamp === "number") { - return inWords(new Date(timestamp)); - } else { - return inWords($.timeago.datetime(timestamp)); - } - }; - var $t = $.timeago; - - $.extend($.timeago, { - settings: { - refreshMillis: 60000, - allowPast: true, - allowFuture: false, - localeTitle: false, - cutoff: 0, - strings: { - prefixAgo: null, - prefixFromNow: null, - suffixAgo: "ago", - suffixFromNow: "from now", - inPast: 'any moment now', - seconds: "less than a minute", - minute: "about a minute", - minutes: "%d minutes", - hour: "about an hour", - hours: "about %d hours", - day: "a day", - days: "%d days", - month: "about a month", - months: "%d months", - year: "about a year", - years: "%d years", - wordSeparator: " ", - numbers: [] - } - }, - - inWords: function(distanceMillis) { - if(!this.settings.allowPast && ! this.settings.allowFuture) { - throw 'timeago allowPast and allowFuture settings can not both be set to false.'; - } - - var $l = this.settings.strings; - var prefix = $l.prefixAgo; - var suffix = $l.suffixAgo; - if (this.settings.allowFuture) { - if (distanceMillis < 0) { - prefix = $l.prefixFromNow; - suffix = $l.suffixFromNow; - } - } - - if(!this.settings.allowPast && distanceMillis >= 0) { - return this.settings.strings.inPast; - } - - var seconds = Math.abs(distanceMillis) / 1000; - var minutes = seconds / 60; - var hours = minutes / 60; - var days = hours / 24; - var years = days / 365; - - function substitute(stringOrFunction, number) { - var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; - var value = ($l.numbers && $l.numbers[number]) || number; - return string.replace(/%d/i, value); - } - - var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || - seconds < 90 && substitute($l.minute, 1) || - minutes < 45 && substitute($l.minutes, Math.round(minutes)) || - minutes < 90 && substitute($l.hour, 1) || - hours < 24 && substitute($l.hours, Math.round(hours)) || - hours < 42 && substitute($l.day, 1) || - days < 30 && substitute($l.days, Math.round(days)) || - days < 45 && substitute($l.month, 1) || - days < 365 && substitute($l.months, Math.round(days / 30)) || - years < 1.5 && substitute($l.year, 1) || - substitute($l.years, Math.round(years)); - - var separator = $l.wordSeparator || ""; - if ($l.wordSeparator === undefined) { separator = " "; } - return $.trim([prefix, words, suffix].join(separator)); - }, - - parse: function(iso8601) { - var s = $.trim(iso8601); - s = s.replace(/\.\d+/,""); // remove milliseconds - s = s.replace(/-/,"/").replace(/-/,"/"); - s = s.replace(/T/," ").replace(/Z/," UTC"); - s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 - s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900 - return new Date(s); - }, - datetime: function(elem) { - var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); - return $t.parse(iso8601); - }, - isTime: function(elem) { - // jQuery's `is()` doesn't play well with HTML5 in IE - return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); - } - }); - - // functions that can be called via $(el).timeago('action') - // init is default when no action is given - // functions are called with context of a single element - var functions = { - init: function(){ - var refresh_el = $.proxy(refresh, this); - refresh_el(); - var $s = $t.settings; - if ($s.refreshMillis > 0) { - this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis); - } - }, - update: function(time){ - var parsedTime = $t.parse(time); - $(this).data('timeago', { datetime: parsedTime }); - if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString()); - refresh.apply(this); - }, - updateFromDOM: function(){ - $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) }); - refresh.apply(this); - }, - dispose: function () { - if (this._timeagoInterval) { - window.clearInterval(this._timeagoInterval); - this._timeagoInterval = null; - } - } - }; - - $.fn.timeago = function(action, options) { - var fn = action ? functions[action] : functions.init; - if(!fn){ - throw new Error("Unknown function name '"+ action +"' for timeago"); - } - // each over objects here and call the requested function - this.each(function(){ - fn.call(this, options); - }); - return this; - }; - - function refresh() { - //check if it's still visible - if(!$.contains(document.documentElement,this)){ - //stop if it has been removed - $(this).timeago("dispose"); - return this; - } - - var data = prepareData(this); - var $s = $t.settings; - - if (!isNaN(data.datetime)) { - if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) { - $(this).text(inWords(data.datetime)); - } - } - return this; - } - - function prepareData(element) { - element = $(element); - if (!element.data("timeago")) { - element.data("timeago", { datetime: $t.datetime(element) }); - var text = $.trim(element.text()); - if ($t.settings.localeTitle) { - element.attr("title", element.data('timeago').datetime.toLocaleString()); - } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { - element.attr("title", text); - } - } - return element.data("timeago"); - } - - function inWords(date) { - return $t.inWords(distance(date)); - } - - function distance(date) { - return (new Date().getTime() - date.getTime()); - } - - // fix for IE6 suckage - document.createElement("abbr"); - document.createElement("time"); -})); diff --git a/gui/slick/js/lib/jquery.tokeninput.js b/gui/slick/js/lib/jquery.tokeninput.js deleted file mode 100644 index 5eec491e1..000000000 --- a/gui/slick/js/lib/jquery.tokeninput.js +++ /dev/null @@ -1,861 +0,0 @@ -/* - * jQuery Plugin: Tokenizing Autocomplete Text Entry - * Version 1.6.0 - * - * Copyright (c) 2009 James Smith (http://loopj.com) - * Licensed jointly under the GPL and MIT licenses, - * choose which one suits your project best! - * - */ - -(function ($) { -// Default settings -var DEFAULT_SETTINGS = { - // Search settings - method: "GET", - contentType: "json", - queryParam: "q", - searchDelay: 300, - minChars: 1, - propertyToSearch: "name", - jsonContainer: null, - - // Display settings - hintText: "Type in a search term", - noResultsText: "No results", - searchingText: "Searching...", - deleteText: "×", - animateDropdown: true, - - // Tokenization settings - tokenLimit: null, - tokenDelimiter: ",", - preventDuplicates: false, - - // Output settings - tokenValue: "id", - - // Prepopulation settings - prePopulate: null, - processPrePopulate: true, - - // Manipulation settings - idPrefix: "token-input-", - - // Formatters - resultsFormatter: function(item){ return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' onError=this.onerror=null;this.src='"+srRoot+"/images/flags/unknown.png'; /> " + item[this.propertyToSearch]+ "</li>" }, - tokenFormatter: function(item) { return "<li><img src='"+srRoot+"/images/subtitles/flags/"+item["id"]+".png' onError=this.onerror=null;this.src='"+srRoot+"/images/flags/unknown.png'; /> <p>" + item[this.propertyToSearch] + "</p></li>" }, - flag: "flag", - - // Callbacks - onResult: null, - onAdd: null, - onDelete: null, - onReady: null -}; - -// Default classes to use when theming -var DEFAULT_CLASSES = { - tokenList: "token-input-list", - token: "token-input-token", - tokenDelete: "token-input-delete-token", - selectedToken: "token-input-selected-token", - highlightedToken: "token-input-highlighted-token", - dropdown: "token-input-dropdown", - dropdownItem: "token-input-dropdown-item", - dropdownItem2: "token-input-dropdown-item2", - selectedDropdownItem: "token-input-selected-dropdown-item", - inputToken: "token-input-input-token" -}; - -// Input box position "enum" -var POSITION = { - BEFORE: 0, - AFTER: 1, - END: 2 -}; - -// Keys "enum" -var KEY = { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - ESCAPE: 27, - SPACE: 32, - PAGE_UP: 33, - PAGE_DOWN: 34, - END: 35, - HOME: 36, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - NUMPAD_ENTER: 108, - COMMA: 188 -}; - -// Additional public (exposed) methods -var methods = { - init: function(url_or_data_or_function, options) { - var settings = $.extend({}, DEFAULT_SETTINGS, options || {}); - - return this.each(function () { - $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings)); - }); - }, - clear: function() { - this.data("tokenInputObject").clear(); - return this; - }, - add: function(item) { - this.data("tokenInputObject").add(item); - return this; - }, - remove: function(item) { - this.data("tokenInputObject").remove(item); - return this; - }, - get: function() { - return this.data("tokenInputObject").getTokens(); - } -} - -// Expose the .tokenInput function to jQuery as a plugin -$.fn.tokenInput = function (method) { - // Method calling and initialization logic - if(methods[method]) { - return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); - } else { - return methods.init.apply(this, arguments); - } -}; - -// TokenList class for each input -$.TokenList = function (input, url_or_data, settings) { - // - // Initialization - // - - // Configure the data source - if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") { - // Set the url to query against - settings.url = url_or_data; - - // If the URL is a function, evaluate it here to do our initalization work - var url = computeURL(); - - // Make a smart guess about cross-domain if it wasn't explicitly specified - if(settings.crossDomain === undefined) { - if(url.indexOf("://") === -1) { - settings.crossDomain = false; - } else { - settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]); - } - } - } else if(typeof(url_or_data) === "object") { - // Set the local data to search through - settings.local_data = url_or_data; - } - - // Build class names - if(settings.classes) { - // Use custom class names - settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes); - } else if(settings.theme) { - // Use theme-suffixed default class names - settings.classes = {}; - $.each(DEFAULT_CLASSES, function(key, value) { - settings.classes[key] = value + "-" + settings.theme; - }); - } else { - settings.classes = DEFAULT_CLASSES; - } - - - // Save the tokens - var saved_tokens = []; - - // Keep track of the number of tokens in the list - var token_count = 0; - - // Basic cache to save on db hits - var cache = new $.TokenList.Cache(); - - // Keep track of the timeout, old vals - var timeout; - var input_val; - - // Create a new text input an attach keyup events - var input_box = $("<input type=\"text\" autocomplete=\"off\" >") - .css({ - outline: "none" - }) - .attr("id", settings.idPrefix + input.id) - .focus(function () { - if (settings.tokenLimit === null || settings.tokenLimit !== token_count) { - show_dropdown_hint(); - } - }) - .blur(function () { - hide_dropdown(); - $(this).val(""); - }) - .bind("keyup keydown blur update", resize_input) - .keydown(function (event) { - var previous_token; - var next_token; - - switch(event.keyCode) { - case KEY.LEFT: - case KEY.RIGHT: - case KEY.UP: - case KEY.DOWN: - if(!$(this).val()) { - previous_token = input_token.prev(); - next_token = input_token.next(); - - if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) { - // Check if there is a previous/next token and it is selected - if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) { - deselect_token($(selected_token), POSITION.BEFORE); - } else { - deselect_token($(selected_token), POSITION.AFTER); - } - } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) { - // We are moving left, select the previous token if it exists - select_token($(previous_token.get(0))); - } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) { - // We are moving right, select the next token if it exists - select_token($(next_token.get(0))); - } - } else { - var dropdown_item = null; - - if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) { - dropdown_item = $(selected_dropdown_item).next(); - } else { - dropdown_item = $(selected_dropdown_item).prev(); - } - - if(dropdown_item.length) { - select_dropdown_item(dropdown_item); - } - return false; - } - break; - - case KEY.BACKSPACE: - previous_token = input_token.prev(); - - if(!$(this).val().length) { - if(selected_token) { - delete_token($(selected_token)); - hidden_input.change(); - } else if(previous_token.length) { - select_token($(previous_token.get(0))); - } - - return false; - } else if($(this).val().length === 1) { - hide_dropdown(); - } else { - // set a timeout just long enough to let this function finish. - setTimeout(function(){do_search();}, 5); - } - break; - - case KEY.TAB: - case KEY.ENTER: - case KEY.NUMPAD_ENTER: - case KEY.COMMA: - if(selected_dropdown_item) { - add_token($(selected_dropdown_item).data("tokeninput")); - hidden_input.change(); - return false; - } - break; - - case KEY.ESCAPE: - hide_dropdown(); - return true; - - default: - if(String.fromCharCode(event.which)) { - // set a timeout just long enough to let this function finish. - setTimeout(function(){do_search();}, 5); - } - break; - } - }); - - // Keep a reference to the original input box - var hidden_input = $(input) - .hide() - .val("") - .focus(function () { - input_box.focus(); - }) - .blur(function () { - input_box.blur(); - }); - - // Keep a reference to the selected token and dropdown item - var selected_token = null; - var selected_token_index = 0; - var selected_dropdown_item = null; - - // The list to store the token items in - var token_list = $("<ul />") - .addClass(settings.classes.tokenList) - .click(function (event) { - var li = $(event.target).closest("li"); - if(li && li.get(0) && $.data(li.get(0), "tokeninput")) { - toggle_select_token(li); - } else { - // Deselect selected token - if(selected_token) { - deselect_token($(selected_token), POSITION.END); - } - - // Focus input box - input_box.focus(); - } - }) - .mouseover(function (event) { - var li = $(event.target).closest("li"); - if(li && selected_token !== this) { - li.addClass(settings.classes.highlightedToken); - } - }) - .mouseout(function (event) { - var li = $(event.target).closest("li"); - if(li && selected_token !== this) { - li.removeClass(settings.classes.highlightedToken); - } - }) - .insertBefore(hidden_input); - - // The token holding the input box - var input_token = $("<li />") - .addClass(settings.classes.inputToken) - .appendTo(token_list) - .append(input_box); - - // The list to store the dropdown items in - var dropdown = $("<div>") - .addClass(settings.classes.dropdown) - .appendTo("body") - .hide(); - - // Magic element to help us resize the text input - var input_resizer = $("<tester/>") - .insertAfter(input_box) - .css({ - position: "absolute", - top: -9999, - left: -9999, - width: "auto", - fontSize: input_box.css("fontSize"), - fontFamily: input_box.css("fontFamily"), - fontWeight: input_box.css("fontWeight"), - letterSpacing: input_box.css("letterSpacing"), - whiteSpace: "nowrap" - }); - - // Pre-populate list if items exist - hidden_input.val(""); - var li_data = settings.prePopulate || hidden_input.data("pre"); - if(settings.processPrePopulate && $.isFunction(settings.onResult)) { - li_data = settings.onResult.call(hidden_input, li_data); - } - if(li_data && li_data.length) { - $.each(li_data, function (index, value) { - insert_token(value); - checkTokenLimit(); - }); - } - - // Initialization is done - if($.isFunction(settings.onReady)) { - settings.onReady.call(); - } - - // - // Public functions - // - - this.clear = function() { - token_list.children("li").each(function() { - if ($(this).children("input").length === 0) { - delete_token($(this)); - } - }); - } - - this.add = function(item) { - add_token(item); - } - - this.remove = function(item) { - token_list.children("li").each(function() { - if ($(this).children("input").length === 0) { - var currToken = $(this).data("tokeninput"); - var match = true; - for (var prop in item) { - if (item[prop] !== currToken[prop]) { - match = false; - break; - } - } - if (match) { - delete_token($(this)); - } - } - }); - } - - this.getTokens = function() { - return saved_tokens; - } - - // - // Private functions - // - - function checkTokenLimit() { - if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) { - input_box.hide(); - hide_dropdown(); - return; - } - } - - function resize_input() { - if(input_val === (input_val = input_box.val())) {return;} - - // Enter new content into resizer and resize input accordingly - var escaped = input_val.replace(/&/g, '&').replace(/\s/g,' ').replace(/</g, '<').replace(/>/g, '>'); - input_resizer.html(escaped); - input_box.width(input_resizer.width() + 30); - } - - function is_printable_character(keycode) { - return ((keycode >= 48 && keycode <= 90) || // 0-1a-z - (keycode >= 96 && keycode <= 111) || // numpad 0-9 + - / * . - (keycode >= 186 && keycode <= 192) || // ; = , - . / ^ - (keycode >= 219 && keycode <= 222)); // ( \ ) ' - } - - // Inner function to a token to the list - function insert_token(item) { - var this_token = settings.tokenFormatter(item); - this_token = $(this_token) - .addClass(settings.classes.token) - .insertBefore(input_token); - - // The 'delete token' button - $("<span>" + settings.deleteText + "</span>") - .addClass(settings.classes.tokenDelete) - .appendTo(this_token) - .click(function () { - delete_token($(this).parent()); - hidden_input.change(); - return false; - }); - - // Store data on the token - var token_data = {"id": item.id}; - token_data[settings.propertyToSearch] = item[settings.propertyToSearch]; - $.data(this_token.get(0), "tokeninput", item); - - // Save this token for duplicate checking - saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index)); - selected_token_index++; - - // Update the hidden input - update_hidden_input(saved_tokens, hidden_input); - - token_count += 1; - - // Check the token limit - if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) { - input_box.hide(); - hide_dropdown(); - } - - return this_token; - } - - // Add a token to the token list based on user input - function add_token (item) { - var callback = settings.onAdd; - - // See if the token already exists and select it if we don't want duplicates - if(token_count > 0 && settings.preventDuplicates) { - var found_existing_token = null; - token_list.children().each(function () { - var existing_token = $(this); - var existing_data = $.data(existing_token.get(0), "tokeninput"); - if(existing_data && existing_data.id === item.id) { - found_existing_token = existing_token; - return false; - } - }); - - if(found_existing_token) { - select_token(found_existing_token); - input_token.insertAfter(found_existing_token); - input_box.focus(); - return; - } - } - - // Insert the new tokens - if(settings.tokenLimit == null || token_count < settings.tokenLimit) { - insert_token(item); - checkTokenLimit(); - } - - // Clear input box - input_box.val(""); - - // Don't show the help dropdown, they've got the idea - hide_dropdown(); - - // Execute the onAdd callback if defined - if($.isFunction(callback)) { - callback.call(hidden_input,item); - } - } - - // Select a token in the token list - function select_token (token) { - token.addClass(settings.classes.selectedToken); - selected_token = token.get(0); - - // Hide input box - input_box.val(""); - - // Hide dropdown if it is visible (eg if we clicked to select token) - hide_dropdown(); - } - - // Deselect a token in the token list - function deselect_token (token, position) { - token.removeClass(settings.classes.selectedToken); - selected_token = null; - - if(position === POSITION.BEFORE) { - input_token.insertBefore(token); - selected_token_index--; - } else if(position === POSITION.AFTER) { - input_token.insertAfter(token); - selected_token_index++; - } else { - input_token.appendTo(token_list); - selected_token_index = token_count; - } - - // Show the input box and give it focus again - input_box.focus(); - } - - // Toggle selection of a token in the token list - function toggle_select_token(token) { - var previous_selected_token = selected_token; - - if(selected_token) { - deselect_token($(selected_token), POSITION.END); - } - - if(previous_selected_token === token.get(0)) { - deselect_token(token, POSITION.END); - } else { - select_token(token); - } - } - - // Delete a token from the token list - function delete_token (token) { - // Remove the id from the saved list - var token_data = $.data(token.get(0), "tokeninput"); - var callback = settings.onDelete; - - var index = token.prevAll().length; - if(index > selected_token_index) index--; - - // Delete the token - token.remove(); - selected_token = null; - - // Show the input box and give it focus again - input_box.focus(); - - // Remove this token from the saved list - saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1)); - if(index < selected_token_index) selected_token_index--; - - // Update the hidden input - update_hidden_input(saved_tokens, hidden_input); - - token_count -= 1; - - if(settings.tokenLimit !== null) { - input_box - .show() - .val("") - .focus(); - } - - // Execute the onDelete callback if defined - if($.isFunction(callback)) { - callback.call(hidden_input,token_data); - } - } - - // Update the hidden input box value - function update_hidden_input(saved_tokens, hidden_input) { - var token_values = $.map(saved_tokens, function (el) { - return el[settings.tokenValue]; - }); - hidden_input.val(token_values.join(settings.tokenDelimiter)); - - } - - // Hide and clear the results dropdown - function hide_dropdown () { - dropdown.hide().empty(); - selected_dropdown_item = null; - } - - function show_dropdown() { - dropdown - .css({ - position: "absolute", - top: $(token_list).offset().top + $(token_list).outerHeight(), - left: $(token_list).offset().left, - zindex: 999 - }) - .show(); - } - - function show_dropdown_searching () { - if(settings.searchingText) { - dropdown.html("<p>"+settings.searchingText+"</p>"); - show_dropdown(); - } - } - - function show_dropdown_hint () { - if(settings.hintText) { - dropdown.html("<p>"+settings.hintText+"</p>"); - show_dropdown(); - } - } - - // Highlight the query part of the search term - function highlight_term(value, term) { - return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>"); - } - - function find_value_and_highlight_term(template, value, term) { - return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + value + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term)); - } - - // Populate the results dropdown with some results - function populate_dropdown (query, results) { - if(results && results.length) { - dropdown.empty(); - var dropdown_ul = $("<ul>") - .appendTo(dropdown) - .mouseover(function (event) { - select_dropdown_item($(event.target).closest("li")); - }) - .mousedown(function (event) { - add_token($(event.target).closest("li").data("tokeninput")); - hidden_input.change(); - return false; - }) - .hide(); - - $.each(results, function(index, value) { - var this_li = settings.resultsFormatter(value); - - this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query); - - this_li = $(this_li).appendTo(dropdown_ul); - - if(index % 2) { - this_li.addClass(settings.classes.dropdownItem); - } else { - this_li.addClass(settings.classes.dropdownItem2); - } - - if(index === 0) { - select_dropdown_item(this_li); - } - - $.data(this_li.get(0), "tokeninput", value); - }); - - show_dropdown(); - - if(settings.animateDropdown) { - dropdown_ul.slideDown("fast"); - } else { - dropdown_ul.show(); - } - } else { - if(settings.noResultsText) { - dropdown.html("<p>"+settings.noResultsText+"</p>"); - show_dropdown(); - } - } - } - - // Highlight an item in the results dropdown - function select_dropdown_item (item) { - if(item) { - if(selected_dropdown_item) { - deselect_dropdown_item($(selected_dropdown_item)); - } - - item.addClass(settings.classes.selectedDropdownItem); - selected_dropdown_item = item.get(0); - } - } - - // Remove highlighting from an item in the results dropdown - function deselect_dropdown_item (item) { - item.removeClass(settings.classes.selectedDropdownItem); - selected_dropdown_item = null; - } - - // Do a search and show the "searching" dropdown if the input is longer - // than settings.minChars - function do_search() { - var query = input_box.val().toLowerCase(); - - if(query && query.length) { - if(selected_token) { - deselect_token($(selected_token), POSITION.AFTER); - } - - if(query.length >= settings.minChars) { - show_dropdown_searching(); - clearTimeout(timeout); - - timeout = setTimeout(function(){ - run_search(query); - }, settings.searchDelay); - } else { - hide_dropdown(); - } - } - } - - // Do the actual search - function run_search(query) { - var cache_key = query + computeURL(); - var cached_results = cache.get(cache_key); - if(cached_results) { - populate_dropdown(query, cached_results); - } else { - // Are we doing an ajax search or local data search? - if(settings.url) { - var url = computeURL(); - // Extract exisiting get params - var ajax_params = {}; - ajax_params.data = {}; - if(url.indexOf("?") > -1) { - var parts = url.split("?"); - ajax_params.url = parts[0]; - - var param_array = parts[1].split("&"); - $.each(param_array, function (index, value) { - var kv = value.split("="); - ajax_params.data[kv[0]] = kv[1]; - }); - } else { - ajax_params.url = url; - } - - // Prepare the request - ajax_params.data[settings.queryParam] = query; - ajax_params.type = settings.method; - ajax_params.dataType = settings.contentType; - if(settings.crossDomain) { - ajax_params.dataType = "jsonp"; - } - - // Attach the success callback - ajax_params.success = function(results) { - if($.isFunction(settings.onResult)) { - results = settings.onResult.call(hidden_input, results); - } - cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results); - - // only populate the dropdown if the results are associated with the active search query - if(input_box.val().toLowerCase() === query) { - populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results); - } - }; - - // Make the request - $.ajax(ajax_params); - } else if(settings.local_data) { - // Do the search through local data - var results = $.grep(settings.local_data, function (row) { - return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1; - }); - - if($.isFunction(settings.onResult)) { - results = settings.onResult.call(hidden_input, results); - } - cache.add(cache_key, results); - populate_dropdown(query, results); - } - } - } - - // compute the dynamic URL - function computeURL() { - var url = settings.url; - if(typeof settings.url == 'function') { - url = settings.url.call(); - } - return url; - } -}; - -// Really basic cache for the results -$.TokenList.Cache = function (options) { - var settings = $.extend({ - max_size: 500 - }, options); - - var data = {}; - var size = 0; - - var flush = function () { - data = {}; - size = 0; - }; - - this.add = function (query, results) { - if(size > settings.max_size) { - flush(); - } - - if(!data[query]) { - size += 1; - } - - data[query] = results; - }; - - this.get = function (query) { - return data[query]; - }; -}; -}(jQuery)); -- GitLab From 7f52fce2aa50e5814caca7a1dfb88e85644349a8 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 16:13:31 +1030 Subject: [PATCH 184/215] remove refs to old libs --- gui/slick/js/_bower.min.js | Bin 502722 -> 0 bytes gui/slick/views/config_general.mako | 1 - gui/slick/views/editShow.mako | 5 ++--- gui/slick/views/home_newShow.mako | 1 - gui/slick/views/layouts/main.mako | 5 +---- gui/slick/views/manage.mako | 1 - 6 files changed, 3 insertions(+), 10 deletions(-) delete mode 100644 gui/slick/js/_bower.min.js diff --git a/gui/slick/js/_bower.min.js b/gui/slick/js/_bower.min.js deleted file mode 100644 index aad0ddf1ce56d0457e6d9e1978f112a66e0d3d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502722 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 RDHP%UDX!J5MdWEsYXH>gL=*r3 diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index 096874d1d..d96ff7f5c 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -14,7 +14,6 @@ <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/new/config_general.js"></script> </%block> <%block name="content"> diff --git a/gui/slick/views/editShow.mako b/gui/slick/views/editShow.mako index 2bee5ca1f..ebde82a8a 100644 --- a/gui/slick/views/editShow.mako +++ b/gui/slick/views/editShow.mako @@ -15,7 +15,6 @@ <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script> - <script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/new/editShow.js"></script> % if show.is_anime: <script type="text/javascript" src="${srRoot}/js/blackwhite.js?${sbPID}"></script> @@ -45,7 +44,7 @@ <div class="component-group"> <h3>Main Settings</h3> <fieldset class="component-group-list"> - + <div class="field-pair"> <label for="location"> <span class="component-title">Show Location</span> @@ -246,7 +245,7 @@ </fieldset> </div> </div> - + </div> <br> diff --git a/gui/slick/views/home_newShow.mako b/gui/slick/views/home_newShow.mako index 62a72a473..6905df264 100644 --- a/gui/slick/views/home_newShow.mako +++ b/gui/slick/views/home_newShow.mako @@ -7,7 +7,6 @@ <script type="text/javascript" src="${srRoot}/js/qualityChooser.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/newShow.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/addShowOptions.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/lib/bootstrap-formhelpers.min-2.3.0.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/blackwhite.js?${sbPID}"></script> </%block> diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index d392987ce..b896d3c97 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -311,19 +311,16 @@ </div> </div> </footer> - <script type="text/javascript" src="${srRoot}/js/_bower.min.js?${sbPID}"></script> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookie.js?${sbPID}"></script> + <script type="text/javascript" src="${srRoot}/js/vender.min.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.tokeninput.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script><!-- Can't be added to bower --> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.confirm.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/pnotify.custom.min.js?${sbPID}"></script><!-- Needs to be removed --> <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script> diff --git a/gui/slick/views/manage.mako b/gui/slick/views/manage.mako index cb8264528..19035aea7 100644 --- a/gui/slick/views/manage.mako +++ b/gui/slick/views/manage.mako @@ -5,7 +5,6 @@ from sickbeard.common import statusStrings %> <%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/lib/bootbox.min.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/new/manage.js"></script> <script type="text/javascript" src="${srRoot}/js/massUpdate.js?${sbPID}"></script> </%block> -- GitLab From 7532232c3526e87c1d5170527344164cdf62432d Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 17:13:02 +1030 Subject: [PATCH 185/215] add libs to bower --- .build/bower.json | 3 +++ gui/slick/css/vender.min.css | Bin 1812 -> 3303 bytes .../js/lib/jquery-ui-1.10.4.custom.min.js | Bin 132041 -> 0 bytes gui/slick/js/lib/jquery.qtip-2.2.1.min.js | Bin 44296 -> 0 bytes .../js/lib/jquery.ui.touch-punch-0.2.2.min.js | Bin 1190 -> 0 bytes gui/slick/js/vender.min.js | Bin 504707 -> 641866 bytes gui/slick/views/layouts/main.mako | 6 +----- 7 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 gui/slick/js/lib/jquery-ui-1.10.4.custom.min.js delete mode 100644 gui/slick/js/lib/jquery.qtip-2.2.1.min.js delete mode 100644 gui/slick/js/lib/jquery.ui.touch-punch-0.2.2.min.js diff --git a/.build/bower.json b/.build/bower.json index d92b4f39c..ac3062b66 100644 --- a/.build/bower.json +++ b/.build/bower.json @@ -20,6 +20,9 @@ "jquery-tokeninput": "~1.7.0", "bootstrap3-typeahead": "~3.1.1", "underscore": "~1.8.3", + "jqueryui-touch-punch": "*", + "pnotify": "~2.1.0", + "qtip2": "~2.2.1", "jQuery Confirm": "jquery-confirm#~2.5.0" } } diff --git a/gui/slick/css/vender.min.css b/gui/slick/css/vender.min.css index 16f33eb6152f17e9301150733d3242ef26430c9d..f4a14e40997d6bebf9c2f64070e38628db120a38 100644 GIT binary patch literal 3303 zcmXTT(JRT%PR-NJ%qu7@(ap&$E~(BhOD#&v$uGCc$V^E|&9lx(%}mcIu}Um0$ydzG zEyyn_Nz5yOi5jX}muIGwWLTLP7!*`kC*>EVq!w8j7E~w{=jUXmC@5Q6T3RQU78U0g zS(T(#lvt<b=auLdXI7<J85$K-K)7j%xtTeYR$-|{DT#TBI>m{3#k$3*MVV>VRl1pZ zDXA4!AX9P^i_$amtPHFR5>rw#^U|#htdkOxv(t<6OY>56lk;=(i>#E>($cI!zR)c$ zsmw{$EvYO>waUxSOSMkUNlh%W%1KQtsm0=Hg`CW4Y}#<BRR9N9HPp8T&>%221qA`j zb;bo13KpOs!Rkic^3<g4%o5$if`Zh<qQt!9RIB8~qErmWrDPT-Cgr52=%6_oCa#c^ z33CjFJ+2lYi0%a>ohWe+P6ySPA?jl3YV7Q24Gmv&7Z4=LOoift#Jp;#erGojgr$g- z)U?FXoRZp{Oe{_zH623JhjBrLHF6x7VvU0ogVeM{1DLN23=AMCu^f`t%?%9DoM@er zSzM5lSZS4%lb@W8)xin{)oD5Ti6!7f26uviHPl@O*foIz2coYCl+R#JGB-DeIiVmw zGp{7I2wi`1YEEi$NotBNu9!2hurM)6g&CNZmWJO1lz2)?N~%rCEJKNwl%o8Cl>G9% z>Vo{@%#zIfJgdZ{;{2S_l2m90fR+Im2@#Yj(PI;mcXUA+61liYPELjvBD&z<z#*5E zUs95vi!KQ*XP~JH5~Cy+HHJ9-tx!-6i%WR)f>IZ_NJCCJkfO-k+#I)2r8$^p8Q@b6 zDxoklCn#i*5<AwSkASIIqgXeyBsCXHVUU&xf@GU$gw4pbGy>)+q~=zmhcTEBF5|88 z@{4j4a|oD$;!AkWfu(3%-i4GBwR)wQx&?XpC7EfJ)g}1_Rz{#$ha^uh6Ei;`)tSh3 zm}PB7Np6l^QhrLM9kQWt1JW`pQd5xaQ$SLtTbz-Yl3!j8t2>hNE1*JF1`0+66$*w1 z1r-WK=}CzirUp6?q-UyWt(%))rAw@0BGn<gQ8zh1uOu-uFSQ6cdf|RDP(W1KdKRg< z@TP--fhwYKMD{1#JY>P*jKrb>B)@|i8oEV^DVe3kRt7LXq6$LG7?>gyH<x6V<fK-k zl<H8&=t2t@J(JX2m=Gw|4N&!`R+OM>N0H7<&d<|9c0Nb|Qo^Fz2`TzP#URWsNW#)H zO3g(!QLnfpF*zIRHjr{;)1i_j`2`@EY7l{(NI^|EQq6({0@y9p5H`d_P)MMgr<<IU zUz}Qm>>}OblFa1n)FNn=2sQ`iL9p}C{imCeSzMA|REd<B;3)`R&44U7um&4uWe93q zLE4_?pmrBDvO!9~4L(@0Xkd-VFW}@+l3xI>cCaTNOj(4%=-QxdI3xvNr{OjjO&YgG zSi9HIz`y`C-C+b1aw3CCf{PJEH4Ww>CjiXAMk!}t#$==>rlb~C!$K0&UI(?|brW+k z)AOv7Q^BngZ1%%5utHL4NlAWQHMC}iwq#HnQ_#kPp@D%a8Ez~n&B*~bN>H;EtfE!` Gr&R!n4${#8 delta 63 zcmaDZIfZX>0;>e0&SXVK;fcb66N_{wD=><H`C^l~88sQJC$C{rnCPN6ae?W?SBjg> R8I74ISFt2-=4O><0stt25o`be diff --git a/gui/slick/js/lib/jquery-ui-1.10.4.custom.min.js b/gui/slick/js/lib/jquery-ui-1.10.4.custom.min.js deleted file mode 100644 index ce23cf3e604b1ce1abbdf84d3cb40d6bf3eaa2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132041 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 M#^*t!3n&Ym0c^7-R{#J2 diff --git a/gui/slick/js/lib/jquery.qtip-2.2.1.min.js b/gui/slick/js/lib/jquery.qtip-2.2.1.min.js deleted file mode 100644 index 411a0f8f98f112b9319f0d6696d6951641d587ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44296 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�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 diff --git a/gui/slick/js/lib/jquery.ui.touch-punch-0.2.2.min.js b/gui/slick/js/lib/jquery.ui.touch-punch-0.2.2.min.js deleted file mode 100644 index 33d6f97e5e6da98a226d5c223e70b014932fd3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcmdPb;!@C3$O<e?Evi%q^;8JSFHO!+2q?`<&QLJWGtx8SQUI%P&M&Ae%1qBFQ7|$v zG}KXWNi0iMa4RiJOD)O=ncz~In4^%BnVgzeoSLFgnwOGVq)?KPs^IGxqL5#t;2z+k z5SCh0oSC1eU<6ZFtOqsRCAA<mFQwQDWROBuA;>LyrI~u=nJMY1C3;!KXyUo~rNyZb zVSO%*w9>rflFa-(jU>(LB)#I&f`a^_61@_TKWvrq^T3SMyc8vc%shpZ{N&Qy)Vvbw z%rp%}G{u_LMX4pFMS0e>Wr;-!$+k%#CqS$!D9SI%FR3g@)k(EY){6%Vdgf)8=p<Uh zY*$FpNY}~Gtj<i+NY~3R%1qD9OU!XCOU;8iCAC;DCp9m<B*V@SVNtqXK~XA5jZ11; zVrfo^hNd;h?o3;BBa$-`^U_mOz>$+$9BmM*lV%I^i(Yb3YGO$$*e(qvUr^Y9*~Lnl z)@gc~d6^{$F^vqJlA_X72vMGymy%zuW2lp<SDajwnwl2@XGQ8{>Lur7rskD^#2~Cl zowUT9;#4f8flgj&PL8H^x?V|Q5h%t|GK&imOOi9d?$Ainw60Coiw8$Ua7kiOi7hP9 zG}1MzK^{)CEy>6%21QC@O^sq2G=!ZK3rb3hQZd34BQP`(A)06l@}G4Y)H>h%veXn? zu)D265u^l;y8N=#A|*{Ef!zGER1|@f{PH{{P3u}~n7cs+A)K8Cj%US0guNj5qu2>{ zMv6w74#Y~R4G05W^HT7chtOGC0CpM7p#0JjB~4IBDWY4cSq;{doRgWH4RU)T)Zbt` z!Tts%S%jr1L7%3Vnv)938G1>Xc_|u7;K(WlMV69Il3qbkenln7FG!K7q^XIl7VJSx nrJ!&_Qwhq8m<nC<Qj|0`tyA@q6LWIFNyfTXQv*^iX<7pSxpkw- diff --git a/gui/slick/js/vender.min.js b/gui/slick/js/vender.min.js index e37f67ccef5b5d5322859284153e21292d0efd20..c479c1d2b91e11d3ede44cd18e7019c452b4cb65 100644 GIT binary patch delta 126485 zcmZpEE_Z60dP56i3sVbo3rh>@7B*3JM#af<jit0Tt25Iy6g3j{@{2OlGxHL2T+34P zO7u$dOOrEFi}i9+^U_N)><l$Es}rYR_`xVvpKOb+HaR0PFFiFS1fnI{AXX>EHYGo~ zG#6x0a#3nxNh;V-4JF_F(qag^SV_}5MK3civjicgk))$&07B)Nc`5njI)*yQdd0~_ zsi}Dpa8_i!PO@HdPG)Le2}lsaiqugwL?8p5ywaQ;O`Sx&lEk9))Dpdv%;JK?lH?4C zBT_VLYcta{67`Bp3kvd!pkB3A%Fl!NIWI*iGfx5LejPM*n)TIXiA4&@Iw`h^dZn3q zxga0u6%^%{<d;+yr0S&Frs&0k1wHdJOLWrUT$j}1lA`=d>lD3susy*giA5#0X{C9| zC7Jno8i|@<b5m?fGBS&;6_eG}VCFa{7L=40rNUyU9v(#)!LF&Mrjcx`XrKeL!#BSy zHN{rZP$x+vQAY{vs{FFlA|*{Ef!zGER1|@f{PH{{P0d;qQxFcVPt>eVR#VdexfALY zs5J%{rXm^QnwNqw18M}qRiy<ePRK7UQPR{wx1pv6q(Me0IVUqYTS-$V*;dgIVguM` zpzxml@C2h+y>*gaYECLR^(AHIrD#-x1H2d%;8uyCxT>hsNYYV4iU*KwpwtTr3``{; z|G`wG=A~dNaLr3m(yZ0gN!3eE%*heaNJ4TJG~O{>R+>j&x25SNCz|HufZSGFtC1C0 znp#w;se_#Ul=73ZQj<%RY;8d)IX_JywE~nsil=3;iB11s!Ok{)iaML>^pAHLb-9!Z z^72bE(<+s8rvI#CQk|YVjg70mIwiBn&`JrMfOJwai;S$4a#GVulynM8i!-d0lJZMR z@^h7RiVG5xGxO37t&B`zY$FgmIX|x?wW7o-Q9~&yKc!MhvsNe7Hc<mo7-;IGA<~a# zb+Rp7l}>;k*eQCk@LZ^uUjWKf#d^ghiOJb|P=jrgQOrx#14n>TQEG8!RjLvqC^V~+ z)YOu5QWJ|pGILY&OG`A8G<A}u2c|KJ>%;6S$S=+WS>c$IqoHV^S*v4cpjoR~Yh9FD zQd*R!099r?x$%lfeQ~Nk#5o#?&_oR?_B1qWbrSVbD@s!HQZ%6IL1`0Oj#QVW78Pga z=UFKk=^5%7DCt1GWK~^~S(1}#rD&)FX2ho!Cnpv__@KZ8iKkYSAPLtOmsI9t=A~OH zB^70+XOxs=q~@k7=_ID4B<Ca+7h5SQ=_KbD<)s$ExrwDE`SGAaGbgdqO3^^4JTs*v z!%E56z@VT)NhdcmFFqp`WRjJVp&3X7lw7QoKnWr_RY@l^IX@4iD<2fiC6!k7hB}FP znYoFe;IdLmOH2V-4i-p_FD^(;O|eoc&dD!V(t(9(JVZH6*3`g2r#K@qCBGbGYDQ*C zDu_-=1v$<l)mR6d`QwXHi&INL5=E)tOsr_2lbKhXT2vBmkW^F*l1PCRz#t|#Sy-ji z>g499l;)%sTUFQU6qV-rLU_|RTCj@9Sf}L|X@H9Q6ot$@1#npeRjrvkeZdY!Q9iIl zl6_KiN~~3q4k%v;Phaquk+mMGE;=PPIx$vF4OuTl3|x5XVB|NjLTEfkr^MQ$@j<Rk z)~wYjE=ep&wNe5lqRhmc%&N@1bS0gV%-qx>D^SI!lL3nG)M5w+R1iW~pj?ocnFmt^ zNj>O-prnH)28j(&0s^HikTo9QI55<i{?VC9WcmkHHumXpg)BU_P=DK2Bc*Ib14uaz zm4jziL|%o;OkWtmC|r;1Wj&BTGV{_Q;Q->K7K5utr0fkz*<f8z1+c6H;%4ThM}y^{ zfeJG*7UCvQ*nr9ro0QBl1${duo$3fBa3)Z)QYy{Vg%)uNO4=x9z%q_ba&fU$H7uJb z<>lw4D%I*JB^G5S>gHsYr7Bq|B^HBHAc#G^@C&0TsOrp2(@285A1UdosVRYKJzHDb zBt3YDL)vCZdf><fg}NrBe6dc_OHRy7PR$7dCw2|ZT7;RP45Frn;3L@~2ogupIQ`=n zMyYy)Vmz9m4pc;OAjrVN($vyam_rcpi&Q{r*49D`K6uhX4)%JTYFMy?0~!=_sm0(@ z8=PLXl@t)Mp$j)cK}lOfDYd95zevf}7ByXf3MAxIqX$+7$}(yBn2PHw3sO;3XXd5l zTPYQnCMTyB7h|eNR}NKZh3t4pVW_E7l%JDorIeVHT2!J`tErb*P>`CJ5|R%t0KknD zO&uj2B}Fv%BbCR{;sfsM>H49}64M<%F!4{1n#ICfkE9eD#_+TbE;G^f>m{b7ID^W4 z4WuNl3n^bgZJdnEVtDcdmE?-Hwu**oYKa<3h+G1TEv3@TdRQ*e1t~^&Q3Ir*xF9hP zlCNMoz(E9aAV`O;t*xSgJxS3R57GyV%X+ks!-#oMTtam~<B8}9g=hmi8JZ*^v5F*~ zUk|C-^+0Z_)zs80C`v_+VR*Db;|8tJ1?Pec6Vxz5ju)_cM5w|N4#L=aNJ$0@Qm}eZ zm>NP7G?*U`SFQ)j-x`{bl!~GU+Frn}3)Cuuq*xR^AafEji}f%pDap;jrX1o_kYNZH zfkOaZ{KAq6QV>kPsLCo{5BC8y9O3RrttdhEE=u)<-M1hmkTw(4vmgPu`FbGdp*cRa zqP_&=SCCgx6=z`h6x!xUDk`=QE-A{)OUE#)L{qOQwIC-kIaNbHCQm<IN699s2$TY# zRv>##Q%9*7WXkl+6O7z8;FJiH2DizenHyA(=_MBzYbb$5l^_9)qH=oT3G~_((T;-} zg9rq$S-F{cx{!7rnt=$7nmS4)`2`pm3f#QXD=00_u!q&g;G9#RT5OxBmz!FYo~i+^ zmt*181z0|{Sknqc1Cn|)aUF<$f)0Rs4O~YB)I;ke4Mjs8L$s6xaWk~$&CdgMn!(|X zXclUKTU_X6Byw9BYFU0kYMutf_*$LPf)r3|4cyO~Zt;<cciL@cNw0#$B1EqsStkji z8eZ@s73zw%w#j-(e5f7pxB}M)B8fRU3QF223N@z(%whrM9C*_n%@RnN4>ljdgmvm+ z2?rty$t7_6@Yf%Zk_Dl-s2<!vamHEUpt%XwwnEC&;KU7S)I*F(1~~!TOhd~tFwI~u zK{+bL&;Y|{3?!tWI*QSp1TNi>+ymw#3NXFmoXnKe&;kvmw8Y{PB{V026@%RaW}$~L zSP)wD)<XgsB7_J*EaefX{|B`PT{UKb1XiJ`lME@P!Tx}T2v`Q;k$Q+vT=L8FG>i-k zG|__rZ%K<k5K=2jAYqVNQGyW!pb`~S9@oPfVIUtPoQ1tWra^gJPh5eV40aGoID&kD zh%j(a;0(pef>cOQR2HN{;{mF*KD9^>Ihlh?A85M++<etmg7rk8qL4BZLm1l3!4L<v zgfu~U2a=7@+gz}g3`PqIY&opGMND&xyry$KXtbs>C$(4);xA1d)T$HI!U6{!h*47m z4jx!Z1rh>9i2*c7Vd5aafc1bFpwUsVE@*(K7U`vdMhBHrGRyQZTC$*88Z?jqEy&?T zGsr3eZDR78#Pyl^dBxy%B-keuw26s{BS;$-xsQX|^#%nPq(FiuHfXAX=mQ5MR00xP zNaC=-2ZdBEz9unh2~)2JZoGh_3(SJXCAi>*)XS+F)nFM&Ed#R$EClOd!UPd*6tIB^ zF4R;+8h{xcQJtHa=K&el0{aisD0EApBV1q`plqn|U`K<7x<c|brZX;K6t0JkW}!CC zpqfwv0^Dr1PX<%abPjI5z`EEF-=lQnp$34J1;86Q22f#86Q&+Aw56d0X^$xBBts-? zbwI5ZD{%7!G!3Cy4fZ>Dh{;w7BnKH?%E&C%1DOLeCMh*7zbMteAT>`((;75NmI&^F z!^S_shJXX1Ah9SluSBC>6FQRw^$}POwKoh4Z%9iF6hWyKC6F|TRmv(E+WJH9Jwprt zH9w)TQIKCO3?8io4b|#Eh9GTiZ9x$u#$8i`Dp0SNnwFNDToRv|2eBON)Z&c%at%#A zXp|c07-)jyM?=%f5Z!ucq(be+sv8_UFi%0%!wiJ>=%C5cGfx94ZW8q{qc{;>G=VyI zYHCn5u+##YzXFXHLLyU1ClMtY6Vpmkiy*NGP29E9)%=+Rr^l>k;&6hdg5;e1Vnix{ zk44!kDkedaGiJhY&dD!MRnoMc9xKl(&JWh2rUo6!*PE^=z${k}7PJKoSVB@Fbkr-= zzqAC|%b95!$)I8Ul2ltIkV8^alys6Y{Q$L4CmBl!CBs7qQopLHCF`Zu=cMN9rKFZ5 zCTD1Xnn##^fKJ?iCYs;|K*x~P)Ijc5w6#U+l|bh3l57+8GV>gZiV`a|k}-NX*1Dh+ zljN+XhNfAsxF9DpIaMP`$568tix=VUfyI>0G<{ZSMNk5()j{r1AaZk(PO@h8^!`jn zv3f-Vo$6Y+V-TaS&{PPG11Jv^;K|u=-(jeR$RkF`by97klXQ|}b<%7NtkY~#p?O_R zO(VrNH99R;M``+Jb2j1n6iw?iZEelWG!59;w<2t=DMb?{Q-B(Qwkg)BImM|8uz~n= z&_Fy?9dyt*Iz84NK8XSwYKD3uIz3h=B|1G8+EmUjC=mlyvC-+VwjkkJ=&VGl=k$d- ztiocD440XgZmX1;rvxt3lB|=aU(jP0g%lJ><pR2Z6<EMl2Qml@8pE}RG+scFqX#KF zbP_c*HLa9D98iZj3B7Ou86m6(t0odPp;IMb!@xm<WEQL(0_$;r=>e;PdR`A&s_1|W z0yjx9ECuyj!0lA9DV#7<5~shv%P4A*WS<1;@G9vfLh?Asc4$a~m=I4TVa{QI3=`vl zWf)K)3Kro*60xeTowkHg1YRY=X2rnfLhB1ny^O?SXLz>}QY07amKTBQj3OmX<kA(c z1vG3?4Vy)>QcBCL0F@S?8Sk{5{BkR$vdrSlq?}ZxTF|&kPJL!dDrn?23E3==5lS!} zN;+^Y(EI_amB3@tkl_|2g&CPCDWJ*_o~-;!OAr|`5n8VzC9-_((h@Amj0cv?@=HtX z!9j;Cf<K{wDgX^lJP8e~0A#4J20XfPBs5S>2P%resx^^S<4#SX1(3!LT3WIMrzOzr z2Cl>eb{DS1#0yV4@F3ww78)eUDV|2j36`EG7d8t|-w?;hGJUNpD@Q$~2-bnD7Xi;C zSZAhbr0Bsj1EKt*fut3jnyW!`^;Sv-N;)O^1z;LHT?}SHrtU$^T1~JOta&9GnwrxU z^4Ub|lfY9okiI>fZJVsAlcZU#lvkRYlv<<&FXxl=@=_~G3i68$)zmZ)9NQ$lw9KMn zu!N=#Ze2#mx{ScO>LJ>Uuxd+8Nh!!LhUkK_Z4DqT)-+pqah(DV043;Lo{}agC>7Ic zYM_g9(seR)GIg?St81-`%QH)oGc=O)KuaAotCJIpQ|loM9;`BL!GodJNkyrN+14N# zrP2Z=kT4|ll#pdWVGWi8hcSv2L<FP{tf)5K7F@Y|=9Oqb+?fgLn?gsBHSDcaV)XR1 zYNF!|bS?E_H9-T)N}8HFnZ<sIej4eZPH(!cf#&p&=HQru2XakKT1|}xQmEUe>)?nE za9x;<;&mg4*P%Yo#_scMTiB8hsL$)cfdclGRkp1X#G_C-uoOfDBnMUmTBenO?)z+1 z-{bLo2FUXnwg#FyN~L)zscD(hf10!L)+79EgdPY+wi$>(fTS*X;?jV47E~XDBOf&N z2}{b_DSD8Rat%#84R{vN%PiJN*0fKB%UOY>>cNX#Kr1~8G?a>yi}G`FAiYi{P0gAb zP?Dk83cNPdL)PTrvIN|l#_kQM6xbJ-R)m8Vi9q}SiAEeYK>PWWSOJPx>}eG#_OwA0 z>5$y7tpQB{d8sK%({=LMIO~)2psSFK?2SyV5IjwtB+w8UsLTK*9Qa&(ejZYM8`)%N zA{PXxxgkrhB)`BG?mi=JrGg5S3|?BGRBx4~2PqZsDFkN%t1LZmc;ZtCR-j~+r3cc1 zuCNx=h=!G@(6wFlX$lAjf|eSB+CACGp$BrbCZ0SG&aa^IEk!TCv?R3%l7>MYY&&=e zg3D@Hsf)-Wn$}76h%yr7WF;%GaZqnSO#~+>yaqxOq$a4GK=UAy{|rI>4U~w~NUyhp zd*8681{`A`3KAtC7T75u2FQ7uD6wsbQucxMB7)oyTWn)Sc6~9XLXb_MI0Rdb&qS~S zkV=pabcNv9R)AI%hzNyP2aixI4Y0dG9>nEmP^y45S5q~zbgENIiy$kwrhhPI7WG42 zqoo5LmatMZtOeyCMAZl>G9i%*N-Ky!*S1BZ2W^e%iur6Je(+pqh>|A_HIb_bke^YL z3#y^eGyyf!9H*JJwUDJW;FVpqwGbb`#?GuJD@KdSVlDzquBp*Twly?>EeAxb+k+0e zftCX%YStn~*Pz36ljV9OrVAu8vhsn4J=D}7iyHN&2l6vZ)q}=0Km#nWWh~%v7uZAz zxK~tMl3xJI3Xr}SSROW@1Mc-fA_~@dg{T5+1m$ZbNZq8QqXe3)RMLcvw7^DFy}?Gn zI*#A~)PZ&%A!Cg&DX3sAXb257*9GYmLBkF*;57YWJByeu$}k`_2*4A8u+emIDA+;* zVS2)CMsblu=;Q~;m$lH=%k;t>Ov23e23BAOWMB-mlnCDAhmN4=R6_=#i>;z#bs%Fr zjyXAq-j`-ISE61jXru?K0XoG{jJ)O(90(B2&<-JlqXAlEtXZp50GmBVF*+H%L<`$` zQSi_fe82_jK+HiO$ohIs!tN`Z{`Myu*K~P1R*rh`2&Z+Tnwmx;yg6-~h-g9Uz=e&F zgpG6(5p^4g4PJzqnV)By3|hQQ*a_euD#$OchYY4_)@p(WXrK$%VPT7Fv?v8M9F&@q zT9T@e0(Z4e3Yv(KW-VxiBV=7)HPVVzt7>@XyB=*RD<p7H1a%=|N;(i4GChI302aJn z39bq>H-@SoB%-7PA~E&WLo|aVm2{vJBdEHef^b<(GayF5)j=oOko>C)7E;myQ>gmY zK`VG627qOiYIU*-LF>6oGm%2cN@=>hC#zOHGzh>;8o?!pZboK$Mh<8JFIw=FW`Yd` zt+vZd&d<|@co0N_772rBs5`JLgn9<aqLkFMMB&n$67+DGF0hqZygoT2H8~sVK_pEO zFQNDw-9G4gI-R8a{F365qQn9t6n{gc;r>SRCD?1J70LBEiI7Ffy2Y94d62k<F4aTw zIn>8sO`s5fDu(+NY?m&Si|$XbuKaAM9<aw?Hl!BSgH|r0coVF=Jh3P*GcO&YrxxKw zV|-qOxB{vb&A;h6l?53fqZQyR-PDTYoO%+x57&ug2Fam;W=K8AO}f}aCk3>js0f-i zpizLP9jqJbV`yN3>IPUT1e%@9%uClx%g-xGEKe=Y&rP+3*BjuG@OsFu0hmH~S~3Rh z97;u9mk(2fWE!l}fx0d&Q6Vi69IminP0lPz&H=55&r8ckQ3MJ&C7t4W$of(gDda4H zA_4U%Xy_8QGf5A$Ny0u&L(?izBTW-l)6^2Tr$bFmX*zQToABtqj_ITOI!4mIj_Lc) zvv3H3W|F|I8R$IH=#~!bTRLD{S;*Vc0qGxrH(jI_+rp;&phFO8;GP$3ARnwK6Smg_ z*5N3whi+X$E7ie^Khd?~+|+?(RWWQO70e>o+CTI?9kQdFI#M;@b&DQsE&|le9o^J1 zWHxmuf>s=Wi#u3)2Q{9kwy8tW05))eY&-=E*hV*XC>o*%DR{LmWX%AWiL^o%JbMbA zn}@{!L=9+NEqqyRW=T#ek}l8+3&<h`6g?nw=)b80i+|yZzd#N}ayM4rf|lT-corl8 zA1?qe*+ui~=%x<HC?PEJ5i2AS#XV%~q!=>0hn^t8V^DeprS-)b_JlTdz~o`oIMiUW zHgP~lTH$**Kr0hro`ARsIv7grO&rq=KQf7o?%v2utJH<;3;|6uV`f}fQwma6fd`=> z1F4YJJjtLTNSf~6z;qJ0Fod`V%tR_pz>8T1{q7C0m!MlXpo7zB9>Ltb0oH?3>4OSV zXegi-kN5*&IPKm52MS~h2P_=11O<3i9JW0$qq{dC=?63%mRhU_9rXlF5|Oxj1ACJZ z8YQsO9JB`kytW?10L}S>Q!}DgCvNu!sf}OKc5lEuQjfZ8nu5mf=<bbTJw#&!9RCO| zG=(720Hm%@)fnBqF}iz$aS5Z?=<bct-5cPoN$}kgI*9Ebqq{diXE1^GStcfDkM7=p zZS%4Mt#KC{-Mx{YrT`8J9@xnG=<W^p*^J<(C#10fUS&19djlLI;O;$mL~eBV2G-3$ zuo;ul-5a2-9guw(&{gx0_4Rbxy@6xzhEhsB=(JO-49FNK@<LP4desc{9Sq=Q%8(_f z8F)4@WY|I$+1Dnb?_S72-@TxObMHnXsLPv3+}@2uq?NwlO)-#d3x<%LE?Iciac5!o zc^10Qk@s$7;qiJF%<GwH8W=lQve12x)AR6+D<tgQK-$0pNn4OWFw)c+-Max^)vKX7 zx_86KCLLupKkD9%OrrK~WD>o1Ba`U88<~{t-N-@|0FVtQ@TLCXt!k*g1eao<@(sGv zVo2@XNJQPc0gkbn8d#KoSm6B;AO@(Q#<zC^tQUO)1$rF-Ga0T9_udVR*fzx24FYzX zk`;PvLlh$K-9Xxi29bnEsFeoT-5?Lb_HIBe1_^=vjJ$Uvb9C<p_yFh8y&K7yC6z;P z?*@_k5+IX|&;eoy2flS9zaD;CH)2-^9k*^IPJj24jdOJGMqX;s=-!Rg+*I&33+M)q z(Y+h^Ha4K`WdN;P11+*2-Mc~j))j2~CO}&dAe$x-`<EblNT74N=sQ`^3>n?K0X`cX zWsAnZ?cGoo&?!nSEX^!R)qvj1G5yV5Mx%Ntr&2Gew4@|IuUJVZS_!gIOi2eOrxXi1 zA}A4hAqZ?2iDoV046a1bIUY%%0}CKmQ@}=tVW!$vgZ8hc7J)8SfUx2-Kx1K6pfjh6 zOEQzQA#zYAR8kRisY8Bwe12YhUVdIuPJVJW=uV5A#H7@mVk?M|R!Wd#y>!4@t(1a6 zhAGw7>L9xYx`H3!n%qk0bsO@~dk;WokwLFU02>6m0b%+-UncSC_WG=BGS=YHOt?<l zWF5#AGJ5%W8q@pNGl7rpS4`1^tI&g*R8xaEJRjx{&`ANXH4HE@Js3kx4b_+o)G(;2 zNr4%yS5lOjo}O9+j?;S3Wh>z1rlbiutOR_RQD#nNNhQiLMJT32qJtW4)JKjekRu^R z<8;dO_g@%gRImgXB>F)e6le%e_nOZtqlByyVl+Y_gbz|DT@Tvg1&%AIZi45B>p~SO zL6-I>mlhT07g;G4<Y(rUq!uaZAcD~fbj}<&wL+}6SAw4DgmiFJy$<;DAw(lmvl<cq zpmA_pMO3~HD%U;<ay}hovovHp2IV3LokZ|DRZW!0N5s82Xw^OR-Wurj6yQWLU9gKu zbo!OcY~rAkElR-0s1{`A#g`U<kAY1BZ?8x#)&q%wuIE8I2NuJD(8WC<rKJU+qcIT1 zfwjV~F~EApf4vf_meK;qJvCOzdXT&gN#3<62ZMsnMae4xAFQRRqoD|o2r^P`JxDiN zrh=Uo22Bc(L<>9Y2YP55bgv2|tr1RD5Or7*RTO5bf~duvsIa9eL<dF(ULb&SfDA{9 z9>hEl51b#Mmr7ub4W!6`=t7SSuqc7Z0IMm&8W;6Q7mdJ5IOL)(8GKG0a@hfk3y7iE zqoNk&)O66o7H}N|&iC*V*fvQ=F{vIJ7&SGBV=!Uv03C&iuNY3ka2sTC8$OqT#!tc3 z3ACRHKDr^b2;Cdt>P$&fM-i0qz(oo*9f*{S>owqqR>9ISIQxO^gt`$)IkIY)8^NIp zQ-fUPAW9w3p&n2b&{Pc5!~&|^At}*{8ZiJp9TsXCBv=t8G)hI61dV#Ai@3o~g2Wy5 z9Rx8KpL=SN?mPm;dSyN6&MiHp4gEThMokgwNde#<4a9gQ9cY=0c}@W|Kp-kWr7#vl zplTGLR@Ng92`DZpP0j{w9fog!2D=dKKuCMAG!x-E^v(8Q$3bi^EdcM+2e}!3NI*em zo-XL}uFSl6h{K@z>rqq`<FFpS>)Ht60Fd#zkOB~4Em*K1v9vf9A_lPwBASy}iD^7E z{9z{q7$eL_>&t-6K(`K?8VuX9DuOwt9(K1IBCJt%kAs7?2z1IPXyZ8OK$K#L&p?3; z*-egNAygP*1%aL399XaK8|^Bj7LRrnK!>1e>Wp?3icv0l8|^A6C}~4VtI@6kXs7|R zVF$kCZ?vlbyW<R_-v+7FM!O2BO5mjyqg{m}NS~^>By+T@06l#ibif&ELmb*v1+NVN z-_DC@t3n&|h_*Z=hap;u7z&`>0Eh}mD;bxX(XN69xVnRe|7ceM<)&{OT?KpC%mMhW z^Q6S&Y|`cxCJQbSwM3dt09|9OlVXcJqz}4wMkf_T2+}{ZPMV%LgHdw&&TJNbQ^*xG z@gV)skq+2s50VUcG!-^up{bKRy^w`TZ1RVRtgbLYy+qI*DA<faNPtbzM4fj4Ins8z zf-$R@6Pmps8PL&;;2Uw^)<7Kvl7twisgnr3NJ=9G?yP#adWh{H<!HV`NI=a&br&S0 z5O<|R&oEDdOmUz&6<nHtj_HNDRSmL31nO9@G}soML`_YdB$#_s;qHw`b1zs2RtJM+ z;AVlw@!=QSBx+V;91eu-?)lLa2~VovfTVtk1aFoFohv#-QY6^DNor~ugDXWMW?qx? z^U^Yla;ZG?3N_UhbR;Usc+kvgK~a8gK?#Ia4`RlHPgww++zFA22c5=Qnp1)#l3SWn zk{O?qnU@OEmza~8o@WI;mR|=tXKWQ+4LUc#O36Q4Ne6a!G{T4w$Q&hP?l&_z8!|H% z4<ECKAL|P`R53lZL<4hX3v_z~$P-FB(TO@qv7qJ=)JkXY)EKI@;Q6=db5z+R>J#;F z83@y-Sz8;6S~|jJi;+VRGVuhNEQSOXgbk`$ApQY)2Yi<jWRMwjq-17ZeQJ?yqJ}#7 zT5Rx~nXOW8Vo`c#o-XMA4AX)N>*SoHMt{E`f7B?Wyub?D43C_Ht+fepIK3d}&d z862fg1-j7{oPcU-l0kK5ZUOX0wA{q(`c#+9#GL$e4Uo$~d+?F2Oov`hhGQZHYy~LD zp|=#}CT7FT0!_3)4u(POu?AgP1iHHj+4HGIdV!$%P7O`H)ZBuSN)63g9dN}2x=aia zXdvUN!Bu;1K?$^4fCRB#T7GhAF-RN2_UVeM%wqLAX`st@)4??oq|!n-1!|WLEHGe) zWJAmZPunSJYrtgV5$W4r9Te(`MX8AjMfv5$wo0Z->Q?HRc?G2<3ZUZ!Y?VOrO6r>0 z_38?!u?bmZYlS^RVL1ZQkObXc2{scv>k4-UI3sH6l_lmNoCeK|ND&VW-g?+Xs3v@e zW`;s$o<cHg*itja7S4{&h}B7hbg>YD1iB(AFGWL1K}pjp%~sJsCl#DdAsHI#TL=f5 zDp5S)37$MoD#-);Aq8|?i!<mRCQZmGN-1Cp)7dargH}u^fitPn<crB7)BUEib5H+x zmr=MrQ4cH(nwA4IK<O5irqiJea2RQVv!7;dtwxF_=xR1d<f^GD!UGf$ub_nl5P4`x zgqp~*Q!5LKQj3c<(n=@0_zQwu!&#rCS#4-+Yn!B(om%OfpOT7j5y;L|P(uecUk*wX zYHF!^pnIo0^YT)QG}LXtx7vfF)K*CyF<u5zs;#bMXQK~NV5bh5G^+$9iKLP|@QN6a zNg4UfWvNAz9sMCeqXa&Z8yvuhBm`3raSl8f?O}x}UgfCvCMK6;mZgF$&d-~^QH5D- z^6g|UP%v;C;;<Q_17fu%I5u<hON&!W3lQ<?j@uz9x^=+4D`*IS^E<>L8cJXe!a!Xd zZUHMpc1luCX%Rx37jAbT>%^FvL!0<YD#^2&KEaCFc)G(~CYI?g*33fnuqXh}cR^3h z1}$n*(n%`GgLo223L*fO16zzF1?Gbemo6v;*Sw%)0+xp4KwS`@;N+E&PBqApN=YT) zbE+Xm)q<*2=sCrZfCim+44+UlM(9yUD#_D@7C3OHq~#ao>VgW5qWl~T2c&_|Uq?PX znKaV~%uSIuH3hA+N83`Mh{x6RfwwnD+fw<^tC*ncibmT~pri6YIUXD!uy)&MTMAMV z7mv23)KZ|$u+g>@w9$dmf`QcXkS5G%TPg+GUIjHevY@w*KpF|7Z7G!Lok7%=vW1V` zr=%8Vm*f|a)Rvm8Xe2sau$o;|S|i0)$q#gWMrJbjQZS{=JO#*QPWICeE@u}rNiA1E zme&A{1Jqh6<>pr*3xl-fC6;BTCzj+FL3F0TxO!-6^^%KH6H8K&wQGP*Jpf&Tp_8Ns zTEwLZUeKwbS!<<Ko|=@MS%R#%7-SjLjgte_MI9h)JuE7*Sp~5{2WF#Ytrf_llJ&Kk zAXjMCT7w5U&^Aaw1KGA3$^Z?rr6uO%fF?~qBW55+gZsKVC5h=^2KK=!sCL_Gm@*xh z&iWjk^wd0%Ka*3@MqNNRl!LEe1gV7#5r9~>N*N_31y=g{#mSkF0!=SDKUW{Rm|Q<I zFFB_)CAC-|YNx)EHey{TXrM$}Nv|L;9ki|(WLmwgt*xRVlIb8@A!AV>X<KNpX@G=b z2MCuWrq|Sf1QbDi@RCIEQ4iq3kCMc6@U2;3XO|?V+bcm24AxcB_Dw9w&@0L>%}dcR zOf}Pja1-nEQu1>_V^c|bAcJ%g^`P#yP0>JdcV<aWs!lb?MF_X)fKm?9qE%2w3>*(I zr_^fdC~83NoCl>HxY3$wYD$nh&6G0h^AzCXpeY}i^^moxh)EdDYPd2zh+YlIm0M8f z>gDHw$3#$dfKS(fFUbWfPy&s!!EMQ}&jU}ZAZr7=7<8MQqOENr=$7D;RFH!~OA%5) z*ImQKV4Y_T(1<JQSZAV6ie@$Re!LWzZT1?;wn;FK9(cD?Kz(XaZf0>YXna&t#{hI# zqkUO^W{O6N9xR>L)F4F!=>EBQ=)!wjMMF(ZE0Ai)MG)|GtO2qeDr10k1QX;suw`nX z_2&qi6yeT;t|LY^GYK?X0zMiJ%Mc~RG_@ooXCoVy2)<xh4|JJcHE4sqm6EQZfq{WR zL4Adi4%9zZklTc7K@kL+rXk%H4V>0su|)@blYBi&$^;E$!4ed7(6&|wGL;A3NQG8H zkn3qA*VLnVnha}5^ffrW!+mW7s>G1J4VKo>1SM&BVz8|)fG1N#5NK9Uzo^G9QV%LT z)1dX3nwk=5BVB57NdR02$S!0x_Q)JP4CNY{1Zp4n-H(u(#|YWDVr=Hs>Ok@u+(nZ& z?iHSXNsnC^-R%f(VmMkUy(lrSBsE3J*47r;Mm>Zcdjl&&f^Ijkh2Gi-syOS>>sV;1 z0C%Z|Cdg20uG(51%(4SX6_LY5YHCRL_$u0#Oc%&tV}svdg=2Pjw9S*3l3#8=BHBFQ zsvA_zBbpH)o;{V?JmAyAlj^~ZO?yxa#){VM8*I&+dQh21r}hoD=1qM`egVDOH`tmt z^*Q;))M($p8#ZccSXwqnr4zJa18dXNCuier)Ige;$W4zFO-%yr7@RE+aEeAYD@n5+ zR;QER!XTxAfpb2$zM4S8fy5de)KUS}SMU}xa(xbx1Xbrq&6s-ho(=)$kl|^(&6s-Z z4Nek$4Q{C5^fp))<Zn=i5Za`JHDd%o&F#^43>Dikxx}?&sMLxfW|1YL(UOr_T#{c@ zN%BBVy>%ku2nWsTL=7cSe^&`IqYLfr>p>0IP0YzrLcR+ddgM|P&U><9%V?km=w;@4 zK->vikda!SlbWlSS*)RC1>V1zld7Z%876?OKm@HGflk(gZ;yv>i3b;XDC-_m^FUca zvlhGKa}tY7P+VV@Sfr3xuagWp*%CaMfa6YTy@Jx>44o9)WP1ZET|?`X{OZg!jYL~r z(Cu3(_Hgg(73X9or)s2t*7WD)mt-b`?!JHs>7-~IYU(H^MjOOxLORTfhSneh>r=E1 ztx|LiYs)h-b5b?HD)ev$TTKnf1V}FvHPAGz!7`BWfHOg(2eqJ?eoT)+qom%p8p;BV zH07q|m4Zi~GAmM3zygUC`FX|3MX9NIR)+cpI*`5jR@FtR@a}97jH#rPn3H3r<OoV6 zpuo0L@&N@oj&nGmwnp1l!xII_X4C<OB%M^q#p&?nqtLV2K}&zY2>`CyHWijkbyD>} z{!mk!u9(jzQlG3@oeW;_lag7cpl_$7Q;p@KM_s6Mz%$+8c`xKWP8pf;AQN@KD;#oC z6U&gQ7R~BpJ;;I2sT$Rw6<tcYO4=#l1N~}2N9xrVfrmb=3=Ir)zzNt&(XbYLJVRnZ zL26zKct1W-PRmG5OaUE50UCj_N`)Ph0FQ}UP1tH1u#u42Dg}LaLOxE+$wBjLQc0c; zswIgzInxWjFp5q;b(xJz8f6_2c;!k)W;|pi#Pp9}7{$S=rq{VL^GHD!9HbWO!BuG1 zLe4RmT&N~okLwf*SX6>b98DcX!&)4^Bjh<yI>hZeZb)+01F0Gq|AA}<9RPsr!H|4d zA#4pQqSC;L7qnQ2aOy26&B+1n<$!vb8x}bkc`0E3)nles10`@WC6G!(@->n*ty65% z^zzfviXrPW^9!_%bdn*XU1$kkQzum~4OE7xsev!@at5so(@-j{&xBu_1Iut=WlErd zn9_oj#1f>O1)2<~M$6<$u#};b1h>E*#R{A@SS72e)hFvg*1f|Vgi|&4#&a@gNHH@_ z1775V&hUX1^*O0|=_MI<DSEkxLQ}IE6oskQsgO#h9yIg`FUug;(1Gd}j5@>sbWSU@ z3W1obi)yYF+zGH+2iaN--Jqo)sfo!U85*g`6*xF_At3^-V<8-Hy+LR_6tq;dntp(b zO?3MGr%depkTsA>I*{Cskm0U}3T5P%fmb!5ES1X0jL*nR0gHpW;qU_i(u*<+bW`$6 zN>WpFGxCcvt3V5CF&800)*!(bG#Tks!(66Ro(igrGBV>q3$?5u>!KiT13LulP_We? zdv%jDQp<|+^K?Nu2xF-enk~lIY=JGlLS0A&vQQAbv=6i%8s^#Q{|~S!)?;6sg>nD@ zre|<lgJBEgBmgvzA%@Xp^E4>jR598DElACS<{ePuYqSLl4v!(!0*xTt0!5sCMMm=z zJZzMxp#<IlK=<}%eJO#O9o$%?UHj96ppQq}pM$pjsgpu}+Y{9EWCu0-snhnPtlbG} z=GB81qEx~=deC+!_7PW2Dz`g9&CdGV{Ib*mYIlN~oro=?^lx{9nw<ggeVowHg)}vx zbti-~+U^`}ca{_rGxBK%U!n#($B*=(Ph0)C{5*Y~R9pQxjg+JuO?&Xt8I_ti@HmeK zD8JT#`T{kj1vQ{e9X0u-B{iv_^FV9BgFu=pHF2PI(y0|Cpy44EeVsIrQQ)l{HJ~jh zHN~kpsmUcZ$r*`x>8UkEsl}-!AWhk+l^O*_HmSwMF!ME4^mWofnv0W*@^f-PN;9ic zYcxvpH0^Wp6H{sulk$s7YEp}e@{2%fGo~A^U=*&;um*KTZIkp$@_q8lQ;VDvi&Hf; zbyD(^OLJ56N}wy$T+34PV7ux-!*+=!$r)fV$k>`~l3r12K~5rQ=u$^X2{c@o3sRzy zs%ftQ8=--9`*kvG5vJFJ*V=)N(opgRZT|tYi<LBWGW0+rc?dD^F0Q1~q@<kGV$h%g zc<W_iQckK)vR+wcYPn9bUP@|7VrGs`vL0l-F#^tt1Zl|0OwB6+i6w(sV6pm=q8#tk zN}XiA#GDccqc|fo4a&?-ElGq3LdL>$K&5a_Vo7RBNMccXYKbOjoEGBKG);RAWRD^H zE7TLsQ&0hoB%OND20OxDLb3?Fhz*xb9wELyXm)|QIK!@9Q&UGV13I7#*#n6ZzZw~u zkh?;X^dSCB(X6S_NU~MR&r{M)(nN_%gqQu3vQm>vG?Jm`7o}wurNW$%p;@bwiC9He zpQMul8li<Af(%;sgmKO!bPNlgXh4hAQu9jOit=*<K!@vUfDS5!#4U^!scDVfMCe(R zU?bCQ6E*77G<7m<)4@YfN{}Oal{BrDK+DHK3s^GM)RY`Sj5N@yKflD>R5dk?Ok4P& zzMzy2at?}q9f)>CTiZ<gOe-bWb|_7qWYAa^XgiI8rmbySO^rsfTD_V^2Kaajjb!j1 zV*^bcC2-jRE*_M0QuOkRGSf5j5_7--2+9@7i8-L%oe*=Ns`E=rFxA2pr$JSL3m#N; z^{II!80tVJ6{<3jDkNp8nC?opO~<}86;`;~R>N4JL3$Y5Ha@=~5p-RMm7Wo31`;vL z0Gq*ptE`3}$O>M-s*{<QIemi#tB6tx(gt3*8rvit=yWXfU~LI;<ddIarmCqWO;;>t z7mmO#2{od)B)>pI6ER2+b2BzgFb_fRKbijF3!{Wol4dnFwJ_W3lflbKU@ivd0%&4{ zCMHcC?D~~JF%MpU37J92%u5GNYJ<}xE>|O#t3v%zYoeo+2AXKmtc6TafD!;=-Zv4u z<0m^F64nK8s|FR@`K2X9=`e!p09B3%EjU9+0}?^vnV{v*I!gI@;Oqg?tOQ!@F#V!2 ztC$4#z=3ELonFkuCg_Z+A5<xW^@B|-Eg;$<5Yy~YO)D(`n+2}?i8e{t0d5FbBiM+P zq#Q7ZcvI5hroi-q3<50<#XTC1luK%<c|OW$lM2$LN+P>GWv>C!OJ-vVQUTY4+G+#R zn1ZyW>IbYb1!+sw6KWsQtTCmjsgt3mRu7&ML2pHAT4_+P35D8*LTf_R7Z)R+z707@ z65QZPLo~cW6$G`~P-so4`r`Z|y0)Rvno#xhZbN|@M>^0}T$+wjJ-A8%RiSihL%~`c z&?XdUXC-ud&}bV9bO(phXd7y@4TZ0TDC|ScHq>;-9gGsei5i;KwXpF@g(OhpRkJ!R zzeoc#o1bi(s0W#ow@%j8wblf!1&dCO)yv5&E=kQxEds41gZ9Z4lC2@Dy>tzy+qpA| zP4B5;=bRqDf}L}^Kq4axb97?t^u+1x5*8qHQ*09vxnCz0+%M8evrW|lcOG4HGfPTR zi>y;XJxw2|RmIa2rm=}b>a6(m)Dp1DVhv5uuu!5xW?pd#Xq+WKO(7^X-L;}XvpNZM z!8OPu$)K}>QZ!TaG7^jZ%ku(?@(WUnN-8yyH9<X)lGI|*0DzjBMpATgtZhnkax82l z!8Rp2F}9{g14P+I$7)&^rAn8S7Ud}<)#{|^rR5}+l%(dt-Df+QF-asSI@TIwXOgXf zb&?G{@RGD`4K<U&YwI);qmvK;2r?6FWHQLe^wbi#agN21!3nUjf#9kdSz03zp%vNp zjzvX@l_1a9R@dqzMJLAECTr>>)zpB^PfSUHnLk;vSgal#?kIr_vsEKeQzy+9;|RiJ zu;)@h0h+3riXNaTnrdp`g@Q>MsnIF1I-mdsF(Cd<vro3Fh9w-UWS#sxt7On2YqfBX zfIJBbhWtF+WDO-G$0~t(m5C`S{&~r%5D!cjn87YFeZwjyRv#pF8i_gx8<KSL^FS6D zfVvndpzVaIP-79sq!xjVPDxG6%ma=5Om|qpE;hMeomCkvtaV^+gDcG|nO-=HU1ECo zG!}kyTSHBd0zD*Ia6Dsp4Knr*@k46SWW{0${E+|-?^IBDr)j34hj%LII`kCVB#pG_ zR8VN^=o%{8+NP+ff%tmG1v%g)nmUG>7|zH~O9O=k$TiYs&>)3|1yXPpgSIw{fkRm@ zH!&}>pcFKu2y=X~hN2;8_pc@>%0MO|3_{Xqh*hHjTqCCRbjOwK;?oa&W@4$gO@u6v zMKv9=n*hn3I_cOI7GtO^29*}DRIO+W+P#~frjS%qlZ2dype0CJcz%%v=wvZy377&Z z0n;FZV4&F6NzzG<PKnjDPR%J!RRHCBaK=c|OhS(+P{z<mwM_!4R#VdeAO2;WYL9Fd zXmHUg9m#Nz0D8Pl?%gjw+1{749_I2y9mtrH9(swWR9sR7+7V)FYn!Z@lA4oRlBxhI z#vpD5730`EoL{5?3J3)(g=G?=uuRfSRa1kTnG_2#6Dj}-7`^yZP}i;)S|NZpvmz3S zV@?h{3BeL!87TARm4Gv2YHlW^aG(BgGMm`s1G8A_b<%Y*@Rn8JY?21bCK;eQDg!+N z(lj+e@sn(u5uFwbT}5V~sgr7(46EK!L6Mtcn+(cH(89vjR?z@FWmgZ{ga{hQfw>#B z9~WK+YU-rhroefitEX}*!Do?zirwf~khCqt@t{Zol|4bJpdvpkF{d<D19tfnY7$4a zKo>nAp&Ot<p$88wc-T$9xQtnNx>q2R`t-aj%<Nj=;Maqz(@4|-?fXs9D^4vzbIf$b zKqe7T>8BSDDmsyzX`2Wy0I_&tx}pw~ggaX8s)TL^Y_&VOxRs&-C~<(y1=Z=(8Fw>^ zf|?Ahve0ByQv(i8SgNwE1{LUu(;coe$_b&i7;MvY5~nL}W>;sohm^$A7Z$Jyvn1AP zT1^y`oWAcaqnvD_6`G#JT12j!E_j7adV0VPMm`5nGX>QA0Vicx1SIQ~fag<eVGPhA zl*L8Kt~sfoNvN8dB%S11h|cLBD;Oo}by5&h2%6Qk*5LJ<AaBAedV3@liJ&3{v@t$0 zB?UzhXj()^(NMG2Dp@bFq$CkKsimf-fub9{W-~E5Svw`x7S!Cyt53;+<Sctw3r_>G zOf%Uw3DklBD}t$k1Vf5WvSuw}R1Zx#cuYSLq(mnX*(Dm_d6r}yh~=8Kn&5tXDnFX< zCl@e_FxjV0p1EJG9@$Tz`7nf^QW3h~A%dg=Vpoz*Vsw&ra;&CxNl|4rwDf@p)h2`I z^injdA$(i#mU@F)sH@U!tCKSG_)@G=bV~D*GV@ZbQfsY2WwNeFnx+-3cCdw&vD16i z*~IzNtP=IWNg*@UHmz1;di`BSmFb`EGV1w(MWIbreQ>NnIZ8T8V7bgxeJHIIi&&8g zjw?uu8Qkgy@e%1%p*|6DfoXYuPFkgfxh~igP(}t_sHcgL2a9K>Drst3CF*77CZ?wr z`{XC4q=K3Ti8_fWjcU-)J*aTbOx3K_fE@UNa1%7Nl}d|Krx)yI;{@ddPU94Ck%8zF zfQs29%|uXZ8PsHk<&8u{FCumN-6iZY^*N9fm8gl3Ndqmy1Z9vU+vr$OWt^&!sHvG` zn+T~yGSf7a@=9})Qj3(};SXy>gG+Fb)?`})>tsaRI$2v=GYQhf1i1-X9Vh7(_>~rC zfD$<@kP)s(2l+?`a@)BgxNt$P4bwGYU7Ebqas`-L>*<Lcj3OZ#iHNZ&@DV@3;Cb)- zBFCH@kXOLvBzV_KYF<gPEy%wRA?PL_+Z2uJS`-mY9Z=d6&P=jTwoS510Xqk_ZdxY^ zJQ)YBRP*yRloE5w6Dy0AbYK&f>8T~2xuE#g(A3F-Z8XX%bV*H1Eh<V)u?2Y`OAp3{ zX3FUe)0kxHQz1Lk!OKu!g@XbpyrAoWa?@>*Vier(gf3<&Ey{t`2QYuyCP93ZnVSx_ z66_{$IhbXesFxL3np#w;lWm&_I@h>3KPOcu$F?5QyFv5<^-A)C!EF|6@X4o;fg!MI zNjgX(u#f?DZ;*xIA%Q46pw5M42vBkZH32{gDACryx<1hc9IDXq#bQ`HAW>TzQsgB; z>TH;NbYd)I))`bZLrQzFFN-yjKnwbjor10c;UdriWKUmrC0pCXdcC~-lvKz>E!ZK6 zDJftBK|L?905rkqfsV#W2OskSI#~wNA}I!)K?|*PoD!3>A@X4T#h@e)@@0~3BG`_Q z%7Ro-PD@f#%Z*Nog?8@!6N?l;)f+|{R?5sx2el<^4Xjga;LW2HSg@qpg4(?Bpa5H` zk*ZlcSukD%(mBU;HzYvQY!g8@y%tp>=NKG5g&g#o0(L_hENb9xNViRkPQi!{r^Fz% zfJoP@t*xyE*F?Ft)rO!=UX~!j5X7uSPG>lSb9%uncFB6s(s7++Tm90aoEVL0b){G> zjp#Uar5MdvZA~yYMpHjM6SQkiFSQ~yStAK4(!e34X${&N59*v*Ljofe)J;o?HjK4S z1vfFl5sHXOjZ~dPO}KdmSPX>vE6)~u<hOHvZb4~DYD#cPWlm~M&E&)YQH|u%qN3Ei z60lG$tdK@ary$2ozp#v1!WfkEA+ZX{FOUKi)KWy#f^g*Y#71^eBTx|oDIGAiCu`QC z<X!No9k$a2_cMvGCu$_>B<rM1pD4g45eYsjDjj?*F<4ZyRuf!&Kr$gH^@0;hK~X+f zQEG~FeraBbtpTLi$w(}A%&T-N%Fj;C1MQYm1S<ynWBPgrMo~z*OwP|O0QG}3Ac+f< zMIbc^LN&Y;0M#kr?JUsl71*re=;T;yNZ&w13FZ_fa74k&QdIv!6)_f1->`~NtRBiO zhB{wc8;kS7jzRWNO^srrUM93chiCvb0gzn)(gW^LL!=SqKQw7U1?r1ZQ^4C-(<)IV z5aQs<2jnA=k)W~}CAc9aA|x!JnG$LcB5WZ}fRzC$sY#{jYHHbPYT0@@%K7OCS6eA4 zX(xjnjS^&&?|&7Y&byb9yB;|V?3L0IGjo)zlv48ZQkCGzA+s2i?m=-1I?@~LWN^?x zIxEmMJzx=d#R*abm4JpyQECb#OG45bsOJbuOyS_vWUo||3R)qgWTjM;TAZI#mZ}6v z<p|BuNwMHi1Jwc<pddr3xsXI4X=FO%UPkeHP;FHV%6zFXA85e)`ibE4q9DCC==r`H zp#A(Hr|V_rrt9S;mXsDH=7eXalw{~AA@h_pt-x*pIisQyY(BUK1+#RLA-80gWMtMC zBdO3)0<F4J0!JL^Y;jPF7~K>dCGc`QY>F~-({Y;smPFACYKm(>!mywyAL>ZG;-X|& z;z|c`Kno_2gAOUYCO`ZtJY83ZiN_HX7O;e;rUo)t0cSYX>L42j4c6(3I~he?p;-&w zq{+=JK_pX%kHKLB3VU$Z8QG+a#Jm(x7i+SiuV_7Fv00)XXjlpC#ptA1NCp8Vl0;2Z zN95;$!X42#fHqg4ZqraS0IeYbDN%wZSV(6D+`|Ch5`gTE{Jhkn`l9?I+{PJ#jDti4 z5#}M=g=}WB9z+H+f#l@ZC#FDx3zUj*DTBBG9H8jRz=;LyVcgQl+G}+(LCF}N-|EX1 zGLVHJ84lI;h{TP>HZ)0OyTC32r2tUsge29{q8xD3A`!w(PpvQU#K_a2i(|kU7Z$BJ zQz&{)hS&%RMp&GKrqdB#hDHTM(l)I$CNCLuRgng0<10iTB$lxF6hj)>uPEUPYO;gw z#Q^7(dZP0RwAl>KFX?)q`z*Y`y?}t6()7$cM4Tjn=4p~ZSAj!&380&6vTT!dvh>pO zQ2VlJrFqj+8`%YuKrN1Ru-Cx#2drt6tcNI+L4lN;S)8ho1y-jCYES53x<f-#Cmpdv zFb~!%RGfYxfKhU~qB@&3wDY2-rU-E#$W?_UnFVTUi5d_Q&055v5-H#*wfa<uL7?TL z;JD9Bu}y|VCv@}(QbFmJ<mcy<WER-EK_sDJRt!4S60~U7DiPXIjL%H54b}#2wuc#$ znVVWvY+Id~n{HKI3snWJb8VCAA;uMegSr^hQ3AUnIWajS)wUWuSYQR}gMvr0tWrRW zs56T}>yuNgTy+vlN{Xyfb@KB<Ada(g)d6kX25;uDQc{B2Rg{{Sk_zfzf=!0*6ibCR zmg-ZW#z8Vhd17WsW*+4763`_qDXDobrJ%v-@Wjj#h?0W*;!IG|g)4&&aDw=*h;BQm zGYva~G11o6)~%)nHd+H}T7%17jYQ3QgpPF3a08_Ouc(otms#vq3e6;mnl&|vp!q+L zhe7ENGRTiG(bm>B1!f}n981WFz96L~8L4@iNP`-nwllc3n52`eld4mn0ZWn~2iv<^ zX{2c+>VcMMrzDmng63=xJlkqeWnqO7sMXX_0xz`BD*+#c1D?tQcbrR7^GbBmG?Fwy zcZtFrlcblDpO<P6>gz#u*;a>u4>U-&P1i`$w0E^is<i^0GzSvYQA*58tN@t{%4VSJ z<Uo9#4BJ%55zfh}ing|{I?%ziBt5Wf68L%(&|ti9eVT1@O$}s-LK8InSEPa1F9@|C zEUZ~mqXZg)0-c1cr>6uSAqN?zkpjB{yt-B=RR?rg6UbdwNwu1qdZ1v{NYyJYO-@cN zF4l3=N!0@vOHi4#(!9y3*@E?IY8jxd=%AhXu#f_~5Zn?^tVJHp0*$FvgAY9{Dax-* zO{u9du!S7~T3QSWM=Yi!Yb${orzxO8Oi0pE$gocXt%?FGu7~*(<ZvaOG)<j!(7B~b zC7=^kVL=N@Y5_TknR$>=4vi!|urw&{lc1N@fL7jtv_QE!P$h6-knx&2=`gJ|HLeid z^<a~1T{Sf|b(CNk2V`%eni?pb!Gu7n6ZK#`+v?m(D+E_3u>^?+N^_u7rI1VkaUmvv zSfEo=GxE#zK&h_2sM5X~QjS?Af{z!jh0?aRwl4P7MX8A?l~yjbR?w0Lszy^s33R*- zk`*8>#0n70HW5@dq=KzLu>mBBWLQRhW=bm9!Jw`#l5yZ0iXi5JnYPv73u#h|L9PR- ztp!aYrzR$6XaphB2(-~voS2tcl34}oi^I4YiJ+)O9>2`gn9SHBTA!$sW}5__VJ*>6 z(o@p3PPI*qPK!>_){c#})=aU1jah&<#HPZU_R+~THHkWDdIg|G+OddIDhpI!Ksq7G zIw?A-;Mpwjss(WI3hp%*gNHxC6O1Jp^_j(x#to=Ts;Q9*ZsbE|Ej3bflrohxA>$B< znxFuI4vwa3>S!n>m1gFYWafc(3M4~MgoV}<pmh(B#wx<-=#*Hb`7AxS%KBJ{UY#W5 zVlW#~*eZm9+6~ExB^pXfntECJnRyzC_Mi$Z5p;!;73dx&g!gkG-iPM3Bs&B9;?$Cm z%-q!c(h?2u`TG@>8jvbeQzr>@46apXib5h}a2XUrNJVij$PFMdSmg@p&pCsS<VXY+ z`5My$`I*JpiopqYy5bvFk@^yFWeQGx(1tNo1f24rW7r@gF;Y!QetLRNs)maWsA&&U z0UMkIo359Vnv+<G96+F9r0UEx4aoQewDzw@aiN+TL=s-5LXt%i_;ACbRM7l8Y)cRL z{Lp03A;!fe8sVDJ2C?wtq#;#zv_UNB%1|T;XcGbAJV+jnW-|bf!()Vt3N#cz`418< zpu?%74Pw>QAR9kGX=wTfV`kA%=%kpM8Z1e{>;dV8on4|2UTvrW+E<p7npl=v1Da6P z)Yk*Azk&3bK#4WErY2QWv!tkUS~ZKv^qCIKGWF2uoHWg9$POQHNF%w<mWViV#f&4c z<G^vG12R#w7Lg+JL8%B55heMC;6@r+EP-^uV;gKzCiD&@(EL6qjnx<H!Gs{erw4U1 zOcbxPK}Lc~AF$J~TZEjl3P279y9w4ZQ>#}4^P#CM+8`FXtr$FPU<VsUE=q;f5Fp#& z^8kh5!MRk;YS5Jipi|N`L8&=4J+TDTw$(_66n*x|R>_det)!=<9Sq9anwr{RwoY0- ztfd7>!HKq&dWi*@(JA2e0k~DJ6RH_&ov5a!n5YM9F@l;Qi3J5Yp!}X#ln&n6R}5;r z!(CPcc3B$4&~%+loh+SfogAH9TewSg@@zpzGJwuuPqNRoO4P}>MKrJM5loFVM4QaY zO{V~K418{mDJWSZWWX&zHMM;E{AeV>yu{qpSSvT3Lfb?=P@4|PC_Ru|O^s4veMx3P zenCmG5@dq1&=#>I1JvZpPg5wgPthw#EGka*3ikKYDAcqngr@W&&Fb3BG>vRqcx%Z; zr@B_B612Q1u{5WoSSL*f*6@W-lNH)$fXr~y$<QdMsma%@2kjTjhBp9ovh~2-5T&I2 z{G8N8Pz?ZeMmDIZ1~o3httjw5Nzkkfs9mgqkOOfwbx`@XwzjS{HHulV=`vSqgnUVT zYDI}{7RVo&U<<$}jX_5ZYicx*1Z{IQbuyu42*^m#&NUb}4`e5(AchIp+PbQ#X=Ec8 zVYUcG#rZk;pk|1gnnpcT4Oj@tHpn@x#U-$Vr$82favQn@$YNj%U>OCxhqEBRs03;e zB8(9-nR?0fpc8yD^HPgIo&&WR!2w{4?2^<%4FiyDVhOkcchtz#ODxfG0SV<+!i91x zK_?o4lUcAPXmv}r9%#*Wc~NFbs%D}ds5h#i1g$TWbQBGs6QK2=6ogO-3RpxuLF-!Z z6n>FL2xvYrTd%mZ0DLo`nwmzAEmR8HtOd0rV29&7mXs7}z{DZBIXO`$2ihNiO6Vxn zD}h$Nfcom7A|qQTSw~SZ3*i%;bWq<Lo~=Q%R`9N!UUEiakz<L5fu>$berQ1fY_qR+ zB6R7FAySQB0%<*fhVxT&Qo-#qu=aW^`jg=Lb<%A$l0XHPc2Odv2ulO;G_}(-A!Qr* zu1K8>TLaK&b0KKWCM@(4!FwnnLg1E~b&73zbcVKeEO>paMk;8Yv$(h(bX6nhFanr9 zunyZ4om50UQwniAG&aB&I3%ZL=4gOR1-G31#1ajN_mIo_GKeN{=^md~Y^zj~SpXS# zgVhtZpy^mp8xgXT*)|DU^g}9>;>@a4+vp^{@=Vb9agts}YG!&yNi0MXw38WJID^xb zEppSh9LZj21rN3;vse%84Bg!Pl*AmUOEUB7GfQw7RDom=SZ8Lc8C)B>E>OHy>Qw1C z>Nx2*>$rdh`dvYDJZ_MUi0-yZ6-qiDwn~*sI-a&lU_UA8c-bmt)PudHq~i@aj!ehL zRta=Zfs&4|trG0)E<an?)xQ3=O3A69?e0oC0k%qMIhh5Sd1a|ZB}zJhwo2fQ)=D}- zprMptTP0AAQ_=~sRRZNn-HgOyh(IV*0L0VHOwm%(3A2q>D$Ud_&rC^AEm6_|v7yzm zQmjt6Eu^B1uvMBKC&Fk@4{jAHfLlormmnv^Nbmp<<RA~7C@=@MT~|j1%mr`7SJH_G zbHI0ND(NI9f_bpoRY@l)(N-xQx@jxLsj@Hxlys64ZI$wKG*iGGOC_C@MBD02q_gRu z6ULwuL~Tt#jn2t|_r<I=lJzn{w|{~*a@#7|DC+7)XQnBnmne9;Dky0uYAeOs*<{+; z=x5s5C`PB|rDUeX>gw7lX{xCuPj3`r63@+40ySB!6G1DZt)V#}(ayv^(aJB;uU11- zC(}RJ3MnIKC@E=c=sO35>S_50D`-R;=vv0dRvYS=)@s&hI0u9(<YZ>2YU*h@78K;9 zhNmWZXO`$``Q|5O=A`OpPX92KNitQlrY71zM@cDGGukj#6Mhl^(h2%HO2+X<N=Q=i zN;;ta9YQTgKuJ@xrpC3_y2>^cG|&hcfYzzfi!aYe%>yr@lS$D7v7w!(6ma9SN)OUD zvz@--1EWYigaaCr0Ow?A0iK!yD=t8y;PK@o9mw1WbeTLXlk22G#?HXQdOFbIHP{d$ zXh;WK>w->30F5N*WZI@81Tsr<>Qi;Hkc6Pe24sVL1Radi$*~3XZM8uT(TmSa0hNzB zkX7&{rA2uPNG&;N-3jV&C?ytUChDf77AF^FCZ(n%RYG%id}fL!xa(UC?v2?(=49g` zR~QB4Lqs(oB?hdf1rJ(e>*ZF0hAXo55=&||^+2^D*hSEsWSb7_>DhuhN#LWWz~?Y! zra)Hz#%HGJD1nCpl&qqIb)s}q!8h50*1v$dg{j3zu8M_J1)%P!4!9_>f+$Xf6qYqL zN=iDA;u0<a;eusKiV~BvGxO3xmpYXer-B-i+0c*y&3`7QWR(_|=z%l1PEmb+PO6ns zVh*^BfdpDkW?8C|l~O@|PG(6eXfF^bBoj;Wb2F2btXy><ijYGV?m=xO@L{g0d7x4T z903`bDJiLWN>(nlpgI)PO$7(LMk1sit(Q^{9ixR-+o90nKSdMLpbZA|VW+Hy<U?D6 z;5H0QR3jahqHI&Jo%sbCvIaGLz|KO74zO$M^FU2bbYHsEYC=0pu<T*0YY27<ydeu3 z6L!(bge`W0rl1heP#S0?8+nX3Q?sTf2eOa>oMhr58;!wg>oqcUz+-4x&_NHVK~AM5 zCHZ;iCS_nZ$vGeF3ylnrQ4nXs-R%P5#}}uTgo7&pu$l1jr+WA}G-Tx1S_z^Plxo0^ z1=Ylvi8<gwDGkWnv_>+h9R|8E8#1&H+TD=^8leJfh%e1cEH2JW&x1?|X+Q%q9;;wE zPey8<Mh<jnb$abHW^rhVqy(ClgXKU_V7uxhg9b-XhV5%=6jLEhaPV*+s1H|DldK0H z5J`iqmDF(s83sv<NMru4wVFDR-XPfFnJKZLqD-(D9AdRPRiGP{Km)du=NL=WgF7UU zzBr<cgsf46^KD(gC1s)xB%Gj`P6ssX4eGaOBqwTu=VPHIaB2!P&Y@+99{2zPLmdN6 zy|hfwHQ`#|DgZP<p^>Vo2RgYJR3(7<@Iged)1f0`h>@X0=zt>BX;6EhJPpv0GH4MR zXulF<f*&#_pa~v*F({5sj0K$s0$B_0l30?c5e%~!-0BWR;e|{u{L3mby+@dhClDNT zu&M#6C7%o$DhG!FtYMyvVn%WzESaFCp6MHBFpAW}>Jw1>6zhSj8VD2OZU`G12oMgq zc(Zkb%^{#hb8RiOq6Y^aG*nVkAe%fO<55-`pqU*PH8s$1aeXT2dM>bH#Eei)4J0){ z@=Ge{P;&69WRNo0`UhCV=I5nqC_y=pWC+^o3SM}i0cs>?7K4tJ0qN93SOAT*jLek! zR1H{p1aX~at&Wpz6?A~qwi-H`YE`WimzkoXgjh8VUPud?{{uB&(`=JLT}As!y}Z<l zlFSsVWSw+yyG%(t%{mP<<D#Yp8!!e9%qXU4C@Cvxr)%ofLnfu{A=M&i8ZaFa(J;Tm zN<pX>L8CmG&{;T8y$ALfEDm9XHJT!DX$&sLpfxpIeMx40Nlq%Ja!5N7wAeU0Db_Z% zR!1qWpePmMB=j)QtWJgvX+jjh^B#l?@fox`fmEVsf=o^3gOsn}fe95QtLYn8F^Vcf zOL17)3tD5Q1UZ{3uLRs3RZ*J$@glQu4%qiFqoEZM*eLioDR>4HtVaX1MF*?_&3LdF zB=R8&lR;}!5Eg<1Lq%!w!8sE3$@Us>-y(%#Ne*mY0b0j^D<BO`9q^JBumw;{Ari@& zn$VgZQV>8yAt3?{5J+<kEyYdWyNZ$12x=6x9zzWsuw(T!Kn=ngh!L8wV66vFZoxuH zNjnL=#$PE8RukxH<W|-smVng5I_;otoKCW4HO9bJGAvobG=tI!s0$4p(@54)N-P0Y zbfD=2Q0mDq&J+aA|ALb!xQzjK79^R#Qw=nsgBsSUc`4wdx<M%gJVFGniqOIY<UWvd zP>T#`4u_bn;i3td&45>5kQfHfB5~<~n~tf)&_opgjxLBs3`aqt3)0X^(FCn2g|H!! z05(rg1Kh5xfixR6p=lag^<o$ZI$sAC5fJT=zGMw7p1=``l;@ze51RXs+aTc30!@d3 z1`}aAr*B`y$RCNO3l`LnN*&^pC>=#bh;P8l2#WPIAew4G5da?1uK|sl)qp#r;B(<X z2?m^RariMBby_}I(_Tr*N~ttYNmE-1v>rz(7G8iO5~T*%I<QT!B&MmS0d`UiB(K(h zyUI1NvG$srR434!LrNxOn{W;295&DxUJayGt_ceXP}2`IMS~K}kiq6eTkvd0J)|W8 z3ms_P3T^r;K@YG3CGJFMGX%WI0IBVdqr!y=qc+z-3z&7PKwETSYi6cz|G>yw53f5h zyNkA&D21v{BI=2GnxJM;v_WiiQnX=gEUf39tXEK!nw**f+Cy!htOwaWsG(_<3|T&% znrN#JFA8GxH0r^H0W|PnK@Lik;LHmTUCkPBs)Z$2a4Lz>1LsryOr12ap|F|*Rnoc& zv_B2zXYk4#a6=FrFDa>>#h~_KDrRRn8P-dNq|4M4oitllSnn8G7eFEqGOKDmJ>VXz zL_O#t&qSR>&;So;4~cD(rd1+h^u4+kv?Mk~58QZ9L^Sq5Sre34Qq|Pb5+M^=N$|ZR z;KCick^)rrfm^5<I$5@v8tI_Pe&kaO>ou)2Y_mX-k_Czs9R$-Bd=wjKs{m*jzkP~E zvZhrsXs0~fzM7ge&`zjW+h~w39gqP!$vPRawVFB^8tKqf1<NI%_PmP@+$XTf)%q-O zvjW!EL00Xm!vzj=Sa?E<PH6H6H4Y$yjPPltG^h%snI*)0VLH4U2hAMzZlJ184%)Va z^co;;2K57=b=l;`FQWDELju6g0XIcqi5Dz_aA2Z6YMBCAaswKb1szBSR*a~f!A$@i zSbqg130k`X+5myvlT6f;1g%cdwAV<}D~GOUaslP6jMTizj{YLD2w_*9R6VG>K^3HC zt&ZE|i^(GOXriFz6KG5xw7gqQO$pS_O$03!N`$U}0F@e$)}Nh$eUe^kZb3;U=wvtO zMJnJi=xWf}JvoV$R!Wf50(HRm3T5VGmQ-3Pf!R5!O10oqgfi+&azXo(!11gX5AuUs zei5t<l?3evB5HQc>Qto8QYvhW1xtK`)WH&r1}q#E;hVN<H8nM@Tx)gsK*M8+nI%wL zLF;9wH#oAe)uY5@5>n`bZp=kp0%)IzvLaAJ(<%kNw@Cxkttker(AJ2K)zkzpi$W~S z)2v3A>{_b{8npv257ev`1dZE4#s#3E0b1!O0&7M=*B!t%Iu(OkD4>N{pq&v_u!sh? z(7^g!5m66HO9*}7np!7G6BOsr91;&{FMu^`xN3qEJY+m<dfi$^8F=Rl)~f}N!Rdkx zQnF5jtSCxKEW&0QXr2YEFe$MJ_uvdng@TecN|gZ~AWN+W4SJ=gme^-&C_(Sz(X>)h z0^K<UyUqvV22=|&Q>>EU18$%pAh0di272@|^NLf8N}Rwq5Np8KxWT5HJxfwGl)%#v zy5Lm~u(}m=BA!BaY9*KkcQ;E5K>X4I$ly8Xpg}|#4LTEWdLR#@@brBTn7F1N5MpMV z9&ne5D-PU5QPNQY83V1ZD+@rY&ytEuiZpahKx;-3lit`I0-A**!pisEOl*<Rb^%BW z!ZP^K4YXo{B`)ZaFj&Mw(gd_Y4@oA7lmptmBQkwM93x9TJh53r*OGzO4nm?RDX|E8 z8;l0%Bv5dafRYAOp)Gt-nww4{q(cf$y+~y^s7+j@2kpSX#%q!4XU*#AdVx&re4rRF z$S>Aa($+|<se!bZK!dh=iAhOCsb!!;6+r{xuo44dLNchk3||}rE6t%TbC~kXymY7t z_688x)kuoL149}`3TdDd1VD=gAcGX(GDjyH!hu$0IyunxoldT84zzaC$+OJ?4L|4G z=745q3v6@XQ@lEbp!FNDIbNM2kP2`kPp8<n2(+*uBR>Us0;j|_TQ9$~B((@!QEIqq z>XgDnJis$mAfYl_1D*PETLYa6+iY+Nk67TRsZ(hSxoF!!2Xq6GL9I@eZ8k=Etm6o3 zF(^TfRtBZCWbg_G9VgHNB267<+d{CG^1Rd{7wE~!I&P3~0B0rZ%=$EN?Fl|dMk7~K zP0h&G);1S9aj%(gTU}x0qf=?+T?=<mE@<2z<fhzc!`NEHMqaRiAUEWqXwy(Ef((K~ zV-lA5LCtx+l+1ca3tdx9Eem?2EP|z1keHqtVV`UZld@7wuBid_??BsgGONI2?hqf> z)L;aHCRii5mtf_lrsf7Q4ZK9pO;bk+bWaaxq+QY0wn9x!qtdnzI&BIX19H{_t%89H zfTK{+)>b1CG6x3c*VH&qH%MldsRylMN=Gb5f$9Mn0*k?9h|Ri{dY~CeZH;s_wRAAE zrp7=M9J>$|k-C+7CHVzV1ts|fAo*GyXz;12IjX6-fm{mKt81&_20Bi<K0hZX0;Eva z3B=9M$?-`|E71UrxR&G>z*Obu<V2z<3IVN2ge)BZHEAI`*TIoz4{m}&x>agwuuuif zY=e^)_=50aP}oC+R4WTo?X#d6$Tmd-c2a_-6^vC=qmeaz!bT>M`eLXuO)IE<ing}7 zYHAut+H;}pA^TiVL$MfM#=&%I>g3wOl!I3R<!b6d)>VL(`ohyK(zv5FD7}IXuBxf8 zfie^AHOg#L67@3ugF$T!(7Yx%POWl5bzn(`hNezAnmi=aTIE8g&owl4U}k}0#1?!# z9%vy>t|l}VzyYiSif}8Kcs=+4bV&4onrT6h=1p#5ftniRrpUyi)I=ps`!rjG6u73= z$<@i%34#|!_Qh7NnpQ!2#bxPgYPq0&zM$n^piCYd<__H^3^t^=47zawtiK-30F5%+ zT(m-}93}$sFQ|~J1PMWJM$^<uQ&ZC@vrU79lTNv98Z<z3(%~1V=~UW+*1STN_=CzZ za4B7sT2K$2X@q5wT%AgtLQNeFNKDun>lv!4LD)7XdWJPM5VoDIiJmc%gt2i=jUq%! zO-%{h?+2yZ3Q#_T<S<=Z>{+26CJc@nO&txzw3?bU&|oZNQ~<Om0#q9!OwzW^*Q)^C z7jIu?1!4Kym+2c>8R$TAs%^errLC>4uYI`{gynBv4wBY{4SYi!q-|TISD~#@p9eKe zx5Ns<^tab70jr0ZSEN^|t&s;cRJYU$!t}S-ErlpUN&^}hpe1(TIw&>879jyiFqJwv zI%PWLIwd-#nmXxfY8iStsr6|kpu`F;KD2EiMG#c7B)<SG1uA~PQ>+D`Q?+v|(MR_5 zaw}~!K=r$(Riz#z)KXK>E2=C|uMa$c1S&K$A=OQMa#4M1Vo55jEdh2WNFjJ92-rx_ ztSO|W1J<m8Fb8RH4IyZosR`}gK*#bmlt5E9N;=V%ItAc@qo$?+bWWDN2BcqJuYho~ zPAaHnUQ?r3Ra28$?3d`L0f{P21h*u=0Ms``RBNDghulld(MwHBOHD4(w1?E*m7op^ z(w-BzJZOcLUTRuBNHJs?b2ixJpq_a}3245lx>l!B6SOo9e2*rgBLiyAf<sCZ+&-v= z9*hmXZ4KOv0PWGy)B$A&*q}3b2nO2v1I;33CY6F()@hkJ^^kK!5<&A)(4a$ZJGp}0 z1R0A4bxshiL1>0WG~Pg)wo^5$Vf{yiG!4)xL)D<;1JX*gZIiSTp`{?Cu+sre6&7gM zBT0a>AZWFqB51||Hma2j9yLkV$pE$8bh1H>7>xFdrcREnBDerZRZ~-P4h}X1?Ws*H z0d=X9^gtU#6H9#aQ&M$uZ9zs`r{u$`dR<U*%&<)X2W2kOZVK=;E21dLu-C}6&7FQ= z0;5E|PMSuxj;^7mrj<sfZHh*&COpZ4maIUt64J62xZz3pMJcI8Ape7_7VsJp1JJt1 z`~q!T+!{ji3y{=ng3c@k)gijJnGm~>*NVaI%1tav&&&ha1+fM+3k$CNGa>B>Y}P^a zgye%x2nV$cbkb{TKyz@QWdydiwi;RBaH=oX$kkB-bz{<U^2@=d!$%ryZEdq^YBWG? zpIl8%O>4+Czq#=0A|MfT9sz7KghINSnnrrGL9C)JxE)(llcNdR!IG|HsHp=Tc1%yS z)o`>$?l08qIp-IF4xWT1HAq5Bv;{2>N(7AoKyLTY*NAr1jf&OO*HKbXF$7QNLM3uD zQ&MtLLB}=tgO)}h-z5UBmnuNbI>;3g`k;`mDFQ8z(+903NYu-%2cImY4_Paw4_Z*9 zl$n>2T9jD=T2*8ai#pZ{&OmyVNG5_Bagfz#HBd7^21gS%BrU%vIW^KYKv6LXoF_nM zcYxP9f|fZ#Ml=y4xVB2*>6PS~8l@yqU6^d|VdV}P_JAx_vQ7szT|o=nK%*AIrl6Gs zAm4*%TU#G{KX79U!t=BDu}Xrp)uR(*Yjx5Sp~J(FgT^3T&kE=wCA~_W6x$?FOVA#+ zpbp&Bs)6x9Qt(OyKICj`YwH2ALJ#6mP5bC%oupW+=p>zF5D6cs26ayr4ee79D|M_= zYPmp;f^;y!`|Dky<JXFY@YDuc5{_6`s;!Y2Z5XSj1|kunpjAAe6DtxyYlQPsr$4l0 z6xIZ-V08o+xlnJz7FIwV3Mv^(^3&6ECMy(+Ku0MdGv%-qTF?#-Y!n*W-vq5Ig`7a7 z56VuE%XXmKAs}5CP0(t1aCb#bO&`8*0;(hxGFA$1f`jr6WbU*c(o6?UJs}$2(7v0k zt!)}a6;u&qcoEe1$Ve>KK)*2tstZ;UgHnez)KbvMIOq&1(AEx(WKB@14U*O?Ppk)T z^#m;kfyFUo)*Wf_hl{2T>SP?u2KZTzpsl4EhLCy(6iQ&T;r)GRGJ&mWgy{w;vM%#Y zECTHT2W<+lO|(}6O%o|ufl9GdC7m2dy8{{<(b=&&xwepag$X6vLzG%UG{#PUZ_F&t zq?0#YPnu1vJ|ChV8hzk81G?T+Q>Oq`E)(UFchEM0ni|jr>acMIXxQo$*@F77XreYo zH8rWw?hRz`4!Gk4Ix_+~;H?2&xu2-1SDczyl$-%t%MM=EUjscn3)Eswv{eK(+H4im zA(zfW?%haD0j<F-u(h>KR8uR`$+XR|ce7H2#7I1>-IT2pZD|k-Z4y93z8<<x!%8C) z)FxI_ON5S3fd|q+SLi5a*3@Kx*K$~CKo<vs%6I6(HAq5G(osy*)JcS{XaF~*)YLRm zp*?++gawLG$UuQ6XwgkQQbQ^aJdF=KIuSbL3LU=HfJlOt9)WgY!Z-ZpK}N#RG(iSm zp>iNSiq6RUn{uJ?pr)2v4{hE;oCG>~Pa{baa-s%gego9j1Z{(X6#DVSCHY0E;7g%E z!!9nGI{7s<(Cd4^Q@~0(>8O1zXmBH1SsKYY@I5fmM)k2+i~wC>m7@pR;-IFcfiVvc zk+DzFfG{+zQZ&MKplnUhNiZ7e5DJz8HNnHJ8jxI|lL9$74m$tJlUV?=M+r2Z57|Xm z57|Yh30vy}i$xu0H8sT)jc{%CXxNfSTcwhs(p05bE9k6*I?Nd`SHQ|5jTBI*LXRgv z4OdVwx<Ug9bmN$YTe7C64yaiIS<eG+5olI}W`Gj)GE>#mKnV~soQ<^w3~B&RSNz5z z!l*Po@dTrAeU2XJMkR2PR#Ss)bVjVI0&RhXOY5X->Veh4>H}ygf>Ol7G8A~txUP~m zI8B3=((1xyra_1HL6QY%HmAM-Je{M2GLxgEgVf3gHAz6Neb9KD66gj!u#xbbn`jSj zj)BWPQ0q+-vT0va2iE_9^mGbAl)XlJbapK0^f(PoO{<i8?A;lSbl4I(Lxd@ijtgW# zlBQ0&9;BzDlvbgHGWwpSp{WDuVOXW>r6s1MhU9Bl8t5e28(JCYfHs7vslk$;UWrjr zW_o&Rkp{l-0_QKta5SiV2d}pV9a<_3u7zRSF{?mp7E|Gp^-xL3KENtS%pvt(z>~|6 zQV?zE8Cv{dnQI2EHx36)r-P#aS}*9NLK^d)c_kXjpuP&E`(;|?nU|7Up<`$OI#;_= zuPPJ7)lP!e1ki$AAsMmFP(`z*X8L;`W-+1Yv{)VR942UYK4`opY5Ku*X0dvR$q<9> zK=*xt-GM9$sg;mLbPYk14xkI=b4ozrtf!={0?YNFOa<CR59%!>rldgn+$x||`p_H% zvC1|Lk_kCLEgz5`P#_D};}1M&wE%V@G^C&z5@roJTJ_)wSqWsal1?;=4$yiSC5S7O zG(mv^)&!msVTU#dK#l>QVT)KI0kvBRk_15Q;Y9mHTgbVO@JUXvBG@!1A{G)8A?*<O z4n<8X_zpVw`O%<5UJ`9xAi)ANQ2~9CDa3k+cM}tJ5~u5PGK<T?)?Y%MpJJ=12w9>H z^3`<4t&EVvj-;XTsPlx7IU!J!SIh=BOPC5doUm92wE7hq)UZVnup$byQUkOz0I~*5 zCvE!2CKlm((2$*ds+E#6Xiu>MRI8FTY;Fj&k`$r=8gm+&I`IAaFh#bhR&XY0QFx*P zcriX~0X`&OgQxQ_CLN*a8M49&v<e6`l?1x1UP)62JYi*(4sA;0BqpWiC|RY0do-y9 zpz#urUBv~7d1%&^X6k}WP=L~~iNuVO+#D+<HP9l~Vr$S0xlWQ^k_>p|H)3TObZ#su zv8bjdd3vEevjiLX#w(5Ki7|}A^+;J2yt5o~et|}krj9G<d}8?AFeHxf7d5a(tSh){ z2VKMri%95fpf$9844r~gfS9WRy4VpiMy3HuF?#T|Ueoq6N=%oxW90~h<bO!G;!P!> zv(7UTp<6K$6E&?teF9Lk29{_wK|6{P?WZd~WD>5of<z`XVWud72X)fZbD$UhCMN2n zfJzeNWDnW_m64iLkXob*z93XVNjn=<J%Bpm2%S;jT#cx9VXM_Z-3rj`B_#FMmw*x^ zgk1t%x(9J*wg&865G75}!W~3Jf^>kB5@<dY*<nai+z=g*gbq><VWC(6PMG4!`FTp9 z)-0$PL~8AU3LxQnNXG))zO_w(cGc1{D?lg2g1c<Ch_(%6*)7-<(1JIllma>p8nmSm zTsbAGseu=BLt09ZC28s4J!Ie_60|r#BNcqcLaLQgh!VWxo1&2jZKi5KPpq&{vPyz< zpVL8mdNeh)({*4gfs%F7ARR2|TA*66yCCf`@NEDViJ*2-q9*k4DbyW88cARWB!QL* zKuSZfc5o|bvS5vPeX1>LqcXEVNgHvI1*`!Hy+aZ-lL_AeU0th_3|prOp1y?yYE6wB zB(;F;NCh1$1UtwLT7bb8c59^SL~DYADi$=&4mz45sip?BR0Ko6tBzvo<c$Y~>!CRc z6f2ND6<Fd%Cmj+M8MeuKX_??kH5EKMt&s}jgPN(Cpz~)zWA1tBB^jX317tB-5~8V; z1X`*JS}qO>qs%<Vq9W(SN{wWlL`~~dJ6%IHwM@uPmPGKZa&oFhs*WM3ZU)uops_%x z!5|;%#e<xz0U9)&?sx{ivjf_JgH>{%#tF*WEh|MsYmFrPbgMK?NZSr%7HI1lsEv~h zZmDO0&dg7RGNDNXY8&V<M`+6cDw3*`1Uef>r%F^0x(US-bjk`ec8e#^F_xTe*Tlk+ z0@(@yD@Y*e54Hy+H3hUP3gi;Vpb8|~L7i9BYz2u$NXmeWZ-CWkz*b?Rob>@}H$s+Q zL-Hx8A}E6NW<az0uw`P1$U#|GtAVliJ`uF}1!O2>ZKGzb4tPB!q$O!@V3iE%6r|Kc zP6UCRZ3@}d2P@`uKz9*<jexjbC(Sk)+=PYpKy}h>p{9UGgzQs5={grQ>WM6jym{Fw zI#vgiD#7#W5KZ;Sx)9=Mx*(&8kTe7icz8_&by~C%q{dOwfigf_UXjl>N81IXp=bbF zy`GX<4_>yZq^Sct45Tcz2r}@csh<g1K#AfTH8n+;%F+_(Mbrp|NFD&qXBB{s`-T*& z;H|WvW<v&Ob22zHq=Hu9Oh2N^EaVAu9a5nUKXe(Afb#Po*CyM#)Iy3eNQ#CO0ve#{ zh*X_4outVZUkHP5D&T=6AjrX;;JrMszOfZ(uM_CJ3{c+@yzmv2RN&hsG(j~CeD?|{ zuYs1MAuj<&6giM`29j#f8g!rqq40SK@HiuA_cycv1n&h!PFbL>py05BMrW378mLGt z0k7TF$+k^{PYdhhfYvc+>J-|7`sLsy5Slum3Pn?=$QHT*43e@C2@4`z56P!!DNCo= zHWiYnF?E4m1QtfqWDQ-e3LShbM&wH991|p^rt2U#@ayfPVf%hSURMH1g3oaQS)&wd z1(#LQPK?z_(g7XM3@WS;NfRT%A-h~tO-%`Mcs{5*0hIx#I_RKSJ;YHtI?<3630{;2 z>C+(H0g$L!tq;979nv(14(`GVE%5o>pfkcjht=s7As_z(EhRzT0iE0eYKnu{pds1R z6#L9b+f48va5{*DG>alNHLYN|2{Ye8q752rP)|VokO|5;r66Y}mZd7`OfL8*F+Gl- znG2T0YeDBqDQQCk0UCqg?yY~ChEi!Bc#uR%6I_RZixY^kS)f7oV$kJVN}%Srk|r#u zzzgy~@l~3fQCyN(RDxErfa*w4*Sj7TN}%cqY%rv}1?{4MbVi{W0Hrqv^%_(PqYeZe zm;^eM1$217MmT6cAh=2g8;{VV3F@|Iq?csa8CWMl#%Libz^jR)4Pt9*P=w*<G1b(h zLL&~6_drh504W8Vm|l`mQv(_i1{(&7PH@yt7u?JwTo1`Nuwf(E@H!+cGjt$rajXMO zI{7+EFm0%1A~cDBmIlETK#Dk>e3ZH!B&bqStWl&>44#S2)yYFH7Bw<Ji43&XeELCE zX3_dYaC;Tw9tUUwfo;Kn6lc)B4z$<>-ymL718VC*hAtqvq8Q?Lm`<G(TkugCiAlxQ z8Yvoy(A88)5L&a|4su8#L_AU#A|9z}XA8QI3?*p69Moz6bhI3}*$&Fspv%-jCvhT{ zguq9Cp}qkpcW9b|#)S+lAwy1aK*>F^przoT!76vKkHHlNqzMA%>%l7?NT~ra0W?+* z?lgcFQlkWXjt)G;!CpaR05BKTOxQj=Xfg&RJxIZj2pU`hYk*2&<O-+<i%<@W($v(^ zNCOXw*B6)Q6{UjKfYsDwgR(|?Nd|nJ9bEgu+G@oGsmYm%IZ)O1*;a+1CIm>Ql1>5W zd;rK266j(9sI`!AEd(brq?!t}WDmT6N=ZSd0MhqG-NTBgI;US;!3x?z0Bu}A@*b8J zR*GJFQEGt(WY7t%)dODS2x?ED1u`PcK#e}wiY8FM6kMNzv?YV<W?S$MH`vA_gg96j zt{%Nq1gT5ZNdhGt;d;!5XRRja0s+waeDH!z(3H9@cw0WGg98`V(9{I4)JoGU$;YA& zE(}%&P6_dlE+1%u0M68@haWSfsfQ3nDqL!HQV>g3G^-0W!tvz=q>3C?7+_8II?14Q zA9~59IYpoa1dyf~s3QW(`)HLSqE3Jwj{z+~tdpQqPT<-I)Z9ZFzlqdTQ&U9ZgEIuI z83!tcH8qjWbU>_SgEq}Ur2}l;3^+f)PI&-HfV4wuRS*x<7J=(hOoc}_%EWB6K`g8~ zsE1|&kSP#HBad3dgN|3$)G5?ZidNDN)mDmC(uvT?2XzQ5ZBt+;6(e#1Xj5`3B&5?| z>m^E%w;}1I+q&sw+NOZdYX+y2Yz_DflqTZrq%7OaXjqq1*Dw~kkUH8R);>iKbS4hC zL<1$<U`;DG=+L$z+#qNHp{AByQ=^nvkO?km?X#^W8+HjZYD_;kl~J-DwD}5dl1{KD zXc|~C5jITb0^(+YmIZ^_-N7Y^xuC^rpaUV3GoY<R+bm5T#U#*az6GHC1zHP~rlzI@ zO$}hKW@2<2cnLrn?2yYuolM9I*m}?sSkQtn&~{$XEF#KTuJA2h>5$7ez+-;aiJ%Q@ z8c8~-nxKp7(-m!P-R#rB%P0_cN+FLJqlX8$E>JMA(#W>W5Ja4l3qJWRQFF4xNzut% zNnG{N;8aMq1-T0xNgAM|-9T&3GC?=|S%G*u$>5n~(7tn5P=^CDXk=qpQv=zMpBxL{ zjjpY2m8_FwTciP*?b6gq*2&h?Ndiv}xmany)Y~S37N;fFqaUBDggB=H6p`S<10e)S zzMv~|Al+?+B&<UL8d;#-7Mh@I;6PnT+f>N$5TNaN(8hl?XrHB3TItj-MlQ&a5MY}i z{(_`wNY4nA>{3BzVwL2iD(R%zLQ`Ziq=lpePD!8>20(lEKnWrVe7ytw6g}|jPiQKE zAEN+EchD%Ct|!XKS#M)x51r&r)=5s(w9-J)3M$V*BkUk&+uDN8S5AYDUw}lwML}u_ ze4G+Iovj4A><R2EkP?k#Q11r5ZWNTAqm@7sO4><@v3iNqo#!%%u_Wi@=S>g1#VRZT z>Y;%y8-yqXiKl{9PA_C(64Ql`1}1_IJ%)}`fl7^J&`C{7&_iILM?`?SwYgBgf!qV~ zUM*;86=*0Jw1N<Ho`z0REy_{LN#I5wD9eFekO*=mEZiWcbAVE8T3$3*23$OWu2h03 zp8mj+QDnNJ4Wl?SXsjJ{O)&Vhl+sM_?Ym0Jpc4y0=V5@o1X_p&6VOSSUO0<MWco>7 zMxHbs(0wi%puPcU6Q?Gu5VZ!~=8~DFkp$Vm9|AsJv^ohifC8Fq^Z;MsP^5u8mZ1qf zi7{2Px;7;m)&A)YbD1RSL5=3J)S}|d{5)GFBRwNMLnR&90S~sI<-n*dYTF1M*rcDW zp=qiy(qWFa)$ri}D_5ON&>`%g1wrMY^Zl$`bYQ3QS-I#y6O~nUNosvXiIofFuy$yy zLFY(Zbsz)Qpgni6O34az__I<;et|+xYFddB=rkqh5oikF#cfJDkQR}ZE7%HfyT!^? z2i8;poeB?LR%}&W0b1#7WuTK=pI=&>3UVE|1!m=<18M(Rx#;AkmSp6oSRtLErhs&u zTCEObi7eVt8K8qkK}k(h54uW4BT1(^rL-s!RCrq%85rn*XO}^vDYdma#Toha<yNpm zs9klyjc{lU4QVpNY;ggtO-QV?vNX^EEncv4)d7#efP7S1k`HbRfC36sz2Yzr+^JVW zH_xD62fWZ66k*VFUqJ`urzV!ATEPYebYT4zkPYBD7%TXZ)JjUA^QF>LORQW$jFJp1 zSJ=T)pySumtXyg#zACn=hO{@W+;l+M&&mzt`*N##HyyB}-E<%g0xLHi=+X)+uuMv7 zo|T&p#Di`+pt)2lH|Uj78HqZXiMC3R^`1&PS&5+Y@IY%*m2|QbZIzPqbMlLnbaFt# z@SDYSp`y8opp_hndBybw;KiIuI(dn<N(zdZxuDJTiJ<eR@)K<p6_fNJo7SLv4>XjL z6Z6Uvi<LA%JK4btbt+193KDJgi_()4?PD|ybQC~HLr1|t(>_MCrlcq_uNY!Qjk2MU zv5Bdfex^<#c!PFPqHVO&<cE(XKqp-0Cu)Mm1Bw$tC$XlMWhSQvWLBi+1c4GxO^u;W zNg|^C1F0qwZHaN5hLTYVVh$w{e4kflUV1QSQ4h?9`pkULZ2;w|N!ghtplh+v6+q;3 z^Q-Vk7UP!7$0cP5Iv%eyQP{RPQNILwb0R1d$`Wm-Co(gN)hpS6s?jpgB&T+wwz@(^ zZVu?6$kL)btK#I0)ZD~k-Q3LNqWt3gv=Yz?X{)l_93=(tNf(gg4Ryf+>e?EhCX|w< zwz>j10oy7irDi0SW#$)IDU=rFXedL^AXE<X_0hCeP}kM~Ejd+E*3?#4QqZ?kuLX_W zK^C-^f%e=&7N6==XXa&2b}SIi&`Gw2)Y{<H`Kfs&wuvxSu^#AV4A8W0N@f}AtS)H! ztt7KR2{HW}k`Ef^hm5jl>f|TdgDU|g8%U~C(4XGL%_>z7>ei;GmOzsqB!+d8^l~!u zQoZss^K6xJGePTtbdvPI44=&0%o1C}R8yTKz2d|&&{05E8cDWgi5g198Hoj{N;>Mv z`T0dD`QT9tTO|V>10{9DB66$5q~iRX(vnnb=%9-u%xij}@h*)d?Ih4HT}bCPMMFso zbgLt{kDCk{3Ik6yBX4<Ciq)Ae`Grxw9<rJTbmpce!T``A58&}l(7+j(0V*vZQ;VR( z3!(i|9Z(?)(h6ok#}Xh}6*SouUtFG8;F6h}ng^=aiV=l0bp8X>Q3nMh+TctoXoWP` zL_Ls-XhZOMUd6Df4anZ0TAg_CoG$_6L8ED4N5UFm;Kg!ChAW_(4mnDtRwur+I2E*< z58NJt>@5f70$8Yn5>!b}YEohmtO*Ue10xZ<wZ<Eik3k!E{2>iim>zJy9aIHrfM%!* zAj`L)Ueq^&aAEF*Or_Z*K^FCaw@V3^Xt;nDD#e4>+d~$vPcCd0hHlpdyAGxuR#)rg zR>Ir|YNoo@)IgfziMFm*AORQqMCd6xN$~Z^ple?tE1qj=G+@%8WtNc9V9?5x#9AGQ zE5MrxKoL9LBZi%KvchZD>E}IJ*y_QKfem@+q}paBYJ;w})K&s(P=dNiBiX)G1GH1u zs#GHdJZS*h3lBP2vlQIv(}P6<=vr4bwG_yjOYjm3bmb|qc}Sg9P0bqq8UvUMgA!9R zOQ(P2Wrb~PMs->;#A%6om73bc8i{%pn%YWWEyXZLDu8#t*jU;dSYdS)Vm$z;F$`@~ z>40XJOF_47K#CDCALJ(9%)GM1oXiyG{G9yKqREUi#T-FLNfd)Z2O27hDd0`0Dd2%R z&>AI>Sq0D&I#NJ)u%y5|2QdYo@4$&48WE61#>vISA*mIhqaBq%qaNUxNsLZJI<X}d z6cpKsprvJC?WnPU-M^3%L+kb8QT(Tq0h*|W?v~5|WyW-kWStz))d}euX)s0-JnEq` zN$|)73nYUbo|CAllL0CWKt`nMWWx-BGm{{vWP_6sOd4SlR2f_VY-TEG{t2b51Pd#{ z!zd?FTgggEJ2z1~FHu{`T1h(#Bw(Nf<!b6=)at}1C*~xVg6>iXX3DGrl^5dmI-p~l zk#<nn+Ipa^--i@q;MuiIMA-%@eRMKxm6AdI-$eL6cb!aIja2(It8`5*jSPD|Q!7Kz zVpZ_KbwPf)PBvr=yC}ajF9mcRE?A<tu&6{MOCwXqNK-pYBVETx6STb*G8_rnKct_j zl>;dZq5O2M9QfXd+-Rd%h_O(EKwDCEj5Kv2w_xc(v_MRaHbzleuL0V;ja_Y$ZH_j` zXzko+<5+Et40{7Bkinp7mn8ihofO;XY>i~CG))~4m9819lWL!0m7-Ua3hE!Fg6kD{ zfQMujfC`^vaG?qskV@99PPR?1sjo5ANwS4*GXd8k;H6M0wxG!oEzqexpyP_PKu6zz zLkfIMc8b0c=!|iMKq^Qe!?rr9$ST@E$3O>kAb5(7L99+v4om<foEocB0#=c#lLAo{ zTdz|BRbrq65(Ozq2I&D!^nwkF)ky*ifH(#^X*#K~Iz@1SbR7ebKu)q%G}J^L1D*8P zT4({GkfE1TVw<6tRHT!kR|IC|=w#^SB-v)@m4L<S!OR?;jA%p(imla&Pbo?)cLudG zkSb%)z(94PUQ%j$W?n!dcz1H59;mtx$p_CR>41U?)HDFKY`|hhu{uf7#<3`3CLl3W zuvl_VK38!n#Hd=G=@(>}#ioDw$;Md^-f5+gp9tA{n+hM(N2<>t#XhVSO9pSwf{ivn z<WloM`)EN68^L80M2VW3QZi^14oL`}b3mIHz~Y+Vk{>dQ0nr93d2>LAIzpQ+kb_$^ zG^Ym&u!{Pj*auYs(O0VjQHe-<;N>>(<0hbPgbi4LY`2~+xRXt+9>fH%iifocigofJ z%^zqPt&?w?r<a_OnUhkK3OY9yx)lT(B07Z-#h^xmPLXYaUT$V?X0lE(B%6YBzjabg z4fKFlh(*XAu7^$+Lc9T*cDJ>4wJ)+wveGDmwgZYZb&8Pc0^1}cjt+cdnXN5o&#`@x zUWILvUWFB^c%^-jUZri4UZoXC9;6bq(YGi%Nv|GJB*xk%MI)OX3z}1~MYdW8S=!dt z)*Z5_7OhpO0bNmx-W&uiCxrwSxU&gi)<aq?kZKcD<?5tH8-lhB<|f)}KzH;&iZzIO zh;ne7MI%WE-N8Bq&@xa>&Co7KO-&J2NrMapB|FdtQClzvTFBOecWv6{*ur!wf-bp& zajbHnet|k6$JPKk7!EGNpiY7pe!-blsi48)JaC;=4Q|<5fzI%N_5HJ>4P$jcxfa}f zEV0Utt~ZR;Rw}3fE%eVqiCNH&Is52h4M>Ff*yli_&d(lXpf2c`58WIq4LC;=R5XH= zgPOVC_8^;d3!@EVtqe3{t&q%tYp^oV)G5}e2PF(!TW_%WAg#U#tq}7KW5MQt%#Q_k zz0z&-vG%mmL9>3K{xj&-MQD#oCtVLTwpSFCnp~m*Dw@qwjdjdYjWu;LAc0qpsH;OV z3p9#!3Ux{oK{uO#^Ch|@SP-1mK#KAq<9(hwAU|o9CPGI!y>vjH2k~|C!4Uyb0NGFt zk%X2V@hL_1u;N!ET_+Q?%ONc@CkK3`HaMB+q=Odu<$!$z9<u;7Dl|X`v1yeig3n?D z+XHqNQdtgKLWFLZK`h)bO)Cwk_v7o~i3jX`P`D`NDrtjSX4*<RAO<LbDCB@xMzK&K z<5<wTPVJ0n6PSo8NTecFNhb@`M95K7(~r|As!4*cx<cwp*js>ZJ_PNau{W|ZthX|N zhEg@SvkMAbaFW%|0o$Pg3QO%AO`XKN63}VYiN#i+bNY+meG@&{N)Uh03J^`m0T`eF z(git1%da#yDYZx=4OCh{jy?e$V26;ahe~>ALdVHKajBhyoME(cYBeFNDd9VS5+Or9 zppjru&}&*l3WEFsd(gez1xi+sk@Q#%0-h>JtS`y1%FqEtI=E1>0u>NoZfc4ZXr(@A zL0dM6omdO%B7zn%Yba_cg36Xe(9yz)paovw{yuozpagWQw33c`Ik?MgtE8@Nq?Mzs zUQnT=05%^a0xEt$<0s%j2)!KeD1?%sfq{XN0_Y+&=s*luR!JQ^Z=#c^mtT-tl&GdQ zJ@Gc9SbZ*N>;#;&L3@fITZ%ICK;?=q-h<+5!CS8(yZb=l23iFQX(wwW>12aeH6}va z&4_vw+!#TvN9$AJ=Q2VTw1Y0igiOc6TF>B$9a@1F!}2<muLC_G0$PJY&l=Flvekee z^{)qCr4CwA4q4f*q^VO~3vPMTgKj5Cv`s{*I(0xBrV*7HQezWQh=9xIL{J|qI#I7e zCsD65RtGeN<__A33vbSX=fRRQG*S`s*D0X0t3V@g8KBFk>a9UjhyL~&8MYwZ9`-&~ z-a1*)8L_rXrUt5@JeZjXzRfiw)>aqXcm=luG?Jnr$_=axWA%+RwKKuxK$;$MotCJR zssj%OP4Hqp4C#7U?+kP@0!%xkiwv4W&WcWjHvMxGD>QV|pjDzyihZ_KrnW|oU50&* zm2QS6C~4_rMT4eNVs&jHj&rvMIZh`7lDHs4$cWu&I*^_1^&k<@Oaq7pPcVQFr2y;6 z($vYS)j=#IK}krU_B#3@5<1`;5jCqpV;_N_13?gR2-;Y#rj`?(604?`9i0qn75Lj{ z>lM@^wv}fiwS_=M3}_#`6=(~2AWWl1Ht29-Fkx%!Zx1rf&cHs!D%A=qmSUf3m4bBN zP&(+u0Z@ErL$=5J+ZRSd<1;DNwjeq&w%#@aA)=cTofHc?D<UI0739KX`)H7ej&4SD zQf#bMG+15-%+b*R>4vlnK~a+ln#;@tT~(rK2V#SkjYlWN>e_-0C;++JRa2)h8g6o` z71#y!iLr=1*|3%^_?CeT&@mdI@o&&oz_6AIq-hCSijbG80ZK9{&_xWXDLT2JyMw?p z=*94{FsLk+GtTmCLH$CV`g~hZXR-!-x{^)-^fVY(@WEEDI?ySkTAf1M>RQNBW2g(j zGb*6=m71DHnns?EyN-vBkB*<FPMSu(j)#uBj<=4lrVi-tuM*HYe+^AVTiYx>sAkCc zmxg9dO%^EqgL*C@`2~u$ptIaS2WP<)f)2$1i-Hm;tV09o9B5>NuW^7@z3_@xBO7$| z4LBV`4=(_%<4-HG)y>cYi-M#fDIX$VuaN;dW&<P-5e6wJElw?hG-)6Mg*qAq-~&8t z^K5Nx1J%?N6?4FRO*OT24R?sYH44Dy<Resoj-UZ4@PLE`xR8bxo8atK2&#nYp|wzf zUWJ-kfnFtOQ5NXXB7Zm!)Q|)7D!^N-K|!Hw3-Og6<WLFw3_XyGt@0FYZ3Am+zz(UY zQG~b|)Nls5%pRfzG7bu90$UmAq|}4tK<1U?7oZuJ4>JyAB{uUw=M8~<1vd^k;%p&d zqyrNR$p;<DSCU@<7Xh7{#}4Ts)=tk4U=p2P;K|Gi8Qp{}Spu66u7RLyw;*l(_`G6h zyALb}4OY;waRGEx7(*QMx(H3Q+af?~K{68AY=b~mGH7d%NImF43D6y0ph_Dw3{ni; zU0IR|TE&(DI+!C9+?J|JwS`>@qLY!R2fLIOF`)%nXbC!wqY`w)JoqB8%sd6C0IUrJ z<$@ewt(2cs4_@#9Ux@-51P9$74Q^I|)Yw)-a+Fn4t)`AXBwN)aK`sr1t-XhyKL8pA z1Z6Z$PzM&85p7*GYio6!ASNLlAD>$ZISX13bT6Ww2E>jUaBsK<64#)U!r?7A=!64o zY622N;P6M(9iWjVr8v05^)w)3aW&w66^d!F75|{tYrSoBB6KJ(5qee`^zJigDS(^^ z&@F=w7DI-$p&rrz&zq$dgX~RDMLi)O>J6C5wY8w!kqVg+b3s}Ipi>R@hE;V*W`Pwf z0$g;!!2_QnHiNZ#&2%6kX62#-DNL*kYHMpX!6Rnni8>XDI+cmgc|7QyY*mTionn=V z))h>Nw$laoGl`@ng6<5>1fBMnT2W9Gtz@MX3)vP88m@tjgn;&6VMu~4g4}hUW~&G} zEepC{BvD7HBoVaaGqplV6ErwC**jTfazY-5DflQmTU*<7(BvFwZ7ygnpC9O4CeTJz z(5;y|iFz4DscGPSZc4d{1xmKIlNVY_TH9-+f{vKY%uSCjEl$l%EU;Bp(oO~~cLVKz z(os}Q1+~vm&)m?oQZ&@G(x2SuB~xFM4_@R0U0a{7X^(W_sFhM8XxKL09%6S*O`262 z;(oqlP!PdZwAvUV&SbVv1n+@T0v!seq^Sp*U)RvI%GOKEEGjP1fFBG1Hi-|E$rV5o zBA``enbZBRFp7bOn?b7=A?q$cy*khuOz^y&4)|Iw&=y?qwZ7I#wpq{>b2f(du8<qi zK%2`!eJE(j0of4^+FNc19+?A4gL;S<(mF|?qeYT)@}t2E?_rk)gVfg4Bx|ICA`G^I z(iU_q6U^_rhOxD^paw4LL8?00pgJ6sMoLoiQZ%x_GrQ9Z{h36pGi|fLBW9qOvw=_H zW~M-Qje=IV<Rn%q>45r1R^VH^>}>Q?GRy3gbf#Z4W)+@Xt;SjJT3f3LUi%GN4Wy9- z*?^)4N?saD;I$2zc}m(<i8|m}0r+Vg(6fQTGVlT=QL`FlffjfrCOCKKr4}bA7Nn}F z8JUA8aI#Y?o%2&b>%$;x?!jyDbuyvWLgr;bmJ(w$C}DsWdx6$!K+MU)G8Cy<oo1V) zla18Yg1Al%bfKbNaY<@o4%oM#o|!#jJ_L4G(e#gfOd`_@Y?#@mFId6CQD3WR6&+g( zTNr|HCaCKGsT8t7tHq$f2|C3bGUWwo`yo|IpdCx#00JL~n+iVJPAAVc742A^eA`St zl)P6DIu0jAqbd=;dqN3z?1xoeeu;(^bcs)jrV`}zk!*0U4b*AN(u0<ipiUU*TnJRZ ztEnYxq-ZEvfdd0nynv1~12uLa>)65DYl@ZXb#lNNQd1`tv}qD@RyAlC9Flx=pw5N4 z0(2Y>sD+iPrj`K;V9?c8poS7;X`y|Vl}0Ay@Cz5v@i3r8mu|3|jdL~ab3uLN9F0t! zR86Z~ThQ2SW_@&CtcIplChV{ac$Q2D<<OcMO9P!$@ZlHmn9;0Gt*Oa`CiGfO9WW2P z;0dvs8dTSVn|P2zfR&WM&1ogjz#t^7A?~fI$&AuVNi6|ga}Pat1GN83Ck?Tm64bi3 zb<@<z0xwj}(gUs51XZOKkeTC(L{JA8Qbm<xS+p@dA)b|$4O~=NPv02NDpH@HXRm>@ zZUdUNZ7U#RI!T~K4UibBOoWWGDOKr$hlP}MD)qogEFO9u2C`Q`vla2+yq=^Jjb}4g zJ@SSs9nj=7xUZ9Dn+QEs2)f}Ev}hQqa05*&fo{_UEenRW13|eIR2x8UBUe*{?v?^C z0fTK*gzQpGgY3ruZG}#&N8OmE3F=9Ki&tm>AT8$x-D_SAp11`apXHL82D;5z1Gd;O z9eTkz>=;tGpYwC_L31T=OTi6T$ht3$M4d3Wx{UmCg!4fQks-~d_&mtXYRCZ!(*wy$ zh>?s$&@N=qa84q02Q;Y8gVa)>?l#CT;Lrut$W`D8XS5hhg;rKN>4<YsKtYXB7g-~M z2Sv^{P1jH-6*8bV{dhXF0Q6i4NF`?nIyDgNe{h3I4<f2-3qIBazT+Bnvnu+rCa8%4 zbdCVtGfs3W5}}1rh(<Ex3U8bdm!Vl*TZ>qh0}gfQdgnyQ&QXmd__`c$BGZ}9xRgnp z3luP*G*p#1{XhV_s5Pi~Ow!cLNdz|{K+RofJ*NcT8VdF|JT@Uy53q6`bO9AhqM8~w z-qbZT!Ba0*;7dp<K#POY({oZG^J5@mbrcmr6JY2)BxpW>p6>zAvtSQF=B9}0Lt(Se z6@E$-*b^W(fSU)Yc_qc5OR9y6auO>+ou%?b+aO4pfaooOZXU)~F=^K7l;h|ZC4zTc zgAT=lH2##}9Uh1b#0q<4j%{^*9%xJ#tP>(%Yc*XlpG~A5S(#pbo|>8lnuslUoeyeO zu!Sx7)dj6zEyv!kbAni8Tdfoasq?{AzD9l?{PLu<(!Ba)P!m!E+L?eJNCZ1}3Q~L{ zMG>gu3Jz0HkV4O`K*T(3p$2G*2GV%|PnOvkfVyq)mK<u|q#oont7>pbZ3PM?SHyZ) zPzwjN4jA4@v2xLYG^ngxK%Ek#Q>qaiSMZpg4zw+aG~$;99$QNWop}K}upiW5sV`E< zwoL&YgH&u=8l4!cQ({{NqRPSJtARQdw#A^s4ehh6Ky<pjZkCm9mcEfrr7h@=_B8uU zD-fM-ubXM5o2hT4Q)OEioffNI6rC2UtC0s@&X5+XspDu{rJJqeWSgy>rK^!)YisLi zpKn#5sasXA<7``@t5J$Nn3z~o1G26(Iw{t^(#k+nR|8~=zkMe7WM<gRf4RMev#kb5 zVVb?6m9C+tR)r48E84b>b_Vv2R!(*X_PS1>VUy@I<YC!dm<x5Xb?cpVz{AA3nRyxz z258_Gu0k8hu{zn>&YEBgbYLfL+S=L{+h^-mSQ(~Tf)8&?)dGiGfIaBkYDdtGgBrz( zwzg?CHBNR0n)VtX=jqxyYp3eu=z(v+t_NL0o~Ee@a;%yfSaEtyjia3bXv!3#8tg-V zdtGNMXHA4gkiK-#5L0wotWBYsnl4DOofCK<GcDFOTPMf16jWV;1|FfxbhE+zjBK48 zom`zfoqU}Fox*yZBJj>}NIj%eVw;R8JD^3DPN{7w=%$7;+f>j^4doyTyk=de!nPdC zP-UfU1!#1&%C;ifFt(-!%yG0$MeKZcf?kdcS`1%bq~mO>kqp_up#y1v!ERxIw_P2f z2i2>o6+;fSO@y-`Ep0V5rM&z+@Qs!*7ujp%+B!ieI6y;}&N_LvO3-@<Y;A3wzzsen z_&MoHpaFlxvBV`%Y3SNcB~6`tTSw56EnC|}dq>C^hlZw=BV<J)IGcmcZ!bVr1Q{|x zsDey9gOn9Q$8EFi4eG5Np*u1`qo<&PC%?cd+ui^!3^}}6r^wb3#WSFVvYBZmptegT z=st!FD5naPZjhs1#~ErFJcKIkvot{Czm+=WdKG@4;ZPk<oiv>cO)E&i!xdK9XK8@O zhO2bS^(sN5qB>qWps8BWCWT6?oLWsQ=USa0y@LFl%3|AU5S2c?;1{z@y)AV9-2gVK zVxR+CgJ}gmz27j^&_D+~z-wgyo!PK5fXrWlq-u2_dsRWBC04GrI_b6s;Kg$~nYM;H zS+<5c*|r8cIkpDYY57GOpq*ln2D){+uCBFavTc1dykC$Qt*e_J3+f!`Ac>`G8-m4R zbwJ0+*&*#Z1iJ~;ibo8|gN1BC3N^vXZIG0MhFVcogGB1#stse24Tp?aqpF99*(QUg zB6L6`vhk3U;*snt$uEE^&48R(lMLQ;l>)mY05ZW*pO{pvfusxU16?EmkRw4;aj**o zAllG$L0pEc4KzZo16hlggji98Fc+H8(&`a`2eL^UdV_(!5x8H4P!Af*)`q!3-w1NO zNi`@=ty4fnXDW!u1QA(w2G*J&3F!9pw4D6>A`S2wwN!}XAtK;KYDx9rqyK&EGi_6> zlE7>~`%G96>84m^Y9s3bo00@st8AYIK4h&De9r*r><&mC)=jm_LeT@ZCmlSj4>}tN zl<?Hl6g5C&_Ic?g^%*usn%0`xwi(gsvC#&x$YBTy5S<)|j3J5)XsBHS;#?m!wQM`v zOwbZq(By)jnp&ovZ8nVSucoGvX_sA7lWhkLSzXXU*HAC0spZt$*=B(hgT0}qmSty~ z1LK19X4&P`)a2N~0$w)@bR>HQ?C7I(9YalPL>xim6f}$lD%4Bz3#`Cw(4ZA`DQg;N z(lNONG2J-*_eEyT>F+kMvDHHh0&vX=N?*ykpoOd88G0+YV2W;%CQ<<b3L=PPZYJn< z!eq$e1+a3ENRm#9Ca6ykpO}}PlUi(5U6O2NsAmdVcWAC}0$OZns&4{XQK)CCqLWl) zrDtRcTBN9FZVFmeXrz;qY-OmEY-LcZlbVy0Sx`KA-D>H2TWC3^2Q@W16`sOlLFEs) z5oBPMtOa&Pa(=N!8iX0(2^wNdfpCg5^N_@$?G$Jj7-=O#W~4#kkgf?U8jZA4bbS-8 zN;337;u#nLk*J*x&NfNf8EC~~txj@gQF6}o4;Pt5K%vcU4)X)VU#ZX*Uotqnbih}b zAliwrYX$O)G^QIEvWwR1<by}9AcY)coGD)~AN8UW&~Y_TLHHF%MYfQ0@<Ah`kj2TM z!*cVpQ+2_U1xlKr(ie2<y}psPVm@e-l9N+@g|%kBZ9eog5YR}qHE72XLb|3#5m^>C zWbSHRT%K8yoS~7AIKHJiIk7lZ3F>7fD=-fnFsVvbx$tO(%4_87C0FPrB^IZKCFbar zCFYc-g4W<v>Lt~qh-u{O6;;&K<m(k_qN>&|(gDd;;*d+#v`#8YP0Y3iI|H;V1nMGi z?U<j3#DhqJ3bh<iNYv+N=9LuJ)I?WTSmo<g7@}IMQwh5C1WmA32cp&pn_4u%TF{Z) z(V+e0x`sNLwmEu`)2#i|JWEn@i)(6f>Y;-R*4o<HHksC%S++T#xB^Mr!&w^HnpQc{ zpyR#4)eq=E$DB%yT%G7Fy$YQyy~<ckYebMky{wU|0}mDGo+hhYTX;eM-R=WwFVv@$ zWWeqOg5?d^4M6CHL#|#0I8Ws2Ro24qJ<qevh1WYe1-1pC;;I0;S1vfrJpdHG;4>V+ zRtF~+rKaXNhxmf0<qPzZ>x)toOHyG9L85vUwt3)rW1SqmO4~e8ZKaa|y0k2@q$sl@ z1hkDVEx#xibT|t{oo$9*g$`JqZH8W@rcR-vt!)zg$ZJJg+eEkn;Rh9Hq}iruXcX$D z)I&zB!ZK6KYibIiIU_tXFD1WRQ!lM3F*g;u;ZGCZ4g_Bi1hHD%7Ie#bS_#B@5D!#Y zgR*OiMxmw-Oi>|fTNCV7ZCkJ?=x!@;TT>?&)TqnMO-u*R2f;^D!7Iu^i!+j-t#Q!I zB=`&~$m|%j%c+y4lWhyz4-DPS1-ja$C^fl62{eU{bSngC_f$?|a;k<>L4JKsr4nd| zS59Smex4F&ygWri9cf-lNm*SRblePRYD)t=g#}%6s05nd0_~$yid6?K=}!S|KF)=^ z0J5|WG@=bkAVsOrt15I<^mUY!;KyO<DAj{oQs9*Wpeh|v;$)_QoCk3hXyQgQ6JDsm zQh1(DGURXr&@7Z9v=olcjzt&(%H|oix}er8C@w%Y=%j<TgJ^4K*koC2rt8&%&sc*u zQuCrSz)e(5Yq)jM*|5VDK;t~1<(>I?prc4Yx2D6YV%r>~)B#Ss&~^)WQNKnGYJWvH z2iB9()UP)Joe=|CBLHa}p=f}2U37Dx^ST<EnxIv$T$zX@4XU?6DGx;JAc=#`1kJ$} z=ww2!Ja$afaZ0pRx5)&jYsluvdg!cbQaVIbNdYVgnT@qoGEh>0O@7)c=^8326c;7i zDrF^>B^D<aWfqiJ#i+-qTPrERHdDf`Zv`*PvsQq2Kj1qD6`<qfR=S4P3Tc_(3wx{* za|$vNHK0d=+Zt$EE9mAH>q7SQTY=U$re~&DxkPw^G6%c>(DQ}w_jCm7_b*6H&Mc|4 zHPBSDR<g6vhj_?N9kFAx0(tO19(<!9W6t!CUs=WKA!C7{fhO4a9cZk{8oZVOG_V92 zn+0_QK!?Ra^D{W(f)_Ju*6M&ptq_f|WY8#2kpk!lL}-8BIz>YXbmUlaiH-tv1P`{I z-^Q>WcKQ`89*_qF;9@BnPM{^f;0tp@@<EfE$<V>rRQO;lXx9XElO&`!=j86`1}euO z<7tSoRtUc+6}%s#9(L^`Y;qHP#&Kqf6=-K_5onD7Xw;wxv_TbP_6cd|0y<HmriLko zm@)w$>;)cq)6GmZOUtZK(p0Ng(|~y;Q70O9BOm-ECFpVnNR&Z$3&DM&1Jjv`HmQPF z7j#Vo#Qz#Xny^+LEV!(ue>}z{DhA5)khB4fMx7Mf>Wt|MKUhS3U12MDlTq_`E$l2q z@R)ExPHB2(9(d6WZ2J{h9G=!nG7GGeY^V2qV-}mfcMGdfy-pIe`LCM<u5WddYC#i! zpmWj_ZIvoO6C$b5wJAvBclObqIzF*h(Ox><pnWi)dthR9ZPTJb*Tlqv?rH>k1(ue; z11(9AxvLaSP*(z!4#4TR9y&CenT9mR3fZ!sngTj-1#A#Vd1hWZtgHozffrFg>Z=r# zAb<rOWW_8bIALpH!5Ir>5p6w83RZf67k`4&AGB!?Ib9VTicn|R8tTA0R-ly=pdE`| za1l@m3vLwKr-HrhsRQl6X<BK(L_n1iG-cQ4L;MX%8lb(^V7oyl$fUvwZXH9rBvm8O zZM539pv#>=Lu<vwpbD}AJSwFGs(Y1mQsCm5dC204wi?OWDVp$=<Vvbans&N|_URz= z>p}aU^bHLRtPFILL4$PQiAB)KgHTn8R)(5d@G2`A($G)RNwEc8a|$|yAE(+Bh*|@k zB->=|6nk)|3e>lQFcK>?K%G1bon%d`Bpq1DfaRdec{MdbZO_!al#qN4&?qP<*7aaf zU@$!^fJq9xIxP;C%%IE6U|i@l3~0O!bnX~924V9r(U3#pA*lnJVqiHquNXYD>j;`j z$xJl^&!eQ6!B_Qz)}Mh6qPB9a)p5i%E0LLMW?QWk2P(@_^GYBqom7;-DIS{O!M=gS zx(2ALt68fty>CC8G&|_jYRziJ=@$YRC8sN@vsvq91(v23RjR2eLKv`<snpaGH6S9I zwTOxCl<AH;7$xdq9m7=UtVd>wZ8D?~hKvHEo$_p31(Af66SlC^K@wr}a+xW%p5Rs2 zFk>=vQ;Ujit21-ct*T+OchJman^X@m4q6<64k7~k7rZsgwi<HaNOdjj+>{j1`jpIK z&`@BCRVCzDmQ<bmyb#F33ad&T(3Bo{J`J=K8e%rAkbtZTh0f}vra-v$u+xws+;Zrh z^I%6nZqh-zQVA>y%m0~qke$7t7AEL;8xX$|ybuW#aSCamB~8$l7-&s(73hpC@cJmw zFl`EWURxtkvmT)%9ic-JlxK?J>mNWHdO=f;dZ2TOKwIb`L!1Z`L1_+VB6!j)s}PhD zKuSw8Qu8#CmQ`nfYyqt>f~+g6&w!O)AP3u5T4|(dB!b5A6G6v<fyR#!Jlkr}dPFOP z0O$-yXv$Rrt%n4aJfNL}`FSOvy~b%8Nt&RsCYWQAz?a3_gH}O8b=g*jl%!UaSS8!0 zYb0sfS6U_2T7g!nfdqAw60;I3K<0v)JE^uwdLTY%kp-wM&Cg2)-O^DBI(H_uBvk<_ zn*=`LY5K#-Y{K<vkmD&qkp}G@B*9NgfZ7iZP*9=hlb@K9nU}7or>CToZkqzO3UM}A zb*)aSPBmChMG0uVrluY!ST#Vmm?tNv78mPOfo9T+it>w~GHIoGlT)(=>($gU)YOu| zCzdIJ_2-p<T?m?I)=5M;*a<W;Q=NoZK2lQyx>y&qs5G&pv=|hQ#h52qC2K2LDJW^D zXhL>mfY$b8*r!>6PM`-Vu1B>qO%rnTF7za$%sd59(1MoQpq#q~S#=4Dd-xR-(5>yz zD-v{|Tw5p&_L8PfI%rpaW=T$JO-&_4cRlzL0NYB?v51H(wjoIcl+Ivz38Wg)AGQS@ zqlDmsj!{DJKxqy%O$tgFiJ*H7Av44f6F?HS5CL$%w7#g)9$r9!=bLM-AkwzBwiWi( zkVA?pYOSCp4MYxP1$gxU!l588#0n707IFs#*a{RIK$1v?Wz=V;q=HNXHz$x?47zFo zVjft^7Jgt6D84ImK$@TjvUwoZj6h3h*!pB>Ee7L4mc1n+W%W#r$&4+c^@%!Zw$K|1 zK(`2JTBq8kMyExmXluvDT5G1*fCdXdeNgZP-Kns7w&>)VnnWGY*l&S`W-OwV0#6-7 zx)I>nW$?61vO;Dar1_Jak(!)c3>lt>2!c+?hKNQd$7*V%f_KvfrKY=96lkRAC}k>X z>ZMksf>wZn0wf7MmIUfVXecF>X6BS+=7Cz4$<RGU(0T%764d)}qoY%hd&GKhmG!X@ zy*f$A#b7q57=#wjKA@%?sPhbJZh^LbX(WQLS4afyyt7hLP(ljR91ZYBEU3;TI|KXT z)RK_Q+|>Ni5)Ihp4v;p3rcRQkRaw4eW{Lvn$i$o+a03p>tXz;AK*bYmtpH-XRWN9& zH~3^sHpp@LD97r9k{Pt806LhFm=pC&KsP6*YE&TBw?M04aIVlxfgG5Rh~_+y+d%7+ zklk00>_FHtx9|!Tk|;oX0Ta<yYUzN=bns;~#U&cPpvA<twvhT3+M)st&!vKoAb?4r zxDL`1i8f%31+6W^2o@D+ARvMTG}abv5DOn}v$eII{=t}8G!#D621`&ddq8?2r?|kE zqrq>2tO502HKEIzA#2t^Nj15qCKY_d-Lz^Jk?AuXm}Tmrr`e@J7nnh^1d{9UUU~qH zqDsst0y_>IMc@{VW-TI~@<H(gJB8Z-yjl=7lECqY;!D_pd1`9#>*ZiVsEG<Dir3X3 zw}FZtu*=}}D@arirXM-q6@c6eb`z{wrdF>8<|C2<bkqvmH33cdfu)gl2q2eng&NSg zixl{><&@N%)bzv>P{S5<AwWS+W{G{WRWjrz7SM_{Pf)(r)YJyEb<*l#%S<5&IMKFP zFR>sq8oJOPWVw#FW~_B0=vo~3^;DoXNMb=jPNha7;_^VvTBO`v1a?^(#L#rmhA_~c zMV(yGC@FM>Y@RKs8(a@s@MoWEm8g?%i)dTfBbXX#hz6Nel}>>z_#k&vP`QYZ0XP5D z)bj1~qmcwb!=bTORiK+O^*{|eB%|~|ay2zdg`kZh`2{7#N}ARsMU~Zspp_AzeP2rO z!#WG?Q$S<T#i?Gw{(c&TnpTC-gkGds4Z4&x8+7#!WF>2bPIawLu^x16zgQ<t2jeW| zLi-Gm8C5zN8U-~q`I_~hZRXkVp+g<exvI9wI`Hei;LgYfmD8Y>C8WJkotdVQWt#|Y z!)YMoKy75uh2F5H4~TDTYg<`UqnHI77pSyGs4uBctthe00{J5oYyr4m4V?g~snI|Z zw9VB7T_g=Yd>&*ZXzmqSqS)qv>;$zxU;?(bptBvaA>}Ki1Vd5;IwcX*22oSfsE4Wn z3nAGCTCf9N-wNIR0I~p_ub_s(EI<|my8_m#f-kaxT7(E=giI#nXdtkkL7oGJ8kl2? z?2^<%4FiyDVhOnRF4f2cE&izh3FTJ8g>oxFD__CM%u^Gz<To3%;;;yOz@}y*xC^ZT zKiOJG(Eu_`t^k_sLsAI}SVTNQD_UqQd+8*DLIHMEr<$5Z4lDsc+q9tRYf$wADzd>x zsKUe{$s|-K2ig~ait8vT)q{3pfI91-5+hqDSw~S3bX_7Ozj*4TYwDzfmr51ul<1V| zl<Ab~RM;vS=v3M&8tPQpf-kgi1Py@cIN2&yD(N`ef=&Qc(s8j>0u6pE>9~T<eJm-- z&sEZKvsD7GzfjU~w}mYm(~0l^b$dM_L*7a{Ubaf0Ak@uBEC!84DCu}Z1wcIA%oHUZ zAKPf8?btdXHni|miq-K2Z$R?Y@v~K$9w)+RP!C>JtpGl1KQ#|@?jCq@zeEGnuF>%a z_tn80LX~s^z#M4SRniFrbJOyZON*6sg20>%&`_$9PB54Q>p3gwgxD&@Lnl*GoGJ@L zG7FS+LT#1ub5cq&Rl(;2huKzVrXr7Oq~#ZBfO?^cwkDv~!Q{aEV%8eTdYO57sYM<k zzCN}}Hj28s(V1xq=_LxDt_n)ppaXR6Y%)PZ=yo=W(W!YUnQ5`Qx^|#_1<BJJg_y*1 zGnGJX3+qJC=ohS8n`mcZpJ?Tm=m$E>G1EU7va!c4CqJ=719Yp8hQ4z^sGgR8u!2Uk zfv#nIY_*||X{~0BhI2ruLQZCOs-~WnV?jYqYItgrcV>y6mT!JiW=^Vp=JXF!nIu6c zvPB!{D1j~|H;e_H-3ysgQYy_$NlnYlOHEPIQ8JD<Lb@1TDPBoONe^8Be8YQXt#yfQ zD$;a7iC%npMrs~-WJxAP55xuyb>&oQq(E8;&`S_)r*HVcC{horQXvgqL{}1)oj`RN zcsMi(dW$%0JQUhKfQ<x$M_*v0pRkc0P|q7&K7x*026xaiLF0&!zCO6iSf2{nQw0@* zoR6!M4e}9m>6}iEEvO3u*~kjINli&XNhdlM*5^<_s&k>mD5zzqlvtFRsGE`sn%qfB zO-ZVR&LqTVrho=f3-Td1>DfZg5Q5&@7XTI20Jpl~wF|g!nGIUOm{?+!t(RC*tEmSn zw?IJyYlhpxH~!m#TC?CyQ?Qu_u)6rn6dl-2i_xAs0XnJRmG$+YbLJC^i&Kli{U(U3 zVxjF01tr+HJVY^c(6**VNeMQ?4U>SZGXl%N?)8Npx(llEv!Nja+M^GdOM%>#p;J_! zpOb2(l$euR1UkbG9B4V2WvNP5N(K2jnI)-8&}$tNOY(Cwla;J0p?u_!wSsw2TS*sG z7o>uYnuSCFWH?O8sserj2Y8@OBN)>3OUbN<49r0bSZ|1MW{M`PBn26bG*k<zg29yy zOjHAWr2?pmht2q)o=6HBScJPOGX>4D^&pMto~)>aU9keo9iW+4kW=7k0yJ`0p_2)l z?1CmB&=HrQefpr`5%@?PXl+#vq>BnR0(vDjL~VVhP9<ohBMaI!g&G9AKvD<AqzuiP z8Z0J(2KH0)N;EP+MnOUl?(PZ*AAa*>31~DFvVj9UN&sEH4m*^^8n&q!)~5o^1%l3w zsRG?$3%L+RBN<d-Y9zzE%ZahJNuY}jpuWpPz9I`YKn}fR4s=^hNikfoJcBzmPa_99 z05-k$8M8RFKvDu-PYG+3fC9TxCmFN}D<w4#F}Moa4hCr}fd^$kjqRG6WZ1I$3Y|2_ z<qkTPAj2R@5uw?(vQ|?E(rgDiJTnD+GOA!PIK*moN?>K-<T=I?kYnv3eI}&ND_A3( zZ(9K_C=+4#ctYA-psEVmkkEu2sQ`-{Xp}?iVZGv#`~nR_9RtwTygcxsv!J>G)F{!= zOhMba4%!9=+C~O;0Cd;_G3W!^QVn$()E+2L12pajs!9_fV=bAW2|dtoyC%4kY)~AX z7^`WW1fAdj9qg{*33CXzb>xl0^O|1xmsMnXk1!ig0665}{W(O73w$>ws7<W_Ye6NW zm=Ox?L&l@t5u-7E;|xZTdRS!w>HUN283+^7NrteYVF2NP8!on0uyJ10NUp7gwhzH! z2MrYX^^4$kx|IfK^u0n&4RqOhJ$O|(STW)r%bFTUT7X5ReG+7^AxN2~6{Pxr#VhDY zJlK{lNFr2%U+I|y4l>YTL?E3=(*n>q%g9Wr2OVw<Rt7D^HEVUsY)kYYgIKoJ&=D`I zYNfc$6y#|j$owVzQW4PkH5K;7dU>f8C7CH!$vWxa7MYTEnsu5YxL*Jp)C2XO6;m{n zl$Es8HTCKt69>>MTH-TPY$4Z*Lz@w)DX=mS>R-?rgG}g538>Nodkhwbu*LwIBIJq# zReecjeMt`JU?)8!Gqsg;!Gpx0``HsgN3EpR>L|s*PwGdS3Im6MW_2=b;0YFA(BOq| zA<+eG&mfg2pnDPHlKG%b6HxO-MagRV##M}>%Fr?#R`Mo8ltNX4Qo4%L^p6*rg>%5Z zff)_0hQM7>SOE(uBp?Mu3hc}iG~>aBAS(o|*wKN{0D>D*sVYjKZD#e!_8M^C!b2S# zT2MbjYZyrN1KkM+wg74=L?T&J6IxS3u9Jj_qIeV1Rzpj1)Az1o<TQdB1+B$ULkH{@ zJq=KB)<BE^9R~pp)_RoL3MFmOHaKw1LYsnm8o8A<iKwSIKw}uRWHd7`9Wnlp3`>@< zN(7Wnz=;LaZ37*Ytdv*+Y8!!uctNQrzc^D6Gz$k#qTm(=EViLl5-6pE0}7hZL9J@Y z1Tw^f;Ep`FB0>uj9nd+dYHAv&MFuoFph>U-c7HB(M6UvLHnkGu01YlZ=qVP^L=^yb z1w<o;qae`*X=SB=FS~`Xp>70CBIs#=*AUb|+KigeG>yxbpcM$PhyYJKfM)j7Q%h># zsTnkVgOul>Qx0hELvDe9;uK<3N@^NR=k)EX82Ka7bisle5-Jd%1n4L#LVN?B>MhpO zfM}`#MF4o*wFWf2Q3LLU!nf){5*S1!dZ0z4PMs!ef^IlhD$P^U)K&s*a#o7ffED0~ zM5zI`4r~)FiD~L-fSptW$*VQsK5`9gNV6s<)hV$owFY+eL=Ef?j~YmmToV=&`FR@P z3tLd488RlAXbT>bu7@-vV4(vla5R))?S9z7^q|BI+f%KkmIyx@D!;Ti6-R{&6Gm;p z)q)nwmw*=Y!d8Dz-~NG-w;o=1V)hknGf@gv@HqxZ>o&p16Gt1wMuSeng&&a&zLz&S zH6<}GIn_QHeoCQLGGx(TxUGI1ETm)fG;-@fWdStoU?C1lli<7y4_r;i`UqHR1t*di z$W_4lnK}_5GmBCo$pTf*x&$-@3-d8(9|7bV9dN9GyzX9<UzrL&O%EgtZvKJJLk4l+ z^`lOjZ6&N@46O+u(Fdu)t)~avW0k14*GRTa)B#_j0Xo&qHc8V8bkP>{JeulS(ADSA z>AgfmOAnMWL1UV!YHAUX-S0{88?eCpi$Me1C8-Laf)DJv44o|7OpSEVY-~Pqgw$JS z*n&<ii3T0<7^{O|f-d?7-7lSz8d6!1YM-K!tZ4;0={X!`T}@4z4#;@hXpkoGxtco3 zIvKIGnmQSvrOn{5fW;fAC0_w+yn+rhC@9LWsMN^P0r$gUy)I<cm5`<nB!)0Du0bsN zz<(ONT!opU0lByilpWIH{WoY^%DxIx%Oy*LPF;g^7a*Ac)B%82W0M=dfG#Kmc?4y& z12$X)l7Ppynp&bgYH<R(!BGQr2MYWyVWb_B;PxiGqXIGsw6s7;6Sd=)s3!?pJfLZ> zk){V*ZUQ<35hOU-(O*OsAzZ1Gst0v9c-pa6rwVkhWj&gxCMbD9Mz|Bz)RaK$OA<jV zITE20)Sv<b((to0uusxU%`GUY)PQ%n6Tz#`5C>R-7s)E=fN#0U%*iaNv{C}Ib5fOR zH8ri0^fKy8a&tfj9D;nP7Z37-TYeF&`IH3h03w!(YgVTsg(&E*MDR2fsM(0JF&Z?b zf;7tm>+mTiLdW7YYeBneD{FQ5K*M5*nI%wLCmZ^TLaw0z_a|U6nS>O&8lda1^uWv5 zi$P00Qd8^`QMekKRw;TescET2MX4zopbkxOeok4c2I$^;@TwKWx+%?Sgvph)nxN6T z+{|Lo@#}&*C9vp%hQ@Toos1%|7L*2LS{RXFKm{CVolKG@QUV1x&cOOy5m65gY19^= zPLd{Qq#T+<;vr21ux5=)h<T7Ry{6Z#Wt4&UyI|c}@Yox);ccA=X>=wf7GX0DG^P)3 z=OrZ;;U1NNsZdbTMyV~p17oT6&~}D>wuVwhYGO)ik&>pBl9FaEQYr+SfNDWzid7PP zpba$k16G4=ghwwkuQ;`+#3?l`zbI8B5!~)e%`4FaO>C#8Cwi8oYAAsxAaudg(6DM1 zbOo{k^cW+^5P4|<h+kR&;el_HMo!5o(*t=Jg{SX(z{EBEfDkj=^nkleTyfymiIR>I z$T(2Z1eqh&D=tkcE-BK`H36OQ33Uk$hk(Y_iLmm0HxpYV^rBmk7KCN+F&k*D1PcM^ ziXB+QLed1ZEe}a1h?Fz^!ZK#qT_CW;W({5916tYzPbSdu1P##P9^fbeB@L)TTlkux zDjm=Ppp{Uok#aVuIb5O#?YqFnX^|>t&FblTflTatpcpU6FV<Dk)<~?Wfi#vtgSGI@ zc%W>9Fc)D0_-q>Z;sscB105BIRVA5u=}-|+0|2xB2j@8?#o!SkjUom3))vV41h~wB z9q|cm#OdTfn|3<6pkpy1^+FzKw@{@{zHJU@?hJIEBCO4*QwW-2hplzjDFUg0?5Qud zEdovbX5^<JPui5&X6xmbmZTPeXUH`wHFZj1BGA1Vm6|$bwgx)&<+cVoRiL99L92ja zeo+FQz<|2B9&{K3MtQ8`32HCER=wNW+9reNn035Bx5R4dc-t0&wUp<j7Qy%b`9J~% zJZNK`Sr0n&F0&YNd1kJrnwpWVt!*x>IM27OuCQ{^sRV5tcZ9Aj&jpS5gZ7nz4mO4C z0agI*xd9spO6|Ft$l5d%iy(vF(3pfJeo#wZ4>TZM0&0J1f^IN{+#ZEsK`ybjPqxj1 z9#~@qx)2=H(^P_7u?MmZ;$zU3dhqpo2q8_dMsNqg%12Gj2Vxp{1(grzzT}d`63_^{ zqOEO}nwo~AZ6UO216uL!4W9jn3V@?f(biT2v_Loy8l^Qg-qQ_|nPuuh%S_S{3kINi zK!(5qEE!_6t|MfBk4CzhS~{2s+GGh{rw>sPsp|;Zv!)GEPy#xs)c~}>9uj<NYMyFp zJ|LHZ_3GMc_<%N(fVP1}fDF?00&(+ma-ioDfX#xb%FoG(L{S9ZfC8D^1+{0Dz`+Cx zyIlKZ&?XE>k4jAqmb5^pxq_3Hni?$ZAwsI4R%#Zsd1srVkql*OTESQ~H5ysdCv0RA zsV|1hLG4qtwaryi(?HUm3vCbC=Rz8aurdy&6SQFrrX0LZBUe)oGV={ui3v})NJEa+ zp!5n_zEM*TK7`j6bRvXCnQfR}rhhP~i2<6<1V=G!H=~B8PC2SHB+FXCwl{*dKtj)! z0L6zb_=p71LWx{WXdHlp7jixVLL3xTkjMcw(mWuIo7}_#HMLyusd3;_AvNvOY!Oo6 zdRiw}Ctt?{z8=87*s4;~%0sWXEL}}4S4|D%KlFXSU_*+_(oyu+XQq~et|o*SpiyR< zi&jLH!$ctd1(jNkAfdE0&_EIBiVHP0jWXEAe4TPz*v<)^blWs&!q;)M1uaM{&IFC^ zfJ!lN84a!h>cL`AbsD)kjyi>!IvU`3urt;(R8s>pZA|nGYihtuJ6jVyV}!7=aZQaP zSVBz=aq<WF01Zgi(zV5&2cV+$IpAo~)PWr;2D!1lxCFFT9W*2h%E}Ovv~Baj=McEr zmw`6-f{)8C1D$1~1I|_;=}KE$TUYyX&^BMNbU8>Gen&0Lm?FIjZH+vLS@rh1B~}o& zyS;7+SUt?VBE3qGI*6gVrB-?1^9|hXbxR@2kfL8B!`2ZxxR9D+i;#fCwWCfBc>P0( zPN}9&x|$m3h=a5eP%;ILET@%d+d|47s3hdX3aF<*bE*ZP1DbOy(MR+2aw}~!KovXa z3>C=uNooqTLV%n?Vo<A-1?ujB2aQ0bCG_ZeL>r<WECqHZNFgLO<W_=ax3Zzl6^IIi zIY<L)2tnISNS9GB9y&n)>T#B(D(OT!>J)&R?lm<9u{z11<9kwbKr7E7;Z<K;k_y^h z1nGu3)zm;vYlTFWCV~sviCa^H=*8yN)F`6N3+CuSPJjg6GYuN9a|HEFGK=9ekZ^g> z;uok|z2wCDoE(j8aQ7P2BZsWTs;<>>)C8@U!93y+dIvS6>j&N92s%X`GK>h?JE5r) zrk9xtZM;DS_#iDs(7aJ*QYok*3)u^)1Umn)9@IMn+Yb+Z(D(qP#}65PMs2M@vnry| z23^MoYi)xzQ0OFSRwsjNByHOytwd<~2Px)sKy!lyaB)!i2hM?@bzF*|Ne0+JRx)_3 zBwYu5Cc92HsPTf)ZUOBuRs?1LR5djv=ip#N=ltA)#1c?X8g%wDi0unHK{wYHWU_Ti zKJ4%yP+H6Y-IJ_RT&$4`+OiBOoRmNbPXkeqWY}wD+U8C_Fo98`UMEc>TSwPWQxkMr zeTqh|COpJ6Kntosi-xozXZk@_sic5oDHpUL4s?4g$ot?b1-xX$0JI=2zW|?xko*E9 z^_ulMkRa8y1zjzlR-z3#u>s94$dv;iyCBwpW?f723qYDcTX^y43CS;jX-TiC0nNIl zq=MIQYh-}}s<<8;P@vvRT26jBSSfsf!PXXZScwLx$&;(8scBuFk(raKkqfUU0>GEy z!k3GH&L~WW90CQpuB4_WM-#Lo0CZ}J4s@U~(pIC?wgj}d95(Mz54j%_IpHONt~~%P z21*3={2?oN^fjU#b)#Z6^>vgKR1A@p>*(iZrljPg>ZfPwxT9@hhot`sP-8AP5p*(z zJ}5G4z)QaLK}!b`^>P#I!4k>fwOIO^H8s)jE23gStC#djkjL^MCRQSu2x_`PPUES8 zngKGH2t(5Hi;`0#Z590#lfXFwbWaE540;U%=wvq1l@Chb`4rGCvq_+qTe7{Al_O-Z z19G>lbtL4-vJ%ixg|G?eiUv?+45C37H@SgZSP-6@y^9s}!nx?g*jk-P=xFfti_4gW zp;vTPKo=zGRqCYJCV^Ui_OSJF;O12gj0ci}*B^-cCv0t<pj`lnH#O~}lXa3}t)i23 zl0hVVTpH9RRW!6uL9EKLN~z`4iG=nkr!($l6nB9f#;&1g2v2FCb-K_a_B9MNwKYKd zSk=@(BtjIlU`G?=J@BRQ(;r$g3Tr~<r$8YC^)zg`1k{<JGO;8-Jw0c#La|7FDx~)W z=~6<sr9!(jut8^N4->QwJ{df*pbyGPkV8|UE7T#K7ERD_8o1@Hrlt>H$_`bM3K<;* zH@ZPt1~O4v4{4Z#_CzC^+R)ybt*vbuL={vKWIz$r+sH^P)<{NM@ekDnD}zA+U=6ht zv{o2&Dl2HUy+$(P0*&%SP#Z2U9klWT7Q>J!cBFM46`DGzGjA{(674~DK*t$13?VfR zD3rj$@E$%ik-(NN!gPZaS(o`H7Ae4LiA1#1m!VgnL1P1a>WM9+wE+`Kv<H=Spw(8O z$t0!N>F<r1#hG;Srt3+wiPh&rq81u`;1XR4JaeZ6I$Z~3KWz0GxVa8H$XN+=YDZ#C zjiD|0f(`IU0yJ!OiflnW)*NW>1uAM|1Uh*f5=W431h}hIpPpI*9T?RBZQ{#MQ%Ka* zD^5);O3u)Lt+cLz90LPdP^pn<s|aeX*(#<(+=G0Ia{;KEqo!7*lWCh_UuC5Ti4k~% zDO)Gn(jXSvjDm)IJ#<lql}0A0F|4MR2yIz_ht4#THFXp-YicsUk!Ym>T?Pm$+M!F- zAPGT9M-g<}E_C?<cuYV|O(PZBfk#PL;1C6?0G)TJSC7<!$^*~YYeF3W9b|<L*lIu| zL92{VT4i~Vu`e`Dkl|LS97vC1Ir5g1Txis&spZx~8`ZGxwnmBu{1|nxD?v+x^pvzc zAq9SXG3fp_U&!oUxow4}PJT^II&!MfNk{EpL4zCI7XmkaHIfng5~7XjW3d>a1Ugwo z547wYbbc$O&_hhR=YVDGQ#2q9O{)|QUmYkLa-MiPgo33&P4ED#1|%2gr09Xyhe0P> zc`^$?_9%fy@Zq~oK=}lITrDgXb;{M$6jL;Owbi3xlc2UrB}JvFO0lp^p$>Bf_-=r7 z*m)J8(=I`wTABx%=LNOfLAMy>m!*Qj71Zsnga#7mC{+#DWKGaLv9K*$ux6)*W_6-H zsNa~XrUpuXknwA14+694J6-V`iwL9A^u!a4!u2_NiKQj^;1mryY#5vbp``<)=!8q_ zq{FW+fJ8WoGDz-)Eg;eWpG={vqzyJNGeuiT7d8tGS~CMl6`<*xddLN2s8cseI!LX1 zP-_I#$_EXwDS=Kj2O9~`xQX`ghL{y77D4Sc&=_$>X0fIYtlt5ebf~E*1X1=H>CxG- z8k#y;8k(9`DfN0tnGB{}(_SMTwi?b5VG3l06=d-d=z=~-4@D`hLJ2V+ny6Wwr2*<& zfVvh|>9AwoEe&)M!N<CT7U_e|u7?GeQBfvnA2#0b0*5wa{27$`zzeG<_p7rCgDYY9 z{y5O;#8kLsJya69GfNK~!$|E%a6Jqu1kuKtp`{;|nPt$zVqehIIXDWS)q+kcq}>lb zJq^@Jf%Lmft32~kQY%2GB<Q5s7VAOJa8H63`OtD*AsMmpD^RnhX8L;`W-%eqVZPu= zOVDm<&{-Wx(+{RIi=m$N4O$Nhb_c{hh;@((3t2=LeE4?~=qARJ)FSXg?m$?k2jwZy zre;t-0e;?hAh<z`Y=mtZBoA`b>Xd*l4*&(Sa6SIOgVqXQ7eYe{njs-w`ap=8NL_Y_ zYobwffI8Dk5U(j|#)78cLDHb~t;Y^+4}csa0!j{u<q%N2l^{s~)D%v%PqbBpRQ<5n z1}lQs-|##0f+4LC_?|IMD_Bj7bV@d8yFRFZ2RR1Xd`V4_gH}#3-$HDM_%>K4ak@Sy zv$$*`)Z0+UgD(Ds%rJudG@WrPqwsWH9VQ-Ws66VlAY=*%)Z7)bflUg+#zS>L+clw9 zqwNqtn^w|EoBpwhMYtX`MrWUDrQ{5{PDKH#RmmDQ6$IJ>4_O`tjW^I0w6MWgm?H3D zn-EptS-?cprQeWJ5IlQ_F~<l^&5-*ELF;`$Ge?=p;G@I9^HWyo&~`*lVp3|3l2tmm zE0bCPx=bZSL&>JNATbZky3$NtkO>M<8a8hTxkg0|v|P2=8Z;rUlcbj<Q(97zpNCjO z2Av8^N-V0WNuFM4&n&?PzRpBrdSVQta6M8+1?}^NY$n%8($uM}1w|cf4jB?f_{$ks z1GW;}rGu>L29HvK&x?YDrZu!}3>_?Uk_Wq112mNn8PU;z*jk)g5}uioo;qzWqr`N1 zJ5~-qNX~@>E8awsVvFJ@YfyIp)S`i=SWTT^+eG{6iVvBD>!J73Koez(5_lXZJv}EC zs#YfjRD>WWc+mc)jMSWh)FR!Y)Z)|<1tsllP`v=^d?PfXFIWaIj!OaEas+BKf<|$` zhf>so(js)?T@TroYz^1}4WRKX<e5#74sa?;N-RRx0-MYR6(_KS3{npXc@))<G%1#! z2X4iJ%0Hx59;oCIu7{K=;P#+x3bc!smI*pTMibmsvxSTsf<hLu1qN&isI`NXN<hcL z=%nhTfor8i@Fh>MngX)!EFHW<3|!uTmH}v_f;YRTS}BDn!TY=5<HSG)Yk-cD0B@m9 zvPyz<n$w}%XVc*;pObacARQ~{q94#HFM7}ubfybdvx`|If*M4LntHIdnI5z`19m_X z*a1nP1p$yE4eTxO`0HfB8u9v6Thzv6W`UA+BHXF4h9mU$5zw3^{CNH9TAgIrVoY$a z8WN~AHPBORz;>j9HoKx7a|3UDrRqd$f`Td*RPuq&2uP}_0WAsvHzZ)HAS0cMsnDxD zz|IE+9=HWuj3sV#(jifiVVexAO;f?c(HiipH9*bNOwgf#ph0%%@eI&4V@ZfMQW9uA zDrg@aD2y`m9E*ya6Du{6brLnLQ|)vOLHF_$lon@bB!cIUlT$TPbqqn3GHAH~X!s9m zFvy3{GuuEN;OUNM;F~v~9XD9*25Oa{tlF_sG_=-8vQM{4(}XnYKxTn9r-2$bpv7h- z8X2JDrBlI;b<l06kf4LyIFqcCr~_>hK<!V}Ndg^GqEjNO2i<4lnFqe64-%M@=NL;) zw`*eINP%pwhm|9c^atDKk(vTp{{(Ug<ScnewA+GGA%qDYe1KJ;kdy&wMuOF7z?NE~ zoVoyNFhbT?L-Hx84j|^}1xPDF17ja_B4~dL$WX`%M$omtdhm7c_6AnTkWNENJ>+Z# z&00`ACqtTL(EfrB=p;X|5fInwq=5?J%#>7U&r>Je7HSH3B*-3m9Hx?zHnK4M;7bK1 z(2Z6)pi~K-L5FCnN7jW9N7Dsa1__B(aKOV_6ELSlD?w@-CD8eKpdt*kpH&I@P9f-G zV`!sULlHDVt(1~l54!ugQb|(>dQA{wzzcq@Hi~c5)D&SVOG|3N+h36sB6$Ebfd$ST zkYW|AQVCK5!4soWZvONms?0*3uzfg4g*JQ*93%nd=Y@dBXKX8Kkqv>QThLA9pi)^U zY4XJv!qWv38CiKC3CJG2wiCQxryg?Fho%*1I}_;a0?^f9;8p0LqykSHnxGm6z5o%F z*FX!;kk|PliX2Ee14%V#Z8@DZ<eizI!>m9@wLlwh;N70cDGRjO6C8HXlm<Ew9aN8k zSLlN8M}{wF$pNic01aG$MmfNX9W-@76^f=#k!>m@QA1J|B4I&<>mivFEoJF|_QZm% z#?*xnM$-g3UK6yb3OeXmj3_d}=eNKPXG{m3Pzh>8fLr$U_W16<inW5vDrqOi>Llra z_kO2?%2J#OE*0FBg!)TOO{pAwh%d-Cs0=vOL7V&aknEGA6Aej`;N@rF+t$$Xi9Y1W z&KgKD03FnY6<UbXutDd46{Y4RmZYXYk|wm21ce&t%nnT*s3X9O+wC(WZ8O1xzv&<n z(jN2I)U<+mt}L|(GSCdqPLODW`wpD%A%4h&u2KVgPf2HT!9R)Vas13&uq0lqsRNpD zf!Ys_SfqmoOY^{eZ1C}e(6E6Rn}s+O0n`##(u4&Sc<CJ|GE0*)ic1oUO3*?KRCa>; z-1V?f0##37_d<$i&}w8zFBF;q5S{5@*r*>=2BQkp0Ub_O0G^sE*6;;w`O5+IkHMxR z^gxEG(n~Vz46H%-QK4=ciZ+O?sX-Bj9BBs@Pld)CB<q1(rU6n4F|j10rUo<+47Ls) zv(p7PGYLcPRfM0z0vlC_1Z9Q}q)P>DiJ=ZG>E!DuAx4>yYiwu=0d2R0DS(u4I{DDn zAEfLA396J7YZU2}fTvz_b@Gr)MU4zl8Uw8<pMFr4S+pK>?OvLO5_AL_e&h!<eZaO^ zKuR-cHwRkk7G<Vq=GD}IntCX8BP8R&bm~Aai%3i=w$=dM2wISso*JPGIz&1>HA1uA z4suu==)TnS)JUj!q^6y1GA#CCK?@FN)LH;^#22{L4$9YQ&<YQ99VKKj1ANdI>Kkxs zM@iNhGO%<Eo)&~HPlaTjSkRhp(5Qqv*vH`d0@4Bj^Y!5M4y4e4m;f502lp8ul?lYr zpf;&Sjt)G;!J>%t59Xqp3EOK2O~#<42Pqc_W(uhPic(?A4#5SErj7=5VN5+}QWkVi zFzD87$Yc^Mq#@}O)&VLmNKMX6%+Z6a%Cpb5Dg-qkKsuFl3PAh+p@9rOI5`JuEyRdI za2iVkHQh_V^%Q7n9%Ln-jy&iRXwZ6Xlr7GPigWtK6|A700??)fB<o>mU!~}!7o`?x zK*pNT+C1RJjG!Y$(ZU!Snjq<9_~bvrl?ZWL&_XBp;w*$XSQuXWqL+yvb%{DjpmZZ# zkJ;?3)wBj*<Xe&tUYH3!1|Pid9@M=7EzbuFYiL5&WP#4=1`D97gA0Szfm05&!>5t1 z3G4f5r0dkf4}3uuMJiirbyASm))#8{;>!w1)i|syz?$lHl0oY{^pZ=ni$G_@Lux-z zHw2XR(W*p5jet7kYMlg~Xad(opvE53Acw!EnwlaKACw<pZ8%U#p{a><WCLQ+8dBK+ z%NJ-fLurt53tC2?%(<$mDS}Rz$Oj(^gdzjFE)qH#To26wAV)ylj6BK_qyygFU#OuJ zt)%S@y4qRCPbVMLf+@BI?~wpC$`P3Wv>_9|=@?XBCxQlDkoFqsq}x{MWZI_a<tApQ zf|E(MMq*KVX)b8|NmH*lCo?%!!w@vlk{J!_Z|WL?Zk_-onP`Jp`xHIUX*b~V43us? zHLa?k1KNskgP>khQ_HTYQA#Yx1Q)aR*;bPcyM!4vrXQTjC|M8MU<Efx$5RtD_p6u) z8y~9xakD_He?g7z;F84L0?@!KO7AdBQ%5lgbf#(nD0_j{{(!D5g*35>!CcM6=(Jch zH4q6J>;oVEl?hqsT3?-+rjZI-Bn_Ir(#tGHIZ+e7k1O3a5w!OXJlJQQ2-=jUkp#Lx zv{q9m9kf{3J{`PpLemPCZ4uWgs;Qxe2e>9sFtF0dw#^VkoK^}xf-6yTvcpNy$y`ZX z_0Zr{NVWw{X@Vn319Zj~XoXp3N_1kZ6^N&k44zH~?JTbZ^)?_yGU#CKV(@Wj$+7VL z=Gxj;$vR24MH<jmWID+@*`RZ%ZEY*<E37nN>TQ!iOVJYRlQT3t5cyWKS_yFu1t=mx z2?2aJF6?Lukbnj_nSy&pNm$1LG_pXODl}_#Qoys0wyBWgA3!H5K}SidK|3j}(n_ax zF>*nUd;l2?O-hi$1JW%5CA(Bx*l7l7w$K!r3~3)Jfm0Ib3<1zh)oN<6h=DgzP;a{~ zEhs2TEiQ(oJ7|<m*Ar#rthX_;ht6y#>x61rX`tu?mFA$6bwIARwY3FV22GtH5l~|S zv`!W_MhTw6R?<m=HmN{LG(y2ATtZhTgEDip5=dN0I|Ont=5)8YOu{Un#VOMRZ?OuC zgKqeVjs@*bOUsK^0*R-B)J`vCVG`4U53ePHPM(D<^aB?fp`bzodc+Gf%s@TbOsLO5 zVXPAh+Smi>?SrOFH9|FYl4?;7yM=7O1Z6j{Lld<_;P+!d4&DGI*0j86kOa73icXBR zhA5r>z>-m9x}puEI5TK;J#jj_ggVF*rI|G~8Yv);q$cKpj=BJO2DIWV2g=t;nO-=H zNo4v-UPhi&on%`BYYkA30JK9>6V{ZrPS(~2om`d#*~IS!KHsrA2{zE@k(if~1Dg7R zcn(xpDrrK`!b{bxu0^wcy2D&1iF!~|xh%D)I5R)bR>?@uNY7A72X=IWt$|K4ynPO8 zGM5zF`su)?_-qYLQ;m^M)3dFHj{#U!>SThBzy=M5fDc%+s?dQQ(qUDh15Hg<)g`I* z6(v>`kfXAp@udSE&9<u4fs9gHRn{Wisgql21v<Y>AtyDhL<w~Ct`cOmnF4qfn-c6K z?n<x~;6{~Ir4Fp?4?2?@ymQ5>y28pprxJ8IU_EFR1ITsYhL=@^4x}MxRiTrcT9T2U zVx^RplUV@1|FT2@!Bnb+-F*t5ng`WJ$(q&BQb!NEBt;`hr#hvyC=pa>TY+wX1<xge zhEQs2b&50c>&vZRM*vsqfU8w#%?xQM!)&PloiLJEX=Q1k16rwIRjC6WcmeqcHmMH^ zC{VSE!#qf99o;;GdL3}@8Wdr9iOD6IWvQTJ%2N}|QmtU40Xnc=3djcVq>B~&Kwu>$ z9moWXRV9c~l3`T|J1+`!_;s39MJ>cv#a7jjW~Nn@4rqAIstV-$ax2R!9k8RTU>DU_ z=|J~$T7hL!QuC~;bii#Kt12DP%&Aos=t5b@G4pa$?U<~#$EdS~3ovqR-)zpdPicEm z6kB@~BiHtyTi8x3P2aGIO?3OM>ujr|ShzCNG^X<yvrBDXWW*k<y!~4!`@~2Nt_<+V QWhQ8jLuC7+_3RIs0gPAxV*mgE delta 79 zcmX>#O}+WKTtf?E3sVbo3rh>@7B*4!sfJAM+m-A&!UeWh`E%@3V&vLxQN+<6wf(>u ij?*As_j`^5QQLjII17{+xwh}g<(wF~-S0T(A7%hklpL)9 diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index b896d3c97..e91235eff 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -41,7 +41,6 @@ <meta name="msapplication-TileImage" content="${srRoot}/images/ico/favicon-144.png"> <meta name="msapplication-config" content="${srRoot}/css/browserconfig.xml"> - <meta data-var="srRoot" data-content="${srRoot}"> <meta data-var="themeSpinner" data-content="${('', '-dark')[sickbeard.THEME_NAME == 'dark']}"> <meta data-var="anonURL" data-content="${sickbeard.ANON_REDIRECT}"> @@ -78,6 +77,7 @@ <link rel="apple-touch-icon" sizes="72x72" href="${srRoot}/images/ico/favicon-72.png"> <link rel="apple-touch-icon" href="${srRoot}/images/ico/favicon-57.png"> + <link rel="stylesheet" type="text/css" href="${srRoot}/css/vender.min.css?${sbPID}"/> <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/bootstrap.min.css?${sbPID}"/> <link rel="stylesheet" type="text/css" href="${srRoot}/css/browser.css?${sbPID}" /> <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/jquery-ui-1.10.4.custom.min.css?${sbPID}" /> @@ -86,7 +86,6 @@ <link rel="stylesheet" type="text/css" href="${srRoot}/css/${sickbeard.THEME_NAME}.css?${sbPID}" /> <link rel="stylesheet" type="text/css" href="${srRoot}/css/print.css?${sbPID}" /> % if srLogin: - <link rel="stylesheet" type="text/css" href="${srRoot}/css/lib/pnotify.custom.min.css?${sbPID}" /> <link rel="stylesheet" type="text/css" href="${srRoot}/css/country-flags.css?${sbPID}"/> % endif <%block name="css" /> @@ -318,11 +317,8 @@ <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower --> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.qtip-2.2.1.min.js?${sbPID}"></script><!-- Can't be added to bower --> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.ui.touch-punch-0.2.2.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script><!-- Can't be added to bower --> - <script type="text/javascript" src="${srRoot}/js/lib/pnotify.custom.min.js?${sbPID}"></script><!-- Needs to be removed --> <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/new/meta.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/new/core.js?${sbPID}"></script> -- GitLab From 3ba1af01dca2e30f8c40bc6fb5bb2f4ae4046cc7 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 17:25:03 +1030 Subject: [PATCH 186/215] remove old pnotify --- gui/slick/js/lib/pnotify.custom.min.js | Bin 27440 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 gui/slick/js/lib/pnotify.custom.min.js diff --git a/gui/slick/js/lib/pnotify.custom.min.js b/gui/slick/js/lib/pnotify.custom.min.js deleted file mode 100644 index b530874b9c8496d26425c0e3b3ca2d7fbddff6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27440 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 -- GitLab From 1805c0a92503d98c9c4113e2c77094f5646e42f0 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 17:51:47 +1030 Subject: [PATCH 187/215] update js to load it's own file and not home.js --- gui/slick/views/config_postProcessing.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index d8726aa80..182f48771 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -13,7 +13,7 @@ <%block name="scripts"> <script type="text/javascript" src="${srRoot}/js/configPostProcessing.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/new/home.js"></script> +<script type="text/javascript" src="${srRoot}/js/new/config_postProcessing.js"></script> </%block> <%block name="content"> <div id="content960"> -- GitLab From 7b11623592e4f3529e7c81b52c8946cc063b8dec Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Fri, 13 Nov 2015 23:14:52 -0800 Subject: [PATCH 188/215] Test travis caching changes --- .travis.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index f250fbdf4..74d73d121 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ +sudo: false + language: python -python: - - 2.7.10 + +python: 2.7.9 sudo: false @@ -8,13 +10,8 @@ branches: except: - master -install: echo "Nothing required!" - cache: pip -before_script: - - chmod +x ./tests/all_tests.py - script: - ./tests/all_tests.py -- GitLab From 674bec6a5be4bbe6b5da3872367efcae4c863df1 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 18:30:36 +1030 Subject: [PATCH 189/215] update tablesorter --- .build/Gruntfile.js | 8 ++++++++ .build/bower.json | 2 +- gui/slick/css/vender.min.css | Bin 3303 -> 8295 bytes .../js/lib/jquery.tablesorter-2.17.7.min.js | Bin 30757 -> 0 bytes gui/slick/js/new/config_postProcessing.js | 6 ++++-- gui/slick/js/new/displayShow.js | 4 ++-- gui/slick/js/vender.min.js | Bin 641866 -> 658226 bytes gui/slick/views/layouts/main.mako | 6 +++--- 8 files changed, 18 insertions(+), 8 deletions(-) delete mode 100644 gui/slick/js/lib/jquery.tablesorter-2.17.7.min.js diff --git a/.build/Gruntfile.js b/.build/Gruntfile.js index 8716d54c5..470fad0bf 100644 --- a/.build/Gruntfile.js +++ b/.build/Gruntfile.js @@ -8,6 +8,14 @@ module.exports = function(grunt) { ], dependencies: { }, + mainFiles: { + 'tablesorter': [ + 'dist/js/jquery.tablesorter.combined.js', + 'dist/js/widgets/widget-columnSelector.min.js', + 'dist/js/widgets/widget-stickyHeaders.min.js', + 'dist/css/theme.blue.min.css' + ] + }, bowerOptions: { relative: false } diff --git a/.build/bower.json b/.build/bower.json index ac3062b66..8ea36cfd9 100644 --- a/.build/bower.json +++ b/.build/bower.json @@ -14,7 +14,6 @@ "bootstrap": "~3.3.5", "bootstrap-hover-dropdown": "~2.1.3", "jquery-ui": "~1.11.4", - "tablesorter": "jquery.tablesorter#~2.23.5", "jquery-form": "~3.46.0", "jquery-timeago": "~1.4.3", "jquery-tokeninput": "~1.7.0", @@ -23,6 +22,7 @@ "jqueryui-touch-punch": "*", "pnotify": "~2.1.0", "qtip2": "~2.2.1", + "tablesorter": "jquery.tablesorter#~2.24.5", "jQuery Confirm": "jquery-confirm#~2.5.0" } } diff --git a/gui/slick/css/vender.min.css b/gui/slick/css/vender.min.css index f4a14e40997d6bebf9c2f64070e38628db120a38..c23d4637c1e42dbea7d6a89964b962a45fffef9a 100644 GIT binary patch literal 8295 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 N3G7s}q%=#*S^yAm@@N16 delta 49 zcmaFv@LY1Dq{`%*ObQd{>rJ%P-FW6SGk<<rYEfEFez{dfW=cwG-sEX4DHCmVH~(b0 G%MJhp_7rgd diff --git a/gui/slick/js/lib/jquery.tablesorter-2.17.7.min.js b/gui/slick/js/lib/jquery.tablesorter-2.17.7.min.js deleted file mode 100644 index 8ac7a9c071f3c9d92d57b2fbd61e53a1654a3e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30757 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 RK?f*nHL?OhTS+yoxd4}n&yWBB diff --git a/gui/slick/js/new/config_postProcessing.js b/gui/slick/js/new/config_postProcessing.js index b09818bbd..731025565 100644 --- a/gui/slick/js/new/config_postProcessing.js +++ b/gui/slick/js/new/config_postProcessing.js @@ -1,2 +1,4 @@ -$('#config-components').tabs(); -$('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' }); +$(document).ready(function(){ + $('#config-components').tabs(); + $('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' }); +}); diff --git a/gui/slick/js/new/displayShow.js b/gui/slick/js/new/displayShow.js index acc6c5d6e..dc83839e8 100644 --- a/gui/slick/js/new/displayShow.js +++ b/gui/slick/js/new/displayShow.js @@ -272,7 +272,7 @@ $(document).ready(function(){ content: '<div id="popover-target"></div>' }) // bootstrap popover event triggered when the popover opens - .on('shown.bs.popover', function () { - $.tablesorter.columnSelector.attachTo( $("#showTable, #animeTable"), '#popover-target'); + .on('shown.bs.popover', function (){ + $.tablesorter.columnSelector.attachTo($("#showTable, #animeTable"), '#popover-target'); }); }); diff --git a/gui/slick/js/vender.min.js b/gui/slick/js/vender.min.js index c479c1d2b91e11d3ede44cd18e7019c452b4cb65..c245f1543ebd54fe038c79c995029862505ada3e 100644 GIT binary patch delta 42921 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 delta 33206 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 XsWk^z2KapcOwbk*k?n!(To0K6(56o= diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index e91235eff..abaa0cb89 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -314,9 +314,9 @@ <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> - <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower --> + <!-- <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> + <!-- <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> + <!-- <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script> -- GitLab From 45216cc4e2e37fdad6af1ee3e2b4771a21bcc0d1 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 18:32:03 +1030 Subject: [PATCH 190/215] remove old tablesorter refs --- ...ablesorter.widget-columnSelector-2.17.7.js | 317 ------------------ .../jquery.tablesorter.widgets-2.17.7.min.js | Bin 33207 -> 0 bytes gui/slick/views/layouts/main.mako | 3 - 3 files changed, 320 deletions(-) delete mode 100644 gui/slick/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js delete mode 100644 gui/slick/js/lib/jquery.tablesorter.widgets-2.17.7.min.js diff --git a/gui/slick/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js b/gui/slick/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js deleted file mode 100644 index 22d641b83..000000000 --- a/gui/slick/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js +++ /dev/null @@ -1,317 +0,0 @@ -/* Column Selector/Responsive table widget (beta) for TableSorter 5/22/2014 (v2.17.0) - * Requires tablesorter v2.8+ and jQuery 1.7+ - * by Justin Hallett & Rob Garrison - */ -/*jshint browser:true, jquery:true, unused:false */ -/*global jQuery: false */ -;(function($){ -"use strict"; - -var ts = $.tablesorter, -namespace = '.tscolsel', -tsColSel = ts.columnSelector = { - - queryAll : '@media only all { [columns] { display: none; } }', - queryBreak : '@media all and (min-width: [size]) { [columns] { display: table-cell; } }', - - init: function(table, c, wo) { - var $t, colSel; - - // abort if no input is contained within the layout - $t = $(wo.columnSelector_layout); - if (!$t.find('input').add( $t.filter('input') ).length) { - if (c.debug) { - ts.log('*** ERROR: Column Selector aborting, no input found in the layout! ***'); - } - return; - } - - // unique table class name - c.tableId = 'tablesorter' + new Date().getTime(); - c.$table.addClass( c.tableId ); - - // build column selector/state array - colSel = c.selector = { $container : $(wo.columnSelector_container || '<div>') }; - colSel.$style = $('<style></style>').prop('disabled', true).appendTo('head'); - colSel.$breakpoints = $('<style></style>').prop('disabled', true).appendTo('head'); - - colSel.isInitializing = true; - tsColSel.setupSelector(table, c, wo); - - if (wo.columnSelector_mediaquery) { - tsColSel.setupBreakpoints(c, wo); - } - - colSel.isInitializing = false; - if (colSel.$container.length) { - tsColSel.updateCols(c, wo); - } - - c.$table - .off('refreshColumnSelector' + namespace) - .on('refreshColumnSelector' + namespace, function(){ - // make sure we're using current config settings - var c = this.config; - tsColSel.updateBreakpoints(c, c.widgetOptions); - tsColSel.updateCols(c, c.widgetOptions); - }); - - }, - - setupSelector: function(table, c, wo) { - var name, - colSel = c.selector, - $container = colSel.$container, - useStorage = wo.columnSelector_saveColumns && ts.storage, - // get stored column states - saved = useStorage ? ts.storage( table, 'tablesorter-columnSelector' ) : [], - state = useStorage ? ts.storage( table, 'tablesorter-columnSelector-auto') : {}; - - // initial states - colSel.auto = $.isEmptyObject(state) || $.type(state.auto) !== "boolean" ? wo.columnSelector_mediaqueryState : state.auto; - colSel.states = []; - colSel.$column = []; - colSel.$wrapper = []; - colSel.$checkbox = []; - // populate the selector container - c.$table.children('thead').find('tr:first th', table).each(function() { - var $this = $(this), - // if no data-priority is assigned, default to 1, but don't remove it from the selector list - priority = $this.attr(wo.columnSelector_priority) || 1, - colId = $this.attr('data-column'), - state = ts.getData(this, c.headers[colId], 'columnSelector'); - - - // if this column not hidable at all - // include getData check (includes "columnSelector-false" class, data attribute, etc) - if ( isNaN(priority) && priority.length > 0 || state === 'disable' || - ( wo.columnSelector_columns[colId] && wo.columnSelector_columns[colId] === 'disable') ) { - return true; // goto next - } - - // set default state; storage takes priority - colSel.states[colId] = saved && typeof(saved[colId]) !== 'undefined' ? - saved[colId] : typeof(wo.columnSelector_columns[colId]) !== 'undefined' ? - wo.columnSelector_columns[colId] : (state === 'true' || !(state === 'false')); - colSel.$column[colId] = $(this); - - // set default col title - name = $this.attr(wo.columnSelector_name) || $this.text(); - - if ($container.length) { - colSel.$wrapper[colId] = $(wo.columnSelector_layout.replace(/\{name\}/g, name)).appendTo($container); - colSel.$checkbox[colId] = colSel.$wrapper[colId] - // input may not be wrapped within the layout template - .find('input').add( colSel.$wrapper[colId].filter('input') ) - .attr('data-column', colId) - .prop('checked', colSel.states[colId]) - .on('change', function(){ - colSel.states[colId] = this.checked; - tsColSel.updateCols(c, wo); - }).change(); - } - }); - - }, - - setupBreakpoints: function(c, wo){ - var colSel = c.selector; - - // add responsive breakpoints - if (wo.columnSelector_mediaquery) { - // used by window resize function - colSel.lastIndex = -1; - wo.columnSelector_breakpoints.sort(); - tsColSel.updateBreakpoints(c, wo); - c.$table - .off('updateAll' + namespace) - .on('updateAll' + namespace, function(){ - tsColSel.updateBreakpoints(c, wo); - tsColSel.updateCols(c, wo); - }); - } - - if (colSel.$container.length) { - // Add media queries toggle - if (wo.columnSelector_mediaquery) { - colSel.$auto = $( wo.columnSelector_layout.replace(/\{name\}/g, wo.columnSelector_mediaqueryName) ).prependTo(colSel.$container); - colSel.$auto - // needed in case the input in the layout is not wrapped - .find('input').add( colSel.$auto.filter('input') ) - .attr('data-column', 'auto') - .prop('checked', colSel.auto) - .on('change', function(){ - colSel.auto = this.checked; - $.each( colSel.$checkbox, function(i, $cb){ - if ($cb) { - $cb[0].disabled = colSel.auto; - colSel.$wrapper[i].toggleClass('disabled', colSel.auto); - } - }); - if (wo.columnSelector_mediaquery) { - tsColSel.updateBreakpoints(c, wo); - } - tsColSel.updateCols(c, wo); - // copy the column selector to a popup/tooltip - if (c.selector.$popup) { - c.selector.$popup.find('.tablesorter-column-selector') - .html( colSel.$container.html() ) - .find('input').each(function(){ - var indx = $(this).attr('data-column'); - $(this).prop( 'checked', indx === 'auto' ? colSel.auto : colSel.states[indx] ); - }); - } - if (wo.columnSelector_saveColumns && ts.storage) { - ts.storage( c.$table[0], 'tablesorter-columnSelector-auto', { auto : colSel.auto } ); - } - }).change(); - } - // Add a bind on update to re-run col setup - c.$table.off('update' + namespace).on('update' + namespace, function() { - tsColSel.updateCols(c, wo); - }); - } - }, - - updateBreakpoints: function(c, wo) { - var priority, column, breaks, - colSel = c.selector, - prefix = '.' + c.tableId, - mediaAll = [], - breakpts = ''; - if (wo.columnSelector_mediaquery && !colSel.auto) { - colSel.$breakpoints.prop('disabled', true); - colSel.$style.prop('disabled', false); - return; - } - - // only 6 breakpoints (same as jQuery Mobile) - for (priority = 0; priority < 6; priority++){ - /*jshint loopfunc:true */ - breaks = []; - c.$headers.filter('[' + wo.columnSelector_priority + '=' + (priority + 1) + ']').each(function(){ - column = parseInt($(this).attr('data-column'), 10) + 1; - breaks.push(prefix + ' tr th:nth-child(' + column + ')'); - breaks.push(prefix + ' tr td:nth-child(' + column + ')'); - }); - if (breaks.length) { - mediaAll = mediaAll.concat( breaks ); - breakpts += tsColSel.queryBreak - .replace(/\[size\]/g, wo.columnSelector_breakpoints[priority]) - .replace(/\[columns\]/g, breaks.join(',')); - } - } - if (colSel.$style) { - colSel.$style.prop('disabled', true); - } - colSel.$breakpoints - .prop('disabled', false) - .html( tsColSel.queryAll.replace(/\[columns\]/g, mediaAll.join(',')) + breakpts ); - }, - - updateCols: function(c, wo) { - if (wo.columnSelector_mediaquery && c.selector.auto || c.selector.isInitializing) { - return; - } - var column, - colSel = c.selector, - styles = [], - prefix = '.' + c.tableId; - colSel.$container.find('input[data-column]').filter('[data-column!="auto"]').each(function(){ - if (!this.checked) { - column = parseInt( $(this).attr('data-column'), 10 ) + 1; - styles.push(prefix + ' tr th:nth-child(' + column + ')'); - styles.push(prefix + ' tr td:nth-child(' + column + ')'); - } - }); - if (wo.columnSelector_mediaquery){ - colSel.$breakpoints.prop('disabled', true); - } - if (colSel.$style) { - colSel.$style.prop('disabled', false).html( styles.length ? styles.join(',') + ' { display: none; }' : '' ); - } - if (wo.columnSelector_saveColumns && ts.storage) { - ts.storage( c.$table[0], 'tablesorter-columnSelector', colSel.states ); - } - }, - - attachTo : function(table, elm) { - table = $(table)[0]; - var colSel, wo, indx, - c = table.config, - $popup = $(elm); - if ($popup.length && c) { - if (!$popup.find('.tablesorter-column-selector').length) { - // add a wrapper to add the selector into, in case the popup has other content - $popup.append('<span class="tablesorter-column-selector"></span>'); - } - colSel = c.selector; - wo = c.widgetOptions; - $popup.find('.tablesorter-column-selector') - .html( colSel.$container.html() ) - .find('input').each(function(){ - var indx = $(this).attr('data-column'); - $(this).prop( 'checked', indx === 'auto' ? colSel.auto : colSel.states[indx] ); - }); - colSel.$popup = $popup.on('change', 'input', function(){ - // data input - indx = $(this).attr('data-column'); - // update original popup - colSel.$container.find('input[data-column="' + indx + '"]') - .prop('checked', this.checked) - .trigger('change'); - }); - } - } - -}; - -ts.addWidget({ - id: "columnSelector", - priority: 10, - options: { - // target the column selector markup - columnSelector_container : null, - // column status, true = display, false = hide - // disable = do not display on list - columnSelector_columns : {}, - // remember selected columns - columnSelector_saveColumns: true, - - // container layout - columnSelector_layout : '<label><input type="checkbox">{name}</label>', - // data attribute containing column name to use in the selector container - columnSelector_name : 'data-selector-name', - - /* Responsive Media Query settings */ - // enable/disable mediaquery breakpoints - columnSelector_mediaquery: true, - // toggle checkbox name - columnSelector_mediaqueryName: 'Auto: ', - // breakpoints checkbox initial setting - columnSelector_mediaqueryState: true, - // responsive table hides columns with priority 1-6 at these breakpoints - // see http://view.jquerymobile.com/1.3.2/dist/demos/widgets/table-column-toggle/#Applyingapresetbreakpoint - // *** set to false to disable *** - columnSelector_breakpoints : [ '20em', '30em', '40em', '50em', '60em', '70em' ], - // data attribute containing column priority - // duplicates how jQuery mobile uses priorities: - // http://view.jquerymobile.com/1.3.2/dist/demos/widgets/table-column-toggle/ - columnSelector_priority : 'data-priority' - - }, - init: function(table, thisWidget, c, wo) { - tsColSel.init(table, c, wo); - }, - remove: function(table, c){ - var csel = c.selector; - csel.$container.empty(); - if (csel.$popup) { csel.$popup.empty(); } - csel.$style.remove(); - csel.$breakpoints.remove(); - c.$table.off('updateAll' + namespace + ' update' + namespace); - } - -}); - -})(jQuery); diff --git a/gui/slick/js/lib/jquery.tablesorter.widgets-2.17.7.min.js b/gui/slick/js/lib/jquery.tablesorter.widgets-2.17.7.min.js deleted file mode 100644 index 18996733f54b6a0ddd4a7c38a870633426d3a447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33207 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 diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index abaa0cb89..3499cb7e0 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -314,9 +314,6 @@ <script type="text/javascript" src="${srRoot}/js/lib/jquery.cookiejar.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.json-2.2.min.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/lib/jquery.selectboxes.min.js?${sbPID}"></script> - <!-- <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> - <!-- <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widgets-2.17.7.min.js?${sbPID}"></script><!-- Can't be added to bower --> - <!-- <script type="text/javascript" src="${srRoot}/js/lib/jquery.tablesorter.widget-columnSelector-2.17.7.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/isotope.pkgd.min.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script> -- GitLab From 04f5541531de7551e323ee52401f11d6049c94c4 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 20:55:01 +1030 Subject: [PATCH 191/215] fix broken js when there's no failed downloads --- gui/slick/js/failedDownloads.js | 37 +++++++++++---------- gui/slick/views/manage_failedDownloads.mako | 3 +- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/gui/slick/js/failedDownloads.js b/gui/slick/js/failedDownloads.js index 4b991fc2a..7b8a16a81 100644 --- a/gui/slick/js/failedDownloads.js +++ b/gui/slick/js/failedDownloads.js @@ -22,26 +22,29 @@ $(document).ready(function(){ }); }); - $('.removeCheck').forEach(function(name) { - var lastCheck = null; - $(name).click(function(event) { - if(!lastCheck || !event.shiftKey) { - lastCheck = this; - return; - } + if($('.removeCheck').length){ + $('.removeCheck').forEach(function(name) { + var lastCheck = null; + $(name).click(function(event) { + if(!lastCheck || !event.shiftKey) { + lastCheck = this; + return; + } - var check = this; - var found = 0; + var check = this; + var found = 0; - $(name+':visible').each(function() { - switch (found) { - case 2: return false; - case 1: - this.checked = lastCheck.checked; - } + $(name+':visible').each(function() { + switch (found) { + case 2: return false; + case 1: + this.checked = lastCheck.checked; + } - if (this === check || this === lastCheck) { found++; } + if (this === check || this === lastCheck) { found++; } + }); }); }); - }); + } + }); diff --git a/gui/slick/views/manage_failedDownloads.mako b/gui/slick/views/manage_failedDownloads.mako index dbce4121f..4c56c324b 100644 --- a/gui/slick/views/manage_failedDownloads.mako +++ b/gui/slick/views/manage_failedDownloads.mako @@ -47,7 +47,6 @@ </tfoot> <tbody> % for hItem in failedResults: -<% curRemove = "<input type=\"checkbox\" class=\"removeCheck\" id=\"remove-"+hItem["release"]+"\" />" %> <tr> <td class="nowrap">${hItem["release"]}</td> <td align="center"> @@ -65,7 +64,7 @@ <img src="${srRoot}/images/providers/missing.png" width="16" height="16" alt="missing provider" title="missing provider"/> % endif </td> - <td align="center">${curRemove}</td> + <td align="center"><input type="checkbox" class="removeCheck" id="remove-${hItem["release"]}" /></td> </tr> % endfor </tbody> -- GitLab From 0c5dec742a317c9b43c22a2280ea9244b674fa69 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 22:33:54 +1030 Subject: [PATCH 192/215] fix jquery-confirm bower package --- .build/bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.build/bower.json b/.build/bower.json index 8ea36cfd9..3fe6fa1b8 100644 --- a/.build/bower.json +++ b/.build/bower.json @@ -23,6 +23,6 @@ "pnotify": "~2.1.0", "qtip2": "~2.2.1", "tablesorter": "jquery.tablesorter#~2.24.5", - "jQuery Confirm": "jquery-confirm#~2.5.0" + "jquery-confirm": "~2.5.1" } } -- GitLab From 949bdab7564ba6d20e8054d25ab5313f346a2c3d Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sat, 14 Nov 2015 22:34:25 +1030 Subject: [PATCH 193/215] update for loops to use cache for length --- gui/slick/js/configNotifications.js | 4 ++-- gui/slick/js/configPostProcessing.js | 2 +- gui/slick/js/configProviders.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gui/slick/js/configNotifications.js b/gui/slick/js/configNotifications.js index 5c69d7d47..f2bae59c2 100644 --- a/gui/slick/js/configNotifications.js +++ b/gui/slick/js/configNotifications.js @@ -271,7 +271,7 @@ $(document).ready(function(){ var nmjv2_host = $('#nmjv2_host').val(); var nmjv2_dbloc; var radios = document.getElementsByName('nmjv2_dbloc'); - for (var i = 0; i < radios.length; i++) { + for(var i = 0, len = radios.length; i < len; i++) { if (radios[i].checked) { nmjv2_dbloc=radios[i].value; break; @@ -498,7 +498,7 @@ $(document).ready(function(){ var devices = jQuery.parseJSON(data).devices; var current_pushbullet_device = $("#pushbullet_device").val(); $("#pushbullet_device_list").html(''); - for (var i = 0; i < devices.length; i++) { + for (var i = 0, len = devices.length; i < len; i++) { if(devices[i].active === true) { if(current_pushbullet_device == devices[i].iden) { $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>'); diff --git a/gui/slick/js/configPostProcessing.js b/gui/slick/js/configPostProcessing.js index ff1bb61ad..f5a1ff8a1 100644 --- a/gui/slick/js/configPostProcessing.js +++ b/gui/slick/js/configPostProcessing.js @@ -395,7 +395,7 @@ $(document).ready(function () { config_arr.push(season_all_banner ? '1' : '0'); var cur_num = 0; - for (var i = 0; i < config_arr.length; i++) { + for (var i = 0, len = config_arr.length; i < len; i++) { cur_num += parseInt(config_arr[i]); } if (cur_num > cur_most) { diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js index 2f6e1bc1f..e2a7a49ed 100644 --- a/gui/slick/js/configProviders.js +++ b/gui/slick/js/configProviders.js @@ -325,7 +325,7 @@ $(document).ready(function(){ if (finalArr.length > 0) { $('<select>').prop('id','editAProvider').addClass('form-control input-sm').appendTo('#provider-list'); - for (var i = 0; i < finalArr.length; i++) { + for (var i = 0, len = finalArr.length; i < len; i++) { var provider = finalArr[i]; $('#editAProvider').append($('<option>').prop('value',provider).text($.trim($('#'+provider).text()).replace(/\s\*$/, '').replace(/\s\*\*$/, ''))); } -- GitLab From 3b5cb718661883b9295798edd82a73f62f6ef7ae Mon Sep 17 00:00:00 2001 From: medariox <dariovizz@hotmail.it> Date: Sat, 14 Nov 2015 13:48:12 +0100 Subject: [PATCH 194/215] Fixed js breaking when shows accessed from 'recent shows' dropdown --- gui/slick/views/layouts/main.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index 3499cb7e0..e3375a7ce 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -117,7 +117,7 @@ % if sickbeard.SHOWS_RECENT: <li role="separator" class="divider"></li> % for recentShow in sickbeard.SHOWS_RECENT: - <li><a href="${srRoot}/home/displayShow/?show=${recentShow['indexerid']}"><i class="menu-icon-addshow"></i> ${recentShow['name']|trim,h}</a></li> + <li><a href="${srRoot}/home/displayShow?show=${recentShow['indexerid']}"><i class="menu-icon-addshow"></i> ${recentShow['name']|trim,h}</a></li> % endfor % endif </ul> -- GitLab From 226dea57fb503704c1d59f4e719b080554072328 Mon Sep 17 00:00:00 2001 From: Dustyn Gibson <miigotu@gmail.com> Date: Sat, 14 Nov 2015 21:14:09 -0800 Subject: [PATCH 195/215] Temporarily re-add the sys reload hack until remaining known encoding issues are fixed correctly, so that we can merge to master --- SickBeard.py | 12 ++++++++++++ sickbeard/postProcessor.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/SickBeard.py b/SickBeard.py index 4780cf802..e9a3fa0d3 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -155,6 +155,18 @@ class SickRage(object): (sys.platform.startswith('win') and sys.getwindowsversion()[0] >= 6 and getattr(sys.stdout, 'device', sys.stdout).encoding.lower() in ('cp65001', 'charmap')): sickbeard.SYS_ENCODING = 'UTF-8' + # TODO: Continue working on making this unnecessary, this hack creates all sorts of hellish problems + if not hasattr(sys, "setdefaultencoding"): + reload(sys) + + try: + # pylint: disable=E1101 + # On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError + sys.setdefaultencoding(sickbeard.SYS_ENCODING) + except Exception: + sys.exit("Sorry, you MUST add the SickRage folder to the PYTHONPATH environment variable\n" + + "or find another way to force Python to use " + sickbeard.SYS_ENCODING + " for string encoding.") + # Need console logging for SickBeard.py and SickBeard-console.exe self.consoleLogging = (not hasattr(sys, "frozen")) or (sickbeard.MY_NAME.lower().find('-console') > 0) diff --git a/sickbeard/postProcessor.py b/sickbeard/postProcessor.py index 7eda8ef84..e66f7c4ec 100644 --- a/sickbeard/postProcessor.py +++ b/sickbeard/postProcessor.py @@ -514,7 +514,7 @@ class PostProcessor(object): if not name: return to_return - logger.log(u"Analyzing name " + repr(name), logger.DEBUG) + logger.log(u"Analyzing name " + name, logger.DEBUG) name = helpers.remove_non_release_groups(helpers.remove_extension(name)) -- GitLab From bea68f65c79ad08d7b4d01567288801139bf3a64 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 02:02:10 +1030 Subject: [PATCH 196/215] move js to SICKRAGE object --- .build/bower.json | 2 +- .jshintrc | 2 +- gui/slick/js/config.js | 0 gui/slick/js/configBackupRestore.js | 24 - gui/slick/js/configNotifications.js | 575 ----- gui/slick/js/configPostProcessing.js | 475 ---- gui/slick/js/configProviders.js | 570 ----- gui/slick/js/configSearch.js | 222 -- gui/slick/js/configSubtitles.js | 59 - gui/slick/js/core.js | 2269 +++++++++++++++++ gui/slick/js/core.min.js | Bin 0 -> 51335 bytes .../js/lib/jquery.scrolltopcontrol-1.1.js | 131 +- gui/slick/js/new/config_backuprestore.js | 119 - gui/slick/js/new/config_general.js | 131 - gui/slick/js/new/config_notifications.js | 3 - gui/slick/js/new/config_postProcessing.js | 4 - gui/slick/js/new/config_search.js | 4 - gui/slick/js/new/config_subtitles.js | 0 gui/slick/js/new/core.js | 73 - gui/slick/views/config_anime.mako | 4 - gui/slick/views/config_general.mako | 2 - gui/slick/views/config_notifications.mako | 6 - gui/slick/views/config_postProcessing.mako | 6 - gui/slick/views/config_providers.mako | 2 - gui/slick/views/layouts/main.mako | 8 +- sickbeard/webserve.py | 68 +- 26 files changed, 2387 insertions(+), 2372 deletions(-) delete mode 100644 gui/slick/js/config.js delete mode 100644 gui/slick/js/configBackupRestore.js delete mode 100644 gui/slick/js/configNotifications.js delete mode 100644 gui/slick/js/configPostProcessing.js delete mode 100644 gui/slick/js/configSearch.js delete mode 100644 gui/slick/js/configSubtitles.js create mode 100644 gui/slick/js/core.js create mode 100644 gui/slick/js/core.min.js delete mode 100644 gui/slick/js/new/config_backuprestore.js delete mode 100644 gui/slick/js/new/config_general.js delete mode 100644 gui/slick/js/new/config_notifications.js delete mode 100644 gui/slick/js/new/config_postProcessing.js delete mode 100644 gui/slick/js/new/config_search.js delete mode 100644 gui/slick/js/new/config_subtitles.js delete mode 100644 gui/slick/js/new/core.js diff --git a/.build/bower.json b/.build/bower.json index 3fe6fa1b8..431e80790 100644 --- a/.build/bower.json +++ b/.build/bower.json @@ -23,6 +23,6 @@ "pnotify": "~2.1.0", "qtip2": "~2.2.1", "tablesorter": "jquery.tablesorter#~2.24.5", - "jquery-confirm": "~2.5.1" + "jquery-confirm": "~2.5.2" } } diff --git a/.jshintrc b/.jshintrc index 1509de9ae..e24a91c93 100644 --- a/.jshintrc +++ b/.jshintrc @@ -10,7 +10,7 @@ "indent": 4, "jquery": true, "latedef": true, - "maxerr": 2, + "maxerr": 100, "noarg": true, "noempty": true, "nonbsp": true, diff --git a/gui/slick/js/config.js b/gui/slick/js/config.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/gui/slick/js/configBackupRestore.js b/gui/slick/js/configBackupRestore.js deleted file mode 100644 index fc690ba76..000000000 --- a/gui/slick/js/configBackupRestore.js +++ /dev/null @@ -1,24 +0,0 @@ -$(document).ready(function(){ - var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; - - $('#Backup').click(function() { - $("#Backup").attr("disabled", true); - $('#Backup-result').html(loading); - var backupDir = $("#backupDir").val(); - $.get(srRoot + "/config/backuprestore/backup", {'backupDir': backupDir}) - .done(function (data) { - $('#Backup-result').html(data); - $("#Backup").attr("disabled", false); - }); - }); - $('#Restore').click(function() { - $("#Restore").attr("disabled", true); - $('#Restore-result').html(loading); - var backupFile = $("#backupFile").val(); - $.get(srRoot + "/config/backuprestore/restore", {'backupFile': backupFile}) - .done(function (data) { - $('#Restore-result').html(data); - $("#Restore").attr("disabled", false); - }); - }); -}); diff --git a/gui/slick/js/configNotifications.js b/gui/slick/js/configNotifications.js deleted file mode 100644 index f2bae59c2..000000000 --- a/gui/slick/js/configNotifications.js +++ /dev/null @@ -1,575 +0,0 @@ -$(document).ready(function(){ - var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; - - $('#testGrowl').click(function () { - var growl_host = $.trim($('#growl_host').val()); - var growl_password = $.trim($('#growl_password').val()); - if (!growl_host) { - $('#testGrowl-result').html('Please fill out the necessary fields above.'); - $('#growl_host').addClass('warning'); - return; - } - $('#growl_host').removeClass('warning'); - $(this).prop('disabled', true); - $('#testGrowl-result').html(loading); - $.get(srRoot + '/home/testGrowl', {'host': growl_host, 'password': growl_password}) - .done(function (data) { - $('#testGrowl-result').html(data); - $('#testGrowl').prop('disabled', false); - }); - }); - - $('#testProwl').click(function () { - var prowl_api = $.trim($('#prowl_api').val()); - var prowl_priority = $('#prowl_priority').val(); - if (!prowl_api) { - $('#testProwl-result').html('Please fill out the necessary fields above.'); - $('#prowl_api').addClass('warning'); - return; - } - $('#prowl_api').removeClass('warning'); - $(this).prop('disabled', true); - $('#testProwl-result').html(loading); - $.get(srRoot + '/home/testProwl', {'prowl_api': prowl_api, 'prowl_priority': prowl_priority}).done(function (data) { - $('#testProwl-result').html(data); - $('#testProwl').prop('disabled', false); - }); - }); - - $('#testKODI').click(function () { - var kodi_host = $.trim($('#kodi_host').val()); - var kodi_username = $.trim($('#kodi_username').val()); - var kodi_password = $.trim($('#kodi_password').val()); - if (!kodi_host) { - $('#testKODI-result').html('Please fill out the necessary fields above.'); - $('#kodi_host').addClass('warning'); - return; - } - $('#kodi_host').removeClass('warning'); - $(this).prop('disabled', true); - $('#testKODI-result').html(loading); - $.get(srRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password}).done(function (data) { - $('#testKODI-result').html(data); - $('#testKODI').prop('disabled', false); - }); - }); - - $('#testPMC').click(function () { - var plex_host = $.trim($('#plex_host').val()); - var plex_client_username = $.trim($('#plex_client_username').val()); - var plex_client_password = $.trim($('#plex_client_password').val()); - if (!plex_host) { - $('#testPMC-result').html('Please fill out the necessary fields above.'); - $('#plex_host').addClass('warning'); - return; - } - $('#plex_host').removeClass('warning'); - $(this).prop('disabled', true); - $('#testPMC-result').html(loading); - $.get(srRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password}).done(function (data) { - $('#testPMC-result').html(data); - $('#testPMC').prop('disabled', false); - }); - }); - - $('#testPMS').click(function () { - var plex_server_host = $.trim($('#plex_server_host').val()); - var plex_username = $.trim($('#plex_username').val()); - var plex_password = $.trim($('#plex_password').val()); - var plex_server_token = $.trim($('#plex_server_token').val()); - if (!plex_server_host) { - $('#testPMS-result').html('Please fill out the necessary fields above.'); - $('#plex_server_host').addClass('warning'); - return; - } - $('#plex_server_host').removeClass('warning'); - $(this).prop('disabled', true); - $('#testPMS-result').html(loading); - $.get(srRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token}).done(function (data) { - $('#testPMS-result').html(data); - $('#testPMS').prop('disabled', false); - }); - }); - - $('#testEMBY').click(function () { - var emby_host = $('#emby_host').val(); - var emby_apikey = $('#emby_apikey').val(); - if (!emby_host || !emby_apikey) { - $('#testEMBY-result').html('Please fill out the necessary fields above.'); - if (!emby_host) { - $('#emby_host').addClass('warning'); - } else { - $('#emby_host').removeClass('warning'); - } - if (!emby_apikey) { - $('#emby_apikey').addClass('warning'); - } else { - $('#emby_apikey').removeClass('warning'); - } - return; - } - $('#emby_host,#emby_apikey').removeClass('warning'); - $(this).prop('disabled', true); - $('#testEMBY-result').html(loading); - $.get(srRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey}).done(function (data) { - $('#testEMBY-result').html(data); - $('#testEMBY').prop('disabled', false); - }); - }); - - $('#testBoxcar').click(function() { - var boxcar_username = $.trim($('#boxcar_username').val()); - if (!boxcar_username) { - $('#testBoxcar-result').html('Please fill out the necessary fields above.'); - $('#boxcar_username').addClass('warning'); - return; - } - $('#boxcar_username').removeClass('warning'); - $(this).prop('disabled', true); - $('#testBoxcar-result').html(loading); - $.get(srRoot + '/home/testBoxcar', {'username': boxcar_username}).done(function (data) { - $('#testBoxcar-result').html(data); - $('#testBoxcar').prop('disabled', false); - }); - }); - - $('#testBoxcar2').click(function () { - var boxcar2_accesstoken = $.trim($('#boxcar2_accesstoken').val()); - if (!boxcar2_accesstoken) { - $('#testBoxcar2-result').html('Please fill out the necessary fields above.'); - $('#boxcar2_accesstoken').addClass('warning'); - return; - } - $('#boxcar2_accesstoken').removeClass('warning'); - $(this).prop('disabled', true); - $('#testBoxcar2-result').html(loading); - $.get(srRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken}).done(function (data) { - $('#testBoxcar2-result').html(data); - $('#testBoxcar2').prop('disabled', false); - }); - }); - - $('#testPushover').click(function () { - var pushover_userkey = $('#pushover_userkey').val(); - var pushover_apikey = $('#pushover_apikey').val(); - if (!pushover_userkey || !pushover_apikey) { - $('#testPushover-result').html('Please fill out the necessary fields above.'); - if (!pushover_userkey) { - $('#pushover_userkey').addClass('warning'); - } else { - $('#pushover_userkey').removeClass('warning'); - } - if (!pushover_apikey) { - $('#pushover_apikey').addClass('warning'); - } else { - $('#pushover_apikey').removeClass('warning'); - } - return; - } - $('#pushover_userkey,#pushover_apikey').removeClass('warning'); - $(this).prop('disabled', true); - $('#testPushover-result').html(loading); - $.get(srRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey}).done(function (data) { - $('#testPushover-result').html(data); - $('#testPushover').prop('disabled', false); - }); - }); - - $('#testLibnotify').click(function() { - $('#testLibnotify-result').html(loading); - $.get(srRoot + '/home/testLibnotify', function (data) { - $('#testLibnotify-result').html(data); - }); - }); - - $('#twitterStep1').click(function() { - $('#testTwitter-result').html(loading); - $.get(srRoot + '/home/twitterStep1', function (data) { - window.open(data); - }).done(function() { - $('#testTwitter-result').html('<b>Step1:</b> Confirm Authorization'); - }); - }); - - $('#twitterStep2').click(function () { - var twitter_key = $.trim($('#twitter_key').val()); - if (!twitter_key) { - $('#testTwitter-result').html('Please fill out the necessary fields above.'); - $('#twitter_key').addClass('warning'); - return; - } - $('#twitter_key').removeClass('warning'); - $('#testTwitter-result').html(loading); - $.get(srRoot + '/home/twitterStep2', {'key': twitter_key}, function(data) { - $('#testTwitter-result').html(data); - }); - }); - - $('#testTwitter').click(function() { - $.get(srRoot + '/home/testTwitter', function(data) { - $('#testTwitter-result').html(data); - }); - }); - - $('#settingsNMJ').click(function() { - if (!$('#nmj_host').val()) { - alert('Please fill in the Popcorn IP address'); - $('#nmj_host').focus(); - return; - } - $('#testNMJ-result').html(loading); - var nmj_host = $('#nmj_host').val(); - - $.get(srRoot + '/home/settingsNMJ', {'host': nmj_host}, function (data) { - if (data === null) { - $('#nmj_database').removeAttr('readonly'); - $('#nmj_mount').removeAttr('readonly'); - } - var JSONData = $.parseJSON(data); - $('#testNMJ-result').html(JSONData.message); - $('#nmj_database').val(JSONData.database); - $('#nmj_mount').val(JSONData.mount); - - if (JSONData.database) { - $('#nmj_database').attr('readonly', true); - } else { - $('#nmj_database').removeAttr('readonly'); - } - if (JSONData.mount) { - $('#nmj_mount').attr('readonly', true); - } else { - $('#nmj_mount').removeAttr('readonly'); - } - }); - }); - - $('#testNMJ').click(function () { - var nmj_host = $.trim($('#nmj_host').val()); - var nmj_database = $('#nmj_database').val(); - var nmj_mount = $('#nmj_mount').val(); - if (!nmj_host) { - $('#testNMJ-result').html('Please fill out the necessary fields above.'); - $('#nmj_host').addClass('warning'); - return; - } - $('#nmj_host').removeClass('warning'); - $(this).prop('disabled', true); - $('#testNMJ-result').html(loading); - $.get(srRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount}).done(function (data) { - $('#testNMJ-result').html(data); - $('#testNMJ').prop('disabled', false); - }); - }); - - $('#settingsNMJv2').click(function() { - if (!$('#nmjv2_host').val()) { - alert('Please fill in the Popcorn IP address'); - $('#nmjv2_host').focus(); - return; - } - $('#testNMJv2-result').html(loading); - var nmjv2_host = $('#nmjv2_host').val(); - var nmjv2_dbloc; - var radios = document.getElementsByName('nmjv2_dbloc'); - for(var i = 0, len = radios.length; i < len; i++) { - if (radios[i].checked) { - nmjv2_dbloc=radios[i].value; - break; - } - } - - var nmjv2_dbinstance=$('#NMJv2db_instance').val(); - $.get(srRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance}, function (data){ - if (data === null) { - $('#nmjv2_database').removeAttr('readonly'); - } - var JSONData = $.parseJSON(data); - $('#testNMJv2-result').html(JSONData.message); - $('#nmjv2_database').val(JSONData.database); - - if (JSONData.database){ - $('#nmjv2_database').attr('readonly', true); - } else { - $('#nmjv2_database').removeAttr('readonly'); - } - }); - }); - - $('#testNMJv2').click(function () { - var nmjv2_host = $.trim($('#nmjv2_host').val()); - if (!nmjv2_host) { - $('#testNMJv2-result').html('Please fill out the necessary fields above.'); - $('#nmjv2_host').addClass('warning'); - return; - } - $('#nmjv2_host').removeClass('warning'); - $(this).prop('disabled', true); - $('#testNMJv2-result').html(loading); - $.get(srRoot + '/home/testNMJv2', {'host': nmjv2_host}) .done(function (data) { - $('#testNMJv2-result').html(data); - $('#testNMJv2').prop('disabled', false); - }); - }); - - $('#testFreeMobile').click(function () { - var freemobile_id = $.trim($('#freemobile_id').val()); - var freemobile_apikey = $.trim($('#freemobile_apikey').val()); - if (!freemobile_id || !freemobile_apikey) { - $('#testFreeMobile-result').html('Please fill out the necessary fields above.'); - if (!freemobile_id) { - $('#freemobile_id').addClass('warning'); - } else { - $('#freemobile_id').removeClass('warning'); - } - if (!freemobile_apikey) { - $('#freemobile_apikey').addClass('warning'); - } else { - $('#freemobile_apikey').removeClass('warning'); - } - return; - } - $('#freemobile_id,#freemobile_apikey').removeClass('warning'); - $(this).prop('disabled', true); - $('#testFreeMobile-result').html(loading); - $.get(srRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey}).done(function (data) { - $('#testFreeMobile-result').html(data); - $('#testFreeMobile').prop('disabled', false); - }); - }); - - $('#TraktGetPin').click(function () { - var trakt_pin_url = $('#trakt_pin_url').val(); - var w; - w = window.open(trakt_pin_url, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550"); - $('#trakt_pin').removeClass('hide'); - }); - - $('#trakt_pin').on('keyup change', function(){ - var trakt_pin = $('#trakt_pin').val(); - - if (trakt_pin.length !== 0) { - $('#TraktGetPin').addClass('hide'); - $('#authTrakt').removeClass('hide'); - } else { - $('#TraktGetPin').removeClass('hide'); - $('#authTrakt').addClass('hide'); - } - }); - - $('#authTrakt').click(function() { - var trakt_pin = $('#trakt_pin').val(); - if (trakt_pin.length !== 0) { - $.get(srRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin }).done(function (data) { - $('#testTrakt-result').html(data); - $('#authTrakt').addClass('hide'); - $('#trakt_pin').addClass('hide'); - $('#TraktGetPin').addClass('hide'); - }); - } - }); - - $('#testTrakt').click(function () { - var trakt_username = $.trim($('#trakt_username').val()); - var trakt_trending_blacklist = $.trim($('#trakt_blacklist_name').val()); - if (!trakt_username) { - $('#testTrakt-result').html('Please fill out the necessary fields above.'); - if (!trakt_username) { - $('#trakt_username').addClass('warning'); - } else { - $('#trakt_username').removeClass('warning'); - } - return; - } - - if (/\s/g.test(trakt_trending_blacklist)) { - $('#testTrakt-result').html('Check blacklist name; the value need to be a trakt slug'); - $('#trakt_blacklist_name').addClass('warning'); - return; - } - $('#trakt_username').removeClass('warning'); - $('#trakt_blacklist_name').removeClass('warning'); - $(this).prop('disabled', true); - $('#testTrakt-result').html(loading); - $.get(srRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist}).done(function (data) { - $('#testTrakt-result').html(data); - $('#testTrakt').prop('disabled', false); - }); - }); - - $('#testEmail').click(function () { - var status, host, port, tls, from, user, pwd, err, to; - status = $('#testEmail-result'); - status.html(loading); - host = $('#email_host').val(); - host = host.length > 0 ? host : null; - port = $('#email_port').val(); - port = port.length > 0 ? port : null; - tls = $('#email_tls').attr('checked') !== undefined ? 1 : 0; - from = $('#email_from').val(); - from = from.length > 0 ? from : 'root@localhost'; - user = $('#email_user').val().trim(); - pwd = $('#email_password').val(); - err = ''; - if (host === null) { - err += '<li style="color: red;">You must specify an SMTP hostname!</li>'; - } - if (port === null) { - err += '<li style="color: red;">You must specify an SMTP port!</li>'; - } else if (port.match(/^\d+$/) === null || parseInt(port, 10) > 65535) { - err += '<li style="color: red;">SMTP port must be between 0 and 65535!</li>'; - } - if (err.length > 0) { - err = '<ol>' + err + '</ol>'; - status.html(err); - } else { - to = prompt('Enter an email address to send the test to:', null); - if (to === null || to.length === 0 || to.match(/.*@.*/) === null) { - status.html('<p style="color: red;">You must provide a recipient email address!</p>'); - } else { - $.get(srRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to}, function (msg) { - $('#testEmail-result').html(msg); - }); - } - } - }); - - $('#testNMA').click(function () { - var nma_api = $.trim($('#nma_api').val()); - var nma_priority = $('#nma_priority').val(); - if (!nma_api) { - $('#testNMA-result').html('Please fill out the necessary fields above.'); - $('#nma_api').addClass('warning'); - return; - } - $('#nma_api').removeClass('warning'); - $(this).prop('disabled', true); - $('#testNMA-result').html(loading); - $.get(srRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority}).done(function (data) { - $('#testNMA-result').html(data); - $('#testNMA').prop('disabled', false); - }); - }); - - $('#testPushalot').click(function () { - var pushalot_authorizationtoken = $.trim($('#pushalot_authorizationtoken').val()); - if (!pushalot_authorizationtoken) { - $('#testPushalot-result').html('Please fill out the necessary fields above.'); - $('#pushalot_authorizationtoken').addClass('warning'); - return; - } - $('#pushalot_authorizationtoken').removeClass('warning'); - $(this).prop('disabled', true); - $('#testPushalot-result').html(loading); - $.get(srRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken}).done(function (data) { - $('#testPushalot-result').html(data); - $('#testPushalot').prop('disabled', false); - }); - }); - - $('#testPushbullet').click(function () { - var pushbullet_api = $.trim($('#pushbullet_api').val()); - if (!pushbullet_api) { - $('#testPushbullet-result').html('Please fill out the necessary fields above.'); - $('#pushbullet_api').addClass('warning'); - return; - } - $('#pushbullet_api').removeClass('warning'); - $(this).prop('disabled', true); - $('#testPushbullet-result').html(loading); - $.get(srRoot + '/home/testPushbullet', {'api': pushbullet_api}).done(function (data) { - $('#testPushbullet-result').html(data); - $('#testPushbullet').prop('disabled', false); - }); - }); - - function get_pushbullet_devices(msg){ - - if(msg) $('#testPushbullet-result').html(loading); - - var pushbullet_api = $("#pushbullet_api").val(); - - if(!pushbullet_api) { - $('#testPushbullet-result').html("You didn't supply a Pushbullet api key"); - $("#pushbullet_api").focus(); - return false; - } - - $.get(srRoot + "/home/getPushbulletDevices", {'api': pushbullet_api}, function (data) { - var devices = jQuery.parseJSON(data).devices; - var current_pushbullet_device = $("#pushbullet_device").val(); - $("#pushbullet_device_list").html(''); - for (var i = 0, len = devices.length; i < len; i++) { - if(devices[i].active === true) { - if(current_pushbullet_device == devices[i].iden) { - $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>'); - } else { - $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>'); - } - } - } - if (current_pushbullet_device === '') { - $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>'); - } else { - $("#pushbullet_device_list").prepend('<option value="">All devices</option>'); - } - if(msg) $('#testPushbullet-result').html(msg); - }); - - $("#pushbullet_device_list").change(function(){ - $("#pushbullet_device").val($("#pushbullet_device_list").val()); - $('#testPushbullet-result').html("Don't forget to save your new pushbullet settings."); - }); - } - - $('#getPushbulletDevices').click(function(){ - get_pushbullet_devices("Device list updated. Please choose a device to push to."); - }); - - // we have to call this function on dom ready to create the devices select - get_pushbullet_devices(); - - $('#email_show').change(function() { - var key = parseInt($('#email_show').val(), 10); - $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); - }); - - // Update the internal data struct anytime settings are saved to the server - $('#email_show').bind('notify', function() { - load_show_notify_lists(); - }); - - function load_show_notify_lists() { - $.get(srRoot + "/home/loadShowNotifyLists", function(data) { - var list, html, s; - list = $.parseJSON(data); - notify_data = list; - if (list._size === 0) return; - html = '<option value="-1">-- Select --</option>'; - for (s in list) { - if (s.charAt(0) !== '_') { - html += '<option value="' + list[s].id + '">' + $('<div/>').text(list[s].name).html() + '</option>'; - } - } - $('#email_show').html(html); - $('#email_show_list').val(''); - }); - } - // Load the per show notify lists everytime this page is loaded - load_show_notify_lists(); - - $('#email_show_save').click(function() { - $.post(srRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) { - // Reload the per show notify lists to reflect changes - load_show_notify_lists(); - }); - }); - - // show instructions for plex when enabled - $('#use_plex').click(function() { - if ($(this).is(':checked')) { - $('.plexinfo').removeClass('hide'); - } else { - $('.plexinfo').addClass('hide'); - } - }); -}); diff --git a/gui/slick/js/configPostProcessing.js b/gui/slick/js/configPostProcessing.js deleted file mode 100644 index f5a1ff8a1..000000000 --- a/gui/slick/js/configPostProcessing.js +++ /dev/null @@ -1,475 +0,0 @@ -$(document).ready(function () { - // http://stackoverflow.com/questions/2219924/idiomatic-jquery-delayed-event-only-after-a-short-pause-in-typing-e-g-timew - var typewatch = (function () { - var timer = 0; - return function (callback, ms) { - clearTimeout(timer); - timer = setTimeout(callback, ms); - }; - })(); - - function israr_supported() { - var pattern = $('#naming_pattern').val(); - $.get(srRoot + '/config/postProcessing/isRarSupported', function (data) { - if (data !== "supported") { - $('#unpack').qtip('option', { - 'content.text': 'Unrar Executable not found.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#unpack').qtip('toggle', true); - $('#unpack').css('background-color', '#FFFFDD'); - } - }); - } - - function fill_examples() { - var pattern = $('#naming_pattern').val(); - var multi = $('#naming_multi_ep :selected').val(); - var anime_type = $('input[name="naming_anime"]:checked').val(); - - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3}, function (data) { - if (data) { - $('#naming_example').text(data + '.ext'); - $('#naming_example_div').show(); - } else { - $('#naming_example_div').hide(); - } - }); - - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3}, function (data) { - if (data) { - $('#naming_example_multi').text(data + '.ext'); - $('#naming_example_multi_div').show(); - } else { - $('#naming_example_multi_div').hide(); - } - }); - - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { - if (data == "invalid") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_pattern').qtip('toggle', false); - $('#naming_pattern').css('background-color', '#FFFFFF'); - } - }); - } - - function fill_abd_examples() { - var pattern = $('#naming_abd_pattern').val(); - - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'}, function (data) { - if (data) { - $('#naming_abd_example').text(data + '.ext'); - $('#naming_abd_example_div').show(); - } else { - $('#naming_abd_example_div').hide(); - } - }); - - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, function (data) { - if (data == "invalid") { - $('#naming_abd_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_abd_pattern').qtip('toggle', true); - $('#naming_abd_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_abd_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_abd_pattern').qtip('toggle', true); - $('#naming_abd_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_abd_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_abd_pattern').qtip('toggle', false); - $('#naming_abd_pattern').css('background-color', '#FFFFFF'); - } - }); - } - - function fill_sports_examples() { - var pattern = $('#naming_sports_pattern').val(); - - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'}, function (data) { - if (data) { - $('#naming_sports_example').text(data + '.ext'); - $('#naming_sports_example_div').show(); - } else { - $('#naming_sports_example_div').hide(); - } - }); - - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'}, function (data) { - if (data == "invalid") { - $('#naming_sports_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_sports_pattern').qtip('toggle', true); - $('#naming_sports_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_sports_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_sports_pattern').qtip('toggle', true); - $('#naming_sports_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_sports_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_sports_pattern').qtip('toggle', false); - $('#naming_sports_pattern').css('background-color', '#FFFFFF'); - } - }); - } - - function fill_anime_examples() { - var pattern = $('#naming_anime_pattern').val(); - var multi = $('#naming_anime_multi_ep :selected').val(); - var anime_type = $('input[name="naming_anime"]:checked').val(); - - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type}, function (data) { - if (data) { - $('#naming_example_anime').text(data + '.ext'); - $('#naming_example_anime_div').show(); - } else { - $('#naming_example_anime_div').hide(); - } - }); - - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { - if (data) { - $('#naming_example_multi_anime').text(data + '.ext'); - $('#naming_example_multi_anime_div').show(); - } else { - $('#naming_example_multi_anime_div').hide(); - } - }); - - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { - if (data == "invalid") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is invalid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-red' - }); - $('#naming_pattern').qtip('toggle', true); - $('#naming_pattern').css('background-color', '#FFFFDD'); - } else { - $('#naming_pattern').qtip('option', { - 'content.text': 'This pattern is valid.', - 'style.classes': 'qtip-rounded qtip-shadow qtip-green' - }); - $('#naming_pattern').qtip('toggle', false); - $('#naming_pattern').css('background-color', '#FFFFFF'); - } - }); - } - - function setup_naming() { - // if it is a custom selection then show the text box - if ($('#name_presets :selected').val() == "Custom...") { - $('#naming_custom').show(); - } else { - $('#naming_custom').hide(); - $('#naming_pattern').val($('#name_presets :selected').attr('id')); - } - fill_examples(); - } - - function setup_abd_naming() { - // if it is a custom selection then show the text box - if ($('#name_abd_presets :selected').val() == "Custom...") { - $('#naming_abd_custom').show(); - } else { - $('#naming_abd_custom').hide(); - $('#naming_abd_pattern').val($('#name_abd_presets :selected').attr('id')); - } - fill_abd_examples(); - } - - function setup_sports_naming() { - // if it is a custom selection then show the text box - if ($('#name_sports_presets :selected').val() == "Custom...") { - $('#naming_sports_custom').show(); - } else { - $('#naming_sports_custom').hide(); - $('#naming_sports_pattern').val($('#name_sports_presets :selected').attr('id')); - } - fill_sports_examples(); - } - - function setup_anime_naming() { - // if it is a custom selection then show the text box - if ($('#name_anime_presets :selected').val() == "Custom...") { - $('#naming_anime_custom').show(); - } else { - $('#naming_anime_custom').hide(); - $('#naming_anime_pattern').val($('#name_anime_presets :selected').attr('id')); - } - fill_anime_examples(); - } - - $('#unpack').on('change', function(){ - if(this.checked) { - israr_supported(); - } else { - $('#unpack').qtip('toggle', false); - } - }); - - $('#name_presets').on('change', function(){ - setup_naming(); - }); - - $('#name_abd_presets').on('change', function(){ - setup_abd_naming(); - }); - - $('#naming_custom_abd').on('change', function(){ - setup_abd_naming(); - }); - - $('#name_sports_presets').on('change', function(){ - setup_sports_naming(); - }); - - $('#naming_custom_sports').on('change', function(){ - setup_sports_naming(); - }); - - $('#name_anime_presets').on('change', function(){ - setup_anime_naming(); - }); - - $('#naming_custom_anime').on('change', function(){ - setup_anime_naming(); - }); - - $('input[name="naming_anime"]').on('click', function(){ - setup_anime_naming(); - }); - - $('#naming_multi_ep').change(fill_examples); - $('#naming_pattern').focusout(fill_examples); - $('#naming_pattern').keyup(function () { - typewatch(function () { - fill_examples(); - }, 500); - }); - - $('#naming_anime_multi_ep').change(fill_anime_examples); - $('#naming_anime_pattern').focusout(fill_anime_examples); - $('#naming_anime_pattern').keyup(function () { - typewatch(function () { - fill_anime_examples(); - }, 500); - }); - - $('#naming_abd_pattern').focusout(fill_examples); - $('#naming_abd_pattern').keyup(function () { - typewatch(function () { - fill_abd_examples(); - }, 500); - }); - - $('#naming_sports_pattern').focusout(fill_examples); - $('#naming_sports_pattern').keyup(function () { - typewatch(function () { - fill_sports_examples(); - }, 500); - }); - - $('#naming_anime_pattern').focusout(fill_examples); - $('#naming_anime_pattern').keyup(function () { - typewatch(function () { - fill_anime_examples(); - }, 500); - }); - - $('#show_naming_key').on('click', function(){ - $('#naming_key').toggle(); - }); - $('#show_naming_abd_key').on('click', function(){ - $('#naming_abd_key').toggle(); - }); - $('#show_naming_sports_key').on('click', function(){ - $('#naming_sports_key').toggle(); - }); - $('#show_naming_anime_key').on('click', function(){ - $('#naming_anime_key').toggle(); - }); - $('#do_custom').on('click', function(){ - $('#naming_pattern').val($('#name_presets :selected').attr('id')); - $('#naming_custom').show(); - $('#naming_pattern').focus(); - }); - setup_naming(); - setup_abd_naming(); - setup_sports_naming(); - setup_anime_naming(); - - // -- start of metadata options div toggle code -- - $('#metadataType').on('change keyup', function () { - $(this).showHideMetadata(); - }); - - $.fn.showHideMetadata = function () { - $('.metadataDiv').each(function () { - var targetName = $(this).attr('id'); - var selectedTarget = $('#metadataType :selected').val(); - - if (selectedTarget == targetName) { - $(this).show(); - } else { - $(this).hide(); - } - }); - }; - //initialize to show the div - $(this).showHideMetadata(); - // -- end of metadata options div toggle code -- - - $('.metadata_checkbox').on('click', function(){ - $(this).refreshMetadataConfig(false); - }); - - $.fn.refreshMetadataConfig = function (first) { - var cur_most = 0; - var cur_most_provider = ''; - - $('.metadataDiv').each(function () { - var generator_name = $(this).attr('id'); - - var config_arr = []; - var show_metadata = $("#" + generator_name + "_show_metadata").prop('checked'); - var episode_metadata = $("#" + generator_name + "_episode_metadata").prop('checked'); - var fanart = $("#" + generator_name + "_fanart").prop('checked'); - var poster = $("#" + generator_name + "_poster").prop('checked'); - var banner = $("#" + generator_name + "_banner").prop('checked'); - var episode_thumbnails = $("#" + generator_name + "_episode_thumbnails").prop('checked'); - var season_posters = $("#" + generator_name + "_season_posters").prop('checked'); - var season_banners = $("#" + generator_name + "_season_banners").prop('checked'); - var season_all_poster = $("#" + generator_name + "_season_all_poster").prop('checked'); - var season_all_banner = $("#" + generator_name + "_season_all_banner").prop('checked'); - - config_arr.push(show_metadata ? '1' : '0'); - config_arr.push(episode_metadata ? '1' : '0'); - config_arr.push(fanart ? '1' : '0'); - config_arr.push(poster ? '1' : '0'); - config_arr.push(banner ? '1' : '0'); - config_arr.push(episode_thumbnails ? '1' : '0'); - config_arr.push(season_posters ? '1' : '0'); - config_arr.push(season_banners ? '1' : '0'); - config_arr.push(season_all_poster ? '1' : '0'); - config_arr.push(season_all_banner ? '1' : '0'); - - var cur_num = 0; - for (var i = 0, len = config_arr.length; i < len; i++) { - cur_num += parseInt(config_arr[i]); - } - if (cur_num > cur_most) { - cur_most = cur_num; - cur_most_provider = generator_name; - } - - $("#" + generator_name + "_eg_show_metadata").attr('class', show_metadata ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_episode_metadata").attr('class', episode_metadata ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_fanart").attr('class', fanart ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_poster").attr('class', poster ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_banner").attr('class', banner ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_episode_thumbnails").attr('class', episode_thumbnails ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_posters").attr('class', season_posters ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_banners").attr('class', season_banners ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_all_poster").attr('class', season_all_poster ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_all_banner").attr('class', season_all_banner ? 'enabled' : 'disabled'); - $("#" + generator_name + "_data").val(config_arr.join('|')); - - }); - - if (cur_most_provider !== '' && first) { - $('#metadataType option[value=' + cur_most_provider + ']').attr('selected', 'selected'); - $(this).showHideMetadata(); - } - }; - - $(this).refreshMetadataConfig(true); - $('img[title]').qtip({ - position: { - viewport: $(window), - at: 'bottom center', - my: 'top right' - }, - style: { - tip: { - corner: true, - method: 'polygon' - }, - classes: 'qtip-shadow qtip-dark' - } - }); - $('i[title]').qtip({ - position: { - viewport: $(window), - at: 'top center', - my: 'bottom center' - }, - style: { - tip: { - corner: true, - method: 'polygon' - }, - classes: 'qtip-rounded qtip-shadow ui-tooltip-sb' - } - }); - $('.custom-pattern,#unpack').qtip({ - content: 'validating...', - show: { - event: false, - ready: false - }, - hide: false, - position: { - viewport: $(window), - at: 'center left', - my: 'center right' - }, - style: { - tip: { - corner: true, - method: 'polygon' - }, - classes: 'qtip-rounded qtip-shadow qtip-red' - } - }); -}); diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js index e2a7a49ed..b8ac98a50 100644 --- a/gui/slick/js/configProviders.js +++ b/gui/slick/js/configProviders.js @@ -1,572 +1,2 @@ $(document).ready(function(){ - $.fn.showHideProviders = function() { - $('.providerDiv').each(function(){ - var providerName = $(this).attr('id'); - var selectedProvider = $('#editAProvider :selected').val(); - - if (selectedProvider + 'Div' == providerName) { // jshint ignore:line - $(this).show(); - } else { - $(this).hide(); - } - }); - }; - - var ifExists = function(loopThroughArray, searchFor) { - var found = false; - - loopThroughArray.forEach(function(rootObject) { - if (rootObject.name === searchFor) { - found = true; - } - console.log(rootObject.name + " while searching for: "+ searchFor); - }); - return found; - }; - - /** - * Gets categories for the provided newznab provider. - * @param {String} isDefault - * @param {Array} selectedProvider - * @return no return data. Function updateNewznabCaps() is run at callback - */ - $.fn.getCategories = function (isDefault, selectedProvider) { - - var name = selectedProvider[0]; - var url = selectedProvider[1]; - var key = selectedProvider[2]; - - if (!name || !url || !key) { - return; - } - - var params = {url: url, name: name, key: key}; - - $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); - var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ - $(this).updateNewznabCaps( data, selectedProvider ); - console.debug(data.tv_categories); // jshint ignore:line - }); - jqxhr.always(function() { - $(".updating_categories").empty(); - }); - }; - - $.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) { - url = $.trim(url); - if (!url) { - return; - } - - if (!/^https?:\/\//i.test(url)) { - url = "http://" + url; - } - - if (url.match('/$') === null) { - url = url + '/'; - } - - var newData = [isDefault, [name, url, key, cat]]; - newznabProviders[id] = newData; - - if (!isDefault){ - $('#editANewznabProvider').addOption(id, name); - $(this).populateNewznabSection(); - } - - if ($('#provider_order_list > #'+id).length === 0 && showProvider !== false) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; - - $('#provider_order_list').append(toAdd); - $('#provider_order_list').sortable("refresh"); - } - - $(this).makeNewznabProviderString(); - }; - - $.fn.addTorrentRssProvider = function (id, name, url, cookies, titleTAG) { - var newData = [name, url, cookies, titleTAG]; - torrentRssProviders[id] = newData; - - $('#editATorrentRssProvider').addOption(id, name); - $(this).populateTorrentRssSection(); - - if ($('#provider_order_list > #'+id).length === 0) { - $('#provider_order_list').append('<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'); - $('#provider_order_list').sortable("refresh"); - } - - $(this).makeTorrentRssProviderString(); - }; - - $.fn.updateProvider = function (id, url, key, cat) { - newznabProviders[id][1][1] = url; - newznabProviders[id][1][2] = key; - newznabProviders[id][1][3] = cat; - - $(this).populateNewznabSection(); - - $(this).makeNewznabProviderString(); - }; - - $.fn.deleteProvider = function (id) { - $('#editANewznabProvider').removeOption(id); - delete newznabProviders[id]; - $(this).populateNewznabSection(); - $('li').remove('#'+id); - $(this).makeNewznabProviderString(); - }; - - $.fn.updateTorrentRssProvider = function (id, url, cookies, titleTAG) { - torrentRssProviders[id][1] = url; - torrentRssProviders[id][2] = cookies; - torrentRssProviders[id][3] = titleTAG; - $(this).populateTorrentRssSection(); - $(this).makeTorrentRssProviderString(); - }; - - $.fn.deleteTorrentRssProvider = function (id) { - $('#editATorrentRssProvider').removeOption(id); - delete torrentRssProviders[id]; - $(this).populateTorrentRssSection(); - $('li').remove('#'+id); - $(this).makeTorrentRssProviderString(); - }; - - $.fn.populateNewznabSection = function() { - var selectedProvider = $('#editANewznabProvider :selected').val(); - var data = ''; - var isDefault = ''; - var rrcat = ''; - - if (selectedProvider === 'addNewznab') { - data = ['','','']; - isDefault = 0; - $('#newznab_add_div').show(); - $('#newznab_update_div').hide(); - $('#newznab_cat').attr('disabled','disabled'); - $('#newznab_cap').attr('disabled','disabled'); - $('#newznab_cat_update').attr('disabled','disabled'); - $('#newznabcapdiv').hide(); - - $("#newznab_cat option").each(function() { - $(this).remove(); - return; - }); - - $("#newznab_cap option").each(function() { - $(this).remove(); - return; - }); - - } else { - data = newznabProviders[selectedProvider][1]; - isDefault = newznabProviders[selectedProvider][0]; - $('#newznab_add_div').hide(); - $('#newznab_update_div').show(); - $('#newznab_cat').removeAttr("disabled"); - $('#newznab_cap').removeAttr("disabled"); - $('#newznab_cat_update').removeAttr("disabled"); - $('#newznabcapdiv').show(); - } - - $('#newznab_name').val(data[0]); - $('#newznab_url').val(data[1]); - $('#newznab_key').val(data[2]); - - //Check if not already array - if (typeof data[3] === 'string') { - rrcat = data[3].split(","); - } else { - rrcat = data[3]; - } - - // Update the category select box (on the right) - var newCatOptions = []; - if (rrcat) { - rrcat.forEach(function (cat) { - if (cat !== '') { - newCatOptions.push({text : cat, value : cat}); - } - }); - $("#newznab_cat").replaceOptions(newCatOptions); - } - - if (selectedProvider === 'addNewznab') { - $('#newznab_name').removeAttr("disabled"); - $('#newznab_url').removeAttr("disabled"); - } else { - $('#newznab_name').attr("disabled", "disabled"); - - if (isDefault) { - $('#newznab_url').attr("disabled", "disabled"); - $('#newznab_delete').attr("disabled", "disabled"); - } else { - $('#newznab_url').removeAttr("disabled"); - $('#newznab_delete').removeAttr("disabled"); - - //Get Categories Capabilities - if (data[0] && data[1] && data[2] && !ifExists($.fn.newznabProvidersCapabilities, data[0])) { - $(this).getCategories(isDefault, data); - } - $(this).updateNewznabCaps( null, data ); - } - } - }; - - /** - * Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name - * and category capabilities. Return - * @param {Array} newzNabCaps, is the returned object with newzNabprod Name and Capabilities. - * @param {Array} selectedProvider - * @return no return data. The multiselect input $("#newznab_cap") is updated, as a result. - */ - $.fn.updateNewznabCaps = function( newzNabCaps, selectedProvider ) { - if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])) { - $.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories}); // jshint ignore:line - } - - //Loop through the array and if currently selected newznab provider name matches one in the array, use it to - //update the capabilities select box (on the left). - if (selectedProvider[0]) { - $.fn.newznabProvidersCapabilities.forEach(function(newzNabCap) { - if (newzNabCap.name && newzNabCap.name === selectedProvider[0] && newzNabCap.categories instanceof Array) { - var newCapOptions = []; - newzNabCap.categories.forEach(function(categorySet) { - if (categorySet.id && categorySet.name) { - newCapOptions.push({value : categorySet.id, text : categorySet.name + "(" + categorySet.id + ")"}); - } - }); - $("#newznab_cap").replaceOptions(newCapOptions); - } - }); - } - }; - - $.fn.makeNewznabProviderString = function() { - var provStrings = []; - - for (var id in newznabProviders) { - if (newznabProviders.hasOwnProperty(id)) { - provStrings.push(newznabProviders[id][1].join('|')); - } - } - - $('#newznab_string').val(provStrings.join('!!!')); - }; - - $.fn.populateTorrentRssSection = function() { - var selectedProvider = $('#editATorrentRssProvider :selected').val(); - var data = ''; - - if (selectedProvider === 'addTorrentRss') { - data = ['','','','title']; - $('#torrentrss_add_div').show(); - $('#torrentrss_update_div').hide(); - } else { - data = torrentRssProviders[selectedProvider]; - $('#torrentrss_add_div').hide(); - $('#torrentrss_update_div').show(); - } - - $('#torrentrss_name').val(data[0]); - $('#torrentrss_url').val(data[1]); - $('#torrentrss_cookies').val(data[2]); - $('#torrentrss_titleTAG').val(data[3]); - - if (selectedProvider === 'addTorrentRss') { - $('#torrentrss_name').removeAttr("disabled"); - $('#torrentrss_url').removeAttr("disabled"); - $('#torrentrss_cookies').removeAttr("disabled"); - $('#torrentrss_titleTAG').removeAttr("disabled"); - } else { - $('#torrentrss_name').attr("disabled", "disabled"); - $('#torrentrss_url').removeAttr("disabled"); - $('#torrentrss_cookies').removeAttr("disabled"); - $('#torrentrss_titleTAG').removeAttr("disabled"); - $('#torrentrss_delete').removeAttr("disabled"); - } - }; - - $.fn.makeTorrentRssProviderString = function() { - var provStrings = []; - for (var id in torrentRssProviders) { - if (torrentRssProviders.hasOwnProperty(id)) { - provStrings.push(torrentRssProviders[id].join('|')); - } - } - - $('#torrentrss_string').val(provStrings.join('!!!')); - }; - - - $.fn.refreshProviderList = function() { - var idArr = $("#provider_order_list").sortable('toArray'); - var finalArr = []; - $.each(idArr, function(key, val) { - var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; - finalArr.push(val + ':' + checked); - }); - - $("#provider_order").val(finalArr.join(' ')); - $(this).refreshEditAProvider(); - }; - - $.fn.refreshEditAProvider = function() { - $('#provider-list').empty(); - - var idArr = $("#provider_order_list").sortable('toArray'); - var finalArr = []; - $.each(idArr, function(key, val) { - if ($('#enable_'+val).prop('checked')) { - finalArr.push(val); - } - }); - - if (finalArr.length > 0) { - $('<select>').prop('id','editAProvider').addClass('form-control input-sm').appendTo('#provider-list'); - for (var i = 0, len = finalArr.length; i < len; i++) { - var provider = finalArr[i]; - $('#editAProvider').append($('<option>').prop('value',provider).text($.trim($('#'+provider).text()).replace(/\s\*$/, '').replace(/\s\*\*$/, ''))); - } - } else { - document.getElementsByClassName('component-desc')[0].innerHTML = "No providers available to configure."; - } - - $(this).showHideProviders(); - }; - - var newznabProviders = []; - var torrentRssProviders = []; - - $(this).on('change', '.newznab_key', function(){ - var providerId = $(this).attr('id'); - providerId = providerId.substring(0, providerId.length-'_hash'.length); - - var url = $('#'+providerId+'_url').val(); - var cat = $('#'+providerId+'_cat').val(); - var key = $(this).val(); - - $(this).updateProvider(providerId, url, key, cat); }); - - $('#newznab_key,#newznab_url').change(function(){ - var selectedProvider = $('#editANewznabProvider :selected').val(); - - if (selectedProvider === "addNewznab"){ - return; - } - - var url = $('#newznab_url').val(); - var key = $('#newznab_key').val(); - - var cat = $('#newznab_cat option').map(function(i, opt) { - return $(opt).text(); - }).toArray().join(','); - - $(this).updateProvider(selectedProvider, url, key, cat); - }); - - $('#torrentrss_url,#torrentrss_cookies,#torrentrss_titleTAG').change(function(){ - var selectedProvider = $('#editATorrentRssProvider :selected').val(); - - if (selectedProvider === "addTorrentRss"){ - return; - } - - var url = $('#torrentrss_url').val(); - var cookies = $('#torrentrss_cookies').val(); - var titleTAG = $('#torrentrss_titleTAG').val(); - - $(this).updateTorrentRssProvider(selectedProvider, url, cookies, titleTAG); - }); - - $('body').on('change', '#editAProvider',function(){ - $(this).showHideProviders(); - }); - - $('#editANewznabProvider').change(function(){ - $(this).populateNewznabSection(); - }); - - $('#editATorrentRssProvider').change(function(){ - $(this).populateTorrentRssSection(); - }); - - $(this).on('click', '.provider_enabler', function(){ - $(this).refreshProviderList(); - }); - - $('#newznab_cat_update').click(function(){ - console.debug('Clicked Button'); - - // Maybe check if there is anything selected? - $("#newznab_cat option").each(function() { - $(this).remove(); - }); - - var newOptions = []; - - // When the update botton is clicked, loop through the capabilities list - // and copy the selected category id's to the category list on the right. - $("#newznab_cap option:selected").each(function(){ - var selectedCat = $(this).val(); - console.debug(selectedCat); - newOptions.push({text: selectedCat, value: selectedCat}); - }); - - $("#newznab_cat").replaceOptions(newOptions); - - var selectedProvider = $("#editANewznabProvider :selected").val(); - if (selectedProvider === "addNewznab"){ - return; - } - - var url = $('#newznab_url').val(); - var key = $('#newznab_key').val(); - - var cat = $('#newznab_cat option').map(function(i, opt) { - return $(opt).text(); - }).toArray().join(','); - - $("#newznab_cat option:not([value])").remove(); - - $(this).updateProvider(selectedProvider, url, key, cat); - }); - - - $('#newznab_add').click(function(){ - var name = $.trim($('#newznab_name').val()); - var url = $.trim($('#newznab_url').val()); - var key = $.trim($('#newznab_key').val()); - //var cat = $.trim($('#newznab_cat').val()); - - var cat = $.trim($('#newznab_cat option').map(function(i, opt) { - return $(opt).text(); - }).toArray().join(',')); - - if (!name || !url || !key) { - return; - } - - var params = {name: name}; - - // send to the form with ajax, get a return value - $.getJSON(srRoot + '/config/providers/canAddNewznabProvider', params, function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - $(this).addProvider(data.success, name, url, key, cat, 0); - }); - }); - - $('.newznab_delete').click(function(){ - var selectedProvider = $('#editANewznabProvider :selected').val(); - $(this).deleteProvider(selectedProvider); - }); - - $('#torrentrss_add').click(function(){ - var name = $('#torrentrss_name').val(); - var url = $('#torrentrss_url').val(); - var cookies = $('#torrentrss_cookies').val(); - var titleTAG = $('#torrentrss_titleTAG').val(); - var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG}; - - // send to the form with ajax, get a return value - $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - - $(this).addTorrentRssProvider(data.success, name, url, cookies, titleTAG); - $(this).refreshEditAProvider(); - }); - }); - - $('.torrentrss_delete').on('click', function(){ - $(this).deleteTorrentRssProvider($('#editATorrentRssProvider :selected').val()); - $(this).refreshEditAProvider(); - }); - - $(this).on('change', "[class='providerDiv_tip'] input", function(){ - $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").replaceWith($(this).clone()); - $('div .providerDiv ' + "[newznab_name=" + $(this).attr('id') + "]").replaceWith($(this).clone()); - }); - - $(this).on('change', "[class='providerDiv_tip'] select", function(){ - $(this).find('option').each( function() { - if ($(this).is(':selected')) { - $(this).prop('defaultSelected', true); - } else { - $(this).prop('defaultSelected', false); - } - }); - $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").empty().replaceWith($(this).clone()); - }); - - $(this).on('change', '.enabler', function(){ - if ($(this).is(':checked')) { - $('.content_'+$(this).attr('id')).each( function() { - $(this).show(); - }); - } else { - $('.content_'+$(this).attr('id')).each( function() { - $(this).hide(); - }); - } - }); - - $(".enabler").each(function(){ - if (!$(this).is(':checked')) { - $('.content_'+$(this).attr('id')).hide(); - } else { - $('.content_'+$(this).attr('id')).show(); - } - }); - - $.fn.makeTorrentOptionString = function(providerId) { - var seedRatio = $('.providerDiv_tip #' + providerId + '_seed_ratio').prop('value'); - var seedTime = $('.providerDiv_tip #' + providerId + '_seed_time').prop('value'); - var processMet = $('.providerDiv_tip #' + providerId + '_process_method').prop('value'); - var optionString = $('.providerDiv_tip #' + providerId + '_option_string'); - - optionString.val([seedRatio, seedTime, processMet].join('|')); - }; - - $(this).on('change', '.seed_option', function(){ - var providerId = $(this).attr('id').split('_')[0]; - $(this).makeTorrentOptionString(providerId); - }); - - $.fn.replaceOptions = function(options) { - var self, $option; - - this.empty(); - self = this; - - $.each(options, function(index, option) { - $option = $("<option></option>").attr("value", option.value).text(option.text); - self.append($option); - }); - }; - - // initialization stuff - $.fn.newznabProvidersCapabilities = []; - - $(this).showHideProviders(); - - $("#provider_order_list").sortable({ - placeholder: 'ui-state-highlight', - update: function () { - $(this).refreshProviderList(); - } - }); - - $("#provider_order_list").disableSelection(); - - if ($('#editANewznabProvider').length) { - $(this).populateNewznabSection(); - } -}); diff --git a/gui/slick/js/configSearch.js b/gui/slick/js/configSearch.js deleted file mode 100644 index defb6407a..000000000 --- a/gui/slick/js/configSearch.js +++ /dev/null @@ -1,222 +0,0 @@ -$(document).ready(function(){ - var loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; - - function toggleTorrentTitle(){ - if ($('#use_torrents').prop('checked')){ - $('#no_torrents').show(); - } else { - $('#no_torrents').hide(); - } - } - - $.fn.nzbMethodHandler = function() { - var selectedProvider = $('#nzb_method :selected').val(), - blackholeSettings = '#blackhole_settings', - sabnzbdSettings = '#sabnzbd_settings', - testSABnzbd = '#testSABnzbd', - testSABnzbdResult = '#testSABnzbd_result', - nzbgetSettings = '#nzbget_settings'; - - $(blackholeSettings).hide(); - $(sabnzbdSettings).hide(); - $(testSABnzbd).hide(); - $(testSABnzbdResult).hide(); - $(nzbgetSettings).hide(); - - if (selectedProvider.toLowerCase() === 'blackhole') { - $(blackholeSettings).show(); - } else if (selectedProvider.toLowerCase() === 'nzbget') { - $(nzbgetSettings).show(); - } else { - $(sabnzbdSettings).show(); - $(testSABnzbd).show(); - $(testSABnzbdResult).show(); - } - }; - - $.fn.rtorrentScgi = function(){ - var selectedProvider = $('#torrent_method :selected').val(); - - if (selectedProvider.toLowerCase() === 'rtorrent') { - var hostname = $('#torrent_host').prop('value'); - var isMatch = hostname.substr(0, 7) === "scgi://"; - - if (isMatch) { - $('#torrent_username_option').hide(); - $('#torrent_username').prop('value', ''); - $('#torrent_password_option').hide(); - $('#torrent_password').prop('value', ''); - $('#torrent_auth_type_option').hide(); - $("#torrent_auth_type option[value=none]").attr('selected', 'selected'); - } else { - $('#torrent_username_option').show(); - $('#torrent_password_option').show(); - $('#torrent_auth_type_option').show(); - } - } - }; - - $.fn.torrentMethodHandler = function() { - $('#options_torrent_clients').hide(); - $('#options_torrent_blackhole').hide(); - - var selectedProvider = $('#torrent_method :selected').val(), - host = ' host:port', - username = ' username', - password = ' password', - label = ' label', - directory = ' directory', - client = '', - optionPanel = '#options_torrent_blackhole'; - rpcurl = ' RPC URL'; - - if (selectedProvider.toLowerCase() !== 'blackhole') { - var label_warning_deluge = '#label_warning_deluge', - label_anime_warning_deluge = '#label_anime_warning_deluge', - host_desc_rtorrent = '#host_desc_rtorrent', - host_desc_torrent = '#host_desc_torrent', - torrent_verify_cert_option = '#torrent_verify_cert_option', - torrent_path_option = '#torrent_path_option', - torrent_seed_time_option = '#torrent_seed_time_option', - torrent_high_bandwidth_option = '#torrent_high_bandwidth_option', - torrent_label_option = '#torrent_label_option', - torrent_label_anime_option = '#torrent_label_anime_option', - path_synology = '#path_synology', - torrent_paused_option = '#torrent_paused_option'; - - $(label_warning_deluge).hide(); - $(label_anime_warning_deluge).hide(); - $(label_anime_warning_deluge).hide(); - $(host_desc_rtorrent).hide(); - $(host_desc_torrent).show(); - $(torrent_verify_cert_option).hide(); - $(torrent_verify_deluge).hide(); - $(torrent_verify_rtorrent).hide(); - $(torrent_auth_type_option).hide(); - $(torrent_path_option).show(); - $(torrent_path_option).find('.fileBrowser').show(); - $(torrent_seed_time_option).hide(); - $(torrent_high_bandwidth_option).hide(); - $(torrent_label_option).show(); - $(torrent_label_anime_option).show(); - $(path_synology).hide(); - $(torrent_paused_option).show(); - $(torrent_rpcurl_option).hide(); - $(this).rtorrentScgi(); - - if (selectedProvider.toLowerCase() === 'utorrent') { - client = 'uTorrent'; - $(torrent_path_option).hide(); - $('#torrent_seed_time_label').text('Minimum seeding time is'); - $(torrent_seed_time_option).show(); - $('#host_desc_torrent').text('URL to your uTorrent client (e.g. http://localhost:8000)'); - } else if (selectedProvider.toLowerCase() === 'transmission'){ - client = 'Transmission'; - $('#torrent_seed_time_label').text('Stop seeding when inactive for'); - $(torrent_seed_time_option).show(); - $(torrent_high_bandwidth_option).show(); - $(torrent_label_option).hide(); - $(torrent_label_anime_option).hide(); - $(torrent_rpcurl_option).show(); - $('#host_desc_torrent').text('URL to your Transmission client (e.g. http://localhost:9091)'); - } else if (selectedProvider.toLowerCase() === 'deluge'){ - client = 'Deluge'; - $(torrent_verify_cert_option).show(); - $(torrent_verify_deluge).show(); - $(torrent_verify_rtorrent).hide(); - $(label_warning_deluge).show(); - $(label_anime_warning_deluge).show(); - $('#torrent_username_option').hide(); - $('#torrent_username').prop('value', ''); - $('#host_desc_torrent').text('URL to your Deluge client (e.g. http://localhost:8112)'); - } else if ('deluged' == selectedProvider){ - client = 'Deluge'; - $(torrent_verify_cert_option).hide(); - $(torrent_verify_deluge).hide(); - $(torrent_verify_rtorrent).hide(); - $(label_warning_deluge).show(); - $(label_anime_warning_deluge).show(); - $('#torrent_username_option').show(); - $('#host_desc_torrent').text('IP or Hostname of your Deluge Daemon (e.g. scgi://localhost:58846)'); - } else if ('download_station' == selectedProvider){ - client = 'Synology DS'; - $(torrent_label_option).hide(); - $(torrent_label_anime_option).hide(); - $('#torrent_paused_option').hide(); - $(torrent_path_option).find('.fileBrowser').hide(); - $('#host_desc_torrent').text('URL to your Synology DS client (e.g. http://localhost:5000)'); - $(path_synology).show(); - } else if ('rtorrent' == selectedProvider){ - client = 'rTorrent'; - $(torrent_paused_option).hide(); - $('#host_desc_torrent').text('URL to your rTorrent client (e.g. scgi://localhost:5000 <br> or https://localhost/rutorrent/plugins/httprpc/action.php)'); - $(torrent_verify_cert_option).show(); - $(torrent_verify_deluge).hide(); - $(torrent_verify_rtorrent).show(); - $(torrent_auth_type_option).show(); - } else if ('qbittorrent' == selectedProvider){ - client = 'qbittorrent'; - $(torrent_path_option).hide(); - $(torrent_label_option).hide(); - $(torrent_label_anime_option).hide(); - $('#host_desc_torrent').text('URL to your qbittorrent client (e.g. http://localhost:8080)'); - } else if ('mlnet' == selectedProvider){ - client = 'mlnet'; - $(torrent_path_option).hide(); - $(torrent_label_option).hide(); - $(torrent_verify_cert_option).hide(); - $(torrent_verify_deluge).hide(); - $(torrent_verify_rtorrent).hide(); - $(torrent_label_anime_option).hide(); - $(torrent_paused_option).hide(); - $('#host_desc_torrent').text('URL to your MLDonkey (e.g. http://localhost:4080)'); - } - $('#host_title').text(client + host); - $('#username_title').text(client + username); - $('#password_title').text(client + password); - $('#torrent_client').text(client); - $('#rpcurl_title').text(client + rpcurl); - optionPanel = '#options_torrent_clients'; - } - $(optionPanel).show(); - }; - - $('#nzb_method').change($(this).nzbMethodHandler); - - $(this).nzbMethodHandler(); - - $('#testSABnzbd').click(function(){ - $('#testSABnzbd_result').html(loading); - var sab_host = $('#sab_host').val(); - var sab_username = $('#sab_username').val(); - var sab_password = $('#sab_password').val(); - var sab_apiKey = $('#sab_apikey').val(); - - $.get(srRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey}, - function(data){ - $('#testSABnzbd_result').html(data); - }); - }); - - - $('#torrent_method').change($(this).torrentMethodHandler); - - $(this).torrentMethodHandler(); - - $('#use_torrents').click(function(){ - toggleTorrentTitle(); - }); - - $('#test_torrent').click(function(){ - $('#test_torrent_result').html(loading); - var torrent_method = $('#torrent_method :selected').val(); - var torrent_host = $('#torrent_host').val(); - var torrent_username = $('#torrent_username').val(); - var torrent_password = $('#torrent_password').val(); - - $.get(srRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password}, - function(data){ $('#test_torrent_result').html(data); }); - }); - - $('#torrent_host').change($(this).rtorrentScgi); -}); diff --git a/gui/slick/js/configSubtitles.js b/gui/slick/js/configSubtitles.js deleted file mode 100644 index 5ff3942a2..000000000 --- a/gui/slick/js/configSubtitles.js +++ /dev/null @@ -1,59 +0,0 @@ -$(document).ready(function(){ - $.fn.showHideServices = function() { - $('.serviceDiv').each(function(){ - var serviceName = $(this).attr('id'); - var selectedService = $('#editAService :selected').val(); - - if (selectedService+'Div' === serviceName){ - $(this).show(); - } else { - $(this).hide(); - } - }); - }; - - $.fn.addService = function (id, name, url, key, isDefault, showService) { - if (url.match('/$') === null) { url = url + '/'; } - - if ($('#service_order_list > #'+id).length === 0 && showService !== false) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; - - $('#service_order_list').append(toAdd); - $('#service_order_list').sortable("refresh"); - } - }; - - $.fn.deleteService = function (id) { - $('#service_order_list > #'+id).remove(); - }; - - $.fn.refreshServiceList = function() { - var idArr = $("#service_order_list").sortable('toArray'); - var finalArr = []; - $.each(idArr, function(key, val) { - var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; - finalArr.push(val + ':' + checked); - }); - $("#service_order").val(finalArr.join(' ')); - }; - - $('#editAService').change(function(){ - $(this).showHideServices(); - }); - - $('.service_enabler').on('click', function(){ - $(this).refreshServiceList(); - }); - - // initialization stuff - $(this).showHideServices(); - - $("#service_order_list").sortable({ - placeholder: 'ui-state-highlight', - update: function () { - $(this).refreshServiceList(); - } - }); - - $("#service_order_list").disableSelection(); -}); diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js new file mode 100644 index 000000000..94a42be7c --- /dev/null +++ b/gui/slick/js/core.js @@ -0,0 +1,2269 @@ +var srRoot = getMeta('srRoot'), + themeSpinner = getMeta('themeSpinner'), + anonURL = getMeta('anonURL'), + topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', + loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; + +function configSuccess(){ + $('.config_submitter').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + }); + $('.config_submitter_refresh').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + window.location.href = srRoot + '/config/providers/'; + }); + $('#email_show').trigger('notify'); +} + +var SICKRAGE = { + common: { + init: function() { + $("#config-components").tabs({ + activate: function (event, ui) { + var lastOpenedPanel = $(this).data("lastOpenedPanel"), + selected = $(this).tabs('option', 'selected'); + + if (!lastOpenedPanel) { lastOpenedPanel = $(ui.oldPanel); } + + if (!$(this).data("topPositionTab")) { $(this).data("topPositionTab", $(ui.newPanel).position().top); } + + //Dont use the builtin fx effects. This will fade in/out both tabs, we dont want that + //Fadein the new tab yourself + $(ui.newPanel).hide().fadeIn(0); + + if (lastOpenedPanel) { + // 1. Show the previous opened tab by removing the jQuery UI class + // 2. Make the tab temporary position:absolute so the two tabs will overlap + // 3. Set topposition so they will overlap if you go from tab 1 to tab 0 + // 4. Remove position:absolute after animation + lastOpenedPanel + .toggleClass("ui-tabs-hide") + .css("position", "absolute") + .css("top", $(this).data("topPositionTab") + "px") + .fadeOut(0, function () { + $(this).css("position", ""); + }); + } + + //Saving the last tab has been opened + $(this).data("lastOpenedPanel", $(ui.newPanel)); + } + }); + + // @TODO Replace this with a real touchscreen check + // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle + if ((navigator.maxTouchPoints || 0) < 2) { + $('.dropdown-toggle').on('click', function(e) { + var $this = $(this); + if ($this.attr('aria-expanded') === 'true') { + window.location.href = $this.attr('href'); + } + }); + } + + if(metaToBool('sickbeard.FUZZY_DATING')){ + $.timeago.settings.allowFuture = true; + $.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: 'In ', + suffixAgo: "ago", + suffixFromNow: "", + seconds: "less than a minute", + minute: "about a minute", + minutes: "%d minutes", + hour: "an hour", + hours: "%d hours", + day: "a day", + days: "%d days", + month: "a month", + months: "%d months", + year: "a year", + years: "%d years", + wordSeparator: " ", + numbers: [] + }; + $("[datetime]").timeago(); + } + } + }, + config: { + init: function() { + $('#config-components').tabs(); + + $(".enabler").each(function(){ + if (!$(this).prop('checked')) { $('#content_'+$(this).attr('id')).hide(); } + }); + + $(".enabler").click(function() { + if ($(this).prop('checked')){ + $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); + } else { + $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); + } + }); + + $(".viewIf").click(function() { + if ($(this).prop('checked')) { + $('.hide_if_'+$(this).attr('id')).css('display','none'); + $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear"); + } else { + $('.show_if_'+$(this).attr('id')).css('display','none'); + $('.hide_if_'+$(this).attr('id')).fadeIn("fast", "linear"); + } + }); + + $(".datePresets").click(function() { + var def = $('#date_presets').val(); + if ($(this).prop('checked') && '%x' === def) { + def = '%a, %b %d, %Y'; + $('#date_use_system_default').html('1'); + } else if (!$(this).prop('checked') && '1' === $('#date_use_system_default').html()){ + def = '%x'; + } + + $('#date_presets').attr('name', 'date_preset_old'); + $('#date_presets').attr('id', 'date_presets_old'); + + $('#date_presets_na').attr('name', 'date_preset'); + $('#date_presets_na').attr('id', 'date_presets'); + + $('#date_presets_old').attr('name', 'date_preset_na'); + $('#date_presets_old').attr('id', 'date_presets_na'); + + if (def) { $('#date_presets').val(def); } + }); + + // bind 'myForm' and provide a simple callback function + $('#configForm').ajaxForm({ + beforeSubmit: function(){ + $('.config_submitter .config_submitter_refresh').each(function(){ + $(this).attr("disabled", "disabled"); + $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); + $(this).hide(); + }); + }, + success: function(){ + setTimeout(function () { + "use strict"; + configSuccess(); + }, 2000); + } + }); + + $('#api_key').click(function(){ + $('#api_key').select(); + }); + + $("#generate_new_apikey").click(function(){ + $.get(srRoot + '/config/general/generateApiKey', function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + $('#api_key').val(data); + }); + }); + + $('#branchCheckout').click(function() { + var url = srRoot + '/home/branchCheckout?branch=' + $("#branchVersion").val(); + var checkDBversion = srRoot + "/home/getDBcompare"; + $.getJSON(checkDBversion, function(data){ + if (data.status === "success") { + if (data.message === "equal") { + //Checkout Branch + window.location.href = url; + } + if (data.message === "upgrade") { + if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { + //Checkout Branch + window.location.href = url; + } + } + if (data.message === "downgrade") { + alert("Can't switch branch as this will result in a database downgrade."); + } + } + }); + }); + }, + index: function() { + if ($("input[name='proxy_setting']").val().length === 0) { + $("input[id='proxy_indexers']").prop('checked', false); + $("label[for='proxy_indexers']").hide(); + } + + $("input[name='proxy_setting']").on('input', function() { + if($(this).val().length === 0) { + $("input[id='proxy_indexers']").prop('checked', false); + $("label[for='proxy_indexers']").hide(); + } else { + $("label[for='proxy_indexers']").show(); + } + }); + + $('#log_dir').fileBrowser({ title: 'Select log file folder location' }); + }, + backupRestore: function(){ + $('#Backup').click(function() { + $("#Backup").attr("disabled", true); + $('#Backup-result').html(loading); + var backupDir = $("#backupDir").val(); + $.get(srRoot + "/config/backuprestore/backup", {'backupDir': backupDir}) + .done(function (data) { + $('#Backup-result').html(data); + $("#Backup").attr("disabled", false); + }); + }); + $('#Restore').click(function() { + $("#Restore").attr("disabled", true); + $('#Restore-result').html(loading); + var backupFile = $("#backupFile").val(); + $.get(srRoot + "/config/backuprestore/restore", {'backupFile': backupFile}) + .done(function (data) { + $('#Restore-result').html(data); + $("#Restore").attr("disabled", false); + }); + }); + + $('#backupDir').fileBrowser({ title: 'Select backup folder to save to', key: 'backupPath' }); + $('#backupFile').fileBrowser({ title: 'Select backup files to restore', key: 'backupFile', includeFiles: 1 }); + $('#config-components').tabs(); + + $(".enabler").each(function(){ + if (!$(this).prop('checked')) { $('#content_'+$(this).attr('id')).hide(); } + }); + + $(".enabler").click(function() { + if ($(this).prop('checked')){ + $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); + } else { + $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); + } + }); + + $(".viewIf").click(function() { + if ($(this).prop('checked')) { + $('.hide_if_'+$(this).attr('id')).css('display','none'); + $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear"); + } else { + $('.show_if_'+$(this).attr('id')).css('display','none'); + $('.hide_if_'+$(this).attr('id')).fadeIn("fast", "linear"); + } + }); + + $(".datePresets").click(function() { + var def = $('#date_presets').val(); + if ($(this).prop('checked') && '%x' == def) { // jshint ignore:line + def = '%a, %b %d, %Y'; + $('#date_use_system_default').html('1'); + } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html()){ // jshint ignore:line + def = '%x'; + } + + $('#date_presets').attr('name', 'date_preset_old'); + $('#date_presets').attr('id', 'date_presets_old'); + + $('#date_presets_na').attr('name', 'date_preset'); + $('#date_presets_na').attr('id', 'date_presets'); + + $('#date_presets_old').attr('name', 'date_preset_na'); + $('#date_presets_old').attr('id', 'date_presets_na'); + + if (def) { $('#date_presets').val(def); } + }); + + // bind 'myForm' and provide a simple callback function + $('#configForm').ajaxForm({ + beforeSubmit: function(){ + $('.config_submitter .config_submitter_refresh').each(function(){ + $(this).attr("disabled", "disabled"); + $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); + $(this).hide(); + }); + }, + success: function(){ + setTimeout(function () { + "use strict"; + configSuccess(); + }, 2000); + } + }); + + $('#api_key').click(function(){ + $('#api_key').select(); + }); + + $("#generate_new_apikey").click(function(){ + $.get(srRoot + '/config/general/generateApiKey', function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + $('#api_key').val(data); + }); + }); + + $('#branchCheckout').click(function() { + var url = srRoot+'/home/branchCheckout?branch='+$("#branchVersion").val(); + var checkDBversion = srRoot + "/home/getDBcompare"; + $.getJSON(checkDBversion, function(data){ + if (data.status.toLowerCase() === "success") { + if (data.message.toLowerCase() === "equal") { + //Checkout Branch + window.location.href = url; + } + if (data.message.toLowerCase() === "upgrade") { + if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { + //Checkout Branch + window.location.href = url; + } + } + if (data.message.toLowerCase() === "downgrade") { + alert("Can't switch branch as this will result in a database downgrade."); + } + } + }); + }); + }, + notifications: function() { + $('#config-components').tabs(); + + $('#testGrowl').click(function () { + var growlHost = $.trim($('#growl_host').val()); + var growlPassword = $.trim($('#growl_password').val()); + if (!growlHost) { + $('#testGrowl-result').html('Please fill out the necessary fields above.'); + $('#growl_host').addClass('warning'); + return; + } + $('#growl_host').removeClass('warning'); + $(this).prop('disabled', true); + $('#testGrowl-result').html(loading); + $.get(srRoot + '/home/testGrowl', {'host': growlHost, 'password': growlPassword}).done(function (data) { + $('#testGrowl-result').html(data); + $('#testGrowl').prop('disabled', false); + }); + }); + + $('#testProwl').click(function () { + var prowlApi = $.trim($('#prowl_api').val()); + var prowlPriority = $('#prowl_priority').val(); + if (!prowlApi) { + $('#testProwl-result').html('Please fill out the necessary fields above.'); + $('#prowl_api').addClass('warning'); + return; + } + $('#prowl_api').removeClass('warning'); + $(this).prop('disabled', true); + $('#testProwl-result').html(loading); + $.get(srRoot + '/home/testProwl', {'prowl_api': prowlApi, 'prowl_priority': prowlPriority}).done(function (data) { + $('#testProwl-result').html(data); + $('#testProwl').prop('disabled', false); + }); + }); + + $('#testKODI').click(function () { + var kodi_host = $.trim($('#kodi_host').val()); + var kodi_username = $.trim($('#kodi_username').val()); + var kodi_password = $.trim($('#kodi_password').val()); + if (!kodi_host) { + $('#testKODI-result').html('Please fill out the necessary fields above.'); + $('#kodi_host').addClass('warning'); + return; + } + $('#kodi_host').removeClass('warning'); + $(this).prop('disabled', true); + $('#testKODI-result').html(loading); + $.get(srRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password}).done(function (data) { + $('#testKODI-result').html(data); + $('#testKODI').prop('disabled', false); + }); + }); + + $('#testPMC').click(function () { + var plex_host = $.trim($('#plex_host').val()); + var plex_client_username = $.trim($('#plex_client_username').val()); + var plex_client_password = $.trim($('#plex_client_password').val()); + if (!plex_host) { + $('#testPMC-result').html('Please fill out the necessary fields above.'); + $('#plex_host').addClass('warning'); + return; + } + $('#plex_host').removeClass('warning'); + $(this).prop('disabled', true); + $('#testPMC-result').html(loading); + $.get(srRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password}).done(function (data) { + $('#testPMC-result').html(data); + $('#testPMC').prop('disabled', false); + }); + }); + + $('#testPMS').click(function () { + var plex_server_host = $.trim($('#plex_server_host').val()); + var plex_username = $.trim($('#plex_username').val()); + var plex_password = $.trim($('#plex_password').val()); + var plex_server_token = $.trim($('#plex_server_token').val()); + if (!plex_server_host) { + $('#testPMS-result').html('Please fill out the necessary fields above.'); + $('#plex_server_host').addClass('warning'); + return; + } + $('#plex_server_host').removeClass('warning'); + $(this).prop('disabled', true); + $('#testPMS-result').html(loading); + $.get(srRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token}).done(function (data) { + $('#testPMS-result').html(data); + $('#testPMS').prop('disabled', false); + }); + }); + + $('#testEMBY').click(function () { + var emby_host = $('#emby_host').val(); + var emby_apikey = $('#emby_apikey').val(); + if (!emby_host || !emby_apikey) { + $('#testEMBY-result').html('Please fill out the necessary fields above.'); + if (!emby_host) { + $('#emby_host').addClass('warning'); + } else { + $('#emby_host').removeClass('warning'); + } + if (!emby_apikey) { + $('#emby_apikey').addClass('warning'); + } else { + $('#emby_apikey').removeClass('warning'); + } + return; + } + $('#emby_host,#emby_apikey').removeClass('warning'); + $(this).prop('disabled', true); + $('#testEMBY-result').html(loading); + $.get(srRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey}).done(function (data) { + $('#testEMBY-result').html(data); + $('#testEMBY').prop('disabled', false); + }); + }); + + $('#testBoxcar').click(function() { + var boxcar_username = $.trim($('#boxcar_username').val()); + if (!boxcar_username) { + $('#testBoxcar-result').html('Please fill out the necessary fields above.'); + $('#boxcar_username').addClass('warning'); + return; + } + $('#boxcar_username').removeClass('warning'); + $(this).prop('disabled', true); + $('#testBoxcar-result').html(loading); + $.get(srRoot + '/home/testBoxcar', {'username': boxcar_username}).done(function (data) { + $('#testBoxcar-result').html(data); + $('#testBoxcar').prop('disabled', false); + }); + }); + + $('#testBoxcar2').click(function () { + var boxcar2_accesstoken = $.trim($('#boxcar2_accesstoken').val()); + if (!boxcar2_accesstoken) { + $('#testBoxcar2-result').html('Please fill out the necessary fields above.'); + $('#boxcar2_accesstoken').addClass('warning'); + return; + } + $('#boxcar2_accesstoken').removeClass('warning'); + $(this).prop('disabled', true); + $('#testBoxcar2-result').html(loading); + $.get(srRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken}).done(function (data) { + $('#testBoxcar2-result').html(data); + $('#testBoxcar2').prop('disabled', false); + }); + }); + + $('#testPushover').click(function () { + var pushover_userkey = $('#pushover_userkey').val(); + var pushover_apikey = $('#pushover_apikey').val(); + if (!pushover_userkey || !pushover_apikey) { + $('#testPushover-result').html('Please fill out the necessary fields above.'); + if (!pushover_userkey) { + $('#pushover_userkey').addClass('warning'); + } else { + $('#pushover_userkey').removeClass('warning'); + } + if (!pushover_apikey) { + $('#pushover_apikey').addClass('warning'); + } else { + $('#pushover_apikey').removeClass('warning'); + } + return; + } + $('#pushover_userkey,#pushover_apikey').removeClass('warning'); + $(this).prop('disabled', true); + $('#testPushover-result').html(loading); + $.get(srRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey}).done(function (data) { + $('#testPushover-result').html(data); + $('#testPushover').prop('disabled', false); + }); + }); + + $('#testLibnotify').click(function() { + $('#testLibnotify-result').html(loading); + $.get(srRoot + '/home/testLibnotify', function (data) { + $('#testLibnotify-result').html(data); + }); + }); + + $('#twitterStep1').click(function() { + $('#testTwitter-result').html(loading); + $.get(srRoot + '/home/twitterStep1', function (data) { + window.open(data); + }).done(function() { + $('#testTwitter-result').html('<b>Step1:</b> Confirm Authorization'); + }); + }); + + $('#twitterStep2').click(function () { + var twitter_key = $.trim($('#twitter_key').val()); + if (!twitter_key) { + $('#testTwitter-result').html('Please fill out the necessary fields above.'); + $('#twitter_key').addClass('warning'); + return; + } + $('#twitter_key').removeClass('warning'); + $('#testTwitter-result').html(loading); + $.get(srRoot + '/home/twitterStep2', {'key': twitter_key}, function(data) { + $('#testTwitter-result').html(data); + }); + }); + + $('#testTwitter').click(function() { + $.get(srRoot + '/home/testTwitter', function(data) { + $('#testTwitter-result').html(data); + }); + }); + + $('#settingsNMJ').click(function() { + if (!$('#nmj_host').val()) { + alert('Please fill in the Popcorn IP address'); + $('#nmj_host').focus(); + return; + } + $('#testNMJ-result').html(loading); + var nmj_host = $('#nmj_host').val(); + + $.get(srRoot + '/home/settingsNMJ', {'host': nmj_host}, function (data) { + if (data === null) { + $('#nmj_database').removeAttr('readonly'); + $('#nmj_mount').removeAttr('readonly'); + } + var JSONData = $.parseJSON(data); + $('#testNMJ-result').html(JSONData.message); + $('#nmj_database').val(JSONData.database); + $('#nmj_mount').val(JSONData.mount); + + if (JSONData.database) { + $('#nmj_database').attr('readonly', true); + } else { + $('#nmj_database').removeAttr('readonly'); + } + if (JSONData.mount) { + $('#nmj_mount').attr('readonly', true); + } else { + $('#nmj_mount').removeAttr('readonly'); + } + }); + }); + + $('#testNMJ').click(function () { + var nmj_host = $.trim($('#nmj_host').val()); + var nmj_database = $('#nmj_database').val(); + var nmj_mount = $('#nmj_mount').val(); + if (!nmj_host) { + $('#testNMJ-result').html('Please fill out the necessary fields above.'); + $('#nmj_host').addClass('warning'); + return; + } + $('#nmj_host').removeClass('warning'); + $(this).prop('disabled', true); + $('#testNMJ-result').html(loading); + $.get(srRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount}).done(function (data) { + $('#testNMJ-result').html(data); + $('#testNMJ').prop('disabled', false); + }); + }); + + $('#settingsNMJv2').click(function() { + if (!$('#nmjv2_host').val()) { + alert('Please fill in the Popcorn IP address'); + $('#nmjv2_host').focus(); + return; + } + $('#testNMJv2-result').html(loading); + var nmjv2_host = $('#nmjv2_host').val(); + var nmjv2_dbloc; + var radios = document.getElementsByName('nmjv2_dbloc'); + for(var i = 0, len = radios.length; i < len; i++) { + if (radios[i].checked) { + nmjv2_dbloc=radios[i].value; + break; + } + } + + var nmjv2_dbinstance=$('#NMJv2db_instance').val(); + $.get(srRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance}, function (data){ + if (data === null) { + $('#nmjv2_database').removeAttr('readonly'); + } + var JSONData = $.parseJSON(data); + $('#testNMJv2-result').html(JSONData.message); + $('#nmjv2_database').val(JSONData.database); + + if (JSONData.database){ + $('#nmjv2_database').attr('readonly', true); + } else { + $('#nmjv2_database').removeAttr('readonly'); + } + }); + }); + + $('#testNMJv2').click(function () { + var nmjv2_host = $.trim($('#nmjv2_host').val()); + if (!nmjv2_host) { + $('#testNMJv2-result').html('Please fill out the necessary fields above.'); + $('#nmjv2_host').addClass('warning'); + return; + } + $('#nmjv2_host').removeClass('warning'); + $(this).prop('disabled', true); + $('#testNMJv2-result').html(loading); + $.get(srRoot + '/home/testNMJv2', {'host': nmjv2_host}) .done(function (data) { + $('#testNMJv2-result').html(data); + $('#testNMJv2').prop('disabled', false); + }); + }); + + $('#testFreeMobile').click(function () { + var freemobile_id = $.trim($('#freemobile_id').val()); + var freemobile_apikey = $.trim($('#freemobile_apikey').val()); + if (!freemobile_id || !freemobile_apikey) { + $('#testFreeMobile-result').html('Please fill out the necessary fields above.'); + if (!freemobile_id) { + $('#freemobile_id').addClass('warning'); + } else { + $('#freemobile_id').removeClass('warning'); + } + if (!freemobile_apikey) { + $('#freemobile_apikey').addClass('warning'); + } else { + $('#freemobile_apikey').removeClass('warning'); + } + return; + } + $('#freemobile_id,#freemobile_apikey').removeClass('warning'); + $(this).prop('disabled', true); + $('#testFreeMobile-result').html(loading); + $.get(srRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey}).done(function (data) { + $('#testFreeMobile-result').html(data); + $('#testFreeMobile').prop('disabled', false); + }); + }); + + $('#TraktGetPin').click(function () { + var trakt_pin_url = $('#trakt_pin_url').val(); + var w; + w = window.open(trakt_pin_url, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550"); + $('#trakt_pin').removeClass('hide'); + }); + + $('#trakt_pin').on('keyup change', function(){ + var trakt_pin = $('#trakt_pin').val(); + + if (trakt_pin.length !== 0) { + $('#TraktGetPin').addClass('hide'); + $('#authTrakt').removeClass('hide'); + } else { + $('#TraktGetPin').removeClass('hide'); + $('#authTrakt').addClass('hide'); + } + }); + + $('#authTrakt').click(function() { + var trakt_pin = $('#trakt_pin').val(); + if (trakt_pin.length !== 0) { + $.get(srRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin }).done(function (data) { + $('#testTrakt-result').html(data); + $('#authTrakt').addClass('hide'); + $('#trakt_pin').addClass('hide'); + $('#TraktGetPin').addClass('hide'); + }); + } + }); + + $('#testTrakt').click(function () { + var trakt_username = $.trim($('#trakt_username').val()); + var trakt_trending_blacklist = $.trim($('#trakt_blacklist_name').val()); + if (!trakt_username) { + $('#testTrakt-result').html('Please fill out the necessary fields above.'); + if (!trakt_username) { + $('#trakt_username').addClass('warning'); + } else { + $('#trakt_username').removeClass('warning'); + } + return; + } + + if (/\s/g.test(trakt_trending_blacklist)) { + $('#testTrakt-result').html('Check blacklist name; the value need to be a trakt slug'); + $('#trakt_blacklist_name').addClass('warning'); + return; + } + $('#trakt_username').removeClass('warning'); + $('#trakt_blacklist_name').removeClass('warning'); + $(this).prop('disabled', true); + $('#testTrakt-result').html(loading); + $.get(srRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist}).done(function (data) { + $('#testTrakt-result').html(data); + $('#testTrakt').prop('disabled', false); + }); + }); + + $('#testEmail').click(function () { + var status, host, port, tls, from, user, pwd, err, to; + status = $('#testEmail-result'); + status.html(loading); + host = $('#email_host').val(); + host = host.length > 0 ? host : null; + port = $('#email_port').val(); + port = port.length > 0 ? port : null; + tls = $('#email_tls').attr('checked') !== undefined ? 1 : 0; + from = $('#email_from').val(); + from = from.length > 0 ? from : 'root@localhost'; + user = $('#email_user').val().trim(); + pwd = $('#email_password').val(); + err = ''; + if (host === null) { + err += '<li style="color: red;">You must specify an SMTP hostname!</li>'; + } + if (port === null) { + err += '<li style="color: red;">You must specify an SMTP port!</li>'; + } else if (port.match(/^\d+$/) === null || parseInt(port, 10) > 65535) { + err += '<li style="color: red;">SMTP port must be between 0 and 65535!</li>'; + } + if (err.length > 0) { + err = '<ol>' + err + '</ol>'; + status.html(err); + } else { + to = prompt('Enter an email address to send the test to:', null); + if (to === null || to.length === 0 || to.match(/.*@.*/) === null) { + status.html('<p style="color: red;">You must provide a recipient email address!</p>'); + } else { + $.get(srRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to}, function (msg) { + $('#testEmail-result').html(msg); + }); + } + } + }); + + $('#testNMA').click(function () { + var nma_api = $.trim($('#nma_api').val()); + var nma_priority = $('#nma_priority').val(); + if (!nma_api) { + $('#testNMA-result').html('Please fill out the necessary fields above.'); + $('#nma_api').addClass('warning'); + return; + } + $('#nma_api').removeClass('warning'); + $(this).prop('disabled', true); + $('#testNMA-result').html(loading); + $.get(srRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority}).done(function (data) { + $('#testNMA-result').html(data); + $('#testNMA').prop('disabled', false); + }); + }); + + $('#testPushalot').click(function () { + var pushalot_authorizationtoken = $.trim($('#pushalot_authorizationtoken').val()); + if (!pushalot_authorizationtoken) { + $('#testPushalot-result').html('Please fill out the necessary fields above.'); + $('#pushalot_authorizationtoken').addClass('warning'); + return; + } + $('#pushalot_authorizationtoken').removeClass('warning'); + $(this).prop('disabled', true); + $('#testPushalot-result').html(loading); + $.get(srRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken}).done(function (data) { + $('#testPushalot-result').html(data); + $('#testPushalot').prop('disabled', false); + }); + }); + + $('#testPushbullet').click(function () { + var pushbullet_api = $.trim($('#pushbullet_api').val()); + if (!pushbullet_api) { + $('#testPushbullet-result').html('Please fill out the necessary fields above.'); + $('#pushbullet_api').addClass('warning'); + return; + } + $('#pushbullet_api').removeClass('warning'); + $(this).prop('disabled', true); + $('#testPushbullet-result').html(loading); + $.get(srRoot + '/home/testPushbullet', {'api': pushbullet_api}).done(function (data) { + $('#testPushbullet-result').html(data); + $('#testPushbullet').prop('disabled', false); + }); + }); + + function get_pushbullet_devices(msg){ + if(msg) { $('#testPushbullet-result').html(loading); } + + var pushbullet_api = $("#pushbullet_api").val(); + + if(!pushbullet_api) { + $('#testPushbullet-result').html("You didn't supply a Pushbullet api key"); + $("#pushbullet_api").focus(); + return false; + } + + $.get(srRoot + "/home/getPushbulletDevices", {'api': pushbullet_api}, function (data) { + var devices = jQuery.parseJSON(data).devices; + var current_pushbullet_device = $("#pushbullet_device").val(); + $("#pushbullet_device_list").html(''); + for (var i = 0, len = devices.length; i < len; i++) { + if(devices[i].active === true) { + if(current_pushbullet_device == devices[i].iden) { + $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>'); + } else { + $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>'); + } + } + } + if (current_pushbullet_device === '') { + $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>'); + } else { + $("#pushbullet_device_list").prepend('<option value="">All devices</option>'); + } + if(msg) $('#testPushbullet-result').html(msg); + }); + + $("#pushbullet_device_list").change(function(){ + $("#pushbullet_device").val($("#pushbullet_device_list").val()); + $('#testPushbullet-result').html("Don't forget to save your new pushbullet settings."); + }); + } + + $('#getPushbulletDevices').click(function(){ + get_pushbullet_devices("Device list updated. Please choose a device to push to."); + }); + + // we have to call this function on dom ready to create the devices select + get_pushbullet_devices(); + + $('#email_show').change(function() { + var key = parseInt($('#email_show').val(), 10); + $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); + }); + + // Update the internal data struct anytime settings are saved to the server + $('#email_show').bind('notify', function() { + load_show_notify_lists(); + }); + + function load_show_notify_lists() { + $.get(srRoot + "/home/loadShowNotifyLists", function(data) { + var list, html, s; + list = $.parseJSON(data); + notify_data = list; + if (list._size === 0) return; + html = '<option value="-1">-- Select --</option>'; + for (s in list) { + if (s.charAt(0) !== '_') { + html += '<option value="' + list[s].id + '">' + $('<div/>').text(list[s].name).html() + '</option>'; + } + } + $('#email_show').html(html); + $('#email_show_list').val(''); + }); + } + // Load the per show notify lists everytime this page is loaded + load_show_notify_lists(); + + $('#email_show_save').click(function() { + $.post(srRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) { + // Reload the per show notify lists to reflect changes + load_show_notify_lists(); + }); + }); + + // show instructions for plex when enabled + $('#use_plex').click(function() { + if ($(this).is(':checked')) { + $('.plexinfo').removeClass('hide'); + } else { + $('.plexinfo').addClass('hide'); + } + }); + }, + postProcessing: function() { + $('#config-components').tabs(); + $('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' }); + + // http://stackoverflow.com/questions/2219924/idiomatic-jquery-delayed-event-only-after-a-short-pause-in-typing-e-g-timew + var typewatch = (function () { + var timer = 0; + return function (callback, ms) { + clearTimeout(timer); + timer = setTimeout(callback, ms); + }; + })(); + + function israr_supported() { + var pattern = $('#naming_pattern').val(); + $.get(srRoot + '/config/postProcessing/isRarSupported', function (data) { + if (data !== "supported") { + $('#unpack').qtip('option', { + 'content.text': 'Unrar Executable not found.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#unpack').qtip('toggle', true); + $('#unpack').css('background-color', '#FFFFDD'); + } + }); + } + + function fill_examples() { + var pattern = $('#naming_pattern').val(); + var multi = $('#naming_multi_ep :selected').val(); + var anime_type = $('input[name="naming_anime"]:checked').val(); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3}, function (data) { + if (data) { + $('#naming_example').text(data + '.ext'); + $('#naming_example_div').show(); + } else { + $('#naming_example_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3}, function (data) { + if (data) { + $('#naming_example_multi').text(data + '.ext'); + $('#naming_example_multi_div').show(); + } else { + $('#naming_example_multi_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + if (data == "invalid") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_pattern').qtip('toggle', false); + $('#naming_pattern').css('background-color', '#FFFFFF'); + } + }); + } + + function fill_abd_examples() { + var pattern = $('#naming_abd_pattern').val(); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'}, function (data) { + if (data) { + $('#naming_abd_example').text(data + '.ext'); + $('#naming_abd_example_div').show(); + } else { + $('#naming_abd_example_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, function (data) { + if (data == "invalid") { + $('#naming_abd_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_abd_pattern').qtip('toggle', true); + $('#naming_abd_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_abd_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_abd_pattern').qtip('toggle', true); + $('#naming_abd_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_abd_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_abd_pattern').qtip('toggle', false); + $('#naming_abd_pattern').css('background-color', '#FFFFFF'); + } + }); + } + + function fill_sports_examples() { + var pattern = $('#naming_sports_pattern').val(); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'}, function (data) { + if (data) { + $('#naming_sports_example').text(data + '.ext'); + $('#naming_sports_example_div').show(); + } else { + $('#naming_sports_example_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'}, function (data) { + if (data == "invalid") { + $('#naming_sports_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_sports_pattern').qtip('toggle', true); + $('#naming_sports_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_sports_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_sports_pattern').qtip('toggle', true); + $('#naming_sports_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_sports_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_sports_pattern').qtip('toggle', false); + $('#naming_sports_pattern').css('background-color', '#FFFFFF'); + } + }); + } + + function fill_anime_examples() { + var pattern = $('#naming_anime_pattern').val(); + var multi = $('#naming_anime_multi_ep :selected').val(); + var anime_type = $('input[name="naming_anime"]:checked').val(); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type}, function (data) { + if (data) { + $('#naming_example_anime').text(data + '.ext'); + $('#naming_example_anime_div').show(); + } else { + $('#naming_example_anime_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + if (data) { + $('#naming_example_multi_anime').text(data + '.ext'); + $('#naming_example_multi_anime_div').show(); + } else { + $('#naming_example_multi_anime_div').hide(); + } + }); + + $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + if (data == "invalid") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is invalid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFDDDD'); + } else if (data == "seasonfolders") { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-red' + }); + $('#naming_pattern').qtip('toggle', true); + $('#naming_pattern').css('background-color', '#FFFFDD'); + } else { + $('#naming_pattern').qtip('option', { + 'content.text': 'This pattern is valid.', + 'style.classes': 'qtip-rounded qtip-shadow qtip-green' + }); + $('#naming_pattern').qtip('toggle', false); + $('#naming_pattern').css('background-color', '#FFFFFF'); + } + }); + } + + function setup_naming() { + // if it is a custom selection then show the text box + if ($('#name_presets :selected').val() == "Custom...") { + $('#naming_custom').show(); + } else { + $('#naming_custom').hide(); + $('#naming_pattern').val($('#name_presets :selected').attr('id')); + } + fill_examples(); + } + + function setup_abd_naming() { + // if it is a custom selection then show the text box + if ($('#name_abd_presets :selected').val() == "Custom...") { + $('#naming_abd_custom').show(); + } else { + $('#naming_abd_custom').hide(); + $('#naming_abd_pattern').val($('#name_abd_presets :selected').attr('id')); + } + fill_abd_examples(); + } + + function setup_sports_naming() { + // if it is a custom selection then show the text box + if ($('#name_sports_presets :selected').val() == "Custom...") { + $('#naming_sports_custom').show(); + } else { + $('#naming_sports_custom').hide(); + $('#naming_sports_pattern').val($('#name_sports_presets :selected').attr('id')); + } + fill_sports_examples(); + } + + function setup_anime_naming() { + // if it is a custom selection then show the text box + if ($('#name_anime_presets :selected').val() == "Custom...") { + $('#naming_anime_custom').show(); + } else { + $('#naming_anime_custom').hide(); + $('#naming_anime_pattern').val($('#name_anime_presets :selected').attr('id')); + } + fill_anime_examples(); + } + + $('#unpack').on('change', function(){ + if(this.checked) { + israr_supported(); + } else { + $('#unpack').qtip('toggle', false); + } + }); + + $('#name_presets').on('change', function(){ + setup_naming(); + }); + + $('#name_abd_presets').on('change', function(){ + setup_abd_naming(); + }); + + $('#naming_custom_abd').on('change', function(){ + setup_abd_naming(); + }); + + $('#name_sports_presets').on('change', function(){ + setup_sports_naming(); + }); + + $('#naming_custom_sports').on('change', function(){ + setup_sports_naming(); + }); + + $('#name_anime_presets').on('change', function(){ + setup_anime_naming(); + }); + + $('#naming_custom_anime').on('change', function(){ + setup_anime_naming(); + }); + + $('input[name="naming_anime"]').on('click', function(){ + setup_anime_naming(); + }); + + $('#naming_multi_ep').change(fill_examples); + $('#naming_pattern').focusout(fill_examples); + $('#naming_pattern').keyup(function () { + typewatch(function () { + fill_examples(); + }, 500); + }); + + $('#naming_anime_multi_ep').change(fill_anime_examples); + $('#naming_anime_pattern').focusout(fill_anime_examples); + $('#naming_anime_pattern').keyup(function () { + typewatch(function () { + fill_anime_examples(); + }, 500); + }); + + $('#naming_abd_pattern').focusout(fill_examples); + $('#naming_abd_pattern').keyup(function () { + typewatch(function () { + fill_abd_examples(); + }, 500); + }); + + $('#naming_sports_pattern').focusout(fill_examples); + $('#naming_sports_pattern').keyup(function () { + typewatch(function () { + fill_sports_examples(); + }, 500); + }); + + $('#naming_anime_pattern').focusout(fill_examples); + $('#naming_anime_pattern').keyup(function () { + typewatch(function () { + fill_anime_examples(); + }, 500); + }); + + $('#show_naming_key').on('click', function(){ + $('#naming_key').toggle(); + }); + $('#show_naming_abd_key').on('click', function(){ + $('#naming_abd_key').toggle(); + }); + $('#show_naming_sports_key').on('click', function(){ + $('#naming_sports_key').toggle(); + }); + $('#show_naming_anime_key').on('click', function(){ + $('#naming_anime_key').toggle(); + }); + $('#do_custom').on('click', function(){ + $('#naming_pattern').val($('#name_presets :selected').attr('id')); + $('#naming_custom').show(); + $('#naming_pattern').focus(); + }); + setup_naming(); + setup_abd_naming(); + setup_sports_naming(); + setup_anime_naming(); + + // -- start of metadata options div toggle code -- + $('#metadataType').on('change keyup', function () { + $(this).showHideMetadata(); + }); + + $.fn.showHideMetadata = function () { + $('.metadataDiv').each(function () { + var targetName = $(this).attr('id'); + var selectedTarget = $('#metadataType :selected').val(); + + if (selectedTarget == targetName) { + $(this).show(); + } else { + $(this).hide(); + } + }); + }; + //initialize to show the div + $(this).showHideMetadata(); + // -- end of metadata options div toggle code -- + + $('.metadata_checkbox').on('click', function(){ + $(this).refreshMetadataConfig(false); + }); + + $.fn.refreshMetadataConfig = function (first) { + var cur_most = 0; + var cur_most_provider = ''; + + $('.metadataDiv').each(function () { + var generator_name = $(this).attr('id'); + + var config_arr = []; + var show_metadata = $("#" + generator_name + "_show_metadata").prop('checked'); + var episode_metadata = $("#" + generator_name + "_episode_metadata").prop('checked'); + var fanart = $("#" + generator_name + "_fanart").prop('checked'); + var poster = $("#" + generator_name + "_poster").prop('checked'); + var banner = $("#" + generator_name + "_banner").prop('checked'); + var episode_thumbnails = $("#" + generator_name + "_episode_thumbnails").prop('checked'); + var season_posters = $("#" + generator_name + "_season_posters").prop('checked'); + var season_banners = $("#" + generator_name + "_season_banners").prop('checked'); + var season_all_poster = $("#" + generator_name + "_season_all_poster").prop('checked'); + var season_all_banner = $("#" + generator_name + "_season_all_banner").prop('checked'); + + config_arr.push(show_metadata ? '1' : '0'); + config_arr.push(episode_metadata ? '1' : '0'); + config_arr.push(fanart ? '1' : '0'); + config_arr.push(poster ? '1' : '0'); + config_arr.push(banner ? '1' : '0'); + config_arr.push(episode_thumbnails ? '1' : '0'); + config_arr.push(season_posters ? '1' : '0'); + config_arr.push(season_banners ? '1' : '0'); + config_arr.push(season_all_poster ? '1' : '0'); + config_arr.push(season_all_banner ? '1' : '0'); + + var cur_num = 0; + for (var i = 0, len = config_arr.length; i < len; i++) { + cur_num += parseInt(config_arr[i]); + } + if (cur_num > cur_most) { + cur_most = cur_num; + cur_most_provider = generator_name; + } + + $("#" + generator_name + "_eg_show_metadata").attr('class', show_metadata ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_episode_metadata").attr('class', episode_metadata ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_fanart").attr('class', fanart ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_poster").attr('class', poster ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_banner").attr('class', banner ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_episode_thumbnails").attr('class', episode_thumbnails ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_season_posters").attr('class', season_posters ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_season_banners").attr('class', season_banners ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_season_all_poster").attr('class', season_all_poster ? 'enabled' : 'disabled'); + $("#" + generator_name + "_eg_season_all_banner").attr('class', season_all_banner ? 'enabled' : 'disabled'); + $("#" + generator_name + "_data").val(config_arr.join('|')); + + }); + + if (cur_most_provider !== '' && first) { + $('#metadataType option[value=' + cur_most_provider + ']').attr('selected', 'selected'); + $(this).showHideMetadata(); + } + }; + + $(this).refreshMetadataConfig(true); + $('img[title]').qtip({ + position: { + viewport: $(window), + at: 'bottom center', + my: 'top right' + }, + style: { + tip: { + corner: true, + method: 'polygon' + }, + classes: 'qtip-shadow qtip-dark' + } + }); + $('i[title]').qtip({ + position: { + viewport: $(window), + at: 'top center', + my: 'bottom center' + }, + style: { + tip: { + corner: true, + method: 'polygon' + }, + classes: 'qtip-rounded qtip-shadow ui-tooltip-sb' + } + }); + $('.custom-pattern,#unpack').qtip({ + content: 'validating...', + show: { + event: false, + ready: false + }, + hide: false, + position: { + viewport: $(window), + at: 'center left', + my: 'center right' + }, + style: { + tip: { + corner: true, + method: 'polygon' + }, + classes: 'qtip-rounded qtip-shadow qtip-red' + } + }); + }, + search: function() { + $('#config-components').tabs(); + $('#nzb_dir').fileBrowser({ title: 'Select .nzb black hole/watch location' }); + $('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' }); + $('#torrent_path').fileBrowser({ title: 'Select .torrent download location' }); + + function toggleTorrentTitle(){ + if ($('#use_torrents').prop('checked')){ + $('#no_torrents').show(); + } else { + $('#no_torrents').hide(); + } + } + + $.fn.nzbMethodHandler = function() { + var selectedProvider = $('#nzb_method :selected').val(), + blackholeSettings = '#blackhole_settings', + sabnzbdSettings = '#sabnzbd_settings', + testSABnzbd = '#testSABnzbd', + testSABnzbdResult = '#testSABnzbd_result', + nzbgetSettings = '#nzbget_settings'; + + $(blackholeSettings).hide(); + $(sabnzbdSettings).hide(); + $(testSABnzbd).hide(); + $(testSABnzbdResult).hide(); + $(nzbgetSettings).hide(); + + if (selectedProvider.toLowerCase() === 'blackhole') { + $(blackholeSettings).show(); + } else if (selectedProvider.toLowerCase() === 'nzbget') { + $(nzbgetSettings).show(); + } else { + $(sabnzbdSettings).show(); + $(testSABnzbd).show(); + $(testSABnzbdResult).show(); + } + }; + + $.fn.rtorrentScgi = function(){ + var selectedProvider = $('#torrent_method :selected').val(); + + if (selectedProvider.toLowerCase() === 'rtorrent') { + var hostname = $('#torrent_host').prop('value'); + var isMatch = hostname.substr(0, 7) === "scgi://"; + + if (isMatch) { + $('#torrent_username_option').hide(); + $('#torrent_username').prop('value', ''); + $('#torrent_password_option').hide(); + $('#torrent_password').prop('value', ''); + $('#torrent_auth_type_option').hide(); + $("#torrent_auth_type option[value=none]").attr('selected', 'selected'); + } else { + $('#torrent_username_option').show(); + $('#torrent_password_option').show(); + $('#torrent_auth_type_option').show(); + } + } + }; + + $.fn.torrentMethodHandler = function() { + $('#options_torrent_clients').hide(); + $('#options_torrent_blackhole').hide(); + + var selectedProvider = $('#torrent_method :selected').val(), + host = ' host:port', + username = ' username', + password = ' password', + label = ' label', + directory = ' directory', + client = '', + optionPanel = '#options_torrent_blackhole'; + rpcurl = ' RPC URL'; + + if (selectedProvider.toLowerCase() !== 'blackhole') { + var label_warning_deluge = '#label_warning_deluge', + label_anime_warning_deluge = '#label_anime_warning_deluge', + host_desc_rtorrent = '#host_desc_rtorrent', + host_desc_torrent = '#host_desc_torrent', + torrent_verify_cert_option = '#torrent_verify_cert_option', + torrent_path_option = '#torrent_path_option', + torrent_seed_time_option = '#torrent_seed_time_option', + torrent_high_bandwidth_option = '#torrent_high_bandwidth_option', + torrent_label_option = '#torrent_label_option', + torrent_label_anime_option = '#torrent_label_anime_option', + path_synology = '#path_synology', + torrent_paused_option = '#torrent_paused_option'; + + $(label_warning_deluge).hide(); + $(label_anime_warning_deluge).hide(); + $(label_anime_warning_deluge).hide(); + $(host_desc_rtorrent).hide(); + $(host_desc_torrent).show(); + $(torrent_verify_cert_option).hide(); + $(torrent_verify_deluge).hide(); + $(torrent_verify_rtorrent).hide(); + $(torrent_auth_type_option).hide(); + $(torrent_path_option).show(); + $(torrent_path_option).find('.fileBrowser').show(); + $(torrent_seed_time_option).hide(); + $(torrent_high_bandwidth_option).hide(); + $(torrent_label_option).show(); + $(torrent_label_anime_option).show(); + $(path_synology).hide(); + $(torrent_paused_option).show(); + $(torrent_rpcurl_option).hide(); + $(this).rtorrentScgi(); + + if (selectedProvider.toLowerCase() === 'utorrent') { + client = 'uTorrent'; + $(torrent_path_option).hide(); + $('#torrent_seed_time_label').text('Minimum seeding time is'); + $(torrent_seed_time_option).show(); + $('#host_desc_torrent').text('URL to your uTorrent client (e.g. http://localhost:8000)'); + } else if (selectedProvider.toLowerCase() === 'transmission'){ + client = 'Transmission'; + $('#torrent_seed_time_label').text('Stop seeding when inactive for'); + $(torrent_seed_time_option).show(); + $(torrent_high_bandwidth_option).show(); + $(torrent_label_option).hide(); + $(torrent_label_anime_option).hide(); + $(torrent_rpcurl_option).show(); + $('#host_desc_torrent').text('URL to your Transmission client (e.g. http://localhost:9091)'); + } else if (selectedProvider.toLowerCase() === 'deluge'){ + client = 'Deluge'; + $(torrent_verify_cert_option).show(); + $(torrent_verify_deluge).show(); + $(torrent_verify_rtorrent).hide(); + $(label_warning_deluge).show(); + $(label_anime_warning_deluge).show(); + $('#torrent_username_option').hide(); + $('#torrent_username').prop('value', ''); + $('#host_desc_torrent').text('URL to your Deluge client (e.g. http://localhost:8112)'); + } else if ('deluged' == selectedProvider){ + client = 'Deluge'; + $(torrent_verify_cert_option).hide(); + $(torrent_verify_deluge).hide(); + $(torrent_verify_rtorrent).hide(); + $(label_warning_deluge).show(); + $(label_anime_warning_deluge).show(); + $('#torrent_username_option').show(); + $('#host_desc_torrent').text('IP or Hostname of your Deluge Daemon (e.g. scgi://localhost:58846)'); + } else if ('download_station' == selectedProvider){ + client = 'Synology DS'; + $(torrent_label_option).hide(); + $(torrent_label_anime_option).hide(); + $('#torrent_paused_option').hide(); + $(torrent_path_option).find('.fileBrowser').hide(); + $('#host_desc_torrent').text('URL to your Synology DS client (e.g. http://localhost:5000)'); + $(path_synology).show(); + } else if ('rtorrent' == selectedProvider){ + client = 'rTorrent'; + $(torrent_paused_option).hide(); + $('#host_desc_torrent').text('URL to your rTorrent client (e.g. scgi://localhost:5000 <br> or https://localhost/rutorrent/plugins/httprpc/action.php)'); + $(torrent_verify_cert_option).show(); + $(torrent_verify_deluge).hide(); + $(torrent_verify_rtorrent).show(); + $(torrent_auth_type_option).show(); + } else if ('qbittorrent' == selectedProvider){ + client = 'qbittorrent'; + $(torrent_path_option).hide(); + $(torrent_label_option).hide(); + $(torrent_label_anime_option).hide(); + $('#host_desc_torrent').text('URL to your qbittorrent client (e.g. http://localhost:8080)'); + } else if ('mlnet' == selectedProvider){ + client = 'mlnet'; + $(torrent_path_option).hide(); + $(torrent_label_option).hide(); + $(torrent_verify_cert_option).hide(); + $(torrent_verify_deluge).hide(); + $(torrent_verify_rtorrent).hide(); + $(torrent_label_anime_option).hide(); + $(torrent_paused_option).hide(); + $('#host_desc_torrent').text('URL to your MLDonkey (e.g. http://localhost:4080)'); + } + $('#host_title').text(client + host); + $('#username_title').text(client + username); + $('#password_title').text(client + password); + $('#torrent_client').text(client); + $('#rpcurl_title').text(client + rpcurl); + optionPanel = '#options_torrent_clients'; + } + $(optionPanel).show(); + }; + + $('#nzb_method').change($(this).nzbMethodHandler); + + $(this).nzbMethodHandler(); + + $('#testSABnzbd').click(function(){ + $('#testSABnzbd_result').html(loading); + var sab_host = $('#sab_host').val(); + var sab_username = $('#sab_username').val(); + var sab_password = $('#sab_password').val(); + var sab_apiKey = $('#sab_apikey').val(); + + $.get(srRoot + '/home/testSABnzbd', {'host': sab_host, 'username': sab_username, 'password': sab_password, 'apikey': sab_apiKey}, function(data){ + $('#testSABnzbd_result').html(data); + }); + }); + + $('#torrent_method').change($(this).torrentMethodHandler); + + $(this).torrentMethodHandler(); + + $('#use_torrents').click(function(){ + toggleTorrentTitle(); + }); + + $('#test_torrent').click(function(){ + $('#test_torrent_result').html(loading); + var torrent_method = $('#torrent_method :selected').val(); + var torrent_host = $('#torrent_host').val(); + var torrent_username = $('#torrent_username').val(); + var torrent_password = $('#torrent_password').val(); + + $.get(srRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password}, function(data){ + $('#test_torrent_result').html(data); + }); + }); + + $('#torrent_host').change($(this).rtorrentScgi); + }, + subtitles: function() { + $.fn.showHideServices = function() { + $('.serviceDiv').each(function(){ + var serviceName = $(this).attr('id'); + var selectedService = $('#editAService :selected').val(); + + if (selectedService+'Div' === serviceName){ + $(this).show(); + } else { + $(this).hide(); + } + }); + }; + + $.fn.addService = function(id, name, url, key, isDefault, showService) { + if (url.match('/$') === null) { url = url + '/'; } + + if ($('#service_order_list > #'+id).length === 0 && showService !== false) { + var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="service_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/services/newznab.gif" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; + + $('#service_order_list').append(toAdd); + $('#service_order_list').sortable("refresh"); + } + }; + + $.fn.deleteService = function(id) { + $('#service_order_list > #'+id).remove(); + }; + + $.fn.refreshServiceList = function() { + var idArr = $("#service_order_list").sortable('toArray'); + var finalArr = []; + $.each(idArr, function(key, val) { + var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; + finalArr.push(val + ':' + checked); + }); + $("#service_order").val(finalArr.join(' ')); + }; + + $('#editAService').change(function(){ + $(this).showHideServices(); + }); + + $('.service_enabler').on('click', function(){ + $(this).refreshServiceList(); + }); + + // initialization stuff + $(this).showHideServices(); + + $("#service_order_list").sortable({ + placeholder: 'ui-state-highlight', + update: function() { + $(this).refreshServiceList(); + } + }); + + $("#service_order_list").disableSelection(); + }, + providers: function() { + $.fn.showHideProviders = function() { + $('.providerDiv').each(function(){ + var providerName = $(this).attr('id'); + var selectedProvider = $('#editAProvider :selected').val(); + + if (selectedProvider + 'Div' == providerName) { // jshint ignore:line + $(this).show(); + } else { + $(this).hide(); + } + }); + }; + + var ifExists = function(loopThroughArray, searchFor) { + var found = false; + + loopThroughArray.forEach(function(rootObject) { + if (rootObject.name === searchFor) { + found = true; + } + console.log(rootObject.name + " while searching for: "+ searchFor); + }); + return found; + }; + + /** + * Gets categories for the provided newznab provider. + * @param {String} isDefault + * @param {Array} selectedProvider + * @return no return data. Function updateNewznabCaps() is run at callback + */ + $.fn.getCategories = function (isDefault, selectedProvider) { + + var name = selectedProvider[0]; + var url = selectedProvider[1]; + var key = selectedProvider[2]; + + if (!name || !url || !key) { + return; + } + + var params = {url: url, name: name, key: key}; + + $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); + var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ + $(this).updateNewznabCaps( data, selectedProvider ); + console.debug(data.tv_categories); // jshint ignore:line + }); + jqxhr.always(function() { + $(".updating_categories").empty(); + }); + }; + + $.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) { + url = $.trim(url); + if (!url) { + return; + } + + if (!/^https?:\/\//i.test(url)) { + url = "http://" + url; + } + + if (url.match('/$') === null) { + url = url + '/'; + } + + var newData = [isDefault, [name, url, key, cat]]; + newznabProviders[id] = newData; + + if (!isDefault){ + $('#editANewznabProvider').addOption(id, name); + $(this).populateNewznabSection(); + } + + if ($('#provider_order_list > #'+id).length === 0 && showProvider !== false) { + var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; + + $('#provider_order_list').append(toAdd); + $('#provider_order_list').sortable("refresh"); + } + + $(this).makeNewznabProviderString(); + }; + + $.fn.addTorrentRssProvider = function (id, name, url, cookies, titleTAG) { + var newData = [name, url, cookies, titleTAG]; + torrentRssProviders[id] = newData; + + $('#editATorrentRssProvider').addOption(id, name); + $(this).populateTorrentRssSection(); + + if ($('#provider_order_list > #'+id).length === 0) { + $('#provider_order_list').append('<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'); + $('#provider_order_list').sortable("refresh"); + } + + $(this).makeTorrentRssProviderString(); + }; + + $.fn.updateProvider = function (id, url, key, cat) { + newznabProviders[id][1][1] = url; + newznabProviders[id][1][2] = key; + newznabProviders[id][1][3] = cat; + + $(this).populateNewznabSection(); + + $(this).makeNewznabProviderString(); + }; + + $.fn.deleteProvider = function (id) { + $('#editANewznabProvider').removeOption(id); + delete newznabProviders[id]; + $(this).populateNewznabSection(); + $('li').remove('#'+id); + $(this).makeNewznabProviderString(); + }; + + $.fn.updateTorrentRssProvider = function (id, url, cookies, titleTAG) { + torrentRssProviders[id][1] = url; + torrentRssProviders[id][2] = cookies; + torrentRssProviders[id][3] = titleTAG; + $(this).populateTorrentRssSection(); + $(this).makeTorrentRssProviderString(); + }; + + $.fn.deleteTorrentRssProvider = function (id) { + $('#editATorrentRssProvider').removeOption(id); + delete torrentRssProviders[id]; + $(this).populateTorrentRssSection(); + $('li').remove('#'+id); + $(this).makeTorrentRssProviderString(); + }; + + $.fn.populateNewznabSection = function() { + var selectedProvider = $('#editANewznabProvider :selected').val(); + var data = ''; + var isDefault = ''; + var rrcat = ''; + + if (selectedProvider === 'addNewznab') { + data = ['','','']; + isDefault = 0; + $('#newznab_add_div').show(); + $('#newznab_update_div').hide(); + $('#newznab_cat').attr('disabled','disabled'); + $('#newznab_cap').attr('disabled','disabled'); + $('#newznab_cat_update').attr('disabled','disabled'); + $('#newznabcapdiv').hide(); + + $("#newznab_cat option").each(function() { + $(this).remove(); + return; + }); + + $("#newznab_cap option").each(function() { + $(this).remove(); + return; + }); + + } else { + data = newznabProviders[selectedProvider][1]; + isDefault = newznabProviders[selectedProvider][0]; + $('#newznab_add_div').hide(); + $('#newznab_update_div').show(); + $('#newznab_cat').removeAttr("disabled"); + $('#newznab_cap').removeAttr("disabled"); + $('#newznab_cat_update').removeAttr("disabled"); + $('#newznabcapdiv').show(); + } + + $('#newznab_name').val(data[0]); + $('#newznab_url').val(data[1]); + $('#newznab_key').val(data[2]); + + //Check if not already array + if (typeof data[3] === 'string') { + rrcat = data[3].split(","); + } else { + rrcat = data[3]; + } + + // Update the category select box (on the right) + var newCatOptions = []; + if (rrcat) { + rrcat.forEach(function (cat) { + if (cat !== '') { + newCatOptions.push({text : cat, value : cat}); + } + }); + $("#newznab_cat").replaceOptions(newCatOptions); + } + + if (selectedProvider === 'addNewznab') { + $('#newznab_name').removeAttr("disabled"); + $('#newznab_url').removeAttr("disabled"); + } else { + $('#newznab_name').attr("disabled", "disabled"); + + if (isDefault) { + $('#newznab_url').attr("disabled", "disabled"); + $('#newznab_delete').attr("disabled", "disabled"); + } else { + $('#newznab_url').removeAttr("disabled"); + $('#newznab_delete').removeAttr("disabled"); + + //Get Categories Capabilities + if (data[0] && data[1] && data[2] && !ifExists($.fn.newznabProvidersCapabilities, data[0])) { + $(this).getCategories(isDefault, data); + } + $(this).updateNewznabCaps( null, data ); + } + } + }; + + /** + * Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name + * and category capabilities. Return + * @param {Array} newzNabCaps, is the returned object with newzNabprod Name and Capabilities. + * @param {Array} selectedProvider + * @return no return data. The multiselect input $("#newznab_cap") is updated, as a result. + */ + $.fn.updateNewznabCaps = function( newzNabCaps, selectedProvider ) { + if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])) { + $.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories}); // jshint ignore:line + } + + //Loop through the array and if currently selected newznab provider name matches one in the array, use it to + //update the capabilities select box (on the left). + if (selectedProvider[0]) { + $.fn.newznabProvidersCapabilities.forEach(function(newzNabCap) { + if (newzNabCap.name && newzNabCap.name === selectedProvider[0] && newzNabCap.categories instanceof Array) { + var newCapOptions = []; + newzNabCap.categories.forEach(function(categorySet) { + if (categorySet.id && categorySet.name) { + newCapOptions.push({value : categorySet.id, text : categorySet.name + "(" + categorySet.id + ")"}); + } + }); + $("#newznab_cap").replaceOptions(newCapOptions); + } + }); + } + }; + + $.fn.makeNewznabProviderString = function() { + var provStrings = []; + + for (var id in newznabProviders) { + if (newznabProviders.hasOwnProperty(id)) { + provStrings.push(newznabProviders[id][1].join('|')); + } + } + + $('#newznab_string').val(provStrings.join('!!!')); + }; + + $.fn.populateTorrentRssSection = function() { + var selectedProvider = $('#editATorrentRssProvider :selected').val(); + var data = ''; + + if (selectedProvider === 'addTorrentRss') { + data = ['','','','title']; + $('#torrentrss_add_div').show(); + $('#torrentrss_update_div').hide(); + } else { + data = torrentRssProviders[selectedProvider]; + $('#torrentrss_add_div').hide(); + $('#torrentrss_update_div').show(); + } + + $('#torrentrss_name').val(data[0]); + $('#torrentrss_url').val(data[1]); + $('#torrentrss_cookies').val(data[2]); + $('#torrentrss_titleTAG').val(data[3]); + + if (selectedProvider === 'addTorrentRss') { + $('#torrentrss_name').removeAttr("disabled"); + $('#torrentrss_url').removeAttr("disabled"); + $('#torrentrss_cookies').removeAttr("disabled"); + $('#torrentrss_titleTAG').removeAttr("disabled"); + } else { + $('#torrentrss_name').attr("disabled", "disabled"); + $('#torrentrss_url').removeAttr("disabled"); + $('#torrentrss_cookies').removeAttr("disabled"); + $('#torrentrss_titleTAG').removeAttr("disabled"); + $('#torrentrss_delete').removeAttr("disabled"); + } + }; + + $.fn.makeTorrentRssProviderString = function() { + var provStrings = []; + for (var id in torrentRssProviders) { + if (torrentRssProviders.hasOwnProperty(id)) { + provStrings.push(torrentRssProviders[id].join('|')); + } + } + + $('#torrentrss_string').val(provStrings.join('!!!')); + }; + + + $.fn.refreshProviderList = function() { + var idArr = $("#provider_order_list").sortable('toArray'); + var finalArr = []; + $.each(idArr, function(key, val) { + var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; + finalArr.push(val + ':' + checked); + }); + + $("#provider_order").val(finalArr.join(' ')); + $(this).refreshEditAProvider(); + }; + + $.fn.refreshEditAProvider = function() { + $('#provider-list').empty(); + + var idArr = $("#provider_order_list").sortable('toArray'); + var finalArr = []; + $.each(idArr, function(key, val) { + if ($('#enable_'+val).prop('checked')) { + finalArr.push(val); + } + }); + + if (finalArr.length > 0) { + $('<select>').prop('id','editAProvider').addClass('form-control input-sm').appendTo('#provider-list'); + for (var i = 0, len = finalArr.length; i < len; i++) { + var provider = finalArr[i]; + $('#editAProvider').append($('<option>').prop('value',provider).text($.trim($('#'+provider).text()).replace(/\s\*$/, '').replace(/\s\*\*$/, ''))); + } + } else { + document.getElementsByClassName('component-desc')[0].innerHTML = "No providers available to configure."; + } + + $(this).showHideProviders(); + }; + + var newznabProviders = []; + var torrentRssProviders = []; + + $(this).on('change', '.newznab_key', function(){ + var providerId = $(this).attr('id'); + providerId = providerId.substring(0, providerId.length-'_hash'.length); + + var url = $('#'+providerId+'_url').val(); + var cat = $('#'+providerId+'_cat').val(); + var key = $(this).val(); + + $(this).updateProvider(providerId, url, key, cat); + }); + + $('#newznab_key,#newznab_url').change(function(){ + var selectedProvider = $('#editANewznabProvider :selected').val(); + + if (selectedProvider === "addNewznab"){ + return; + } + + var url = $('#newznab_url').val(); + var key = $('#newznab_key').val(); + + var cat = $('#newznab_cat option').map(function(i, opt) { + return $(opt).text(); + }).toArray().join(','); + + $(this).updateProvider(selectedProvider, url, key, cat); + }); + + $('#torrentrss_url,#torrentrss_cookies,#torrentrss_titleTAG').change(function(){ + var selectedProvider = $('#editATorrentRssProvider :selected').val(); + + if (selectedProvider === "addTorrentRss"){ + return; + } + + var url = $('#torrentrss_url').val(); + var cookies = $('#torrentrss_cookies').val(); + var titleTAG = $('#torrentrss_titleTAG').val(); + + $(this).updateTorrentRssProvider(selectedProvider, url, cookies, titleTAG); + }); + + $('body').on('change', '#editAProvider',function(){ + $(this).showHideProviders(); + }); + + $('#editANewznabProvider').change(function(){ + $(this).populateNewznabSection(); + }); + + $('#editATorrentRssProvider').change(function(){ + $(this).populateTorrentRssSection(); + }); + + $(this).on('click', '.provider_enabler', function(){ + $(this).refreshProviderList(); + }); + + $('#newznab_cat_update').click(function(){ + console.debug('Clicked Button'); + + // Maybe check if there is anything selected? + $("#newznab_cat option").each(function() { + $(this).remove(); + }); + + var newOptions = []; + + // When the update botton is clicked, loop through the capabilities list + // and copy the selected category id's to the category list on the right. + $("#newznab_cap option:selected").each(function(){ + var selectedCat = $(this).val(); + console.debug(selectedCat); + newOptions.push({text: selectedCat, value: selectedCat}); + }); + + $("#newznab_cat").replaceOptions(newOptions); + + var selectedProvider = $("#editANewznabProvider :selected").val(); + if (selectedProvider === "addNewznab"){ + return; + } + + var url = $('#newznab_url').val(); + var key = $('#newznab_key').val(); + + var cat = $('#newznab_cat option').map(function(i, opt) { + return $(opt).text(); + }).toArray().join(','); + + $("#newznab_cat option:not([value])").remove(); + + $(this).updateProvider(selectedProvider, url, key, cat); + }); + + + $('#newznab_add').click(function(){ + var name = $.trim($('#newznab_name').val()); + var url = $.trim($('#newznab_url').val()); + var key = $.trim($('#newznab_key').val()); + //var cat = $.trim($('#newznab_cat').val()); + + var cat = $.trim($('#newznab_cat option').map(function(i, opt) { + return $(opt).text(); + }).toArray().join(',')); + + if (!name || !url || !key) { + return; + } + + var params = {name: name}; + + // send to the form with ajax, get a return value + $.getJSON(srRoot + '/config/providers/canAddNewznabProvider', params, function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + $(this).addProvider(data.success, name, url, key, cat, 0); + }); + }); + + $('.newznab_delete').click(function(){ + var selectedProvider = $('#editANewznabProvider :selected').val(); + $(this).deleteProvider(selectedProvider); + }); + + $('#torrentrss_add').click(function(){ + var name = $('#torrentrss_name').val(); + var url = $('#torrentrss_url').val(); + var cookies = $('#torrentrss_cookies').val(); + var titleTAG = $('#torrentrss_titleTAG').val(); + var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG}; + + // send to the form with ajax, get a return value + $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + + $(this).addTorrentRssProvider(data.success, name, url, cookies, titleTAG); + $(this).refreshEditAProvider(); + }); + }); + + $('.torrentrss_delete').on('click', function(){ + $(this).deleteTorrentRssProvider($('#editATorrentRssProvider :selected').val()); + $(this).refreshEditAProvider(); + }); + + $(this).on('change', "[class='providerDiv_tip'] input", function(){ + $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").replaceWith($(this).clone()); + $('div .providerDiv ' + "[newznab_name=" + $(this).attr('id') + "]").replaceWith($(this).clone()); + }); + + $(this).on('change', "[class='providerDiv_tip'] select", function(){ + $(this).find('option').each( function() { + if ($(this).is(':selected')) { + $(this).prop('defaultSelected', true); + } else { + $(this).prop('defaultSelected', false); + } + }); + $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").empty().replaceWith($(this).clone()); + }); + + $(this).on('change', '.enabler', function(){ + if ($(this).is(':checked')) { + $('.content_'+$(this).attr('id')).each( function() { + $(this).show(); + }); + } else { + $('.content_'+$(this).attr('id')).each( function() { + $(this).hide(); + }); + } + }); + + $(".enabler").each(function(){ + if (!$(this).is(':checked')) { + $('.content_'+$(this).attr('id')).hide(); + } else { + $('.content_'+$(this).attr('id')).show(); + } + }); + + $.fn.makeTorrentOptionString = function(providerId) { + var seedRatio = $('.providerDiv_tip #' + providerId + '_seed_ratio').prop('value'); + var seedTime = $('.providerDiv_tip #' + providerId + '_seed_time').prop('value'); + var processMet = $('.providerDiv_tip #' + providerId + '_process_method').prop('value'); + var optionString = $('.providerDiv_tip #' + providerId + '_option_string'); + + optionString.val([seedRatio, seedTime, processMet].join('|')); + }; + + $(this).on('change', '.seed_option', function(){ + var providerId = $(this).attr('id').split('_')[0]; + $(this).makeTorrentOptionString(providerId); + }); + + $.fn.replaceOptions = function(options) { + var self, $option; + + this.empty(); + self = this; + + $.each(options, function(index, option) { + $option = $("<option></option>").attr("value", option.value).text(option.text); + self.append($option); + }); + }; + + // initialization stuff + $.fn.newznabProvidersCapabilities = []; + + $(this).showHideProviders(); + + $("#provider_order_list").sortable({ + placeholder: 'ui-state-highlight', + update: function () { + $(this).refreshProviderList(); + } + }); + + $("#provider_order_list").disableSelection(); + + if ($('#editANewznabProvider').length) { + $(this).populateNewznabSection(); + } + } + }, + manage: { + init: function() { + // controller-wide code + }, + show: function() { + // action-specific code + } + } +}; + +var UTIL = { + exec: function(controller, action) { + var ns = SICKRAGE; + action = (action === undefined) ? "init" : action; + + if (controller !== "" && ns[controller] && typeof ns[controller][action] === "function") { + ns[controller][action](); + } + }, + init: function() { + var body = document.body, + controller = body.getAttribute("data-controller"), + action = body.getAttribute("data-action"); + + UTIL.exec("common"); + UTIL.exec(controller); + UTIL.exec(controller, action); + } +}; + +$(document).ready(UTIL.init); diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js new file mode 100644 index 0000000000000000000000000000000000000000..0e56469a964fe646a862dd294650d488358186c3 GIT binary patch literal 51335 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 literal 0 HcmV?d00001 diff --git a/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js b/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js index a914012a0..c53a58f7c 100644 --- a/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js +++ b/gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js @@ -2,75 +2,78 @@ //** Available/ usage terms at http://www.dynamicdrive.com (March 30th, 09') //** v1.1 (April 7th, 09'): //** 1) Adds ability to scroll to an absolute position (from top of page) or specific element on the page instead. -//** 2) Fixes scroll animation not working in Opera. +//** 2) Fixes scroll animation not working in Opera. var scrolltotop={ - //startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control - //scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top). - setting: {startline:100, scrollto: 0, scrollduration:1000, fadeduration:[500, 100]}, - controlHTML: top_image_html,//set in inc_top.tmpl so it can be $srRooted - controlattrs: {offsetx:10, offsety:10}, //offset of control relative to right/ bottom of window corner - anchorkeyword: '#top', //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links + //startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control + //scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top). + setting: {startline:100, scrollto: 0, scrollduration:1000, fadeduration:[500, 100]}, + controlHTML: topImageHtml, // jshint ignore:line + controlattrs: {offsetx:10, offsety:10}, //offset of control relative to right/ bottom of window corner + anchorkeyword: '#top', //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links - state: {isvisible:false, shouldvisible:false}, + state: {isvisible:false, shouldvisible:false}, - scrollup:function(){ - if (!this.cssfixedsupport) //if control is positioned using JavaScript - this.$control.css({opacity:0}) //hide control immediately after clicking it - var dest=isNaN(this.setting.scrollto)? this.setting.scrollto : parseInt(this.setting.scrollto) - if (typeof dest=="string" && jQuery('#'+dest).length==1) //check element set by string exists - dest=jQuery('#'+dest).offset().top - else - dest=0 - this.$body.animate({scrollTop: dest}, this.setting.scrollduration); - }, + scrollup:function(){ + if (!this.cssfixedsupport) { //if control is positioned using JavaScript + this.$control.css({opacity:0}); //hide control immediately after clicking it + } + var dest=isNaN(this.setting.scrollto)? this.setting.scrollto : parseInt(this.setting.scrollto); + if (typeof dest === "string" && jQuery('#'+dest).length === 1){ //check element set by string exists + dest=jQuery('#'+dest).offset().top; + } else { + dest = 0; + } + this.$body.animate({scrollTop: dest}, this.setting.scrollduration); + }, - keepfixed:function(){ - var $window=jQuery(window) - var controlx=$window.scrollLeft() + $window.width() - this.$control.width() - this.controlattrs.offsetx - var controly=$window.scrollTop() + $window.height() - this.$control.height() - this.controlattrs.offsety - this.$control.css({left:controlx+'px', top:controly+'px'}) - }, + keepfixed:function(){ + var $window=jQuery(window); + var controlx=$window.scrollLeft() + $window.width() - this.$control.width() - this.controlattrs.offsetx; + var controly=$window.scrollTop() + $window.height() - this.$control.height() - this.controlattrs.offsety; + this.$control.css({left:controlx+'px', top:controly+'px'}); + }, - togglecontrol:function(){ - var scrolltop=jQuery(window).scrollTop() - if (!this.cssfixedsupport) - this.keepfixed() - this.state.shouldvisible=(scrolltop>=this.setting.startline)? true : false - if (this.state.shouldvisible && !this.state.isvisible){ - this.$control.stop().animate({opacity:1}, this.setting.fadeduration[0]) - this.state.isvisible=true - } - else if (this.state.shouldvisible==false && this.state.isvisible){ - this.$control.stop().animate({opacity:0}, this.setting.fadeduration[1]) - this.state.isvisible=false - } - }, - - init:function(){ - jQuery(document).ready(function($){ - var mainobj=scrolltotop - var iebrws=document.all - mainobj.cssfixedsupport=!iebrws || iebrws && document.compatMode=="CSS1Compat" && window.XMLHttpRequest //not IE or IE7+ browsers in standards mode - mainobj.$body=(window.opera)? (document.compatMode=="CSS1Compat"? $('html') : $('body')) : $('html,body') - mainobj.$control=$('<div id="topcontrol">'+mainobj.controlHTML+'</div>') - .css({position:mainobj.cssfixedsupport? 'fixed' : 'absolute', bottom:mainobj.controlattrs.offsety, right:mainobj.controlattrs.offsetx, opacity:0, cursor:'pointer'}) - .attr({title:'Scroll Back to Top'}) - .click(function(){mainobj.scrollup(); return false}) - .appendTo('body') - if (document.all && !window.XMLHttpRequest && mainobj.$control.text()!='') //loose check for IE6 and below, plus whether control contains any text - mainobj.$control.css({width:mainobj.$control.width()}) //IE6- seems to require an explicit width on a DIV containing text - mainobj.togglecontrol() - $('a[href="' + mainobj.anchorkeyword +'"]').click(function(){ - mainobj.scrollup() - return false - }) - $(window).bind('scroll resize', function(e){ - mainobj.togglecontrol() - }) - }) - } -} + togglecontrol:function(){ + var scrolltop=jQuery(window).scrollTop(); + if (!this.cssfixedsupport) { + this.keepfixed(); + } + this.state.shouldvisible=(scrolltop>=this.setting.startline)? true : false; + if (this.state.shouldvisible && !this.state.isvisible){ + this.$control.stop().animate({opacity:1}, this.setting.fadeduration[0]); + this.state.isvisible = true; + } else if (this.state.shouldvisible === false && this.state.isvisible){ + this.$control.stop().animate({opacity:0}, this.setting.fadeduration[1]); + this.state.isvisible=false; + } + }, -scrolltotop.init() \ No newline at end of file + init:function(){ + jQuery(document).ready(function($){ + var mainobj = scrolltotop; + var iebrws = document.all; + mainobj.cssfixedsupport=!iebrws || iebrws && document.compatMode.toLowerCase() === "CSS1Compat".toLowerCase() && window.XMLHttpRequest; //not IE or IE7+ browsers in standards mode + mainobj.$body=(window.opera)? (document.compatMode.toLowerCase() === "CSS1Compat".toLowerCase() ? $('html') : $('body')) : $('html,body'); + mainobj.$control=$('<div id="topcontrol">'+mainobj.controlHTML+'</div>') + .css({position:mainobj.cssfixedsupport? 'fixed' : 'absolute', bottom:mainobj.controlattrs.offsety, right:mainobj.controlattrs.offsetx, opacity:0, cursor:'pointer'}) + .attr({title:'Scroll Back to Top'}) + .click(function(){mainobj.scrollup(); return false;}) + .appendTo('body'); + if (document.all && !window.XMLHttpRequest && mainobj.$control.text()!==''){ //loose check for IE6 and below, plus whether control contains any text + mainobj.$control.css({width:mainobj.$control.width()}); //IE6- seems to require an explicit width on a DIV containing text + } + mainobj.togglecontrol(); + $('a[href="' + mainobj.anchorkeyword +'"]').click(function(){ + mainobj.scrollup(); + return false; + }); + $(window).bind('scroll resize', function(){ + mainobj.togglecontrol(); + }); + }); + } +}; + +scrolltotop.init(); diff --git a/gui/slick/js/new/config_backuprestore.js b/gui/slick/js/new/config_backuprestore.js deleted file mode 100644 index b721fac14..000000000 --- a/gui/slick/js/new/config_backuprestore.js +++ /dev/null @@ -1,119 +0,0 @@ -$(document).ready(function(){ - $('#backupDir').fileBrowser({ title: 'Select backup folder to save to', key: 'backupPath' }); - $('#backupFile').fileBrowser({ title: 'Select backup files to restore', key: 'backupFile', includeFiles: 1 }); - $('#config-components').tabs(); - - $(".enabler").each(function(){ - if (!$(this).prop('checked')) $('#content_'+$(this).attr('id')).hide(); - }); - - $(".enabler").click(function() { - if ($(this).prop('checked')){ - $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); - } else { - $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); - } - }); - - $(".viewIf").click(function() { - if ($(this).prop('checked')) { - $('.hide_if_'+$(this).attr('id')).css('display','none'); - $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear"); - } else { - $('.show_if_'+$(this).attr('id')).css('display','none'); - $('.hide_if_'+$(this).attr('id')).fadeIn("fast", "linear"); - } - }); - - $(".datePresets").click(function() { - var def = $('#date_presets').val(); - if ($(this).prop('checked') && '%x' == def) { - def = '%a, %b %d, %Y'; - $('#date_use_system_default').html('1'); - } else if (!$(this).prop('checked') && '1' == $('#date_use_system_default').html()){ - def = '%x'; - } - - $('#date_presets').attr('name', 'date_preset_old'); - $('#date_presets').attr('id', 'date_presets_old'); - - $('#date_presets_na').attr('name', 'date_preset'); - $('#date_presets_na').attr('id', 'date_presets'); - - $('#date_presets_old').attr('name', 'date_preset_na'); - $('#date_presets_old').attr('id', 'date_presets_na'); - - if (def) $('#date_presets').val(def); - }); - - // bind 'myForm' and provide a simple callback function - $('#configForm').ajaxForm({ - beforeSubmit: function(){ - $('.config_submitter .config_submitter_refresh').each(function(){ - $(this).attr("disabled", "disabled"); - $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); - $(this).hide(); - }); - }, - success: function(){ - setTimeout(function () { - "use strict"; - config_success(); - }, 2000); - } - }); - - $('#api_key').click(function(){ - $('#api_key').select(); - }); - - $("#generate_new_apikey").click(function(){ - $.get(srRoot + '/config/general/generateApiKey', - function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - $('#api_key').val(data); - }); - }); - - $('#branchCheckout').click(function() { - var url = srRoot+'/home/branchCheckout?branch='+$("#branchVersion").val(); - var checkDBversion = srRoot + "/home/getDBcompare"; - $.getJSON(checkDBversion, function(data){ - if (data.status == "success") { - if (data.message == "equal") { - //Checkout Branch - window.location.href = url; - } - if (data.message == "upgrade") { - if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { - //Checkout Branch - window.location.href = url; - } - } - if (data.message == "downgrade") { - alert("Can't switch branch as this will result in a database downgrade."); - } - } - }); - }); - -}); - -function config_success(){ - $('.config_submitter').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - }); - $('.config_submitter_refresh').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - url = srRoot+'/config/providers/'; - window.location.href = url; - }); - $('#email_show').trigger('notify'); -} diff --git a/gui/slick/js/new/config_general.js b/gui/slick/js/new/config_general.js deleted file mode 100644 index 9e6c079ba..000000000 --- a/gui/slick/js/new/config_general.js +++ /dev/null @@ -1,131 +0,0 @@ -function configSuccess(){ - $('.config_submitter').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - }); - $('.config_submitter_refresh').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - window.location.href = srRoot + '/config/providers/'; - }); - $('#email_show').trigger('notify'); -} - -$(document).ready(function(){ - if ($("input[name='proxy_setting']").val().length === 0) { - $("input[id='proxy_indexers']").prop('checked', false); - $("label[for='proxy_indexers']").hide(); - } - - $("input[name='proxy_setting']").on('input', function() { - if($(this).val().length === 0) { - $("input[id='proxy_indexers']").prop('checked', false); - $("label[for='proxy_indexers']").hide(); - } else { - $("label[for='proxy_indexers']").show(); - } - }); - - $('#log_dir').fileBrowser({ title: 'Select log file folder location' }); - $('#config-components').tabs(); - - $(".enabler").each(function(){ - if (!$(this).prop('checked')) { $('#content_'+$(this).attr('id')).hide(); } - }); - - $(".enabler").click(function() { - if ($(this).prop('checked')){ - $('#content_'+$(this).attr('id')).fadeIn("fast", "linear"); - } else { - $('#content_'+$(this).attr('id')).fadeOut("fast", "linear"); - } - }); - - $(".viewIf").click(function() { - if ($(this).prop('checked')) { - $('.hide_if_'+$(this).attr('id')).css('display','none'); - $('.show_if_'+$(this).attr('id')).fadeIn("fast", "linear"); - } else { - $('.show_if_'+$(this).attr('id')).css('display','none'); - $('.hide_if_'+$(this).attr('id')).fadeIn("fast", "linear"); - } - }); - - $(".datePresets").click(function() { - var def = $('#date_presets').val(); - if ($(this).prop('checked') && '%x' === def) { - def = '%a, %b %d, %Y'; - $('#date_use_system_default').html('1'); - } else if (!$(this).prop('checked') && '1' === $('#date_use_system_default').html()){ - def = '%x'; - } - - $('#date_presets').attr('name', 'date_preset_old'); - $('#date_presets').attr('id', 'date_presets_old'); - - $('#date_presets_na').attr('name', 'date_preset'); - $('#date_presets_na').attr('id', 'date_presets'); - - $('#date_presets_old').attr('name', 'date_preset_na'); - $('#date_presets_old').attr('id', 'date_presets_na'); - - if (def) { $('#date_presets').val(def); } - }); - - // bind 'myForm' and provide a simple callback function - $('#configForm').ajaxForm({ - beforeSubmit: function(){ - $('.config_submitter .config_submitter_refresh').each(function(){ - $(this).attr("disabled", "disabled"); - $(this).after('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Saving...</span>'); - $(this).hide(); - }); - }, - success: function(){ - setTimeout(function () { - "use strict"; - configSuccess(); - }, 2000); - } - }); - - $('#api_key').click(function(){ - $('#api_key').select(); - }); - - $("#generate_new_apikey").click(function(){ - $.get(srRoot + '/config/general/generateApiKey', - function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - $('#api_key').val(data); - }); - }); - - $('#branchCheckout').click(function() { - var url = srRoot + '/home/branchCheckout?branch=' + $("#branchVersion").val(); - var checkDBversion = srRoot + "/home/getDBcompare"; - $.getJSON(checkDBversion, function(data){ - if (data.status === "success") { - if (data.message === "equal") { - //Checkout Branch - window.location.href = url; - } - if (data.message === "upgrade") { - if ( confirm("Changing branch will upgrade your database.\nYou won't be able to downgrade afterward.\nDo you want to continue?") ) { - //Checkout Branch - window.location.href = url; - } - } - if (data.message === "downgrade") { - alert("Can't switch branch as this will result in a database downgrade."); - } - } - }); - }); - -}); diff --git a/gui/slick/js/new/config_notifications.js b/gui/slick/js/new/config_notifications.js deleted file mode 100644 index 072fca9a2..000000000 --- a/gui/slick/js/new/config_notifications.js +++ /dev/null @@ -1,3 +0,0 @@ -$(document).ready(function(){ - $('#config-components').tabs(); -}); diff --git a/gui/slick/js/new/config_postProcessing.js b/gui/slick/js/new/config_postProcessing.js deleted file mode 100644 index 731025565..000000000 --- a/gui/slick/js/new/config_postProcessing.js +++ /dev/null @@ -1,4 +0,0 @@ -$(document).ready(function(){ - $('#config-components').tabs(); - $('#tv_download_dir').fileBrowser({ title: 'Select TV Download Directory' }); -}); diff --git a/gui/slick/js/new/config_search.js b/gui/slick/js/new/config_search.js deleted file mode 100644 index 0c706f7da..000000000 --- a/gui/slick/js/new/config_search.js +++ /dev/null @@ -1,4 +0,0 @@ -$('#config-components').tabs(); -$('#nzb_dir').fileBrowser({ title: 'Select .nzb black hole/watch location' }); -$('#torrent_dir').fileBrowser({ title: 'Select .torrent black hole/watch location' }); -$('#torrent_path').fileBrowser({ title: 'Select .torrent download location' }); diff --git a/gui/slick/js/new/config_subtitles.js b/gui/slick/js/new/config_subtitles.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/gui/slick/js/new/core.js b/gui/slick/js/new/core.js deleted file mode 100644 index cb6889de6..000000000 --- a/gui/slick/js/new/core.js +++ /dev/null @@ -1,73 +0,0 @@ -var srRoot = getMeta('srRoot'), - themeSpinner = getMeta('themeSpinner'), - anonURL = getMeta('anonURL'), - top_image_html = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />'; - -$(document).ready(function () { - $("#config-components").tabs({ - activate: function (event, ui) { - var lastOpenedPanel = $(this).data("lastOpenedPanel"), - selected = $(this).tabs('option', 'selected'); - - if (!lastOpenedPanel) { lastOpenedPanel = $(ui.oldPanel); } - - if (!$(this).data("topPositionTab")) { $(this).data("topPositionTab", $(ui.newPanel).position().top); } - - //Dont use the builtin fx effects. This will fade in/out both tabs, we dont want that - //Fadein the new tab yourself - $(ui.newPanel).hide().fadeIn(0); - - if (lastOpenedPanel) { - // 1. Show the previous opened tab by removing the jQuery UI class - // 2. Make the tab temporary position:absolute so the two tabs will overlap - // 3. Set topposition so they will overlap if you go from tab 1 to tab 0 - // 4. Remove position:absolute after animation - lastOpenedPanel - .toggleClass("ui-tabs-hide") - .css("position", "absolute") - .css("top", $(this).data("topPositionTab") + "px") - .fadeOut(0, function () { - $(this) - .css("position", ""); - }); - } - - //Saving the last tab has been opened - $(this).data("lastOpenedPanel", $(ui.newPanel)); - } - }); - - // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle - if ((navigator.maxTouchPoints || 0) < 2) { - $('.dropdown-toggle').on('click', function(e) { - var $this = $(this); - if ($this.attr('aria-expanded') === 'true') { - window.location.href = $this.attr('href'); - } - }); - } - - if(metaToBool('sickbeard.FUZZY_DATING')){ - $.timeago.settings.allowFuture = true; - $.timeago.settings.strings = { - prefixAgo: null, - prefixFromNow: 'In ', - suffixAgo: "ago", - suffixFromNow: "", - seconds: "less than a minute", - minute: "about a minute", - minutes: "%d minutes", - hour: "an hour", - hours: "%d hours", - day: "a day", - days: "%d days", - month: "a month", - months: "%d months", - year: "a year", - years: "%d years", - wordSeparator: " ", - numbers: [] - }; - $("[datetime]").timeago(); - } -}); diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako index bd83311e0..d006a1499 100644 --- a/gui/slick/views/config_anime.mako +++ b/gui/slick/views/config_anime.mako @@ -3,10 +3,6 @@ import sickbeard from sickbeard.helpers import anon_url %> - -<%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> -</%block> <%block name="content"> <div id="content960"> <h1 class="header">${header}</h1> diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index d96ff7f5c..0d74ea107 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -12,9 +12,7 @@ from sickbeard.helpers import anon_url %> <%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/rootDirs.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/new/config_general.js"></script> </%block> <%block name="content"> % if not header is UNDEFINED: diff --git a/gui/slick/views/config_notifications.mako b/gui/slick/views/config_notifications.mako index eca63e139..769cdacd3 100644 --- a/gui/slick/views/config_notifications.mako +++ b/gui/slick/views/config_notifications.mako @@ -6,12 +6,6 @@ from sickbeard.common import SKIPPED, WANTED, UNAIRED, ARCHIVED, IGNORED, SNATCHED, SNATCHED_PROPER, SNATCHED_BEST, FAILED from sickbeard.common import Quality, qualityPresets, statusStrings, qualityPresetStrings, cpu_presets, multiEpStrings %> - -<%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/configNotifications.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/new/config_notifications.js"></script> -</%block> <%block name="content"> % if not header is UNDEFINED: <h1 class="header">${header}</h1> diff --git a/gui/slick/views/config_postProcessing.mako b/gui/slick/views/config_postProcessing.mako index 182f48771..e669c11d0 100644 --- a/gui/slick/views/config_postProcessing.mako +++ b/gui/slick/views/config_postProcessing.mako @@ -9,12 +9,6 @@ from sickbeard.metadata.generic import GenericMetadata from sickbeard import naming %> - -<%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/configPostProcessing.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/new/config_postProcessing.js"></script> -</%block> <%block name="content"> <div id="content960"> % if not header is UNDEFINED: diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index 28bf95490..eb25276a5 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -6,8 +6,6 @@ from sickbeard.helpers import anon_url %> <%block name="scripts"> -<script type="text/javascript" src="${srRoot}/js/configProviders.js?${sbPID}"></script> -<script type="text/javascript" src="${srRoot}/js/config.js?${sbPID}"></script> <script type="text/javascript"> $(document).ready(function(){ % if sickbeard.USE_NZBS: diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index e3375a7ce..af38d14bd 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -90,7 +90,7 @@ % endif <%block name="css" /> </head> - <body> + <body data-controller="${controller}" data-action="${action}"> <nav class="navbar navbar-default navbar-fixed-top hidden-print" role="navigation"> <div class="container-fluid"> <div class="navbar-header"> @@ -318,7 +318,11 @@ <script type="text/javascript" src="${srRoot}/js/lib/formwizard.js?${sbPID}"></script><!-- Can't be added to bower --> <script type="text/javascript" src="${srRoot}/js/new/parsers.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/new/meta.js?${sbPID}"></script> - <script type="text/javascript" src="${srRoot}/js/new/core.js?${sbPID}"></script> + % if sickbeard.DEVELOPER: + <script type="text/javascript" src="${srRoot}/js/core.js?${sbPID}"></script> + % else: + <script type="text/javascript" src="${srRoot}/js/core.min.js?${sbPID}"></script> + % endif <script type="text/javascript" src="${srRoot}/js/lib/jquery.scrolltopcontrol-1.1.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/browser.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/ajaxNotifications.js?${sbPID}"></script> diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 00aef8bde..b53917465 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -141,6 +141,8 @@ class PageTemplate(MakoTemplate): self.arguments['title'] = "FixME" self.arguments['header'] = "FixME" self.arguments['topmenu'] = "FixME" + self.arguments['controller'] = "FixME" + self.arguments['action'] = "FixME" def render(self, *args, **kwargs): for key in self.arguments: @@ -678,7 +680,7 @@ class Home(WebRoot): showlists = [["Shows", sickbeard.showList]] stats = self.show_statistics() - return t.render(title="Home", header="Show List", topmenu="home", showlists=showlists, show_stat=stats[0], max_download_count=stats[1]) + return t.render(title="Home", header="Show List", topmenu="home", showlists=showlists, show_stat=stats[0], max_download_count=stats[1], controller="home", action="index") @staticmethod def show_statistics(): @@ -1287,7 +1289,9 @@ class Home(WebRoot): xem_numbering=get_xem_numbering_for_show(indexerid, indexer), scene_absolute_numbering=get_scene_absolute_numbering_for_show(indexerid, indexer), xem_absolute_numbering=get_xem_absolute_numbering_for_show(indexerid, indexer), - title=showObj.name + title=showObj.name, + controller="home", + action="displayShow" ) @staticmethod @@ -1362,9 +1366,10 @@ class Home(WebRoot): if showObj.is_anime: return t.render(show=show, scene_exceptions=scene_exceptions, groups=groups, whitelist=whitelist, - blacklist=blacklist, title='Edit Show', header='Edit Show') + blacklist=blacklist, title='Edit Show', header='Edit Show', controller="home", action="editShow") else: - return t.render(show=show, scene_exceptions=scene_exceptions, title='Edit Show', header='Edit Show') + return t.render(show=show, scene_exceptions=scene_exceptions, title='Edit Show', header='Edit Show', + controller="home", action="editShow") flatten_folders = not config.checkbox_to_value(flatten_folders) # UI inverts this value dvdorder = config.checkbox_to_value(dvdorder) @@ -1829,7 +1834,8 @@ class Home(WebRoot): t = PageTemplate(rh=self, filename="testRename.mako") submenu = [{'title': 'Edit', 'path': 'home/editShow?show=%d' % showObj.indexerid, 'icon': 'ui-icon ui-icon-pencil'}] - return t.render(submenu=submenu, ep_obj_list=ep_obj_rename_list, show=showObj, title='Preview Rename', header='Preview Rename') + return t.render(submenu=submenu, ep_obj_list=ep_obj_rename_list, show=showObj, title='Preview Rename', header='Preview Rename', + controller="home", action="previewRename") def doRename(self, show=None, eps=None): if show is None or eps is None: @@ -2121,7 +2127,7 @@ class HomeIRC(Home): def index(self): t = PageTemplate(rh=self, filename="IRC.mako") - return t.render(topmenu="system", header="IRC", title="IRC") + return t.render(topmenu="system", header="IRC", title="IRC", controller="IRC", action="index") @route('/news(/?.*)') @@ -2143,7 +2149,7 @@ class HomeNews(Home): t = PageTemplate(rh=self, filename="markdown.mako") data = markdown2.markdown(news if news else "The was a problem connecting to github, please refresh and try again", extras=['header-ids']) - return t.render(title="News", header="News", topmenu="system", data=data) + return t.render(title="News", header="News", topmenu="system", data=data, controller="news", action="index") @route('/changes(/?.*)') @@ -2161,7 +2167,7 @@ class HomeChangeLog(Home): t = PageTemplate(rh=self, filename="markdown.mako") data = markdown2.markdown(changes if changes else "The was a problem connecting to github, please refresh and try again", extras=['header-ids']) - return t.render(title="Changelog", header="Changelog", topmenu="system", data=data) + return t.render(title="Changelog", header="Changelog", topmenu="system", data=data, controller="changes", action="index") @route('/home/postprocess(/?.*)') @@ -2171,7 +2177,7 @@ class HomePostProcess(Home): def index(self): t = PageTemplate(rh=self, filename="home_postprocess.mako") - return t.render(title='Post Processing', header='Post Processing', topmenu='home') + return t.render(title='Post Processing', header='Post Processing', topmenu='home', controller="postprocess", action="index") def processEpisode(self, proc_dir=None, nzbName=None, jobName=None, quiet=None, process_method=None, force=None, is_priority=None, delete_on="0", failed="0", proc_type="auto", *args, **kwargs): @@ -2213,7 +2219,7 @@ class HomeAddShows(Home): def index(self): t = PageTemplate(rh=self, filename="home_addShows.mako") - return t.render(title='Add Shows', header='Add Shows', topmenu='home') + return t.render(title='Add Shows', header='Add Shows', topmenu='home', controller="home", action="addShows") @staticmethod def getIndexerLanguages(): @@ -2394,7 +2400,7 @@ class HomeAddShows(Home): posts them to addNewShow """ t = PageTemplate(rh=self, filename="home_recommendedShows.mako") - return t.render(title="Recommended Shows", header="Recommended Shows", enable_anime_options=False) + return t.render(title="Recommended Shows", header="Recommended Shows", enable_anime_options=False, controller="home", action="addShows|recommendedShows") def getRecommendedShows(self): t = PageTemplate(rh=self, filename="trendingShows.mako") @@ -2766,7 +2772,7 @@ class Manage(Home, WebRoot): def index(self): t = PageTemplate(rh=self, filename="manage.mako") - return t.render(title='Mass Update', header='Mass Update', topmenu='manage') + return t.render(title='Mass Update', header='Mass Update', topmenu='manage', controller="manage", action="index") @staticmethod def showEpisodeStatuses(indexer_id, whichStatus): @@ -2805,7 +2811,7 @@ class Manage(Home, WebRoot): if not status_list: return t.render( title="Episode Overview", header="Episode Overview", - topmenu="manage", whichStatus=whichStatus) + topmenu="manage", whichStatus=whichStatus, controller="manage", action="episodeStatuses") myDB = db.DBConnection() status_results = myDB.select( @@ -2831,7 +2837,8 @@ class Manage(Home, WebRoot): return t.render( title="Episode Overview", header="Episode Overview", topmenu='manage', whichStatus=whichStatus, - show_names=show_names, ep_counts=ep_counts, sorted_show_ids=sorted_show_ids) + show_names=show_names, ep_counts=ep_counts, sorted_show_ids=sorted_show_ids, + controller="manage", action="episodeStatuses") def changeEpisodeStatuses(self, oldStatus, newStatus, *args, **kwargs): status_list = [int(oldStatus)] @@ -2903,7 +2910,8 @@ class Manage(Home, WebRoot): t = PageTemplate(rh=self, filename="manage_subtitleMissed.mako") if not whichSubs: - return t.render(whichSubs=whichSubs, title='Episode Overview', header='Episode Overview', topmenu='manage') + return t.render(whichSubs=whichSubs, title='Episode Overview', header='Episode Overview', topmenu='manage', + controller="manage", action="subtitleMissed") myDB = db.DBConnection() status_results = myDB.select( @@ -2933,7 +2941,8 @@ class Manage(Home, WebRoot): sorted_show_ids.append(cur_indexer_id) return t.render(whichSubs=whichSubs, show_names=show_names, ep_counts=ep_counts, sorted_show_ids=sorted_show_ids, - title='Missing Subtitles', header='Missing Subtitles', topmenu='manage') + title='Missing Subtitles', header='Missing Subtitles', topmenu='manage', + controller="manage", action="subtitleMissed") def downloadSubtitleMissed(self, *args, **kwargs): to_download = {} @@ -3590,7 +3599,8 @@ class ConfigGeneral(Config): def index(self): t = PageTemplate(rh=self, filename="config_general.mako") - return t.render(title='Config - General', header='General Configuration', topmenu='config', submenu=self.ConfigMenu()) + return t.render(title='Config - General', header='General Configuration', topmenu='config', submenu=self.ConfigMenu(), + controller="config", action="index") @staticmethod def generateApiKey(): @@ -3754,7 +3764,8 @@ class ConfigBackupRestore(Config): def index(self): t = PageTemplate(rh=self, filename="config_backuprestore.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Backup/Restore', header='Backup/Restore', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Backup/Restore', header='Backup/Restore', topmenu='config', + controller="config", action="backupRestore") @staticmethod def backup(backupDir=None): @@ -3815,7 +3826,8 @@ class ConfigSearch(Config): def index(self): t = PageTemplate(rh=self, filename="config_search.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Episode Search', header='Search Settings', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Episode Search', header='Search Settings', topmenu='config', + controller="config", action="search") def saveSearch(self, use_nzbs=None, use_torrents=None, nzb_dir=None, sab_username=None, sab_password=None, sab_apikey=None, sab_category=None, sab_category_anime=None, sab_category_backlog=None, sab_category_anime_backlog=None, sab_host=None, nzbget_username=None, @@ -3917,7 +3929,8 @@ class ConfigPostProcessing(Config): def index(self): t = PageTemplate(rh=self, filename="config_postProcessing.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Post Processing', header='Post Processing', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Post Processing', header='Post Processing', topmenu='config', + controller="config", action="postProcessing") def savePostProcessing(self, naming_pattern=None, naming_multi_ep=None, kodi_data=None, kodi_12plus_data=None, @@ -4112,7 +4125,8 @@ class ConfigProviders(Config): def index(self): t = PageTemplate(rh=self, filename="config_providers.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Providers', header='Search Providers', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Providers', header='Search Providers', topmenu='config', + controller="config", action="providers") @staticmethod def canAddNewznabProvider(name): @@ -4596,7 +4610,8 @@ class ConfigNotifications(Config): def index(self): t = PageTemplate(rh=self, filename="config_notifications.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Notifications', header='Notifications', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Notifications', header='Notifications', topmenu='config', + controller="config", action="notifications") def saveNotifications(self, use_kodi=None, kodi_always_on=None, kodi_notify_onsnatch=None, kodi_notify_ondownload=None, @@ -4828,7 +4843,8 @@ class ConfigSubtitles(Config): def index(self): t = PageTemplate(rh=self, filename="config_subtitles.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Subtitles', header='Subtitles', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Subtitles', header='Subtitles', topmenu='config', + controller="config", action="subtitles") def saveSubtitles(self, use_subtitles=None, subtitles_plugins=None, subtitles_languages=None, subtitles_dir=None, service_order=None, subtitles_history=None, subtitles_finder_frequency=None, @@ -4889,7 +4905,8 @@ class ConfigAnime(Config): t = PageTemplate(rh=self, filename="config_anime.mako") - return t.render(submenu=self.ConfigMenu(), title='Config - Anime', header='Anime', topmenu='config') + return t.render(submenu=self.ConfigMenu(), title='Config - Anime', header='Anime', topmenu='config', + controller="config", action="anime") def saveAnime(self, use_anidb=None, anidb_username=None, anidb_password=None, anidb_use_mylist=None, split_home=None): @@ -4936,7 +4953,8 @@ class ErrorLogs(WebRoot): level = logger.ERROR t = PageTemplate(rh=self, filename="errorlogs.mako") - return t.render(header="Logs & Errors", title="Logs & Errors", topmenu="system", submenu=self.ErrorLogsMenu(level), logLevel=level) + return t.render(header="Logs & Errors", title="Logs & Errors", topmenu="system", submenu=self.ErrorLogsMenu(level), logLevel=level, + controller="errorlogs", action="index") @staticmethod def haveErrors(): -- GitLab From dc92c3373be2d3959ea1534503466176a9cb15cb Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 13:51:04 +1030 Subject: [PATCH 197/215] fix providers not saving --- gui/slick/js/configProviders.js | 570 +++++++++++++++++++++++++ gui/slick/js/core.js | 572 +------------------------- gui/slick/views/config_providers.mako | 1 + 3 files changed, 573 insertions(+), 570 deletions(-) diff --git a/gui/slick/js/configProviders.js b/gui/slick/js/configProviders.js index b8ac98a50..e2a7a49ed 100644 --- a/gui/slick/js/configProviders.js +++ b/gui/slick/js/configProviders.js @@ -1,2 +1,572 @@ $(document).ready(function(){ + $.fn.showHideProviders = function() { + $('.providerDiv').each(function(){ + var providerName = $(this).attr('id'); + var selectedProvider = $('#editAProvider :selected').val(); + + if (selectedProvider + 'Div' == providerName) { // jshint ignore:line + $(this).show(); + } else { + $(this).hide(); + } + }); + }; + + var ifExists = function(loopThroughArray, searchFor) { + var found = false; + + loopThroughArray.forEach(function(rootObject) { + if (rootObject.name === searchFor) { + found = true; + } + console.log(rootObject.name + " while searching for: "+ searchFor); + }); + return found; + }; + + /** + * Gets categories for the provided newznab provider. + * @param {String} isDefault + * @param {Array} selectedProvider + * @return no return data. Function updateNewznabCaps() is run at callback + */ + $.fn.getCategories = function (isDefault, selectedProvider) { + + var name = selectedProvider[0]; + var url = selectedProvider[1]; + var key = selectedProvider[2]; + + if (!name || !url || !key) { + return; + } + + var params = {url: url, name: name, key: key}; + + $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); + var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ + $(this).updateNewznabCaps( data, selectedProvider ); + console.debug(data.tv_categories); // jshint ignore:line + }); + jqxhr.always(function() { + $(".updating_categories").empty(); + }); + }; + + $.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) { + url = $.trim(url); + if (!url) { + return; + } + + if (!/^https?:\/\//i.test(url)) { + url = "http://" + url; + } + + if (url.match('/$') === null) { + url = url + '/'; + } + + var newData = [isDefault, [name, url, key, cat]]; + newznabProviders[id] = newData; + + if (!isDefault){ + $('#editANewznabProvider').addOption(id, name); + $(this).populateNewznabSection(); + } + + if ($('#provider_order_list > #'+id).length === 0 && showProvider !== false) { + var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; + + $('#provider_order_list').append(toAdd); + $('#provider_order_list').sortable("refresh"); + } + + $(this).makeNewznabProviderString(); + }; + + $.fn.addTorrentRssProvider = function (id, name, url, cookies, titleTAG) { + var newData = [name, url, cookies, titleTAG]; + torrentRssProviders[id] = newData; + + $('#editATorrentRssProvider').addOption(id, name); + $(this).populateTorrentRssSection(); + + if ($('#provider_order_list > #'+id).length === 0) { + $('#provider_order_list').append('<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'); + $('#provider_order_list').sortable("refresh"); + } + + $(this).makeTorrentRssProviderString(); + }; + + $.fn.updateProvider = function (id, url, key, cat) { + newznabProviders[id][1][1] = url; + newznabProviders[id][1][2] = key; + newznabProviders[id][1][3] = cat; + + $(this).populateNewznabSection(); + + $(this).makeNewznabProviderString(); + }; + + $.fn.deleteProvider = function (id) { + $('#editANewznabProvider').removeOption(id); + delete newznabProviders[id]; + $(this).populateNewznabSection(); + $('li').remove('#'+id); + $(this).makeNewznabProviderString(); + }; + + $.fn.updateTorrentRssProvider = function (id, url, cookies, titleTAG) { + torrentRssProviders[id][1] = url; + torrentRssProviders[id][2] = cookies; + torrentRssProviders[id][3] = titleTAG; + $(this).populateTorrentRssSection(); + $(this).makeTorrentRssProviderString(); + }; + + $.fn.deleteTorrentRssProvider = function (id) { + $('#editATorrentRssProvider').removeOption(id); + delete torrentRssProviders[id]; + $(this).populateTorrentRssSection(); + $('li').remove('#'+id); + $(this).makeTorrentRssProviderString(); + }; + + $.fn.populateNewznabSection = function() { + var selectedProvider = $('#editANewznabProvider :selected').val(); + var data = ''; + var isDefault = ''; + var rrcat = ''; + + if (selectedProvider === 'addNewznab') { + data = ['','','']; + isDefault = 0; + $('#newznab_add_div').show(); + $('#newznab_update_div').hide(); + $('#newznab_cat').attr('disabled','disabled'); + $('#newznab_cap').attr('disabled','disabled'); + $('#newznab_cat_update').attr('disabled','disabled'); + $('#newznabcapdiv').hide(); + + $("#newznab_cat option").each(function() { + $(this).remove(); + return; + }); + + $("#newznab_cap option").each(function() { + $(this).remove(); + return; + }); + + } else { + data = newznabProviders[selectedProvider][1]; + isDefault = newznabProviders[selectedProvider][0]; + $('#newznab_add_div').hide(); + $('#newznab_update_div').show(); + $('#newznab_cat').removeAttr("disabled"); + $('#newznab_cap').removeAttr("disabled"); + $('#newznab_cat_update').removeAttr("disabled"); + $('#newznabcapdiv').show(); + } + + $('#newznab_name').val(data[0]); + $('#newznab_url').val(data[1]); + $('#newznab_key').val(data[2]); + + //Check if not already array + if (typeof data[3] === 'string') { + rrcat = data[3].split(","); + } else { + rrcat = data[3]; + } + + // Update the category select box (on the right) + var newCatOptions = []; + if (rrcat) { + rrcat.forEach(function (cat) { + if (cat !== '') { + newCatOptions.push({text : cat, value : cat}); + } + }); + $("#newznab_cat").replaceOptions(newCatOptions); + } + + if (selectedProvider === 'addNewznab') { + $('#newznab_name').removeAttr("disabled"); + $('#newznab_url').removeAttr("disabled"); + } else { + $('#newznab_name').attr("disabled", "disabled"); + + if (isDefault) { + $('#newznab_url').attr("disabled", "disabled"); + $('#newznab_delete').attr("disabled", "disabled"); + } else { + $('#newznab_url').removeAttr("disabled"); + $('#newznab_delete').removeAttr("disabled"); + + //Get Categories Capabilities + if (data[0] && data[1] && data[2] && !ifExists($.fn.newznabProvidersCapabilities, data[0])) { + $(this).getCategories(isDefault, data); + } + $(this).updateNewznabCaps( null, data ); + } + } + }; + + /** + * Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name + * and category capabilities. Return + * @param {Array} newzNabCaps, is the returned object with newzNabprod Name and Capabilities. + * @param {Array} selectedProvider + * @return no return data. The multiselect input $("#newznab_cap") is updated, as a result. + */ + $.fn.updateNewznabCaps = function( newzNabCaps, selectedProvider ) { + if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])) { + $.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories}); // jshint ignore:line + } + + //Loop through the array and if currently selected newznab provider name matches one in the array, use it to + //update the capabilities select box (on the left). + if (selectedProvider[0]) { + $.fn.newznabProvidersCapabilities.forEach(function(newzNabCap) { + if (newzNabCap.name && newzNabCap.name === selectedProvider[0] && newzNabCap.categories instanceof Array) { + var newCapOptions = []; + newzNabCap.categories.forEach(function(categorySet) { + if (categorySet.id && categorySet.name) { + newCapOptions.push({value : categorySet.id, text : categorySet.name + "(" + categorySet.id + ")"}); + } + }); + $("#newznab_cap").replaceOptions(newCapOptions); + } + }); + } + }; + + $.fn.makeNewznabProviderString = function() { + var provStrings = []; + + for (var id in newznabProviders) { + if (newznabProviders.hasOwnProperty(id)) { + provStrings.push(newznabProviders[id][1].join('|')); + } + } + + $('#newznab_string').val(provStrings.join('!!!')); + }; + + $.fn.populateTorrentRssSection = function() { + var selectedProvider = $('#editATorrentRssProvider :selected').val(); + var data = ''; + + if (selectedProvider === 'addTorrentRss') { + data = ['','','','title']; + $('#torrentrss_add_div').show(); + $('#torrentrss_update_div').hide(); + } else { + data = torrentRssProviders[selectedProvider]; + $('#torrentrss_add_div').hide(); + $('#torrentrss_update_div').show(); + } + + $('#torrentrss_name').val(data[0]); + $('#torrentrss_url').val(data[1]); + $('#torrentrss_cookies').val(data[2]); + $('#torrentrss_titleTAG').val(data[3]); + + if (selectedProvider === 'addTorrentRss') { + $('#torrentrss_name').removeAttr("disabled"); + $('#torrentrss_url').removeAttr("disabled"); + $('#torrentrss_cookies').removeAttr("disabled"); + $('#torrentrss_titleTAG').removeAttr("disabled"); + } else { + $('#torrentrss_name').attr("disabled", "disabled"); + $('#torrentrss_url').removeAttr("disabled"); + $('#torrentrss_cookies').removeAttr("disabled"); + $('#torrentrss_titleTAG').removeAttr("disabled"); + $('#torrentrss_delete').removeAttr("disabled"); + } + }; + + $.fn.makeTorrentRssProviderString = function() { + var provStrings = []; + for (var id in torrentRssProviders) { + if (torrentRssProviders.hasOwnProperty(id)) { + provStrings.push(torrentRssProviders[id].join('|')); + } + } + + $('#torrentrss_string').val(provStrings.join('!!!')); + }; + + + $.fn.refreshProviderList = function() { + var idArr = $("#provider_order_list").sortable('toArray'); + var finalArr = []; + $.each(idArr, function(key, val) { + var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; + finalArr.push(val + ':' + checked); + }); + + $("#provider_order").val(finalArr.join(' ')); + $(this).refreshEditAProvider(); + }; + + $.fn.refreshEditAProvider = function() { + $('#provider-list').empty(); + + var idArr = $("#provider_order_list").sortable('toArray'); + var finalArr = []; + $.each(idArr, function(key, val) { + if ($('#enable_'+val).prop('checked')) { + finalArr.push(val); + } + }); + + if (finalArr.length > 0) { + $('<select>').prop('id','editAProvider').addClass('form-control input-sm').appendTo('#provider-list'); + for (var i = 0, len = finalArr.length; i < len; i++) { + var provider = finalArr[i]; + $('#editAProvider').append($('<option>').prop('value',provider).text($.trim($('#'+provider).text()).replace(/\s\*$/, '').replace(/\s\*\*$/, ''))); + } + } else { + document.getElementsByClassName('component-desc')[0].innerHTML = "No providers available to configure."; + } + + $(this).showHideProviders(); + }; + + var newznabProviders = []; + var torrentRssProviders = []; + + $(this).on('change', '.newznab_key', function(){ + var providerId = $(this).attr('id'); + providerId = providerId.substring(0, providerId.length-'_hash'.length); + + var url = $('#'+providerId+'_url').val(); + var cat = $('#'+providerId+'_cat').val(); + var key = $(this).val(); + + $(this).updateProvider(providerId, url, key, cat); }); + + $('#newznab_key,#newznab_url').change(function(){ + var selectedProvider = $('#editANewznabProvider :selected').val(); + + if (selectedProvider === "addNewznab"){ + return; + } + + var url = $('#newznab_url').val(); + var key = $('#newznab_key').val(); + + var cat = $('#newznab_cat option').map(function(i, opt) { + return $(opt).text(); + }).toArray().join(','); + + $(this).updateProvider(selectedProvider, url, key, cat); + }); + + $('#torrentrss_url,#torrentrss_cookies,#torrentrss_titleTAG').change(function(){ + var selectedProvider = $('#editATorrentRssProvider :selected').val(); + + if (selectedProvider === "addTorrentRss"){ + return; + } + + var url = $('#torrentrss_url').val(); + var cookies = $('#torrentrss_cookies').val(); + var titleTAG = $('#torrentrss_titleTAG').val(); + + $(this).updateTorrentRssProvider(selectedProvider, url, cookies, titleTAG); + }); + + $('body').on('change', '#editAProvider',function(){ + $(this).showHideProviders(); + }); + + $('#editANewznabProvider').change(function(){ + $(this).populateNewznabSection(); + }); + + $('#editATorrentRssProvider').change(function(){ + $(this).populateTorrentRssSection(); + }); + + $(this).on('click', '.provider_enabler', function(){ + $(this).refreshProviderList(); + }); + + $('#newznab_cat_update').click(function(){ + console.debug('Clicked Button'); + + // Maybe check if there is anything selected? + $("#newznab_cat option").each(function() { + $(this).remove(); + }); + + var newOptions = []; + + // When the update botton is clicked, loop through the capabilities list + // and copy the selected category id's to the category list on the right. + $("#newznab_cap option:selected").each(function(){ + var selectedCat = $(this).val(); + console.debug(selectedCat); + newOptions.push({text: selectedCat, value: selectedCat}); + }); + + $("#newznab_cat").replaceOptions(newOptions); + + var selectedProvider = $("#editANewznabProvider :selected").val(); + if (selectedProvider === "addNewznab"){ + return; + } + + var url = $('#newznab_url').val(); + var key = $('#newznab_key').val(); + + var cat = $('#newznab_cat option').map(function(i, opt) { + return $(opt).text(); + }).toArray().join(','); + + $("#newznab_cat option:not([value])").remove(); + + $(this).updateProvider(selectedProvider, url, key, cat); + }); + + + $('#newznab_add').click(function(){ + var name = $.trim($('#newznab_name').val()); + var url = $.trim($('#newznab_url').val()); + var key = $.trim($('#newznab_key').val()); + //var cat = $.trim($('#newznab_cat').val()); + + var cat = $.trim($('#newznab_cat option').map(function(i, opt) { + return $(opt).text(); + }).toArray().join(',')); + + if (!name || !url || !key) { + return; + } + + var params = {name: name}; + + // send to the form with ajax, get a return value + $.getJSON(srRoot + '/config/providers/canAddNewznabProvider', params, function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + $(this).addProvider(data.success, name, url, key, cat, 0); + }); + }); + + $('.newznab_delete').click(function(){ + var selectedProvider = $('#editANewznabProvider :selected').val(); + $(this).deleteProvider(selectedProvider); + }); + + $('#torrentrss_add').click(function(){ + var name = $('#torrentrss_name').val(); + var url = $('#torrentrss_url').val(); + var cookies = $('#torrentrss_cookies').val(); + var titleTAG = $('#torrentrss_titleTAG').val(); + var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG}; + + // send to the form with ajax, get a return value + $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, function(data){ + if (data.error !== undefined) { + alert(data.error); + return; + } + + $(this).addTorrentRssProvider(data.success, name, url, cookies, titleTAG); + $(this).refreshEditAProvider(); + }); + }); + + $('.torrentrss_delete').on('click', function(){ + $(this).deleteTorrentRssProvider($('#editATorrentRssProvider :selected').val()); + $(this).refreshEditAProvider(); + }); + + $(this).on('change', "[class='providerDiv_tip'] input", function(){ + $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").replaceWith($(this).clone()); + $('div .providerDiv ' + "[newznab_name=" + $(this).attr('id') + "]").replaceWith($(this).clone()); + }); + + $(this).on('change', "[class='providerDiv_tip'] select", function(){ + $(this).find('option').each( function() { + if ($(this).is(':selected')) { + $(this).prop('defaultSelected', true); + } else { + $(this).prop('defaultSelected', false); + } + }); + $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").empty().replaceWith($(this).clone()); + }); + + $(this).on('change', '.enabler', function(){ + if ($(this).is(':checked')) { + $('.content_'+$(this).attr('id')).each( function() { + $(this).show(); + }); + } else { + $('.content_'+$(this).attr('id')).each( function() { + $(this).hide(); + }); + } + }); + + $(".enabler").each(function(){ + if (!$(this).is(':checked')) { + $('.content_'+$(this).attr('id')).hide(); + } else { + $('.content_'+$(this).attr('id')).show(); + } + }); + + $.fn.makeTorrentOptionString = function(providerId) { + var seedRatio = $('.providerDiv_tip #' + providerId + '_seed_ratio').prop('value'); + var seedTime = $('.providerDiv_tip #' + providerId + '_seed_time').prop('value'); + var processMet = $('.providerDiv_tip #' + providerId + '_process_method').prop('value'); + var optionString = $('.providerDiv_tip #' + providerId + '_option_string'); + + optionString.val([seedRatio, seedTime, processMet].join('|')); + }; + + $(this).on('change', '.seed_option', function(){ + var providerId = $(this).attr('id').split('_')[0]; + $(this).makeTorrentOptionString(providerId); + }); + + $.fn.replaceOptions = function(options) { + var self, $option; + + this.empty(); + self = this; + + $.each(options, function(index, option) { + $option = $("<option></option>").attr("value", option.value).text(option.text); + self.append($option); + }); + }; + + // initialization stuff + $.fn.newznabProvidersCapabilities = []; + + $(this).showHideProviders(); + + $("#provider_order_list").sortable({ + placeholder: 'ui-state-highlight', + update: function () { + $(this).refreshProviderList(); + } + }); + + $("#provider_order_list").disableSelection(); + + if ($('#editANewznabProvider').length) { + $(this).populateNewznabSection(); + } +}); diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index 94a42be7c..f91e678bc 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -1664,576 +1664,8 @@ var SICKRAGE = { $("#service_order_list").disableSelection(); }, providers: function() { - $.fn.showHideProviders = function() { - $('.providerDiv').each(function(){ - var providerName = $(this).attr('id'); - var selectedProvider = $('#editAProvider :selected').val(); - - if (selectedProvider + 'Div' == providerName) { // jshint ignore:line - $(this).show(); - } else { - $(this).hide(); - } - }); - }; - - var ifExists = function(loopThroughArray, searchFor) { - var found = false; - - loopThroughArray.forEach(function(rootObject) { - if (rootObject.name === searchFor) { - found = true; - } - console.log(rootObject.name + " while searching for: "+ searchFor); - }); - return found; - }; - - /** - * Gets categories for the provided newznab provider. - * @param {String} isDefault - * @param {Array} selectedProvider - * @return no return data. Function updateNewznabCaps() is run at callback - */ - $.fn.getCategories = function (isDefault, selectedProvider) { - - var name = selectedProvider[0]; - var url = selectedProvider[1]; - var key = selectedProvider[2]; - - if (!name || !url || !key) { - return; - } - - var params = {url: url, name: name, key: key}; - - $(".updating_categories").wrapInner('<span><img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif"> Updating Categories ...</span>'); - var jqxhr = $.getJSON(srRoot + '/config/providers/getNewznabCategories', params, function(data){ - $(this).updateNewznabCaps( data, selectedProvider ); - console.debug(data.tv_categories); // jshint ignore:line - }); - jqxhr.always(function() { - $(".updating_categories").empty(); - }); - }; - - $.fn.addProvider = function (id, name, url, key, cat, isDefault, showProvider) { - url = $.trim(url); - if (!url) { - return; - } - - if (!/^https?:\/\//i.test(url)) { - url = "http://" + url; - } - - if (url.match('/$') === null) { - url = url + '/'; - } - - var newData = [isDefault, [name, url, key, cat]]; - newznabProviders[id] = newData; - - if (!isDefault){ - $('#editANewznabProvider').addOption(id, name); - $(this).populateNewznabSection(); - } - - if ($('#provider_order_list > #'+id).length === 0 && showProvider !== false) { - var toAdd = '<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/newznab.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'; - - $('#provider_order_list').append(toAdd); - $('#provider_order_list').sortable("refresh"); - } - - $(this).makeNewznabProviderString(); - }; - - $.fn.addTorrentRssProvider = function (id, name, url, cookies, titleTAG) { - var newData = [name, url, cookies, titleTAG]; - torrentRssProviders[id] = newData; - - $('#editATorrentRssProvider').addOption(id, name); - $(this).populateTorrentRssSection(); - - if ($('#provider_order_list > #'+id).length === 0) { - $('#provider_order_list').append('<li class="ui-state-default" id="' + id + '"> <input type="checkbox" id="enable_' + id + '" class="provider_enabler" CHECKED> <a href="' + anonURL + url + '" class="imgLink" target="_new"><img src="' + srRoot + '/images/providers/torrentrss.png" alt="' + name + '" width="16" height="16"></a> ' + name + '</li>'); - $('#provider_order_list').sortable("refresh"); - } - - $(this).makeTorrentRssProviderString(); - }; - - $.fn.updateProvider = function (id, url, key, cat) { - newznabProviders[id][1][1] = url; - newznabProviders[id][1][2] = key; - newznabProviders[id][1][3] = cat; - - $(this).populateNewznabSection(); - - $(this).makeNewznabProviderString(); - }; - - $.fn.deleteProvider = function (id) { - $('#editANewznabProvider').removeOption(id); - delete newznabProviders[id]; - $(this).populateNewznabSection(); - $('li').remove('#'+id); - $(this).makeNewznabProviderString(); - }; - - $.fn.updateTorrentRssProvider = function (id, url, cookies, titleTAG) { - torrentRssProviders[id][1] = url; - torrentRssProviders[id][2] = cookies; - torrentRssProviders[id][3] = titleTAG; - $(this).populateTorrentRssSection(); - $(this).makeTorrentRssProviderString(); - }; - - $.fn.deleteTorrentRssProvider = function (id) { - $('#editATorrentRssProvider').removeOption(id); - delete torrentRssProviders[id]; - $(this).populateTorrentRssSection(); - $('li').remove('#'+id); - $(this).makeTorrentRssProviderString(); - }; - - $.fn.populateNewznabSection = function() { - var selectedProvider = $('#editANewznabProvider :selected').val(); - var data = ''; - var isDefault = ''; - var rrcat = ''; - - if (selectedProvider === 'addNewznab') { - data = ['','','']; - isDefault = 0; - $('#newznab_add_div').show(); - $('#newznab_update_div').hide(); - $('#newznab_cat').attr('disabled','disabled'); - $('#newznab_cap').attr('disabled','disabled'); - $('#newznab_cat_update').attr('disabled','disabled'); - $('#newznabcapdiv').hide(); - - $("#newznab_cat option").each(function() { - $(this).remove(); - return; - }); - - $("#newznab_cap option").each(function() { - $(this).remove(); - return; - }); - - } else { - data = newznabProviders[selectedProvider][1]; - isDefault = newznabProviders[selectedProvider][0]; - $('#newznab_add_div').hide(); - $('#newznab_update_div').show(); - $('#newznab_cat').removeAttr("disabled"); - $('#newznab_cap').removeAttr("disabled"); - $('#newznab_cat_update').removeAttr("disabled"); - $('#newznabcapdiv').show(); - } - - $('#newznab_name').val(data[0]); - $('#newznab_url').val(data[1]); - $('#newznab_key').val(data[2]); - - //Check if not already array - if (typeof data[3] === 'string') { - rrcat = data[3].split(","); - } else { - rrcat = data[3]; - } - - // Update the category select box (on the right) - var newCatOptions = []; - if (rrcat) { - rrcat.forEach(function (cat) { - if (cat !== '') { - newCatOptions.push({text : cat, value : cat}); - } - }); - $("#newznab_cat").replaceOptions(newCatOptions); - } - - if (selectedProvider === 'addNewznab') { - $('#newznab_name').removeAttr("disabled"); - $('#newznab_url').removeAttr("disabled"); - } else { - $('#newznab_name').attr("disabled", "disabled"); - - if (isDefault) { - $('#newznab_url').attr("disabled", "disabled"); - $('#newznab_delete').attr("disabled", "disabled"); - } else { - $('#newznab_url').removeAttr("disabled"); - $('#newznab_delete').removeAttr("disabled"); - - //Get Categories Capabilities - if (data[0] && data[1] && data[2] && !ifExists($.fn.newznabProvidersCapabilities, data[0])) { - $(this).getCategories(isDefault, data); - } - $(this).updateNewznabCaps( null, data ); - } - } - }; - - /** - * Updates the Global array $.fn.newznabProvidersCapabilities with a combination of newznab prov name - * and category capabilities. Return - * @param {Array} newzNabCaps, is the returned object with newzNabprod Name and Capabilities. - * @param {Array} selectedProvider - * @return no return data. The multiselect input $("#newznab_cap") is updated, as a result. - */ - $.fn.updateNewznabCaps = function( newzNabCaps, selectedProvider ) { - if (newzNabCaps && !ifExists($.fn.newznabProvidersCapabilities, selectedProvider[0])) { - $.fn.newznabProvidersCapabilities.push({'name' : selectedProvider[0], 'categories' : newzNabCaps.tv_categories}); // jshint ignore:line - } - - //Loop through the array and if currently selected newznab provider name matches one in the array, use it to - //update the capabilities select box (on the left). - if (selectedProvider[0]) { - $.fn.newznabProvidersCapabilities.forEach(function(newzNabCap) { - if (newzNabCap.name && newzNabCap.name === selectedProvider[0] && newzNabCap.categories instanceof Array) { - var newCapOptions = []; - newzNabCap.categories.forEach(function(categorySet) { - if (categorySet.id && categorySet.name) { - newCapOptions.push({value : categorySet.id, text : categorySet.name + "(" + categorySet.id + ")"}); - } - }); - $("#newznab_cap").replaceOptions(newCapOptions); - } - }); - } - }; - - $.fn.makeNewznabProviderString = function() { - var provStrings = []; - - for (var id in newznabProviders) { - if (newznabProviders.hasOwnProperty(id)) { - provStrings.push(newznabProviders[id][1].join('|')); - } - } - - $('#newznab_string').val(provStrings.join('!!!')); - }; - - $.fn.populateTorrentRssSection = function() { - var selectedProvider = $('#editATorrentRssProvider :selected').val(); - var data = ''; - - if (selectedProvider === 'addTorrentRss') { - data = ['','','','title']; - $('#torrentrss_add_div').show(); - $('#torrentrss_update_div').hide(); - } else { - data = torrentRssProviders[selectedProvider]; - $('#torrentrss_add_div').hide(); - $('#torrentrss_update_div').show(); - } - - $('#torrentrss_name').val(data[0]); - $('#torrentrss_url').val(data[1]); - $('#torrentrss_cookies').val(data[2]); - $('#torrentrss_titleTAG').val(data[3]); - - if (selectedProvider === 'addTorrentRss') { - $('#torrentrss_name').removeAttr("disabled"); - $('#torrentrss_url').removeAttr("disabled"); - $('#torrentrss_cookies').removeAttr("disabled"); - $('#torrentrss_titleTAG').removeAttr("disabled"); - } else { - $('#torrentrss_name').attr("disabled", "disabled"); - $('#torrentrss_url').removeAttr("disabled"); - $('#torrentrss_cookies').removeAttr("disabled"); - $('#torrentrss_titleTAG').removeAttr("disabled"); - $('#torrentrss_delete').removeAttr("disabled"); - } - }; - - $.fn.makeTorrentRssProviderString = function() { - var provStrings = []; - for (var id in torrentRssProviders) { - if (torrentRssProviders.hasOwnProperty(id)) { - provStrings.push(torrentRssProviders[id].join('|')); - } - } - - $('#torrentrss_string').val(provStrings.join('!!!')); - }; - - - $.fn.refreshProviderList = function() { - var idArr = $("#provider_order_list").sortable('toArray'); - var finalArr = []; - $.each(idArr, function(key, val) { - var checked = + $('#enable_'+val).prop('checked') ? '1' : '0'; - finalArr.push(val + ':' + checked); - }); - - $("#provider_order").val(finalArr.join(' ')); - $(this).refreshEditAProvider(); - }; - - $.fn.refreshEditAProvider = function() { - $('#provider-list').empty(); - - var idArr = $("#provider_order_list").sortable('toArray'); - var finalArr = []; - $.each(idArr, function(key, val) { - if ($('#enable_'+val).prop('checked')) { - finalArr.push(val); - } - }); - - if (finalArr.length > 0) { - $('<select>').prop('id','editAProvider').addClass('form-control input-sm').appendTo('#provider-list'); - for (var i = 0, len = finalArr.length; i < len; i++) { - var provider = finalArr[i]; - $('#editAProvider').append($('<option>').prop('value',provider).text($.trim($('#'+provider).text()).replace(/\s\*$/, '').replace(/\s\*\*$/, ''))); - } - } else { - document.getElementsByClassName('component-desc')[0].innerHTML = "No providers available to configure."; - } - - $(this).showHideProviders(); - }; - - var newznabProviders = []; - var torrentRssProviders = []; - - $(this).on('change', '.newznab_key', function(){ - var providerId = $(this).attr('id'); - providerId = providerId.substring(0, providerId.length-'_hash'.length); - - var url = $('#'+providerId+'_url').val(); - var cat = $('#'+providerId+'_cat').val(); - var key = $(this).val(); - - $(this).updateProvider(providerId, url, key, cat); - }); - - $('#newznab_key,#newznab_url').change(function(){ - var selectedProvider = $('#editANewznabProvider :selected').val(); - - if (selectedProvider === "addNewznab"){ - return; - } - - var url = $('#newznab_url').val(); - var key = $('#newznab_key').val(); - - var cat = $('#newznab_cat option').map(function(i, opt) { - return $(opt).text(); - }).toArray().join(','); - - $(this).updateProvider(selectedProvider, url, key, cat); - }); - - $('#torrentrss_url,#torrentrss_cookies,#torrentrss_titleTAG').change(function(){ - var selectedProvider = $('#editATorrentRssProvider :selected').val(); - - if (selectedProvider === "addTorrentRss"){ - return; - } - - var url = $('#torrentrss_url').val(); - var cookies = $('#torrentrss_cookies').val(); - var titleTAG = $('#torrentrss_titleTAG').val(); - - $(this).updateTorrentRssProvider(selectedProvider, url, cookies, titleTAG); - }); - - $('body').on('change', '#editAProvider',function(){ - $(this).showHideProviders(); - }); - - $('#editANewznabProvider').change(function(){ - $(this).populateNewznabSection(); - }); - - $('#editATorrentRssProvider').change(function(){ - $(this).populateTorrentRssSection(); - }); - - $(this).on('click', '.provider_enabler', function(){ - $(this).refreshProviderList(); - }); - - $('#newznab_cat_update').click(function(){ - console.debug('Clicked Button'); - - // Maybe check if there is anything selected? - $("#newznab_cat option").each(function() { - $(this).remove(); - }); - - var newOptions = []; - - // When the update botton is clicked, loop through the capabilities list - // and copy the selected category id's to the category list on the right. - $("#newznab_cap option:selected").each(function(){ - var selectedCat = $(this).val(); - console.debug(selectedCat); - newOptions.push({text: selectedCat, value: selectedCat}); - }); - - $("#newznab_cat").replaceOptions(newOptions); - - var selectedProvider = $("#editANewznabProvider :selected").val(); - if (selectedProvider === "addNewznab"){ - return; - } - - var url = $('#newznab_url').val(); - var key = $('#newznab_key').val(); - - var cat = $('#newznab_cat option').map(function(i, opt) { - return $(opt).text(); - }).toArray().join(','); - - $("#newznab_cat option:not([value])").remove(); - - $(this).updateProvider(selectedProvider, url, key, cat); - }); - - - $('#newznab_add').click(function(){ - var name = $.trim($('#newznab_name').val()); - var url = $.trim($('#newznab_url').val()); - var key = $.trim($('#newznab_key').val()); - //var cat = $.trim($('#newznab_cat').val()); - - var cat = $.trim($('#newznab_cat option').map(function(i, opt) { - return $(opt).text(); - }).toArray().join(',')); - - if (!name || !url || !key) { - return; - } - - var params = {name: name}; - - // send to the form with ajax, get a return value - $.getJSON(srRoot + '/config/providers/canAddNewznabProvider', params, function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - $(this).addProvider(data.success, name, url, key, cat, 0); - }); - }); - - $('.newznab_delete').click(function(){ - var selectedProvider = $('#editANewznabProvider :selected').val(); - $(this).deleteProvider(selectedProvider); - }); - - $('#torrentrss_add').click(function(){ - var name = $('#torrentrss_name').val(); - var url = $('#torrentrss_url').val(); - var cookies = $('#torrentrss_cookies').val(); - var titleTAG = $('#torrentrss_titleTAG').val(); - var params = { name: name, url: url, cookies: cookies, titleTAG: titleTAG}; - - // send to the form with ajax, get a return value - $.getJSON(srRoot + '/config/providers/canAddTorrentRssProvider', params, function(data){ - if (data.error !== undefined) { - alert(data.error); - return; - } - - $(this).addTorrentRssProvider(data.success, name, url, cookies, titleTAG); - $(this).refreshEditAProvider(); - }); - }); - - $('.torrentrss_delete').on('click', function(){ - $(this).deleteTorrentRssProvider($('#editATorrentRssProvider :selected').val()); - $(this).refreshEditAProvider(); - }); - - $(this).on('change', "[class='providerDiv_tip'] input", function(){ - $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").replaceWith($(this).clone()); - $('div .providerDiv ' + "[newznab_name=" + $(this).attr('id') + "]").replaceWith($(this).clone()); - }); - - $(this).on('change', "[class='providerDiv_tip'] select", function(){ - $(this).find('option').each( function() { - if ($(this).is(':selected')) { - $(this).prop('defaultSelected', true); - } else { - $(this).prop('defaultSelected', false); - } - }); - $('div .providerDiv ' + "[name=" + $(this).attr('name') + "]").empty().replaceWith($(this).clone()); - }); - - $(this).on('change', '.enabler', function(){ - if ($(this).is(':checked')) { - $('.content_'+$(this).attr('id')).each( function() { - $(this).show(); - }); - } else { - $('.content_'+$(this).attr('id')).each( function() { - $(this).hide(); - }); - } - }); - - $(".enabler").each(function(){ - if (!$(this).is(':checked')) { - $('.content_'+$(this).attr('id')).hide(); - } else { - $('.content_'+$(this).attr('id')).show(); - } - }); - - $.fn.makeTorrentOptionString = function(providerId) { - var seedRatio = $('.providerDiv_tip #' + providerId + '_seed_ratio').prop('value'); - var seedTime = $('.providerDiv_tip #' + providerId + '_seed_time').prop('value'); - var processMet = $('.providerDiv_tip #' + providerId + '_process_method').prop('value'); - var optionString = $('.providerDiv_tip #' + providerId + '_option_string'); - - optionString.val([seedRatio, seedTime, processMet].join('|')); - }; - - $(this).on('change', '.seed_option', function(){ - var providerId = $(this).attr('id').split('_')[0]; - $(this).makeTorrentOptionString(providerId); - }); - - $.fn.replaceOptions = function(options) { - var self, $option; - - this.empty(); - self = this; - - $.each(options, function(index, option) { - $option = $("<option></option>").attr("value", option.value).text(option.text); - self.append($option); - }); - }; - - // initialization stuff - $.fn.newznabProvidersCapabilities = []; - - $(this).showHideProviders(); - - $("#provider_order_list").sortable({ - placeholder: 'ui-state-highlight', - update: function () { - $(this).refreshProviderList(); - } - }); - - $("#provider_order_list").disableSelection(); - - if ($('#editANewznabProvider').length) { - $(this).populateNewznabSection(); - } + // @TODO This function need to be filled with ConfigProviders.js but can't be as we've got scope issues currently. + console.log('This function need to be filled with ConfigProviders.js but can\'t be as we\'ve got scope issues currently.'); } }, manage: { diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index eb25276a5..a8259e69c 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -6,6 +6,7 @@ from sickbeard.helpers import anon_url %> <%block name="scripts"> +<script type="text/javascript" src="/js/ConfigProviders.js"></script> <script type="text/javascript"> $(document).ready(function(){ % if sickbeard.USE_NZBS: -- GitLab From 074dc947535de95c25e36ec0c240a7c321aa1a7f Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 13:52:16 +1030 Subject: [PATCH 198/215] update core.min.js to match core.js --- gui/slick/js/core.min.js | Bin 51335 -> 40257 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index 0e56469a964fe646a862dd294650d488358186c3..332e5cef3bd42e8931b41239fcb9f7991756bd05 100644 GIT binary patch delta 142 zcmZpl$b4`Y(}uj+^~w2p#rZj@dO7*&8cHD<nZ*ierFqFEnfZANd8w%>3MKgpNvR5H znK?PBDGKG8B^e6N`FUxX=>bLgWtl0dMa6nq#R^HKB?`%jdFmw~wTZ<F<*DjrsS4@& sB?`sK`30#8nZ?DWsl^J(rA0-lc_lfOdP<tLwK}<pd5N2ikB2Y<00ezB!~g&Q delta 8925 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 -- GitLab From b668f1d91d08d207ff814be6f419ab2ea8b541df Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 16:00:01 +1030 Subject: [PATCH 199/215] add JSCS styling rules --- .build/.jscsrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .build/.jscsrc diff --git a/.build/.jscsrc b/.build/.jscsrc new file mode 100644 index 000000000..f5387e9af --- /dev/null +++ b/.build/.jscsrc @@ -0,0 +1,3 @@ +{ + "preset": "jquery" +} -- GitLab From 149a382b4220d4a28e3e432cf8917605d77fb906 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 16:00:16 +1030 Subject: [PATCH 200/215] move js into core file --- gui/slick/js/core.js | 555 +++++++++++++++------ gui/slick/js/manageEpisodeStatuses.js | 67 --- gui/slick/js/new/manage.js | 34 -- gui/slick/js/new/manage_backlogOverview.js | 7 +- gui/slick/js/new/manage_failedDownloads.js | 9 +- gui/slick/js/new/manage_massEdit.js | 1 - 6 files changed, 394 insertions(+), 279 deletions(-) diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index f91e678bc..a3c13c819 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -1,27 +1,27 @@ -var srRoot = getMeta('srRoot'), - themeSpinner = getMeta('themeSpinner'), - anonURL = getMeta('anonURL'), - topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', - loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; - -function configSuccess(){ - $('.config_submitter').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - }); - $('.config_submitter_refresh').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - window.location.href = srRoot + '/config/providers/'; - }); - $('#email_show').trigger('notify'); -} - var SICKRAGE = { common: { init: function() { + var srRoot = getMeta('srRoot'), + themeSpinner = getMeta('themeSpinner'), + anonURL = getMeta('anonURL'), + topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', + loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; + + function configSuccess(){ + $('.config_submitter').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + }); + $('.config_submitter_refresh').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + window.location.href = srRoot + '/config/providers/'; + }); + $('#email_show').trigger('notify'); + } + $("#config-components").tabs({ activate: function (event, ui) { var lastOpenedPanel = $(this).data("lastOpenedPanel"), @@ -333,9 +333,10 @@ var SICKRAGE = { $('#config-components').tabs(); $('#testGrowl').click(function () { - var growlHost = $.trim($('#growl_host').val()); - var growlPassword = $.trim($('#growl_password').val()); - if (!growlHost) { + var growl = {}; + growl.host = $.trim($('#growl_host').val()); + growl.password = $.trim($('#growl_password').val()); + if (!growl.ost) { $('#testGrowl-result').html('Please fill out the necessary fields above.'); $('#growl_host').addClass('warning'); return; @@ -343,16 +344,17 @@ var SICKRAGE = { $('#growl_host').removeClass('warning'); $(this).prop('disabled', true); $('#testGrowl-result').html(loading); - $.get(srRoot + '/home/testGrowl', {'host': growlHost, 'password': growlPassword}).done(function (data) { + $.get(srRoot + '/home/testGrowl', {'host': growl.host, 'password': growl.password}).done(function (data) { $('#testGrowl-result').html(data); $('#testGrowl').prop('disabled', false); }); }); $('#testProwl').click(function () { - var prowlApi = $.trim($('#prowl_api').val()); - var prowlPriority = $('#prowl_priority').val(); - if (!prowlApi) { + var prowl = {}; + prowl.api = $.trim($('#prowl_api').val()); + prowl.priority = $('#prowl_priority').val(); + if (!prowl.ai) { $('#testProwl-result').html('Please fill out the necessary fields above.'); $('#prowl_api').addClass('warning'); return; @@ -360,17 +362,18 @@ var SICKRAGE = { $('#prowl_api').removeClass('warning'); $(this).prop('disabled', true); $('#testProwl-result').html(loading); - $.get(srRoot + '/home/testProwl', {'prowl_api': prowlApi, 'prowl_priority': prowlPriority}).done(function (data) { + $.get(srRoot + '/home/testProwl', {'prowl_api': prowl.api, 'prowl_priority': prowl.priority}).done(function (data) { $('#testProwl-result').html(data); $('#testProwl').prop('disabled', false); }); }); $('#testKODI').click(function () { - var kodi_host = $.trim($('#kodi_host').val()); - var kodi_username = $.trim($('#kodi_username').val()); - var kodi_password = $.trim($('#kodi_password').val()); - if (!kodi_host) { + var kodi = {}; + kodi.host = $.trim($('#kodi_host').val()); + kodi.username = $.trim($('#kodi_username').val()); + kodi.password = $.trim($('#kodi_password').val()); + if (!kodi.host) { $('#testKODI-result').html('Please fill out the necessary fields above.'); $('#kodi_host').addClass('warning'); return; @@ -378,17 +381,19 @@ var SICKRAGE = { $('#kodi_host').removeClass('warning'); $(this).prop('disabled', true); $('#testKODI-result').html(loading); - $.get(srRoot + '/home/testKODI', {'host': kodi_host, 'username': kodi_username, 'password': kodi_password}).done(function (data) { + $.get(srRoot + '/home/testKODI', {'host': kodi.host, 'username': kodi.username, 'password': kodi.password}).done(function (data) { $('#testKODI-result').html(data); $('#testKODI').prop('disabled', false); }); }); $('#testPMC').click(function () { - var plex_host = $.trim($('#plex_host').val()); - var plex_client_username = $.trim($('#plex_client_username').val()); - var plex_client_password = $.trim($('#plex_client_password').val()); - if (!plex_host) { + var plex = {}; + plex.client = {}; + plex.client.host = $.trim($('#plex_host').val()); + plex.client.username = $.trim($('#plex_client_username').val()); + plex.client.password = $.trim($('#plex_client_password').val()); + if (!plex.host) { $('#testPMC-result').html('Please fill out the necessary fields above.'); $('#plex_host').addClass('warning'); return; @@ -396,18 +401,20 @@ var SICKRAGE = { $('#plex_host').removeClass('warning'); $(this).prop('disabled', true); $('#testPMC-result').html(loading); - $.get(srRoot + '/home/testPMC', {'host': plex_host, 'username': plex_client_username, 'password': plex_client_password}).done(function (data) { + $.get(srRoot + '/home/testPMC', {'host': plex.client.host, 'username': plex.client.username, 'password': plex.client.password}).done(function (data) { $('#testPMC-result').html(data); $('#testPMC').prop('disabled', false); }); }); $('#testPMS').click(function () { - var plex_server_host = $.trim($('#plex_server_host').val()); - var plex_username = $.trim($('#plex_username').val()); - var plex_password = $.trim($('#plex_password').val()); - var plex_server_token = $.trim($('#plex_server_token').val()); - if (!plex_server_host) { + var plex = {}; + plex.server = {}; + plex.server.host = $.trim($('#plex_server_host').val()); + plex.username = $.trim($('#plex_username').val()); + plex.password = $.trim($('#plex_password').val()); + plex.server.token = $.trim($('#plex_server_token').val()); + if (!plex.server.host) { $('#testPMS-result').html('Please fill out the necessary fields above.'); $('#plex_server_host').addClass('warning'); return; @@ -415,23 +422,24 @@ var SICKRAGE = { $('#plex_server_host').removeClass('warning'); $(this).prop('disabled', true); $('#testPMS-result').html(loading); - $.get(srRoot + '/home/testPMS', {'host': plex_server_host, 'username': plex_username, 'password': plex_password, 'plex_server_token': plex_server_token}).done(function (data) { + $.get(srRoot + '/home/testPMS', {'host': plex.server.host, 'username': plex.username, 'password': plex.password, 'plex_server_token': plex.server.token}).done(function (data) { $('#testPMS-result').html(data); $('#testPMS').prop('disabled', false); }); }); $('#testEMBY').click(function () { - var emby_host = $('#emby_host').val(); - var emby_apikey = $('#emby_apikey').val(); - if (!emby_host || !emby_apikey) { + var emby = {}; + emby.host = $('#emby_host').val(); + emby.apikey = $('#emby_apikey').val(); + if (!emby.host || !emby.apikey) { $('#testEMBY-result').html('Please fill out the necessary fields above.'); - if (!emby_host) { + if (!emby.host) { $('#emby_host').addClass('warning'); } else { $('#emby_host').removeClass('warning'); } - if (!emby_apikey) { + if (!emby.apikey) { $('#emby_apikey').addClass('warning'); } else { $('#emby_apikey').removeClass('warning'); @@ -441,15 +449,16 @@ var SICKRAGE = { $('#emby_host,#emby_apikey').removeClass('warning'); $(this).prop('disabled', true); $('#testEMBY-result').html(loading); - $.get(srRoot + '/home/testEMBY', {'host': emby_host, 'emby_apikey': emby_apikey}).done(function (data) { + $.get(srRoot + '/home/testEMBY', {'host': emby.host, 'emby_apikey': emby.apikey}).done(function (data) { $('#testEMBY-result').html(data); $('#testEMBY').prop('disabled', false); }); }); $('#testBoxcar').click(function() { - var boxcar_username = $.trim($('#boxcar_username').val()); - if (!boxcar_username) { + var boxcar = {}; + boxcar.username = $.trim($('#boxcar_username').val()); + if (!boxcar.username) { $('#testBoxcar-result').html('Please fill out the necessary fields above.'); $('#boxcar_username').addClass('warning'); return; @@ -457,15 +466,16 @@ var SICKRAGE = { $('#boxcar_username').removeClass('warning'); $(this).prop('disabled', true); $('#testBoxcar-result').html(loading); - $.get(srRoot + '/home/testBoxcar', {'username': boxcar_username}).done(function (data) { + $.get(srRoot + '/home/testBoxcar', {'username': boxcar.username}).done(function (data) { $('#testBoxcar-result').html(data); $('#testBoxcar').prop('disabled', false); }); }); $('#testBoxcar2').click(function () { - var boxcar2_accesstoken = $.trim($('#boxcar2_accesstoken').val()); - if (!boxcar2_accesstoken) { + var boxcar2 = {}; + boxcar2.accesstoken = $.trim($('#boxcar2_accesstoken').val()); + if (!boxcar2.accesstoken) { $('#testBoxcar2-result').html('Please fill out the necessary fields above.'); $('#boxcar2_accesstoken').addClass('warning'); return; @@ -473,23 +483,24 @@ var SICKRAGE = { $('#boxcar2_accesstoken').removeClass('warning'); $(this).prop('disabled', true); $('#testBoxcar2-result').html(loading); - $.get(srRoot + '/home/testBoxcar2', {'accesstoken': boxcar2_accesstoken}).done(function (data) { + $.get(srRoot + '/home/testBoxcar2', {'accesstoken': boxcar2.accesstoken}).done(function (data) { $('#testBoxcar2-result').html(data); $('#testBoxcar2').prop('disabled', false); }); }); $('#testPushover').click(function () { - var pushover_userkey = $('#pushover_userkey').val(); - var pushover_apikey = $('#pushover_apikey').val(); - if (!pushover_userkey || !pushover_apikey) { + var pushover = {}; + pushover.userkey = $('#pushover_userkey').val(); + pushover.apikey = $('#pushover_apikey').val(); + if (!pushover.userkey || !pushover.apikey) { $('#testPushover-result').html('Please fill out the necessary fields above.'); - if (!pushover_userkey) { + if (!pushover.userkey) { $('#pushover_userkey').addClass('warning'); } else { $('#pushover_userkey').removeClass('warning'); } - if (!pushover_apikey) { + if (!pushover.apikey) { $('#pushover_apikey').addClass('warning'); } else { $('#pushover_apikey').removeClass('warning'); @@ -499,7 +510,7 @@ var SICKRAGE = { $('#pushover_userkey,#pushover_apikey').removeClass('warning'); $(this).prop('disabled', true); $('#testPushover-result').html(loading); - $.get(srRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey}).done(function (data) { + $.get(srRoot + '/home/testPushover', {'userKey': pushover.userkey, 'apiKey': pushover.apikey}).done(function (data) { $('#testPushover-result').html(data); $('#testPushover').prop('disabled', false); }); @@ -522,15 +533,16 @@ var SICKRAGE = { }); $('#twitterStep2').click(function () { - var twitter_key = $.trim($('#twitter_key').val()); - if (!twitter_key) { + var twitter = {}; + twitter.key = $.trim($('#twitter_key').val()); + if (!twitter.key) { $('#testTwitter-result').html('Please fill out the necessary fields above.'); $('#twitter_key').addClass('warning'); return; } $('#twitter_key').removeClass('warning'); $('#testTwitter-result').html(loading); - $.get(srRoot + '/home/twitterStep2', {'key': twitter_key}, function(data) { + $.get(srRoot + '/home/twitterStep2', {'key': twitter.key}, function(data) { $('#testTwitter-result').html(data); }); }); @@ -542,15 +554,16 @@ var SICKRAGE = { }); $('#settingsNMJ').click(function() { + var nmj = {}; if (!$('#nmj_host').val()) { alert('Please fill in the Popcorn IP address'); $('#nmj_host').focus(); return; } $('#testNMJ-result').html(loading); - var nmj_host = $('#nmj_host').val(); + nmj.host = $('#nmj_host').val(); - $.get(srRoot + '/home/settingsNMJ', {'host': nmj_host}, function (data) { + $.get(srRoot + '/home/settingsNMJ', {'host': nmj.host}, function (data) { if (data === null) { $('#nmj_database').removeAttr('readonly'); $('#nmj_mount').removeAttr('readonly'); @@ -574,10 +587,11 @@ var SICKRAGE = { }); $('#testNMJ').click(function () { - var nmj_host = $.trim($('#nmj_host').val()); - var nmj_database = $('#nmj_database').val(); - var nmj_mount = $('#nmj_mount').val(); - if (!nmj_host) { + var nmj = {}; + nmj.host = $.trim($('#nmj_host').val()); + nmj.database = $('#nmj_database').val(); + nmj.mount = $('#nmj_mount').val(); + if (!nmj.host) { $('#testNMJ-result').html('Please fill out the necessary fields above.'); $('#nmj_host').addClass('warning'); return; @@ -585,31 +599,32 @@ var SICKRAGE = { $('#nmj_host').removeClass('warning'); $(this).prop('disabled', true); $('#testNMJ-result').html(loading); - $.get(srRoot + '/home/testNMJ', {'host': nmj_host, 'database': nmj_database, 'mount': nmj_mount}).done(function (data) { + $.get(srRoot + '/home/testNMJ', {'host': nmj.host, 'database': nmj.database, 'mount': nmj.mount}).done(function (data) { $('#testNMJ-result').html(data); $('#testNMJ').prop('disabled', false); }); }); $('#settingsNMJv2').click(function() { - if (!$('#nmjv2_host').val()) { + var nmjv2 = {}; + if(!$('#nmjv2_host').val()) { alert('Please fill in the Popcorn IP address'); $('#nmjv2_host').focus(); return; } $('#testNMJv2-result').html(loading); - var nmjv2_host = $('#nmjv2_host').val(); - var nmjv2_dbloc; + nmjv2.host = $('#nmjv2_host').val(); + nmjv2.dbloc = ''; var radios = document.getElementsByName('nmjv2_dbloc'); for(var i = 0, len = radios.length; i < len; i++) { if (radios[i].checked) { - nmjv2_dbloc=radios[i].value; + nmjv2.dbloc = radios[i].value; break; } } - var nmjv2_dbinstance=$('#NMJv2db_instance').val(); - $.get(srRoot + '/home/settingsNMJv2', {'host': nmjv2_host,'dbloc': nmjv2_dbloc,'instance': nmjv2_dbinstance}, function (data){ + nmjv2.dbinstance=$('#NMJv2db_instance').val(); + $.get(srRoot + '/home/settingsNMJv2', {'host': nmjv2.host,'dbloc': nmjv2.dbloc,'instance': nmjv2.dbinstance}, function (data){ if (data === null) { $('#nmjv2_database').removeAttr('readonly'); } @@ -626,8 +641,9 @@ var SICKRAGE = { }); $('#testNMJv2').click(function () { - var nmjv2_host = $.trim($('#nmjv2_host').val()); - if (!nmjv2_host) { + var nmjv2 = {}; + nmjv2.host = $.trim($('#nmjv2_host').val()); + if (!nmjv2.host) { $('#testNMJv2-result').html('Please fill out the necessary fields above.'); $('#nmjv2_host').addClass('warning'); return; @@ -635,23 +651,24 @@ var SICKRAGE = { $('#nmjv2_host').removeClass('warning'); $(this).prop('disabled', true); $('#testNMJv2-result').html(loading); - $.get(srRoot + '/home/testNMJv2', {'host': nmjv2_host}) .done(function (data) { + $.get(srRoot + '/home/testNMJv2', {'host': nmjv2.host}) .done(function (data) { $('#testNMJv2-result').html(data); $('#testNMJv2').prop('disabled', false); }); }); $('#testFreeMobile').click(function () { - var freemobile_id = $.trim($('#freemobile_id').val()); - var freemobile_apikey = $.trim($('#freemobile_apikey').val()); - if (!freemobile_id || !freemobile_apikey) { + var freemobile = {}; + freemobile.id = $.trim($('#freemobile_id').val()); + freemobile.apikey = $.trim($('#freemobile_apikey').val()); + if (!freemobile.id || !freemobile.apikey) { $('#testFreeMobile-result').html('Please fill out the necessary fields above.'); - if (!freemobile_id) { + if (!freemobile.id) { $('#freemobile_id').addClass('warning'); } else { $('#freemobile_id').removeClass('warning'); } - if (!freemobile_apikey) { + if (!freemobile.apikey) { $('#freemobile_apikey').addClass('warning'); } else { $('#freemobile_apikey').removeClass('warning'); @@ -661,23 +678,24 @@ var SICKRAGE = { $('#freemobile_id,#freemobile_apikey').removeClass('warning'); $(this).prop('disabled', true); $('#testFreeMobile-result').html(loading); - $.get(srRoot + '/home/testFreeMobile', {'freemobile_id': freemobile_id, 'freemobile_apikey': freemobile_apikey}).done(function (data) { + $.get(srRoot + '/home/testFreeMobile', {'freemobile_id': freemobile.id, 'freemobile_apikey': freemobile.apikey}).done(function (data) { $('#testFreeMobile-result').html(data); $('#testFreeMobile').prop('disabled', false); }); }); $('#TraktGetPin').click(function () { - var trakt_pin_url = $('#trakt_pin_url').val(); - var w; - w = window.open(trakt_pin_url, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550"); - $('#trakt_pin').removeClass('hide'); + var track = {}; + trackt.pinUrl = $('#trakt_pin_url').val(); + var w = window.open(trakt.pinUrl, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550"); + $('#trakt_pin').removeClass('hide'); }); $('#trakt_pin').on('keyup change', function(){ - var trakt_pin = $('#trakt_pin').val(); + var trakt = {}; + trakt.pin = $('#trakt_pin').val(); - if (trakt_pin.length !== 0) { + if (trakt.pin.length !== 0) { $('#TraktGetPin').addClass('hide'); $('#authTrakt').removeClass('hide'); } else { @@ -687,9 +705,10 @@ var SICKRAGE = { }); $('#authTrakt').click(function() { - var trakt_pin = $('#trakt_pin').val(); - if (trakt_pin.length !== 0) { - $.get(srRoot + '/home/getTraktToken', { "trakt_pin": trakt_pin }).done(function (data) { + var trakt = {}; + trakt.pin = $('#trakt_pin').val(); + if (trakt.pin.length !== 0) { + $.get(srRoot + '/home/getTraktToken', { "trakt_pin": trakt.pin }).done(function (data) { $('#testTrakt-result').html(data); $('#authTrakt').addClass('hide'); $('#trakt_pin').addClass('hide'); @@ -699,11 +718,12 @@ var SICKRAGE = { }); $('#testTrakt').click(function () { - var trakt_username = $.trim($('#trakt_username').val()); - var trakt_trending_blacklist = $.trim($('#trakt_blacklist_name').val()); - if (!trakt_username) { + var trakt = {}; + trakt.username = $.trim($('#trakt_username').val()); + trakt.trendingBlacklist = $.trim($('#trakt_blacklist_name').val()); + if (!trakt.username) { $('#testTrakt-result').html('Please fill out the necessary fields above.'); - if (!trakt_username) { + if (!trakt.username) { $('#trakt_username').addClass('warning'); } else { $('#trakt_username').removeClass('warning'); @@ -711,7 +731,7 @@ var SICKRAGE = { return; } - if (/\s/g.test(trakt_trending_blacklist)) { + if (/\s/g.test(trakt.trendingBlacklist)) { $('#testTrakt-result').html('Check blacklist name; the value need to be a trakt slug'); $('#trakt_blacklist_name').addClass('warning'); return; @@ -720,7 +740,7 @@ var SICKRAGE = { $('#trakt_blacklist_name').removeClass('warning'); $(this).prop('disabled', true); $('#testTrakt-result').html(loading); - $.get(srRoot + '/home/testTrakt', {'username': trakt_username, 'blacklist_name': trakt_trending_blacklist}).done(function (data) { + $.get(srRoot + '/home/testTrakt', {'username': trakt.username, 'blacklist_name': trakt.trendingBlacklist}).done(function (data) { $('#testTrakt-result').html(data); $('#testTrakt').prop('disabled', false); }); @@ -756,7 +776,15 @@ var SICKRAGE = { if (to === null || to.length === 0 || to.match(/.*@.*/) === null) { status.html('<p style="color: red;">You must provide a recipient email address!</p>'); } else { - $.get(srRoot + '/home/testEmail', {host: host, port: port, smtp_from: from, use_tls: tls, user: user, pwd: pwd, to: to}, function (msg) { + $.get(srRoot + '/home/testEmail', { + host: host, + port: port, + smtp_from: from, // jshint ignore:line + use_tls: tls, // jshint ignore:line + user: user, + pwd: pwd, + to: to + }, function (msg) { $('#testEmail-result').html(msg); }); } @@ -764,9 +792,10 @@ var SICKRAGE = { }); $('#testNMA').click(function () { - var nma_api = $.trim($('#nma_api').val()); - var nma_priority = $('#nma_priority').val(); - if (!nma_api) { + var nma = {}; + nma.api = $.trim($('#nma_api').val()); + nma.priority = $('#nma_priority').val(); + if (!nma.api) { $('#testNMA-result').html('Please fill out the necessary fields above.'); $('#nma_api').addClass('warning'); return; @@ -774,15 +803,16 @@ var SICKRAGE = { $('#nma_api').removeClass('warning'); $(this).prop('disabled', true); $('#testNMA-result').html(loading); - $.get(srRoot + '/home/testNMA', {'nma_api': nma_api, 'nma_priority': nma_priority}).done(function (data) { + $.get(srRoot + '/home/testNMA', {'nma_api': nma.api, 'nma_priority': nma.priority}).done(function (data) { $('#testNMA-result').html(data); $('#testNMA').prop('disabled', false); }); }); $('#testPushalot').click(function () { - var pushalot_authorizationtoken = $.trim($('#pushalot_authorizationtoken').val()); - if (!pushalot_authorizationtoken) { + var pushalot = {}; + pushalot.authToken = $.trim($('#pushalot_authorizationtoken').val()); + if (!pushalot.authToken) { $('#testPushalot-result').html('Please fill out the necessary fields above.'); $('#pushalot_authorizationtoken').addClass('warning'); return; @@ -790,15 +820,16 @@ var SICKRAGE = { $('#pushalot_authorizationtoken').removeClass('warning'); $(this).prop('disabled', true); $('#testPushalot-result').html(loading); - $.get(srRoot + '/home/testPushalot', {'authorizationToken': pushalot_authorizationtoken}).done(function (data) { + $.get(srRoot + '/home/testPushalot', {'authorizationToken': pushalot.authToken}).done(function (data) { $('#testPushalot-result').html(data); $('#testPushalot').prop('disabled', false); }); }); $('#testPushbullet').click(function () { - var pushbullet_api = $.trim($('#pushbullet_api').val()); - if (!pushbullet_api) { + var pushbullet = {}; + pushbullet.api = $.trim($('#pushbullet_api').val()); + if (!pushbullet.api) { $('#testPushbullet-result').html('Please fill out the necessary fields above.'); $('#pushbullet_api').addClass('warning'); return; @@ -806,42 +837,47 @@ var SICKRAGE = { $('#pushbullet_api').removeClass('warning'); $(this).prop('disabled', true); $('#testPushbullet-result').html(loading); - $.get(srRoot + '/home/testPushbullet', {'api': pushbullet_api}).done(function (data) { + $.get(srRoot + '/home/testPushbullet', {'api': pushbullet.api}).done(function (data) { $('#testPushbullet-result').html(data); $('#testPushbullet').prop('disabled', false); }); }); - function get_pushbullet_devices(msg){ - if(msg) { $('#testPushbullet-result').html(loading); } + function getPushbulletDevices(msg){ + var pushbullet = {}; + pushbullet.api = $("#pushbullet_api").val(); - var pushbullet_api = $("#pushbullet_api").val(); + if(msg) { + $('#testPushbullet-result').html(loading); + } - if(!pushbullet_api) { + if(!pushbullet.api) { $('#testPushbullet-result').html("You didn't supply a Pushbullet api key"); $("#pushbullet_api").focus(); return false; } - $.get(srRoot + "/home/getPushbulletDevices", {'api': pushbullet_api}, function (data) { - var devices = jQuery.parseJSON(data).devices; - var current_pushbullet_device = $("#pushbullet_device").val(); + $.get(srRoot + "/home/getPushbulletDevices", {'api': pushbullet.api}, function (data) { + pushbullet.devices = jQuery.parseJSON(data).devices; + pushbullet.currentDevice = $("#pushbullet_device").val(); $("#pushbullet_device_list").html(''); for (var i = 0, len = devices.length; i < len; i++) { if(devices[i].active === true) { - if(current_pushbullet_device == devices[i].iden) { - $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'" selected>' + devices[i].nickname + '</option>'); + if(pushbullet.currentDevice === pushbullet.devices[i].iden) { + $("#pushbullet_device_list").append('<option value="'+pushbullet.devices[i].iden+'" selected>' + pushbullet.devices[i].nickname + '</option>'); } else { - $("#pushbullet_device_list").append('<option value="'+devices[i].iden+'">' + devices[i].nickname + '</option>'); + $("#pushbullet_device_list").append('<option value="'+pushbullet.devices[i].iden+'">' + pushbullet.devices[i].nickname + '</option>'); } } } - if (current_pushbullet_device === '') { + if (pushbullet.currentDevice === '') { $("#pushbullet_device_list").prepend('<option value="" selected>All devices</option>'); } else { $("#pushbullet_device_list").prepend('<option value="">All devices</option>'); } - if(msg) $('#testPushbullet-result').html(msg); + if(msg) { + $('#testPushbullet-result').html(msg); + } }); $("#pushbullet_device_list").change(function(){ @@ -851,12 +887,13 @@ var SICKRAGE = { } $('#getPushbulletDevices').click(function(){ - get_pushbullet_devices("Device list updated. Please choose a device to push to."); + getPushbulletDevices("Device list updated. Please choose a device to push to."); }); // we have to call this function on dom ready to create the devices select - get_pushbullet_devices(); + getPushbulletDevices(); + // @TODO Find out what notify_data actually does since it doesn't seem to be a real function $('#email_show').change(function() { var key = parseInt($('#email_show').val(), 10); $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); @@ -864,15 +901,15 @@ var SICKRAGE = { // Update the internal data struct anytime settings are saved to the server $('#email_show').bind('notify', function() { - load_show_notify_lists(); + loadShowNotifyLists(); }); - function load_show_notify_lists() { + function loadShowNotifyLists() { $.get(srRoot + "/home/loadShowNotifyLists", function(data) { var list, html, s; list = $.parseJSON(data); - notify_data = list; - if (list._size === 0) return; + notify_data = list; // @TODO This is the same as the $('#email_show') function above + if (list._size === 0) { return; } html = '<option value="-1">-- Select --</option>'; for (s in list) { if (s.charAt(0) !== '_') { @@ -884,12 +921,12 @@ var SICKRAGE = { }); } // Load the per show notify lists everytime this page is loaded - load_show_notify_lists(); + loadShowNotifyLists(); $('#email_show_save').click(function() { $.post(srRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) { // Reload the per show notify lists to reflect changes - load_show_notify_lists(); + loadShowNotifyLists(); }); }); @@ -915,7 +952,7 @@ var SICKRAGE = { }; })(); - function israr_supported() { + function isRarSupported() { var pattern = $('#naming_pattern').val(); $.get(srRoot + '/config/postProcessing/isRarSupported', function (data) { if (data !== "supported") { @@ -929,12 +966,17 @@ var SICKRAGE = { }); } - function fill_examples() { - var pattern = $('#naming_pattern').val(); - var multi = $('#naming_multi_ep :selected').val(); - var anime_type = $('input[name="naming_anime"]:checked').val(); + function fillExamples() { + var example = {}; + + example.pattern = $('#naming_pattern').val(); + example.multi = $('#naming_multi_ep :selected').val(); + example.animeType = $('input[name="naming_anime"]:checked').val(); - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: 3}, function (data) { + $.get(srRoot + '/config/postProcessing/testNaming', { + pattern: example.pattern, + anime_type: 3 // jshint ignore:line + }, function (data) { if (data) { $('#naming_example').text(data + '.ext'); $('#naming_example_div').show(); @@ -943,7 +985,11 @@ var SICKRAGE = { } }); - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: 3}, function (data) { + $.get(srRoot + '/config/postProcessing/testNaming', { + pattern: example.pattern, + multi: example.multi, + anime_type: 3 // jshint ignore:line + }, function (data) { if (data) { $('#naming_example_multi').text(data + '.ext'); $('#naming_example_multi_div').show(); @@ -952,15 +998,19 @@ var SICKRAGE = { } }); - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { - if (data == "invalid") { + $.get(srRoot + '/config/postProcessing/isNamingValid', { + pattern: example.pattern, + multi: example.multi, + anime_type: example.animeType // jshint ignore:line + }, function (data) { + if (data === "invalid") { $('#naming_pattern').qtip('option', { 'content.text': 'This pattern is invalid.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' }); $('#naming_pattern').qtip('toggle', true); $('#naming_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { + } else if (data === "seasonfolders") { $('#naming_pattern').qtip('option', { 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' @@ -991,14 +1041,14 @@ var SICKRAGE = { }); $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, function (data) { - if (data == "invalid") { + if (data === "invalid") { $('#naming_abd_pattern').qtip('option', { 'content.text': 'This pattern is invalid.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' }); $('#naming_abd_pattern').qtip('toggle', true); $('#naming_abd_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { + } else if (data === "seasonfolders") { $('#naming_abd_pattern').qtip('option', { 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' @@ -1103,20 +1153,20 @@ var SICKRAGE = { }); } - function setup_naming() { + function setupNaming() { // if it is a custom selection then show the text box - if ($('#name_presets :selected').val() == "Custom...") { + if ($('#name_presets :selected').val().toLowerCase() === "custom...") { $('#naming_custom').show(); } else { $('#naming_custom').hide(); $('#naming_pattern').val($('#name_presets :selected').attr('id')); } - fill_examples(); + fillExamples(); } function setup_abd_naming() { // if it is a custom selection then show the text box - if ($('#name_abd_presets :selected').val() == "Custom...") { + if ($('#name_abd_presets :selected').val().toLowerCase() === "custom...") { $('#naming_abd_custom').show(); } else { $('#naming_abd_custom').hide(); @@ -1127,7 +1177,7 @@ var SICKRAGE = { function setup_sports_naming() { // if it is a custom selection then show the text box - if ($('#name_sports_presets :selected').val() == "Custom...") { + if ($('#name_sports_presets :selected').val().toLowerCase() === "custom...") { $('#naming_sports_custom').show(); } else { $('#naming_sports_custom').hide(); @@ -1149,14 +1199,14 @@ var SICKRAGE = { $('#unpack').on('change', function(){ if(this.checked) { - israr_supported(); + isRarSupported(); } else { $('#unpack').qtip('toggle', false); } }); $('#name_presets').on('change', function(){ - setup_naming(); + setupNaming(); }); $('#name_abd_presets').on('change', function(){ @@ -1187,11 +1237,11 @@ var SICKRAGE = { setup_anime_naming(); }); - $('#naming_multi_ep').change(fill_examples); - $('#naming_pattern').focusout(fill_examples); + $('#naming_multi_ep').change(fillExamples); + $('#naming_pattern').focusout(fillExamples); $('#naming_pattern').keyup(function () { typewatch(function () { - fill_examples(); + fillExamples(); }, 500); }); @@ -1203,21 +1253,21 @@ var SICKRAGE = { }, 500); }); - $('#naming_abd_pattern').focusout(fill_examples); + $('#naming_abd_pattern').focusout(fillExamples); $('#naming_abd_pattern').keyup(function () { typewatch(function () { fill_abd_examples(); }, 500); }); - $('#naming_sports_pattern').focusout(fill_examples); + $('#naming_sports_pattern').focusout(fillExamples); $('#naming_sports_pattern').keyup(function () { typewatch(function () { fill_sports_examples(); }, 500); }); - $('#naming_anime_pattern').focusout(fill_examples); + $('#naming_anime_pattern').focusout(fillExamples); $('#naming_anime_pattern').keyup(function () { typewatch(function () { fill_anime_examples(); @@ -1241,7 +1291,7 @@ var SICKRAGE = { $('#naming_custom').show(); $('#naming_pattern').focus(); }); - setup_naming(); + setupNaming(); setup_abd_naming(); setup_sports_naming(); setup_anime_naming(); @@ -1670,10 +1720,189 @@ var SICKRAGE = { }, manage: { init: function() { - // controller-wide code + $.makeRow = function(indexerId, season, episode, name, checked) { + var row = ''; + row += ' <tr class="' + $('#row_class').val() + ' show-' + indexerId + '">'; + row += ' <td class="tableleft" align="center"><input type="checkbox" class="' + indexerId + '-epcheck" name="' + indexerId + '-' + season + 'x' + episode + '"' + (checked ? ' checked' : '') + '></td>'; + row += ' <td>' + season + 'x' + episode + '</td>'; + row += ' <td class="tableright" style="width: 100%">' + name + '</td>'; + row += ' </tr>'; + + return row; + } + }, + index: function() { + $("#massUpdateTable:has(tbody tr)").tablesorter({ + sortList: [[1,0]], + textExtraction: { + 2: function(node) { return $(node).find("span").text().toLowerCase(); }, + 3: function(node) { return $(node).find("img").attr("alt"); }, + 4: function(node) { return $(node).find("img").attr("alt"); }, + 5: function(node) { return $(node).find("img").attr("alt"); }, + 6: function(node) { return $(node).find("img").attr("alt"); }, + 7: function(node) { return $(node).find("img").attr("alt"); }, + 8: function(node) { return $(node).find("img").attr("alt"); }, + 9: function(node) { return $(node).find("img").attr("alt"); }, + }, + widgets: ['zebra'], + headers: { + 0: { sorter: false}, + 1: { sorter: 'showNames'}, + 2: { sorter: 'quality'}, + 3: { sorter: 'sports'}, + 4: { sorter: 'scene'}, + 5: { sorter: 'anime'}, + 6: { sorter: 'flatfold'}, + 7: { sorter: 'archive_firstmatch'}, + 8: { sorter: 'paused'}, + 9: { sorter: 'subtitle'}, + 10: { sorter: 'default_ep_status'}, + 11: { sorter: 'status'}, + 12: { sorter: false}, + 13: { sorter: false}, + 14: { sorter: false}, + 15: { sorter: false}, + 16: { sorter: false}, + 17: { sorter: false} + } + }); }, - show: function() { - // action-specific code + backlogOverview: function() { + $('#pickShow').change(function(){ + var id = $(this).val(); + if (id) { + $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow'); + } + }); + }, + failedDownloads: function() { + $("#failedTable:has(tbody tr)").tablesorter({ + widgets: ['zebra'], + sortList: [[0,0]], + headers: { 3: { sorter: false } } + }); + $('#limit').change(function(){ + window.location.href = srRoot + '/manage/failedDownloads/?limit=' + $(this).val();; + }); + }, + massEdit: function() { + $('#location').fileBrowser({ title: 'Select Show Location' }); + }, + episodeStatuses: function() { + $('.allCheck').click(function(){ + var indexerId = $(this).attr('id').split('-')[1]; + $('.' + indexerId + '-epcheck').prop('checked', $(this).prop('checked')); + }); + + $('.get_more_eps').click(function(){ + var curIndexerId = $(this).attr('id'); + var checked = $('#allCheck-' + curIndexerId).prop('checked'); + var lastRow = $('tr#' + curIndexerId); + var clicked = $(this).attr('data-clicked'); + var action = $(this).attr('value'); + + if(!clicked) { + $.getJSON(srRoot+'/manage/showEpisodeStatuses',{ + indexer_id: curIndexerId, // jshint ignore:line + whichStatus: $('#oldStatus').val() + }, function (data) { + $.each(data, function(season,eps){ + $.each(eps, function(episode, name) { + //alert(season+'x'+episode+': '+name); + lastRow.after($.makeRow(curIndexerId, season, episode, name, checked)); + }); + }); + }); + $(this).attr('data-clicked',1); + $(this).prop('value', 'Collapse'); + } else { + if (action.toLowerCase() === 'collapse') { + $('table tr').filter('.show-' + curIndexerId).hide(); + $(this).prop('value', 'Expand'); + } else if (action.toLowerCase() === 'expand') { + $('table tr').filter('.show-' + curIndexerId).show(); + $(this).prop('value', 'Collapse'); + } + } + }); + + // selects all visible episode checkboxes. + $('.selectAllShows').click(function(){ + $('.allCheck').each(function(){ + this.checked = true; + }); + $('input[class*="-epcheck"]').each(function(){ + this.checked = true; + }); + }); + + // clears all visible episode checkboxes and the season selectors + $('.unselectAllShows').click(function(){ + $('.allCheck').each(function(){ + this.checked = false; + }); + $('input[class*="-epcheck"]').each(function(){ + this.checked = false; + }); + }); + }, + subtitleMissed: function() { + $('.allCheck').click(function(){ + var indexerId = $(this).attr('id').split('-')[1]; + $('.'+indexerId+'-epcheck').prop('checked', $(this).prop('checked')); + }); + + $('.get_more_eps').click(function(){ + var indexerId = $(this).attr('id'); + var checked = $('#allCheck-'+indexerId).prop('checked'); + var lastRow = $('tr#'+indexerId); + var clicked = $(this).attr('data-clicked'); + var action = $(this).attr('value'); + + if (!clicked) { + $.getJSON(srRoot + '/manage/showSubtitleMissed', { + indexer_id: indexerId, // jshint ignore:line + whichSubs: $('#selectSubLang').val() + }, function(data) { + $.each(data, function(season, eps) { + $.each(eps, function(episode, data) { + //alert(season+'x'+episode+': '+name); + lastRow.after($.makeRow(indexerId, season, episode, data.name, data.subtitles, checked)); + }); + }); + }); + $(this).attr('data-clicked', 1); + $(this).prop('value', 'Collapse'); + } else { + if (action === 'Collapse') { + $('table tr').filter('.show-' + indexerId).hide(); + $(this).prop('value', 'Expand'); + } else if (action === 'Expand') { + $('table tr').filter('.show-' + indexerId).show(); + $(this).prop('value', 'Collapse'); + } + } + }); + + // selects all visible episode checkboxes. + $('.selectAllShows').click(function(){ + $('.allCheck').each(function(){ + this.checked = true; + }); + $('input[class*="-epcheck"]').each(function(){ + this.checked = true; + }); + }); + + // clears all visible episode checkboxes and the season selectors + $('.unselectAllShows').click(function(){ + $('.allCheck').each(function(){ + this.checked = false; + }); + $('input[class*="-epcheck"]').each(function(){ + this.checked = false; + }); + }); } } }; diff --git a/gui/slick/js/manageEpisodeStatuses.js b/gui/slick/js/manageEpisodeStatuses.js index 8118aa478..74b148338 100644 --- a/gui/slick/js/manageEpisodeStatuses.js +++ b/gui/slick/js/manageEpisodeStatuses.js @@ -1,71 +1,4 @@ $(document).ready(function() { - function makeRow(indexerId, season, episode, name, checked) { - var row = ''; - row += ' <tr class="' + $('#row_class').val() + ' show-' + indexerId + '">'; - row += ' <td class="tableleft" align="center"><input type="checkbox" class="' + indexerId + '-epcheck" name="' + indexerId + '-' + season + 'x' + episode + '"' + (checked ? ' checked' : '') + '></td>'; - row += ' <td>' + season + 'x' + episode + '</td>'; - row += ' <td class="tableright" style="width: 100%">' + name + '</td>'; - row += ' </tr>'; - - return row; - } - - $('.allCheck').click(function(){ - var indexerId = $(this).attr('id').split('-')[1]; - $('.' + indexerId + '-epcheck').prop('checked', $(this).prop('checked')); - }); - - $('.get_more_eps').click(function(){ - var curIndexerId = $(this).attr('id'); - var checked = $('#allCheck-' + curIndexerId).prop('checked'); - var lastRow = $('tr#' + curIndexerId); - var clicked = $(this).attr('data-clicked'); - var action = $(this).attr('value'); - - if(!clicked) { - $.getJSON(srRoot+'/manage/showEpisodeStatuses',{ - indexer_id: curIndexerId, // jshint ignore:line - whichStatus: $('#oldStatus').val() - }, function (data) { - $.each(data, function(season,eps){ - $.each(eps, function(episode, name) { - //alert(season+'x'+episode+': '+name); - lastRow.after(makeRow(curIndexerId, season, episode, name, checked)); - }); - }); - }); - $(this).attr('data-clicked',1); - $(this).prop('value', 'Collapse'); - } else { - if (action.toLowerCase() === 'collapse') { - $('table tr').filter('.show-' + curIndexerId).hide(); - $(this).prop('value', 'Expand'); - } else if (action.toLowerCase() === 'expand') { - $('table tr').filter('.show-' + curIndexerId).show(); - $(this).prop('value', 'Collapse'); - } - } - }); - - // selects all visible episode checkboxes. - $('.selectAllShows').click(function(){ - $('.allCheck').each(function(){ - this.checked = true; - }); - $('input[class*="-epcheck"]').each(function(){ - this.checked = true; - }); - }); - - // clears all visible episode checkboxes and the season selectors - $('.unselectAllShows').click(function(){ - $('.allCheck').each(function(){ - this.checked = false; - }); - $('input[class*="-epcheck"]').each(function(){ - this.checked = false; - }); - }); }); diff --git a/gui/slick/js/new/manage.js b/gui/slick/js/new/manage.js index a601c7b5e..b8ac98a50 100644 --- a/gui/slick/js/new/manage.js +++ b/gui/slick/js/new/manage.js @@ -1,36 +1,2 @@ $(document).ready(function(){ - $("#massUpdateTable:has(tbody tr)").tablesorter({ - sortList: [[1,0]], - textExtraction: { - 2: function(node) { return $(node).find("span").text().toLowerCase(); }, - 3: function(node) { return $(node).find("img").attr("alt"); }, - 4: function(node) { return $(node).find("img").attr("alt"); }, - 5: function(node) { return $(node).find("img").attr("alt"); }, - 6: function(node) { return $(node).find("img").attr("alt"); }, - 7: function(node) { return $(node).find("img").attr("alt"); }, - 8: function(node) { return $(node).find("img").attr("alt"); }, - 9: function(node) { return $(node).find("img").attr("alt"); }, - }, - widgets: ['zebra'], - headers: { - 0: { sorter: false}, - 1: { sorter: 'showNames'}, - 2: { sorter: 'quality'}, - 3: { sorter: 'sports'}, - 4: { sorter: 'scene'}, - 5: { sorter: 'anime'}, - 6: { sorter: 'flatfold'}, - 7: { sorter: 'archive_firstmatch'}, - 8: { sorter: 'paused'}, - 9: { sorter: 'subtitle'}, - 10: { sorter: 'default_ep_status'}, - 11: { sorter: 'status'}, - 12: { sorter: false}, - 13: { sorter: false}, - 14: { sorter: false}, - 15: { sorter: false}, - 16: { sorter: false}, - 17: { sorter: false} - } }); -}); diff --git a/gui/slick/js/new/manage_backlogOverview.js b/gui/slick/js/new/manage_backlogOverview.js index d61b28a48..38637c688 100644 --- a/gui/slick/js/new/manage_backlogOverview.js +++ b/gui/slick/js/new/manage_backlogOverview.js @@ -1,8 +1,3 @@ $(document).ready(function(){ - $('#pickShow').change(function(){ - var id = $(this).val(); - if (id) { - $('html,body').animate({scrollTop: $('#show-' + id).offset().top -25},'slow'); - } - }); + }); diff --git a/gui/slick/js/new/manage_failedDownloads.js b/gui/slick/js/new/manage_failedDownloads.js index 9184a54f8..38637c688 100644 --- a/gui/slick/js/new/manage_failedDownloads.js +++ b/gui/slick/js/new/manage_failedDownloads.js @@ -1,10 +1,3 @@ $(document).ready(function(){ - $("#failedTable:has(tbody tr)").tablesorter({ - widgets: ['zebra'], - sortList: [[0,0]], - headers: { 3: { sorter: false } } - }); - $('#limit').change(function(){ - window.location.href = srRoot + '/manage/failedDownloads/?limit='+$(this).val();; - }); + }); diff --git a/gui/slick/js/new/manage_massEdit.js b/gui/slick/js/new/manage_massEdit.js index c5406abaf..e69de29bb 100644 --- a/gui/slick/js/new/manage_massEdit.js +++ b/gui/slick/js/new/manage_massEdit.js @@ -1 +0,0 @@ -$('#location').fileBrowser({ title: 'Select Show Location' }); -- GitLab From ed0328fdf5f13fc8faf4e4e104236a918de3a639 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 16:27:29 +1030 Subject: [PATCH 201/215] move global vars to top of file --- gui/slick/js/core.js | 14 ++++++++------ gui/slick/js/core.min.js | Bin 40257 -> 45036 bytes 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index a3c13c819..7438b426e 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -1,12 +1,14 @@ +// @TODO Move these into common.ini when possible, +// currently we can't do that as browser.js and a few others need it before this is loaded +var srRoot = getMeta('srRoot'), + themeSpinner = getMeta('themeSpinner'), + anonURL = getMeta('anonURL'), + topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', + loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; + var SICKRAGE = { common: { init: function() { - var srRoot = getMeta('srRoot'), - themeSpinner = getMeta('themeSpinner'), - anonURL = getMeta('anonURL'), - topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', - loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; - function configSuccess(){ $('.config_submitter').each(function(){ $(this).removeAttr("disabled"); diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index 332e5cef3bd42e8931b41239fcb9f7991756bd05..f714597a88296a8416cce2896afdf0c6e4b3ded0 100644 GIT binary patch delta 6713 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 delta 2057 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 W<%DW=K-HubyoS@P-n?&}9wPvFKEEme -- GitLab From 03ec42ee7c81f7caa68e1f055ca1eed113fee1be Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 17:13:18 +1030 Subject: [PATCH 202/215] fix lint errors with camelCase --- gui/slick/js/core.js | 153 +++++++++++++++++++++++++------------------ 1 file changed, 88 insertions(+), 65 deletions(-) diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index 7438b426e..13d8f63d1 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -1030,10 +1030,13 @@ var SICKRAGE = { }); } - function fill_abd_examples() { + function fillAbdExamples() { var pattern = $('#naming_abd_pattern').val(); - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, abd: 'True'}, function (data) { + $.get(srRoot + '/config/postProcessing/testNaming', { + pattern: pattern, + abd: 'True' + }, function (data) { if (data) { $('#naming_abd_example').text(data + '.ext'); $('#naming_abd_example_div').show(); @@ -1042,7 +1045,10 @@ var SICKRAGE = { } }); - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, abd: 'True'}, function (data) { + $.get(srRoot + '/config/postProcessing/isNamingValid', { + pattern: pattern, + abd: 'True' + }, function (data) { if (data === "invalid") { $('#naming_abd_pattern').qtip('option', { 'content.text': 'This pattern is invalid.', @@ -1068,10 +1074,13 @@ var SICKRAGE = { }); } - function fill_sports_examples() { + function fillSportsExamples() { var pattern = $('#naming_sports_pattern').val(); - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, sports: 'True'}, function (data) { + $.get(srRoot + '/config/postProcessing/testNaming', { + pattern: pattern, + sports: 'True' + }, function (data) { if (data) { $('#naming_sports_example').text(data + '.ext'); $('#naming_sports_example_div').show(); @@ -1080,15 +1089,18 @@ var SICKRAGE = { } }); - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, sports: 'True'}, function (data) { - if (data == "invalid") { + $.get(srRoot + '/config/postProcessing/isNamingValid', { + pattern: pattern, + sports: 'True' + }, function (data) { + if (data === "invalid") { $('#naming_sports_pattern').qtip('option', { 'content.text': 'This pattern is invalid.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' }); $('#naming_sports_pattern').qtip('toggle', true); $('#naming_sports_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { + } else if (data === "seasonfolders") { $('#naming_sports_pattern').qtip('option', { 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' @@ -1106,12 +1118,16 @@ var SICKRAGE = { }); } - function fill_anime_examples() { - var pattern = $('#naming_anime_pattern').val(); - var multi = $('#naming_anime_multi_ep :selected').val(); - var anime_type = $('input[name="naming_anime"]:checked').val(); + function fillAnimeExamples() { + var example = {}; + example.pattern = $('#naming_anime_pattern').val(); + example.multi = $('#naming_anime_multi_ep :selected').val(); + example.animeType = $('input[name="naming_anime"]:checked').val(); - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, anime_type: anime_type}, function (data) { + $.get(srRoot + '/config/postProcessing/testNaming', { + pattern: example.pattern, + anime_type: example.animeType // jshint ignore:line + }, function (data) { if (data) { $('#naming_example_anime').text(data + '.ext'); $('#naming_example_anime_div').show(); @@ -1120,7 +1136,11 @@ var SICKRAGE = { } }); - $.get(srRoot + '/config/postProcessing/testNaming', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { + $.get(srRoot + '/config/postProcessing/testNaming', { + pattern: example.pattern, + multi: example.multi, + anime_type: example.animeType // jshint ignore:line + }, function (data) { if (data) { $('#naming_example_multi_anime').text(data + '.ext'); $('#naming_example_multi_anime_div').show(); @@ -1129,15 +1149,19 @@ var SICKRAGE = { } }); - $.get(srRoot + '/config/postProcessing/isNamingValid', {pattern: pattern, multi: multi, anime_type: anime_type}, function (data) { - if (data == "invalid") { + $.get(srRoot + '/config/postProcessing/isNamingValid', { + pattern: example.pattern, + multi: example.multi, + anime_type: example.animeType // jshint ignore:line + }, function (data) { + if (data === "invalid") { $('#naming_pattern').qtip('option', { 'content.text': 'This pattern is invalid.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' }); $('#naming_pattern').qtip('toggle', true); $('#naming_pattern').css('background-color', '#FFDDDD'); - } else if (data == "seasonfolders") { + } else if (data === "seasonfolders") { $('#naming_pattern').qtip('option', { 'content.text': 'This pattern would be invalid without the folders, using it will force "Flatten" off for all shows.', 'style.classes': 'qtip-rounded qtip-shadow qtip-red' @@ -1166,7 +1190,7 @@ var SICKRAGE = { fillExamples(); } - function setup_abd_naming() { + function setupAbdNaming() { // if it is a custom selection then show the text box if ($('#name_abd_presets :selected').val().toLowerCase() === "custom...") { $('#naming_abd_custom').show(); @@ -1174,10 +1198,10 @@ var SICKRAGE = { $('#naming_abd_custom').hide(); $('#naming_abd_pattern').val($('#name_abd_presets :selected').attr('id')); } - fill_abd_examples(); + fillAbdExamples(); } - function setup_sports_naming() { + function setupSportsNaming() { // if it is a custom selection then show the text box if ($('#name_sports_presets :selected').val().toLowerCase() === "custom...") { $('#naming_sports_custom').show(); @@ -1185,18 +1209,18 @@ var SICKRAGE = { $('#naming_sports_custom').hide(); $('#naming_sports_pattern').val($('#name_sports_presets :selected').attr('id')); } - fill_sports_examples(); + fillSportsExamples(); } - function setup_anime_naming() { + function setupAnimeNaming() { // if it is a custom selection then show the text box - if ($('#name_anime_presets :selected').val() == "Custom...") { + if ($('#name_anime_presets :selected').val().toLowerCase() === "custom...") { $('#naming_anime_custom').show(); } else { $('#naming_anime_custom').hide(); $('#naming_anime_pattern').val($('#name_anime_presets :selected').attr('id')); } - fill_anime_examples(); + fillAnimeExamples(); } $('#unpack').on('change', function(){ @@ -1212,31 +1236,31 @@ var SICKRAGE = { }); $('#name_abd_presets').on('change', function(){ - setup_abd_naming(); + setupAbdNaming(); }); $('#naming_custom_abd').on('change', function(){ - setup_abd_naming(); + setupAbdNaming(); }); $('#name_sports_presets').on('change', function(){ - setup_sports_naming(); + setupSportsNaming(); }); $('#naming_custom_sports').on('change', function(){ - setup_sports_naming(); + setupSportsNaming(); }); $('#name_anime_presets').on('change', function(){ - setup_anime_naming(); + setupAnimeNaming(); }); $('#naming_custom_anime').on('change', function(){ - setup_anime_naming(); + setupAnimeNaming(); }); $('input[name="naming_anime"]').on('click', function(){ - setup_anime_naming(); + setupAnimeNaming(); }); $('#naming_multi_ep').change(fillExamples); @@ -1247,32 +1271,32 @@ var SICKRAGE = { }, 500); }); - $('#naming_anime_multi_ep').change(fill_anime_examples); - $('#naming_anime_pattern').focusout(fill_anime_examples); + $('#naming_anime_multi_ep').change(fillAnimeExamples); + $('#naming_anime_pattern').focusout(fillAnimeExamples); $('#naming_anime_pattern').keyup(function () { typewatch(function () { - fill_anime_examples(); + fillAnimeExamples(); }, 500); }); $('#naming_abd_pattern').focusout(fillExamples); $('#naming_abd_pattern').keyup(function () { typewatch(function () { - fill_abd_examples(); + fillAbdExamples(); }, 500); }); $('#naming_sports_pattern').focusout(fillExamples); $('#naming_sports_pattern').keyup(function () { typewatch(function () { - fill_sports_examples(); + fillSportsExamples(); }, 500); }); $('#naming_anime_pattern').focusout(fillExamples); $('#naming_anime_pattern').keyup(function () { typewatch(function () { - fill_anime_examples(); + fillAnimeExamples(); }, 500); }); @@ -1294,9 +1318,9 @@ var SICKRAGE = { $('#naming_pattern').focus(); }); setupNaming(); - setup_abd_naming(); - setup_sports_naming(); - setup_anime_naming(); + setupAbdNaming(); + setupSportsNaming(); + setupAnimeNaming(); // -- start of metadata options div toggle code -- $('#metadataType').on('change keyup', function () { @@ -1308,7 +1332,7 @@ var SICKRAGE = { var targetName = $(this).attr('id'); var selectedTarget = $('#metadataType :selected').val(); - if (selectedTarget == targetName) { + if (selectedTarget === targetName) { $(this).show(); } else { $(this).hide(); @@ -1328,19 +1352,19 @@ var SICKRAGE = { var cur_most_provider = ''; $('.metadataDiv').each(function () { - var generator_name = $(this).attr('id'); + var generatorName = $(this).attr('id'); var config_arr = []; - var show_metadata = $("#" + generator_name + "_show_metadata").prop('checked'); - var episode_metadata = $("#" + generator_name + "_episode_metadata").prop('checked'); - var fanart = $("#" + generator_name + "_fanart").prop('checked'); - var poster = $("#" + generator_name + "_poster").prop('checked'); - var banner = $("#" + generator_name + "_banner").prop('checked'); - var episode_thumbnails = $("#" + generator_name + "_episode_thumbnails").prop('checked'); - var season_posters = $("#" + generator_name + "_season_posters").prop('checked'); - var season_banners = $("#" + generator_name + "_season_banners").prop('checked'); - var season_all_poster = $("#" + generator_name + "_season_all_poster").prop('checked'); - var season_all_banner = $("#" + generator_name + "_season_all_banner").prop('checked'); + var show_metadata = $("#" + generatorName + "_show_metadata").prop('checked'); + var episode_metadata = $("#" + generatorName + "_episode_metadata").prop('checked'); + var fanart = $("#" + generatorName + "_fanart").prop('checked'); + var poster = $("#" + generatorName + "_poster").prop('checked'); + var banner = $("#" + generatorName + "_banner").prop('checked'); + var episode_thumbnails = $("#" + generatorName + "_episode_thumbnails").prop('checked'); + var season_posters = $("#" + generatorName + "_season_posters").prop('checked'); + var season_banners = $("#" + generatorName + "_season_banners").prop('checked'); + var season_all_poster = $("#" + generatorName + "_season_all_poster").prop('checked'); + var season_all_banner = $("#" + generatorName + "_season_all_banner").prop('checked'); config_arr.push(show_metadata ? '1' : '0'); config_arr.push(episode_metadata ? '1' : '0'); @@ -1359,20 +1383,20 @@ var SICKRAGE = { } if (cur_num > cur_most) { cur_most = cur_num; - cur_most_provider = generator_name; + cur_most_provider = generatorName; } - $("#" + generator_name + "_eg_show_metadata").attr('class', show_metadata ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_episode_metadata").attr('class', episode_metadata ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_fanart").attr('class', fanart ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_poster").attr('class', poster ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_banner").attr('class', banner ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_episode_thumbnails").attr('class', episode_thumbnails ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_posters").attr('class', season_posters ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_banners").attr('class', season_banners ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_all_poster").attr('class', season_all_poster ? 'enabled' : 'disabled'); - $("#" + generator_name + "_eg_season_all_banner").attr('class', season_all_banner ? 'enabled' : 'disabled'); - $("#" + generator_name + "_data").val(config_arr.join('|')); + $("#" + generatorName + "_eg_show_metadata").attr('class', show_metadata ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_episode_metadata").attr('class', episode_metadata ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_fanart").attr('class', fanart ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_poster").attr('class', poster ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_banner").attr('class', banner ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_episode_thumbnails").attr('class', episode_thumbnails ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_posters").attr('class', season_posters ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_banners").attr('class', season_banners ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_all_poster").attr('class', season_all_poster ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_all_banner").attr('class', season_all_banner ? 'enabled' : 'disabled'); + $("#" + generatorName + "_data").val(config_arr.join('|')); }); @@ -1868,7 +1892,6 @@ var SICKRAGE = { }, function(data) { $.each(data, function(season, eps) { $.each(eps, function(episode, data) { - //alert(season+'x'+episode+': '+name); lastRow.after($.makeRow(indexerId, season, episode, data.name, data.subtitles, checked)); }); }); -- GitLab From e1d5fe885342b3577ce305d4c4e5730d1db4da35 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 17:13:47 +1030 Subject: [PATCH 203/215] update core.min to match core --- gui/slick/js/core.min.js | Bin 45036 -> 45151 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index f714597a88296a8416cce2896afdf0c6e4b3ded0..8e83fff11b4a896a20357ec15dc2c18cb6d3a13d 100644 GIT binary patch delta 150 zcmaEJpXvSsrVTRbleyyfC-Y>APYy`XoSc*EJ-Mz(aI$Qs=Vbm2$;mazFgc0ImhsC$ za+_r{;~6KrMN3SMEEbuZ6D>M<RhHu9InkYypT$Z}*3J=|oSwaK^350}DE|zIz4=+J qE%RoZf>}(H9Sg)Jzb=xWTu>l2*`k<#vS*R-W{YAsj?J~z`6d8*hCAl~ delta 207 zcmccrfa%SBrVTRbOo{fB3o?BspUd^0%$FH8Ss+6aB4j<;GJg4HzRUu~$p?z%nKgBi zCU4HtWlWy@I!kYI`AmVyA5wLB67w>1Q{zi23sS9;C;y32nLHzVp{P!7X--L|Rgw;x ztmfqYoQ*hSKgLQ<W{x+Tyf^pYX6ASWrp@yUW-;+Nmll`g=j!R{DcRaizF(}&R+gBf ap=m#PezDZ#6NMt1R~Nf-Z2nlCX957-zEau% -- GitLab From 3f2c3dc1c798532027187e8daedd901e54b8e39c Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 20:36:30 +1030 Subject: [PATCH 204/215] remove unneeded vars & fix camelCase --- gui/slick/js/core.js | 106 +++++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 50 deletions(-) diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index 13d8f63d1..ac72d876e 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -863,8 +863,8 @@ var SICKRAGE = { pushbullet.devices = jQuery.parseJSON(data).devices; pushbullet.currentDevice = $("#pushbullet_device").val(); $("#pushbullet_device_list").html(''); - for (var i = 0, len = devices.length; i < len; i++) { - if(devices[i].active === true) { + for (var i = 0, len = pushbullet.devices.length; i < len; i++) { + if(pushbullet.devices[i].active === true) { if(pushbullet.currentDevice === pushbullet.devices[i].iden) { $("#pushbullet_device_list").append('<option value="'+pushbullet.devices[i].iden+'" selected>' + pushbullet.devices[i].nickname + '</option>'); } else { @@ -898,7 +898,7 @@ var SICKRAGE = { // @TODO Find out what notify_data actually does since it doesn't seem to be a real function $('#email_show').change(function() { var key = parseInt($('#email_show').val(), 10); - $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); + $('#email_show_list').val(key >= 0 ? notify_data[key.toString()].list : ''); // jshint ignore:line }); // Update the internal data struct anytime settings are saved to the server @@ -909,8 +909,8 @@ var SICKRAGE = { function loadShowNotifyLists() { $.get(srRoot + "/home/loadShowNotifyLists", function(data) { var list, html, s; - list = $.parseJSON(data); - notify_data = list; // @TODO This is the same as the $('#email_show') function above + list = $.parseJSON(data); // @TODO The line below this is the same as the $('#email_show') function above + notify_data = list; // jshint ignore:line if (list._size === 0) { return; } html = '<option value="-1">-- Select --</option>'; for (s in list) { @@ -1348,60 +1348,60 @@ var SICKRAGE = { }); $.fn.refreshMetadataConfig = function (first) { - var cur_most = 0; - var cur_most_provider = ''; + var curMost = 0; + var curMostProvider = ''; $('.metadataDiv').each(function () { var generatorName = $(this).attr('id'); - var config_arr = []; - var show_metadata = $("#" + generatorName + "_show_metadata").prop('checked'); - var episode_metadata = $("#" + generatorName + "_episode_metadata").prop('checked'); + var configArray = []; + var showMetadata = $("#" + generatorName + "_show_metadata").prop('checked'); + var episodeMetadata = $("#" + generatorName + "_episode_metadata").prop('checked'); var fanart = $("#" + generatorName + "_fanart").prop('checked'); var poster = $("#" + generatorName + "_poster").prop('checked'); var banner = $("#" + generatorName + "_banner").prop('checked'); - var episode_thumbnails = $("#" + generatorName + "_episode_thumbnails").prop('checked'); - var season_posters = $("#" + generatorName + "_season_posters").prop('checked'); - var season_banners = $("#" + generatorName + "_season_banners").prop('checked'); - var season_all_poster = $("#" + generatorName + "_season_all_poster").prop('checked'); - var season_all_banner = $("#" + generatorName + "_season_all_banner").prop('checked'); - - config_arr.push(show_metadata ? '1' : '0'); - config_arr.push(episode_metadata ? '1' : '0'); - config_arr.push(fanart ? '1' : '0'); - config_arr.push(poster ? '1' : '0'); - config_arr.push(banner ? '1' : '0'); - config_arr.push(episode_thumbnails ? '1' : '0'); - config_arr.push(season_posters ? '1' : '0'); - config_arr.push(season_banners ? '1' : '0'); - config_arr.push(season_all_poster ? '1' : '0'); - config_arr.push(season_all_banner ? '1' : '0'); - - var cur_num = 0; - for (var i = 0, len = config_arr.length; i < len; i++) { - cur_num += parseInt(config_arr[i]); + var episodeThumbnails = $("#" + generatorName + "_episode_thumbnails").prop('checked'); + var seasonPosters = $("#" + generatorName + "_season_posters").prop('checked'); + var seasonBanners = $("#" + generatorName + "_season_banners").prop('checked'); + var seasonAllPoster = $("#" + generatorName + "_season_all_poster").prop('checked'); + var seasonAllBanner = $("#" + generatorName + "_season_all_banner").prop('checked'); + + configArray.push(showMetadata ? '1' : '0'); + configArray.push(episodeMetadata ? '1' : '0'); + configArray.push(fanart ? '1' : '0'); + configArray.push(poster ? '1' : '0'); + configArray.push(banner ? '1' : '0'); + configArray.push(episodeThumbnails ? '1' : '0'); + configArray.push(seasonPosters ? '1' : '0'); + configArray.push(seasonBanners ? '1' : '0'); + configArray.push(seasonAllPoster ? '1' : '0'); + configArray.push(seasonAllBanner ? '1' : '0'); + + var curNumber = 0; + for (var i = 0, len = configArray.length; i < len; i++) { + curNumber += parseInt(configArray[i]); } - if (cur_num > cur_most) { - cur_most = cur_num; - cur_most_provider = generatorName; + if (curNumber > curMost) { + curMost = curNumber; + curMostProvider = generatorName; } - $("#" + generatorName + "_eg_show_metadata").attr('class', show_metadata ? 'enabled' : 'disabled'); - $("#" + generatorName + "_eg_episode_metadata").attr('class', episode_metadata ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_show_metadata").attr('class', showMetadata ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_episode_metadata").attr('class', episodeMetadata ? 'enabled' : 'disabled'); $("#" + generatorName + "_eg_fanart").attr('class', fanart ? 'enabled' : 'disabled'); $("#" + generatorName + "_eg_poster").attr('class', poster ? 'enabled' : 'disabled'); $("#" + generatorName + "_eg_banner").attr('class', banner ? 'enabled' : 'disabled'); - $("#" + generatorName + "_eg_episode_thumbnails").attr('class', episode_thumbnails ? 'enabled' : 'disabled'); - $("#" + generatorName + "_eg_season_posters").attr('class', season_posters ? 'enabled' : 'disabled'); - $("#" + generatorName + "_eg_season_banners").attr('class', season_banners ? 'enabled' : 'disabled'); - $("#" + generatorName + "_eg_season_all_poster").attr('class', season_all_poster ? 'enabled' : 'disabled'); - $("#" + generatorName + "_eg_season_all_banner").attr('class', season_all_banner ? 'enabled' : 'disabled'); - $("#" + generatorName + "_data").val(config_arr.join('|')); + $("#" + generatorName + "_eg_episode_thumbnails").attr('class', episodeThumbnails ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_posters").attr('class', seasonPosters ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_banners").attr('class', seasonBanners ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_all_poster").attr('class', seasonAllPoster ? 'enabled' : 'disabled'); + $("#" + generatorName + "_eg_season_all_banner").attr('class', seasonAllBanner ? 'enabled' : 'disabled'); + $("#" + generatorName + "_data").val(configArray.join('|')); }); - if (cur_most_provider !== '' && first) { - $('#metadataType option[value=' + cur_most_provider + ']').attr('selected', 'selected'); + if (curMostProvider !== '' && first) { + $('#metadataType option[value=' + curMostProvider + ']').attr('selected', 'selected'); $(this).showHideMetadata(); } }; @@ -1528,7 +1528,7 @@ var SICKRAGE = { label = ' label', directory = ' directory', client = '', - optionPanel = '#options_torrent_blackhole'; + optionPanel = '#options_torrent_blackhole', rpcurl = ' RPC URL'; if (selectedProvider.toLowerCase() !== 'blackhole') { @@ -1667,13 +1667,19 @@ var SICKRAGE = { }); $('#test_torrent').click(function(){ + var torrent = {}; $('#test_torrent_result').html(loading); - var torrent_method = $('#torrent_method :selected').val(); - var torrent_host = $('#torrent_host').val(); - var torrent_username = $('#torrent_username').val(); - var torrent_password = $('#torrent_password').val(); - - $.get(srRoot + '/home/testTorrent', {'torrent_method': torrent_method, 'host': torrent_host, 'username': torrent_username, 'password': torrent_password}, function(data){ + torrent.method = $('#torrent_method :selected').val(); + torrent.host = $('#torrent_host').val(); + torrent.username = $('#torrent_username').val(); + torrent.password = $('#torrent_password').val(); + + $.get(srRoot + '/home/testTorrent', { + 'torrent_method': torrent.method, + 'host': torrent.host, + 'username': torrent.username, + 'password': torrent.password + }, function(data){ $('#test_torrent_result').html(data); }); }); -- GitLab From 3032276820fec475736f70a798e885a83a187090 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 20:47:39 +1030 Subject: [PATCH 205/215] fix js linting --- gui/slick/js/core.js | 63 +++++++++++++++++++-------------------- gui/slick/js/core.min.js | Bin 45151 -> 45487 bytes 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index ac72d876e..677d24c4e 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -6,38 +6,37 @@ var srRoot = getMeta('srRoot'), topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; +var configSuccess = function(){ + $('.config_submitter').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + }); + $('.config_submitter_refresh').each(function(){ + $(this).removeAttr("disabled"); + $(this).next().remove(); + $(this).show(); + window.location.href = srRoot + '/config/providers/'; + }); + $('#email_show').trigger('notify'); +}; + var SICKRAGE = { common: { init: function() { - function configSuccess(){ - $('.config_submitter').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - }); - $('.config_submitter_refresh').each(function(){ - $(this).removeAttr("disabled"); - $(this).next().remove(); - $(this).show(); - window.location.href = srRoot + '/config/providers/'; - }); - $('#email_show').trigger('notify'); - } - $("#config-components").tabs({ activate: function (event, ui) { - var lastOpenedPanel = $(this).data("lastOpenedPanel"), - selected = $(this).tabs('option', 'selected'); + var lastOpenedPanel = $(this).data("lastOpenedPanel"); - if (!lastOpenedPanel) { lastOpenedPanel = $(ui.oldPanel); } + if(!lastOpenedPanel) { lastOpenedPanel = $(ui.oldPanel); } - if (!$(this).data("topPositionTab")) { $(this).data("topPositionTab", $(ui.newPanel).position().top); } + if(!$(this).data("topPositionTab")) { $(this).data("topPositionTab", $(ui.newPanel).position().top); } //Dont use the builtin fx effects. This will fade in/out both tabs, we dont want that //Fadein the new tab yourself $(ui.newPanel).hide().fadeIn(0); - if (lastOpenedPanel) { + if(lastOpenedPanel) { // 1. Show the previous opened tab by removing the jQuery UI class // 2. Make the tab temporary position:absolute so the two tabs will overlap // 3. Set topposition so they will overlap if you go from tab 1 to tab 0 @@ -58,8 +57,8 @@ var SICKRAGE = { // @TODO Replace this with a real touchscreen check // hack alert: if we don't have a touchscreen, and we are already hovering the mouse, then click should link instead of toggle - if ((navigator.maxTouchPoints || 0) < 2) { - $('.dropdown-toggle').on('click', function(e) { + if((navigator.maxTouchPoints || 0) < 2) { + $('.dropdown-toggle').on('click', function() { var $this = $(this); if ($this.attr('aria-expanded') === 'true') { window.location.href = $this.attr('href'); @@ -67,7 +66,7 @@ var SICKRAGE = { }); } - if(metaToBool('sickbeard.FUZZY_DATING')){ + if(metaToBool('sickbeard.FUZZY_DATING')) { $.timeago.settings.allowFuture = true; $.timeago.settings.strings = { prefixAgo: null, @@ -687,9 +686,9 @@ var SICKRAGE = { }); $('#TraktGetPin').click(function () { - var track = {}; - trackt.pinUrl = $('#trakt_pin_url').val(); - var w = window.open(trakt.pinUrl, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550"); + var trakt = {}; + trakt.pinUrl = $('#trakt_pin_url').val(); + window.open(trakt.pinUrl, "popUp", "toolbar=no, scrollbars=no, resizable=no, top=200, left=200, width=650, height=550"); $('#trakt_pin').removeClass('hide'); }); @@ -926,7 +925,10 @@ var SICKRAGE = { loadShowNotifyLists(); $('#email_show_save').click(function() { - $.post(srRoot + "/home/saveShowNotifyList", { show: $('#email_show').val(), emails: $('#email_show_list').val()}, function (data) { + $.post(srRoot + "/home/saveShowNotifyList", { + show: $('#email_show').val(), + emails: $('#email_show_list').val() + }, function() { // Reload the per show notify lists to reflect changes loadShowNotifyLists(); }); @@ -955,7 +957,6 @@ var SICKRAGE = { })(); function isRarSupported() { - var pattern = $('#naming_pattern').val(); $.get(srRoot + '/config/postProcessing/isRarSupported', function (data) { if (data !== "supported") { $('#unpack').qtip('option', { @@ -1525,8 +1526,6 @@ var SICKRAGE = { host = ' host:port', username = ' username', password = ' password', - label = ' label', - directory = ' directory', client = '', optionPanel = '#options_torrent_blackhole', rpcurl = ' RPC URL'; @@ -1761,7 +1760,7 @@ var SICKRAGE = { row += ' </tr>'; return row; - } + }; }, index: function() { $("#massUpdateTable:has(tbody tr)").tablesorter({ @@ -1814,7 +1813,7 @@ var SICKRAGE = { headers: { 3: { sorter: false } } }); $('#limit').change(function(){ - window.location.href = srRoot + '/manage/failedDownloads/?limit=' + $(this).val();; + window.location.href = srRoot + '/manage/failedDownloads/?limit=' + $(this).val(); }); }, massEdit: function() { diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index 8e83fff11b4a896a20357ec15dc2c18cb6d3a13d..becd31a45f294a664cb5b8fc7c70b4ae2f771d89 100644 GIT binary patch delta 1005 zcmccrfNA|>rVTQTe98HFX_@K4rOC;u#l^Oh*NV$eUc)NQU6h)eUzX}vQc|QbSx`bm zB`>w2L_<>#BCMgQqoPrgky)&%SDcYwuAx~A5>T3aR@?+#qdb0%I+OFIMJLNG<FtUd zL%*OXzbrE)wWwHM31X;nYHng?PCUpSB~87OqRjO4)FKU~y!?{Pv`Qt-+R4(4b(?oH zu4J67<H0fcZVfxPwNgn@X{wT~t!?7udS*Sw#LerNmq|(|>7}HWWhSQ<>*b{8rI%z_ zr`n}hr)X<yCh2X?mc67o*};pGF>$i9yCR=Xd1hWpez{(LL28~x;^Z>-6h@uRx81V^ zC%Z?kpZq9QWwUA24n;<;&2OvsGHqU6SHmNylWwb|5ES675E|s8WSyC&G1<0TnK5H> zVz(q?=H%*bd8sU0CFP9#;*$83)Z*m$qLTcgqSU++C7o>B$qy%pFzMt>KGiL6k!!1@ z43&y6NG!>S&o3y+%+FKO$wQJTPEAdTFUibJh0EqoR_sxdE<jR~lbDp61D7wH9M>Z+ zQe>;73^ug5GA}<TKfO{(r+D(j9vRyVO}&iFlvHrMX5wIHA&F<hB3?&DBWE(-6sgI% z6OAXE_bT(|BFW@VPVZH)%|p_ckHjuOQdx+^E<#dMJo!j(E@v)GWU^qt>g4!7naOke zO(w7JTQxbgpI;1=GQbWmfGN{a(I}i;*S~==XR`hTU)~HP!!swZov1!}!-PeQaA#x4 z@8(4{sdSPaWA5Z7lWG`?CM!<XU@V^8Gu3!<?c@Tm`AU-orW7*fPVSo`&R7VRIXlG% z%178yh~zeq{x^*2o9m|eF@X}@<TEqWIdu~Ca#Kq(@>3@NoT0{+s0T_ZlNDx4aVP4P z7N-{FCFZ8uPCnQnGC5!-CugEwL1J-nd4AF4$eD7JuSN?@{t&=9dBRL74yYkIlPlFt OCV!qTy7}(RCNTh>&Rx3z delta 846 zcmZ4gnCbolrVTQTlM9$?<yACFGBS%b^-2<xiZzt-3raHc^OSUyic@n^lS@)lHosz8 z!zi7oSzVS`q>y9_Rc)<QQdF9%WNT}iG<gGy9%Itx`z*^O#ZywtGLut_^>R}4(n~U| zQ|(f$Q?#`;H!qO8q{&uNl$e}dGP%Y>QOLSHGcP5-Tra;MHBY0YC^5Ta@@kJ1M(fQ2 zp4ozoiIc0N)=!>PATs$&n)YVD=pBli*=zSQF>-A_QeVR(W}TU)QB;szT9jj}q!1L~ ztPmRHqogxAut!-s-Bw9CCow5CC%!zfC@(WFJw7Ehr!+lPNhf1+e~&z4=H&G~;!Ih# zlRr)pVbaN-e6L5IF=z6>9toyg+sT3bB9nD`IT-UMoAxRR=G!VMm*f`}rRJ5ygN>Z* z*DD>8n3tKG8V?JkLR%%}g2a-H_~OdE{G9ysN+q2lBy9zWrNyZ!FxA#78tIyP8JQ`m z8k#yP8X0i*<o&%;yjhxh#TohKV5#iM|9T5}bC5)GCRg_<*yh5usA%LNvGb8s79g<; zk<=7TzR{P<m@|1|m+0i^eiO#r$rJkTO6DS|&O>77Pu80zKKXH<_~b1U`q;A}GLv&B z$xKe2sLh)W;e*|pG5O#m^~pavjVFJfn9m4uxi5zNZbpcCbGo=D&zmgCm@|3D<Qm4p z$)-~@7>gz^m}WeA;*<g;TkIygP4#EYnLMXYYO>8V&dIB%X-s}N)kiW1$v^o>Y_P49 zEvNB-O?$%*NgSG!6?;S{_jhw_UOnA_X|j$b$7J2v;*;%tIVSth;GP`RslcR@G}&R6 z6jQS8<o})GY-Nc#8k#zjyJyKw-Z?{Z@}XH$(mEOW#U)lrI;F*_MR|$2saDB41&PJQ S<@rS^lmE|<*sMFdNelqw95L1a -- GitLab From 0951345ee4a736488b95536497ee09762733f870 Mon Sep 17 00:00:00 2001 From: Alison Winters <alisonatwork@gmail.com> Date: Sun, 15 Nov 2015 19:40:06 +0100 Subject: [PATCH 206/215] add some unit tests for exceptions helper --- tests/exceptions_helper_tests.py | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/exceptions_helper_tests.py diff --git a/tests/exceptions_helper_tests.py b/tests/exceptions_helper_tests.py new file mode 100644 index 000000000..a1d4e4d29 --- /dev/null +++ b/tests/exceptions_helper_tests.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +import sys, os.path +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +import unittest + +import test_lib as test +from sickrage.helper.exceptions import ex + +class ExceptionsHelperTestCase(unittest.TestCase): + + def test_none_returns_empty(self): + self.assertEqual(ex(None), u'') + + def test_empty_args_returns_empty(self): + self.assertEqual(ex(Exception()), u'') + + def test_args_of_none_returns_empty(self): + self.assertEqual(ex(Exception(None, None)), u'') + + def test_Exception_returns_args_string(self): + self.assertEqual(ex(Exception('hi')), 'hi') + +# TODO why doesn't this work? +# def test_Exception_returns_args_ustring(self): +# self.assertEqual(ex(Exception('\xc3\xa4h')), u'äh') + + def test_Exception_returns_concatenated_args_strings(self): + self.assertEqual(ex(Exception('lots', 'of', 'strings')), 'lots : of : strings') + + def test_Exception_returns_stringified_args(self): + self.assertEqual(ex(Exception(303)), 'error 303') + +if __name__ == '__main__': + if len(sys.argv) > 1: + suite = unittest.TestLoader().loadTestsFromName('exceptions_helper_tests.ExceptionsHelperTestCase.test_' + sys.argv[1]) + unittest.TextTestRunner(verbosity=2).run(suite) + else: + suite = unittest.TestLoader().loadTestsFromTestCase(ExceptionsHelperTestCase) + unittest.TextTestRunner(verbosity=2).run(suite) -- GitLab From 18db07c698ae7c878aaf728e5b1ba6c02519b72d Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Mon, 16 Nov 2015 11:18:48 +1030 Subject: [PATCH 207/215] add topImageHtml to globals --- .jshintrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.jshintrc b/.jshintrc index e24a91c93..7ec9ec8b6 100644 --- a/.jshintrc +++ b/.jshintrc @@ -23,6 +23,7 @@ "metaToBool": true, "getMeta": true, "isMeta": true, + "topImageHtml": true, "generate_bwlist": true, "_": true, "bootbox": true, -- GitLab From 195a232f6d90f97868ae1e1d7a0e4f1f0759fc37 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 22:55:39 +1030 Subject: [PATCH 208/215] update confirmations and move to SICKRAGE --- gui/slick/js/confirmations.js | 129 ------------------------------ gui/slick/js/core.js | 43 ++++++++++ gui/slick/js/core.min.js | Bin 45487 -> 46706 bytes gui/slick/views/layouts/main.mako | 1 - 4 files changed, 43 insertions(+), 130 deletions(-) delete mode 100644 gui/slick/js/confirmations.js diff --git a/gui/slick/js/confirmations.js b/gui/slick/js/confirmations.js deleted file mode 100644 index f20a64db0..000000000 --- a/gui/slick/js/confirmations.js +++ /dev/null @@ -1,129 +0,0 @@ -$(document).ready(function () { - $('a.shutdown').on('click', function(e) { - e.preventDefault(); - var target = $(this).attr('href'); - $.confirm({ - 'title' : 'Shutdown', - 'message' : 'Are you sure you want to shutdown SickRage ?', - 'buttons' : { - 'Yes' : { - 'class' : 'green', - 'action': function(){ - location.href = target; - } - }, - 'No' : { - 'class' : 'red', - 'action': function(){} // Nothing to do in this case. You can as well omit the action property. - } - } - }); - }); - - $('a.restart').on('click', function(e) { - e.preventDefault(); - var target = $(this).attr('href'); - $.confirm({ - 'title' : 'Restart', - 'message' : 'Are you sure you want to restart SickRage ?', - 'buttons' : { - 'Yes' : { - 'class' : 'green', - 'action': function(){ - location.href = target; - } - }, - 'No' : { - 'class' : 'red', - 'action': function(){} // Nothing to do in this case. You can as well omit the action property. - } - } - }); - }); - - $('a.removeshow').on('click', function(e) { - e.preventDefault(); - var target = $(this).attr('href'); - var showname = document.getElementById("showtitle").getAttribute('data-showname'); - $.confirm({ - 'title' : 'Remove Show', - 'message' : 'Are you sure you want to remove <span class="footerhighlight">' + showname + '</span> from the database ?<br><br><input type="checkbox" id="deleteFiles"> <span class="red-text">Check to delete files as well. IRREVERSIBLE</span></input>', - 'buttons' : { - 'Yes' : { - 'class' : 'green', - 'action': function(){ - location.href = target + (document.getElementById('deleteFiles').checked ? '&full=1' : ''); - // If checkbox is ticked, remove show and delete files. Else just remove show. - } - }, - 'No' : { - 'class' : 'red', - 'action': function(){} // Nothing to do in this case. You can as well omit the action property. - } - } - }); - }); - - $('a.clearhistory').on('click', function(e) { - e.preventDefault(); - var target = $(this).attr('href'); - $.confirm({ - 'title' : 'Clear History', - 'message' : 'Are you sure you want to clear all download history ?', - 'buttons' : { - 'Yes' : { - 'class' : 'green', - 'action': function(){ - location.href = target; - } - }, - 'No' : { - 'class' : 'red', - 'action': function(){} // Nothing to do in this case. You can as well omit the action property. - } - } - }); - }); - - $('a.trimhistory').on('click', function(e) { - e.preventDefault(); - var target = $(this).attr('href'); - $.confirm({ - 'title' : 'Trim History', - 'message' : 'Are you sure you want to trim all download history older than 30 days ?', - 'buttons' : { - 'Yes' : { - 'class' : 'green', - 'action': function(){ - location.href = target; - } - }, - 'No' : { - 'class' : 'red', - 'action': function(){} // Nothing to do in this case. You can as well omit the action property. - } - } - }); - }); - - $('a.submiterrors').on('click', function(e) { - e.preventDefault(); - var target = $(this).attr('href'); - $.confirm({ - 'title' : 'Submit Errors', - 'message' : 'Are you sure you want to submit these errors ?<br><br><span class="red-text">Make sure SickRage is updated and trigger<br> this error with debug enabled before submitting</span>', - 'buttons' : { - 'Yes' : { - 'class' : 'green', - 'action': function(){ - location.href = target; - } - }, - 'No' : { - 'class' : 'red', - 'action': function(){} // Nothing to do in this case. You can as well omit the action property. - } - } - }); - }); -}); diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index 677d24c4e..abd37f301 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -24,6 +24,49 @@ var configSuccess = function(){ var SICKRAGE = { common: { init: function() { + $.confirm.options = { + confirmButton: "Yes", + cancelButton: "Cancel", + dialogClass: "modal-dialog", + post: false, + confirm: function(e) { + location.href = e.context.href; + } + }; + + $("a.shutdown").confirm({ + title: "Shutdown", + text: "Are you sure you want to shutdown SickRage?" + }); + + $("a.restart").confirm({ + title: "Restart", + text: "Are you sure you want to restart SickRage?" + }); + + $("a.removeshow").confirm({ + title: "Remove Show", + text: 'Are you sure you want to remove <span class="footerhighlight">' + $('#showtitle').data('showname') + '</span> from the database?<br><br><input type="checkbox" id="deleteFiles"> <span class="red-text">Check to delete files as well. IRREVERSIBLE</span></input>', + confirm: function(e) { + location.href = e.context.href + ($('#deleteFiles')[0].checked ? '&full=1' : ''); + } + }); + + $('a.clearhistory').confirm({ + title: 'Clear History', + text: 'Are you sure you want to clear all download history?' + }); + + $('a.trimhistory').confirm({ + title: 'Trim History', + text: 'Are you sure you want to trim all download history older than 30 days?' + }); + + $('a.submiterrors').confirm({ + title: 'Submit Errors', + text: 'Are you sure you want to submit these errors ?<br><br><span class="red-text">Make sure SickRage is updated and trigger<br> this error with debug enabled before submitting</span>' + }); + $("#config-components").tabs({ activate: function (event, ui) { var lastOpenedPanel = $(this).data("lastOpenedPanel"); diff --git a/gui/slick/js/core.min.js b/gui/slick/js/core.min.js index becd31a45f294a664cb5b8fc7c70b4ae2f771d89..07c6080f5cac0873cd01ac7aea2ca82773f1a384 100644 GIT binary patch delta 1233 zcmZ4gnCa6SrVW#s>h+TI^U^Yla`o~HN;32FifyZ*0#2nRCHZ+)N|C9>N;=7jdC93c zFd=6!Pe~^wGchMW-8m<*xY$Z5H$NpYM;9Wbq*IVzTw<kYr~@_3Dy=jx8DzdjqGokY zesUs+t(Q@hTAyZ{2y#M6YDEc%pH^F|qoSdds8^g(T9T4qo~NV<k_Nd@qq-!sBq!BM zDHtZD1JY%s<XDudP?=w<P+SUSlqcquD3s(Yz|2qx&P>h@N=#3+SE|*77+;iHT#{H+ zqEwG*d=ONMkm*n(uo|A5UzS>&kzbC*^+Bm1NrhmLtWHUNYDI~aI!+%HK@{5*7bNB> zB!dFlRw*q%za+INBQrfCCo?^xM9EHFTSY@j8Dt$efRr@#QW8rNHIzUid5O8HN}Ag0 zHu@kV>=e?9@^ckRGEx;lN|F+bxl-+Il8Wp=c=F3R()B5+IjJS7Zkai$#Y%PxDE1bm zrs#qKT*=NkBQ-f26u=PG3TYta3W>!E<*7M2dJ3LFL9Su0LBXC*KCV!EZS*tq3Q9}t z)CnYr`l3|y1fi_~@*Tt`h`ThS4Py0@L2gJ*u~$+{E6vHVHB_=vQqru2MQ?IWYGP4F zW^qY=Q6-i*a0W>$ctGWmBDx-HIs%)fkeHLB07{WL`H3kCP_q#Us-!407b=Lw!jPiO zTx|BCTUQTGw;;2yTBneolagAbP?C|Dr(kTLkdjzgjBr75X;N-xNorA1eo-+NCj^6~ z6<i_m5I<uiym|$A-hn7D$w)0uRe%_(08c77(uHqgb}A$n!ZMsfX0bwPK}uptYKlT) zUW!6VQD%C2Y7r>8DU@Vn7DG%{D9<d(P)JElDpgKbNX<)3%1KR8NJ>r1F9I0{@>NM@ gUOF@>sZZ7sQP{kmX+<d`*XHnw^(>p&Ygd>602`*aH2?qr delta 34 rcmezLhH3p{rVW#sCYN)|Y%XG7Q9Aj39q(q1+C?mkT$@idt}p=r7!wa9 diff --git a/gui/slick/views/layouts/main.mako b/gui/slick/views/layouts/main.mako index af38d14bd..9ff550e1e 100644 --- a/gui/slick/views/layouts/main.mako +++ b/gui/slick/views/layouts/main.mako @@ -326,7 +326,6 @@ <script type="text/javascript" src="${srRoot}/js/lib/jquery.scrolltopcontrol-1.1.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/browser.js?${sbPID}"></script> <script type="text/javascript" src="${srRoot}/js/ajaxNotifications.js?${sbPID}"></script> - <script type="text/javascript" src="${srRoot}/js/confirmations.js?${sbPID}"></script> % endif <%block name="scripts" /> </body> -- GitLab From 5ea38e4250cda915c2a2ec329b7d0ad9c7543008 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Sun, 15 Nov 2015 22:56:28 +1030 Subject: [PATCH 209/215] add temp CSS for confirm boxes --- gui/slick/css/dark.css | 1131 ++++++++++++++++++++++------------------ 1 file changed, 610 insertions(+), 521 deletions(-) diff --git a/gui/slick/css/dark.css b/gui/slick/css/dark.css index fe24eafcb..d2189bcdf 100644 --- a/gui/slick/css/dark.css +++ b/gui/slick/css/dark.css @@ -4,34 +4,34 @@ inc_top.mako .ui-dialog, .ui-dialog-buttonpane { - background: #2a2a2a !important; + background: #2a2a2a !important; } .ui-widget-content { background: #606060; border: 1px solid #111; - color: #fff; + color: #fff; } .ui-widget-content a { - color: #fff; + color: #fff; } .ui-widget-content a:hover { - color: #09A2FF; - text-decoration: none; + color: #09A2FF; + text-decoration: none; } .ui-widget-header { - background: #3d3d3d; - border: 1px solid #111; - color: #fff; + background: #3d3d3d; + border: 1px solid #111; + color: #fff; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { - border: 1px solid #111; + border: 1px solid #111; } .ui-state-hover, @@ -40,35 +40,35 @@ inc_top.mako .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { - background: #3d3d3d; + background: #3d3d3d; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { - background: #3d3d3d; + background: #3d3d3d; } .ui-icon, .ui-widget-content .ui-icon { - background-image: url("../css/lib/images/ui-icons_ffffff_256x240.png"); + background-image: url("../css/lib/images/ui-icons_ffffff_256x240.png"); } .ui-state-default .ui-icon { - background-image: url('../css/lib/images/ui-icons_09a2ff_256x240.png'); + background-image: url('../css/lib/images/ui-icons_09a2ff_256x240.png'); } .ui-widget-overlay { - background: #000000 url("../css/lib/images/ui-bg_flat_0_000000_40x100.png") 50% 50% repeat-x; + background: #000000 url("../css/lib/images/ui-bg_flat_0_000000_40x100.png") 50% 50% repeat-x; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { - color: #fff; - text-decoration: none; + color: #fff; + text-decoration: none; } .ui-dialog .ui-dialog-titlebar-close { - background: #333; + background: #333; } .ui-tabs { @@ -78,134 +78,134 @@ inc_top.mako } .ui-tabs .ui-tabs-panel { - background-color: #3d3d3d !important; - border: 1px solid #111 !important; + background-color: #3d3d3d !important; + border: 1px solid #111 !important; } .ui-tabs-nav > :not(.ui-tabs-active){ - background: #333; - border-top-left-radius: 5px; - border-top-right-radius: 5px; + background: #333; + border-top-left-radius: 5px; + border-top-right-radius: 5px; } [class^="menu-icon-"], [class*=" menu-icon-"] { - background: url("../images/menu/menu-icons-white.png"); - height: 16px; - width: 16px; - display: inline-block; - position: relative; - top: 2px; - float: left; + background: url("../images/menu/menu-icons-white.png"); + height: 16px; + width: 16px; + display: inline-block; + position: relative; + top: 2px; + float: left; } .menu-icon-addshow { - background-position: 0px 0px; + background-position: 0px 0px; } .menu-icon-anime { - background-position: -21px 0px; + background-position: -21px 0px; } .menu-icon-backlog-view { - background-position: -42px 0px; + background-position: -42px 0px; } .menu-icon-backlog { - background-position: -63px 0px; + background-position: -63px 0px; } .menu-icon-bittorrent { - background-position: -84px 0px; + background-position: -84px 0px; } .menu-icon-config-index { - background-position: -105px 0px; + background-position: -105px 0px; } .menu-icon-config { - background-position: -126px 0px; + background-position: -126px 0px; } .menu-icon-failed-download { - background-position: -147px 0px; + background-position: -147px 0px; } .menu-icon-home { - background-position: -168px 0px; + background-position: -168px 0px; } .menu-icon-manage { - background-position: -189px 0px; + background-position: -189px 0px; } .menu-icon-manage-searches { - background-position: -210px 0px; + background-position: -210px 0px; } .menu-icon-poster { - background-position: -231px 0px; + background-position: -231px 0px; } .menu-icon-postprocess { - background-position: -252px 0px; + background-position: -252px 0px; } .menu-icon-restart { - background-position: -273px 0px; + background-position: -273px 0px; } .menu-icon-shutdown { - background-position: -294px 0px; + background-position: -294px 0px; } .menu-icon-update { - background-position: -315px 0px; + background-position: -315px 0px; } .menu-icon-viewlog-errors { - background-position: -336px 0px; + background-position: -336px 0px; } .menu-icon-viewlog { - background-position: -357px 0px; + background-position: -357px 0px; } .menu-icon-kodi { - background-position: -378px 0px; + background-position: -378px 0px; } .menu-icon-help { - background-position: -399px 0px; + background-position: -399px 0px; } [class^="submenu-icon-"], [class*=" submenu-icon-"] { - background: url("../images/menu/menu-icons-white.png"); - height: 16px; - width: 16px; + background: url("../images/menu/menu-icons-white.png"); + height: 16px; + width: 16px; } .submenu-icon-anime { - background-position: -21px 0px; + background-position: -21px 0px; } .submenu-icon-bittorrent { - background-position: -84px 0px; + background-position: -84px 0px; } .submenu-icon-failed-download { - background-position: -147px 0px; + background-position: -147px 0px; } .submenu-icon-restart { - background-position: -273px 0px; + background-position: -273px 0px; } .submenu-icon-shutdown { - background-position: -294px 0px; + background-position: -294px 0px; } .submenu-icon-kodi { - background-position: -378px 0px; + background-position: -378px 0px; } /* ======================================================================= @@ -213,16 +213,16 @@ inc_bottom.mako ========================================================================== */ .footer { - width: 100%; - padding: 20px 0; - color: #fff; - text-align: center; - font-size: 12px; + width: 100%; + padding: 20px 0; + color: #fff; + text-align: center; + font-size: 12px; } .footerhighlight { - color: #09A2FF; - display: inline; + color: #09A2FF; + display: inline; } /* ======================================================================= @@ -230,88 +230,88 @@ home.mako ========================================================================== */ .imgbanner .banner { - border: 1px solid #111; - overflow: hidden; - height: 66px; - overflow: hidden; - border-radius: 8px; - vertical-align: top; - width: 360px; - display: block; - margin-left: auto; - margin-right: auto; + border: 1px solid #111; + overflow: hidden; + height: 66px; + overflow: hidden; + border-radius: 8px; + vertical-align: top; + width: 360px; + display: block; + margin-left: auto; + margin-right: auto; } .imgsmallposter .small { - height: 66px; - overflow: hidden; - border-radius: 3px; - vertical-align: middle; - width: 45px; - border: 1px solid #111; - margin-right: 5px; + height: 66px; + overflow: hidden; + border-radius: 3px; + vertical-align: middle; + width: 45px; + border: 1px solid #111; + margin-right: 5px; } .progressbarText { - position: absolute; - top: 0; - width: 100%; - height: 100%; - overflow: visible; - text-align: center; - text-shadow: 0 0 0.1em #000; - vertical-align: middle; - font-size: 12px; - color: #fff; + position: absolute; + top: 0; + width: 100%; + height: 100%; + overflow: visible; + text-align: center; + text-shadow: 0 0 0.1em #000; + vertical-align: middle; + font-size: 12px; + color: #fff; } .show { - margin: 12px; - width: 188px; - height: 352px; - background-color: #333; - border: 1px solid #111; - border-radius: 6px; + margin: 12px; + width: 188px; + height: 352px; + background-color: #333; + border: 1px solid #111; + border-radius: 6px; } .show-title:after { - content: ""; - pointer-events: none; - position: absolute; - width: 20px; - height: 100%; - top: 0; - right: 0; - background-image: -webkit-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: -moz-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: -ms-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: -o-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: linear-gradient(to left, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + content: ""; + pointer-events: none; + position: absolute; + width: 20px; + height: 100%; + top: 0; + right: 0; + background-image: -webkit-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: -moz-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: -ms-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: -o-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: linear-gradient(to left, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); } .show-date:after { - content: ""; - pointer-events: none; - position: absolute; - width: 20px; - height: 100%; - top: 0; - right: 0; - background-image: -webkit-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: -moz-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: -ms-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: -o-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); - background-image: linear-gradient(to left, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + content: ""; + pointer-events: none; + position: absolute; + width: 20px; + height: 100%; + top: 0; + right: 0; + background-image: -webkit-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: -moz-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: -ms-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: -o-linear-gradient(right, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); + background-image: linear-gradient(to left, rgba(51, 51, 51, 1), rgba(51, 51, 51, 0)); } td.tvShow a { - color: #fff; - text-decoration: none; + color: #fff; + text-decoration: none; } td.tvShow a:hover { - cursor: pointer; - color: #09A2FF; + cursor: pointer; + color: #09A2FF; } .popover { @@ -332,27 +332,27 @@ home_addShows.mako ========================================================================== */ .icon-addnewshow { - background-image: url("../images/addshows/add-new32-white.png"); - width: 32px; - height: 32px; + background-image: url("../images/addshows/add-new32-white.png"); + width: 32px; + height: 32px; } .icon-addtrendingshow { - background-image: url("../images/addshows/add-trending32-white.png"); - width: 32px; - height: 32px; + background-image: url("../images/addshows/add-trending32-white.png"); + width: 32px; + height: 32px; } .icon-addrecommendedshow { - background-image: url("../images/addshows/add-trakt32-white.png"); - width: 32px; - height: 32px; + background-image: url("../images/addshows/add-trakt32-white.png"); + width: 32px; + height: 32px; } .icon-addexistingshow { - background-image: url("../images/addshows/add-existing32-white.png"); - width: 32px; - height: 32px; + background-image: url("../images/addshows/add-existing32-white.png"); + width: 32px; + height: 32px; } /* ======================================================================= @@ -360,11 +360,11 @@ home_newShow.mako ========================================================================== */ #displayText { - padding: 8px; - overflow: hidden; - font-size: 14px; - background-color: #3d3d3d; - border: 1px solid #111; + padding: 8px; + overflow: hidden; + font-size: 14px; + background-color: #3d3d3d; + border: 1px solid #111; } /* ======================================================================= @@ -372,11 +372,11 @@ home_addExistingShow.mako ========================================================================== */ ul#rootDirStaticList li { - padding: 4px 5px 4px 5px; - margin: 2px; - list-style: none outside none; - cursor: pointer; - background: #3d3d3d; + padding: 4px 5px 4px 5px; + margin: 2px; + list-style: none outside none; + cursor: pointer; + background: #3d3d3d; } /* ======================================================================= @@ -384,11 +384,11 @@ home_trendingShows.mako ========================================================================== */ .traktContainer { - margin: 12px; - width: 188px; - background-color: #333; - border: 1px solid #111; - border-radius: 6px; + margin: 12px; + width: 188px; + background-color: #333; + border: 1px solid #111; + border-radius: 6px; } /* ======================================================================= @@ -398,95 +398,95 @@ displayShow.mako #prevShow, #nextShow, #topcontrol { - -webkit-filter: "none"; - filter: none; + -webkit-filter: "none"; + filter: none; } h1.title { - padding-bottom: 12px; - margin-bottom: 15px; - line-height: 30px; - text-align: left; - text-rendering: optimizelegibility; - border-bottom: 1px solid #555; + padding-bottom: 12px; + margin-bottom: 15px; + line-height: 30px; + text-align: left; + text-rendering: optimizelegibility; + border-bottom: 1px solid #555; } ul.tags li { - margin-right: 4px; - margin-bottom: 5px; - padding: 3px 4px 3px 25px; - background: url(../images/tag.png) no-repeat scroll 5px 4px #15528F; - border-radius: 3px; - border: 1px solid #111; - color: #FFF; - font: 14px/18px "Open Sans", "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif; - text-shadow: 0px 1px rgba(0, 0, 0, 0.8); - float: left; + margin-right: 4px; + margin-bottom: 5px; + padding: 3px 4px 3px 25px; + background: url(../images/tag.png) no-repeat scroll 5px 4px #15528F; + border-radius: 3px; + border: 1px solid #111; + color: #FFF; + font: 14px/18px "Open Sans", "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif; + text-shadow: 0px 1px rgba(0, 0, 0, 0.8); + float: left; } .tvshowImg { - border: 1px solid #111; - border-radius: 5px; - height: 311px; - width: auto; - float: left; + border: 1px solid #111; + border-radius: 5px; + height: 311px; + width: auto; + float: left; } #summary { - padding: 10px; - background-color: #3d3d3d; - border: 1px solid #111; - width: 100%; - height: 250px; - overflow: auto; - cursor: default; + padding: 10px; + background-color: #3d3d3d; + border: 1px solid #111; + width: 100%; + height: 250px; + overflow: auto; + cursor: default; } .sickbeardTable { - table-layout: auto; - width: 100%; - border-collapse: collapse; - border-spacing: 0; - text-align: center; - border: none; - empty-cells: show; - color: #000; + table-layout: auto; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + text-align: center; + border: none; + empty-cells: show; + color: #000; } .sickbeardTable th{ - color: #fff; - text-align: center; - background-color: #15528F; - white-space: nowrap; + color: #fff; + text-align: center; + background-color: #15528F; + white-space: nowrap; } .sickbeardTable th, .sickbeardTable td { - border-top: 1px solid #222; - border-left: 1px solid #222; - padding: 4px; + border-top: 1px solid #222; + border-left: 1px solid #222; + padding: 4px; } th.row-seasonheader { - border: none; - background-color: #222; - color: #fff; - padding-top: 15px; - text-align: left; + border: none; + background-color: #222; + color: #fff; + padding-top: 15px; + text-align: left; } tr.seasonheader { - padding-bottom: 5px; - padding-top: 10px; - text-align: left; - border: none; + padding-bottom: 5px; + padding-top: 10px; + text-align: left; + border: none; } th.col-checkbox, td.col-checkbox { - width: 30px; - border-left: none; - text-align: center; + width: 30px; + border-left: none; + text-align: center; } /* ======================================================================= @@ -494,59 +494,59 @@ schedule.mako ========================================================================== */ h2.day, h2.network { - margin: 10px 0; - font-size: 24px; - line-height: 36px; - font-weight: bold; - letter-spacing: 1px; - color: #FFF; - text-align: center; - text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.3); - background-color: #15528F; + margin: 10px 0; + font-size: 24px; + line-height: 36px; + font-weight: bold; + letter-spacing: 1px; + color: #FFF; + text-align: center; + text-shadow: -1px -1px 0px rgba(0, 0, 0, 0.3); + background-color: #15528F; } .tvshowDiv { - display: block; - clear: both; - border: 1px solid #ccc; - margin: auto; - padding: 0px; - text-align: left; - width: 750px; - border-radius: 5px; - background: #fff; - cursor: default; - overflow: hidden; - color: #000; + display: block; + clear: both; + border: 1px solid #ccc; + margin: auto; + padding: 0px; + text-align: left; + width: 750px; + border-radius: 5px; + background: #fff; + cursor: default; + overflow: hidden; + color: #000; } .tvshowDiv a:hover { - color: #09A2FF; + color: #09A2FF; } #showListTable td.tvShow a { - color: #000; + color: #000; } #showListTable td.tvShow a:hover { - cursor: pointer; - color: #09A2FF; + cursor: pointer; + color: #09A2FF; } table.cal-odd { - background-color: #333; + background-color: #333; } table.cal-even { - background-color: #3d3d3d; + background-color: #3d3d3d; } .calendarShow .text .airtime { - color:#fff + color:#fff } .calendarShow .text .episode-title { - color:#aaa + color:#aaa } /* ======================================================================= @@ -554,43 +554,43 @@ config*.mako ========================================================================== */ .component-group { - padding: 15px 15px 25px; - border-bottom: 1px dotted #555; - min-height: 200px; + padding: 15px 15px 25px; + border-bottom: 1px dotted #555; + min-height: 200px; } .component-group-desc p { - width: 90%; - margin: 10px 0; - color: #ddd; + width: 90%; + margin: 10px 0; + color: #ddd; } #provider_order_list li, #service_order_list li { - padding: 5px; - margin: 5px 0; - font-size: 14px; - background: #333 !important; - color: #fff; + padding: 5px; + margin: 5px 0; + font-size: 14px; + background: #333 !important; + color: #fff; } #provider_order_list .ui-state-default.torrent-provider { - background-color: #555 !important; + background-color: #555 !important; } #provider_order_list .ui-state-default.nzb-provider { - background-color: #222 !important; + background-color: #222 !important; } [class^="icon16-"], [class*=" icon16-"] { - background-image: url("../images/glyphicons-config-white.png"); - background-position: -40px 0; - background-repeat: no-repeat; - display: inline-block; - height: 16px; - line-height: 16px; - vertical-align: text-top; - width: 16px; + background-image: url("../images/glyphicons-config-white.png"); + background-position: -40px 0; + background-repeat: no-repeat; + display: inline-block; + height: 16px; + line-height: 16px; + vertical-align: text-top; + width: 16px; } /* ======================================================================= @@ -598,35 +598,35 @@ config_postProcessing.mako ========================================================================== */ #config div.example { - padding: 10px; - background-color: #333333; - border: 1px solid #111; + padding: 10px; + background-color: #333333; + border: 1px solid #111; } .Key { - width: 100%; - padding: 6px; - font-size: 13px; - background-color: #3d3d3d; - border: 1px solid #111; - border-collapse: collapse; - border-spacing: 0; + width: 100%; + padding: 6px; + font-size: 13px; + background-color: #3d3d3d; + border: 1px solid #111; + border-collapse: collapse; + border-spacing: 0; } .Key th, .tableHeader { - padding: 3px 9px; - margin: 0; - color: #fff; - text-align: center; - background: #15528F; + padding: 3px 9px; + margin: 0; + color: #fff; + text-align: center; + background: #15528F; } .Key tr { - border-bottom: 1px solid #111; + border-bottom: 1px solid #111; } .Key tr.even { - background-color: #333; + background-color: #333; } /* ======================================================================= @@ -634,31 +634,31 @@ config_notifications.mako ========================================================================== */ div.metadata_options { - padding: 7px; - overflow: auto; - background: #333; - color: #fff; - border: 1px solid #111; + padding: 7px; + overflow: auto; + background: #333; + color: #fff; + border: 1px solid #111; } div.metadata_options label:hover { - color: #fff; - background-color: #15528F; - cursor: pointer; + color: #fff; + background-color: #15528F; + cursor: pointer; } div.metadata_options label { - display: block; - padding-left: 7px; - line-height: 20px; - color: #fff; + display: block; + padding-left: 7px; + line-height: 20px; + color: #fff; } div.metadata_example label { - display: block; - line-height: 21px; - color: #fff; - cursor: pointer; + display: block; + line-height: 21px; + color: #fff; + cursor: pointer; } /* ======================================================================= @@ -666,8 +666,8 @@ manage*.mako ========================================================================== */ .separator { - font-size: 90%; - color: #fff; + font-size: 90%; + color: #fff; } a.whitelink { @@ -678,9 +678,9 @@ Global ========================================================================== */ span.path { - padding: 3px 6px; - color: #09A2FF; - background-color: #333; + padding: 3px 6px; + color: #09A2FF; + background-color: #333; } /* ======================================================================= @@ -688,48 +688,48 @@ bootstrap Overrides ========================================================================== */ body { - padding-top: 60px; - overflow-y: scroll; - font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #fff; - background-color: #222; + padding-top: 60px; + overflow-y: scroll; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #fff; + background-color: #222; } /* navbar styling */ .navbar-default { - background-color: #15528F; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#297AB8', endColorstr='#15528F'); - background: -webkit-gradient(linear, left top, left bottom, from(#297AB8), to(#15528F)); - background: -moz-linear-gradient(top, #297AB8, #15528F); - border-color: #3e3f3a; + background-color: #15528F; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#297AB8', endColorstr='#15528F'); + background: -webkit-gradient(linear, left top, left bottom, from(#297AB8), to(#15528F)); + background: -moz-linear-gradient(top, #297AB8, #15528F); + border-color: #3e3f3a; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - background-color: #124477; + background-color: #124477; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #124477; + color: #ffffff; + background-color: #124477; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #124477; + background-color: #124477; } .navbar-default .navbar-toggle .icon-bar { - background-color: #124477; + background-color: #124477; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - background-color: #124477; - color: #ffffff; + background-color: #124477; + color: #ffffff; } @media (max-width: 767px) { @@ -742,59 +742,59 @@ body { } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #fff; - text-decoration: none; - background-color: #15528F; + color: #fff; + text-decoration: none; + background-color: #15528F; } .dropdown-menu > li > a { - padding: 4px 36px 4px 20px; - color: #fff; + padding: 4px 36px 4px 20px; + color: #fff; } .dropdown-menu { - background-color: #333; - border: 1px solid rgba(0, 0, 0, 0.15); - box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176); + background-color: #333; + border: 1px solid rgba(0, 0, 0, 0.15); + box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176); } .btn { - display: inline-block; - *display: inline; - padding: 4px 10px 4px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 12px; - line-height: 16px; - *line-height: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #2672B6; - *background-color: #2672B6; - background-image: -ms-linear-gradient(top, #297AB8, #15528F); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#297AB8), to(#15528F)); - background-image: -webkit-linear-gradient(top, #297AB8, #15528F); - background-image: -o-linear-gradient(top, #297AB8, #15528F); - background-image: linear-gradient(top, #297AB8, #15528F); - background-image: -moz-linear-gradient(top, #297AB8, #15528F); - background-repeat: repeat-x; - border: 1px solid #111; - *border: 0; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-color: #111 #111 #111; - border-bottom-color: #111; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#297AB8', endColorstr='#15528F', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.0), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.0), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.0), 0 1px 2px rgba(0, 0, 0, 0.05); + display: inline-block; + *display: inline; + padding: 4px 10px 4px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 12px; + line-height: 16px; + *line-height: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #2672B6; + *background-color: #2672B6; + background-image: -ms-linear-gradient(top, #297AB8, #15528F); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#297AB8), to(#15528F)); + background-image: -webkit-linear-gradient(top, #297AB8, #15528F); + background-image: -o-linear-gradient(top, #297AB8, #15528F); + background-image: linear-gradient(top, #297AB8, #15528F); + background-image: -moz-linear-gradient(top, #297AB8, #15528F); + background-repeat: repeat-x; + border: 1px solid #111; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #111 #111 #111; + border-bottom-color: #111; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#297AB8', endColorstr='#15528F', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.0), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.0), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.0), 0 1px 2px rgba(0, 0, 0, 0.05); } .btn:hover, @@ -802,78 +802,78 @@ body { .btn.active, .btn.disabled, .btn[disabled] { - background-color: #2672B6; - *background-color: #2672B6; - color: #fff; + background-color: #2672B6; + *background-color: #2672B6; + color: #fff; } .btn:active, .btn.active { - background-color: #cccccc \9; - color: #fff; + background-color: #cccccc \9; + color: #fff; } .btn:hover { - color: #fff; - text-decoration: none; - background-color: #2672B6; - *background-color: #2672B6; - background-position: 0 -150px; - -webkit-transition: background-position 0.0s linear; - -moz-transition: background-position 0.0s linear; - -ms-transition: background-position 0.0s linear; - -o-transition: background-position 0.0s linear; - transition: background-position 0.0s linear; + color: #fff; + text-decoration: none; + background-color: #2672B6; + *background-color: #2672B6; + background-position: 0 -150px; + -webkit-transition: background-position 0.0s linear; + -moz-transition: background-position 0.0s linear; + -ms-transition: background-position 0.0s linear; + -o-transition: background-position 0.0s linear; + transition: background-position 0.0s linear; } .btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; - color: #fff; + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + color: #fff; } .btn.active, .btn:active { - background-color: #2672B6; - background-color: #2672B6 \9; - background-image: none; - color: #fff; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #2672B6; + background-color: #2672B6 \9; + background-image: none; + color: #fff; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); } .btn.disabled, .btn[disabled] { - cursor: default; - background-color: #15528F; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; + cursor: default; + background-color: #15528F; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } @media(min-width:768px){ - .navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - right: 12px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #333; - border-left: 6px solid transparent; - content: ""; - } + .navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + right: 12px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #333; + border-left: 6px solid transparent; + content: ""; + } } pre { - color: #fff; - background-color: #3d3d3d; - border-color: #111; + color: #fff; + background-color: #3d3d3d; + border-color: #111; } /* ======================================================================= @@ -881,15 +881,15 @@ browser.css overrides ========================================================================== */ #fileBrowserDialog ul li { - margin: 2px 0; - list-style-type: none; - cursor: pointer; - background: #333; + margin: 2px 0; + list-style-type: none; + cursor: pointer; + background: #333; } #fileBrowserDialog ul li a:hover { - color: #09a2ff; - background: none; + color: #09a2ff; + background: none; } /* ======================================================================= @@ -897,28 +897,28 @@ formWizard.css ========================================================================== */ legend.legendStep { - color: #ffffff; - margin-bottom: 0px; + color: #ffffff; + margin-bottom: 0px; } div.stepsguide .step p { - margin: 12px 0; - border-bottom: 4px solid #23AFDC; + margin: 12px 0; + border-bottom: 4px solid #23AFDC; } div.stepsguide .disabledstep p { - border-bottom: 4px solid #1178B3; + border-bottom: 4px solid #1178B3; } div.formpaginate .prev, div.formpaginate .next { - padding: 3px 6px; - color: #fff; - cursor: hand; - cursor: pointer; - background: #2265A1; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; + padding: 3px 6px; + color: #fff; + cursor: hand; + cursor: pointer; + background: #2265A1; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; } /* ======================================================================= @@ -926,25 +926,25 @@ pnotify.css ========================================================================== */ .ui-pnotify-container { - border: 1px solid #111; - background-image: -moz-linear-gradient(#333, #3d3d3d) !important; - background-image: linear-gradient(#333, #3d3d3d) !important; - background-image: -webkit-linear-gradient(#333, #3d3d3d) !important; - background-image: -o-linear-gradient(#333, #3d3d3d) !important; - filter: progid:dximagetransform.microsoft.gradient(startColorstr=#333, endColorstr=#3d3d3d) !important; - -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#333, endColorstr=#3d3d3d) !important; - -moz-box-shadow: 0px 0px 2px #000; - -webkit-box-shadow: 0px 0px 2px #000; - -o-box-shadow: 0px 0px 2px #000; - box-shadow: 0px 0px 2px #000; + border: 1px solid #111; + background-image: -moz-linear-gradient(#333, #3d3d3d) !important; + background-image: linear-gradient(#333, #3d3d3d) !important; + background-image: -webkit-linear-gradient(#333, #3d3d3d) !important; + background-image: -o-linear-gradient(#333, #3d3d3d) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#333, endColorstr=#3d3d3d) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#333, endColorstr=#3d3d3d) !important; + -moz-box-shadow: 0px 0px 2px #000; + -webkit-box-shadow: 0px 0px 2px #000; + -o-box-shadow: 0px 0px 2px #000; + box-shadow: 0px 0px 2px #000; } .ui-pnotify-title { - color: #ffffff; + color: #ffffff; } .ui-pnotify-text { - color: #ffffff; + color: #ffffff; } /* ======================================================================= @@ -952,90 +952,90 @@ tablesorter.css ========================================================================== */ .tablesorter { - width: 100%; - margin-right: auto; - margin-left: auto; - color: #fff; - text-align: left; - background-color: #333; - border-spacing: 0; + width: 100%; + margin-right: auto; + margin-left: auto; + color: #fff; + text-align: left; + background-color: #333; + border-spacing: 0; } .tablesorter th, .tablesorter td { - padding: 4px; - border-top: #222 1px solid; - border-left: #222 1px solid; - vertical-align: middle; + padding: 4px; + border-top: #222 1px solid; + border-left: #222 1px solid; + vertical-align: middle; } .tablesorter th { - color: #fff; - text-align: center; - text-shadow: -1px -1px 0 rgba(0,0,0,0.3); - background-color: #15528F; - border-collapse: collapse; - font-weight: normal; + color: #fff; + text-align: center; + text-shadow: -1px -1px 0 rgba(0,0,0,0.3); + background-color: #15528F; + border-collapse: collapse; + font-weight: normal; } .tablesorter thead .tablesorter-headerDesc { - background-color: #297AB8; - background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); - /* background-image: url(../images/tablesorter/asc.gif); */ + background-color: #297AB8; + background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); + /* background-image: url(../images/tablesorter/asc.gif); */ } .tablesorter thead .tablesorter-headerAsc { - background-color: #297AB8; - background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); - /* background-image: url(../images/tablesorter/desc.gif); */ + background-color: #297AB8; + background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); + /* background-image: url(../images/tablesorter/desc.gif); */ } thead.tablesorter-stickyHeader { - border-top: 2px solid #222; - border-bottom: 2px solid #222; + border-top: 2px solid #222; + border-bottom: 2px solid #222; } /* Zebra Widget - row alternating colors */ .tablesorter tr.odd, .sickbeardTable tr.odd { - background-color: #333333; + background-color: #333333; } .tablesorter tr.even, .sickbeardTable tr.even { - background-color: #2e2e2e; + background-color: #2e2e2e; } .tablesorter tr.tablesorter-filter-row, .tablesorter tr.tablesorter-filter-row td { - text-align: center; - background: #333; - border-bottom: 1px solid #111; + text-align: center; + background: #333; + border-bottom: 1px solid #111; } /* hidden filter row */ .tablesorter-filter-row.hideme td { - /*** *********************************************** ***/ - /*** change this padding to modify the thickness ***/ - /*** of the closed filter row (height = padding x 2) ***/ - padding: 2px; - /*** *********************************************** ***/ - margin: 0; - line-height: 0; - cursor: pointer; + /*** *********************************************** ***/ + /*** change this padding to modify the thickness ***/ + /*** of the closed filter row (height = padding x 2) ***/ + padding: 2px; + /*** *********************************************** ***/ + margin: 0; + line-height: 0; + cursor: pointer; } .tablesorter-filter-row.hideme * { - height: 1px; - min-height: 0; - border: 0; - padding: 0; - margin: 0; - /* don't use visibility: hidden because it disables tabbing */ - opacity: 0; - filter: alpha(opacity=0); + height: 1px; + min-height: 0; + border: 0; + padding: 0; + margin: 0; + /* don't use visibility: hidden because it disables tabbing */ + opacity: 0; + filter: alpha(opacity=0); } #showListTable tbody { - color: #000; + color: #000; } /* ======================================================================= @@ -1043,11 +1043,11 @@ token-input.css ========================================================================== */ div.token-input-dropdown { - background-color: #fff; - color: #000; - border-left-color: #ccc; - border-right-color: #ccc; - border-bottom-color: #ccc; + background-color: #fff; + color: #000; + border-left-color: #ccc; + border-right-color: #ccc; + border-bottom-color: #ccc; } /* ======================================================================= @@ -1055,29 +1055,29 @@ jquery.confirm.css ========================================================================== */ #confirmBox{ - background: #222; - width: 460px; - position: fixed; - left: 50%; - top: 50%; - margin: -130px 0 0 -230px; - border: 1px solid #111; - box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.175); + background: #222; + width: 460px; + position: fixed; + left: 50%; + top: 50%; + margin: -130px 0 0 -230px; + border: 1px solid #111; + box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.175); } #confirmBox h1 { - background-color: #15528F; - border-bottom: 1px solid #111; - color: #fff; - margin: 0; - font-size: 22px; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75); + background-color: #15528F; + border-bottom: 1px solid #111; + color: #fff; + margin: 0; + font-size: 22px; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75); } #confirmBox p { - padding-top: 20px; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75); + padding-top: 20px; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75); } /* ======================================================================= @@ -1093,15 +1093,15 @@ bootstrap modal } .modal-header { - padding:9px 15px; - border-bottom:1px solid #eee; - background-color: #15528F; - -webkit-border-top-left-radius: 5px; - -webkit-border-top-right-radius: 5px; - -moz-border-radius-topleft: 5px; - -moz-border-radius-topright: 5px; - border-top-left-radius: 5px; - border-top-right-radius: 5px; + padding:9px 15px; + border-bottom:1px solid #eee; + background-color: #15528F; + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; } /* ======================================================================= @@ -1109,11 +1109,100 @@ bootstrap panel ========================================================================== */ .panel-default { - background-color: #3D3D3D; - border-color: #111111; + background-color: #3D3D3D; + border-color: #111111; } .panel-heading { - background-color: #3D3D3D !important; - color: #FFFFFF !important; + background-color: #3D3D3D !important; + color: #FFFFFF !important; +} + + +/* ======================================================================= +new #confirmBox +@TODO THIS NEEDS TO BE FIXED! +========================================================================== */ +.modal-dialog { + width: 460px; + position: fixed; + left: 50%; + top: 50%; + margin: -130px 0 0 -230px; + border: 1px solid #111; + box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.175); + border-radius: 0px; +} + +.modal-content { + border-radius: 0px; +} + +.modal-header { + border-bottom: none; + border-radius: 0px; +} + +.modal-body, .modal-content{ + background: #222; +} + +.modal-footer { + border-top: none; +} + +.confirmation-modal { + background: -moz-linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)) repeat-x rgba(0,0,0,0.5); + background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.5))) repeat-x rgba(0,0,0,0.5); +} + +.modal-footer { + text-align: center; +} + +.modal-header .close { + display: none +} + +.modal-footer button { + margin-right: 15px; + padding: 2px 15px; + text-decoration: none; + display: inline-block; + color: #fff; + text-align:center; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.75); + background-clip: padding-box; + border: 1px solid #111; + border-radius: 3px; + cursor: pointer; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.08),rgba(255,255,255,0) 50%,rgba(0,0,0,0) 51%,rgba(0,0,0,0.25)); + background-image: -moz-linear-gradient(top, rgba(255,255,255,0.08),rgba(255,255,255,0) 50%,rgba(0,0,0,0) 51%,rgba(0,0,0,0.25)); + background-image: -o-linear-gradient(top, rgba(255,255,255,0.08),rgba(255,255,255,0) 50%,rgba(0,0,0,0) 51%,rgba(0,0,0,0.25)); + background-image: linear-gradient(to bottom, rgba(255,255,255,0.08),rgba(255,255,255,0) 50%,rgba(0,0,0,0) 51%,rgba(0,0,0,0.25)); + -webkit-box-shadow: inset 0 1px rgba(255,255,255,0.1),inset 0 -1px 3px rgba(0,0,0,0.3),inset 0 0 0 1px rgba(255,255,255,0.08),0 1px 2px rgba(0,0,0,0.15); + box-shadow: inset 0 1px rgba(255,255,255,0.1),inset 0 -1px 3px rgba(0,0,0,0.3),inset 0 0 0 1px rgba(255,255,255,0.08),0 1px 2px rgba(0,0,0,0.15); +} + +.modal-footer button:last-child { + margin-right:0; +} + +.modal-footer button.confirm { + background-color: #3F7636; +} + +.modal-footer button.confirm:hover { + background-color: #48873E; +} + +.modal-footer button.cancel { + background-color: #8D2D2B; +} + +.modal-footer button.cancel:hover { + background-color: #A13331; } -- GitLab From bdf4782dabe389eeaaa629dbf427458786a9aae1 Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sun, 8 Nov 2015 07:54:36 -0500 Subject: [PATCH 210/215] Change from UserDict to NumDict and add unittests --- sickbeard/__init__.py | 2 +- sickbeard/common.py | 81 +++---- sickbeard/numdict.py | 126 +++++++++++ tests/common_tests.py | 54 +++++ tests/numdict_tests.py | 499 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 709 insertions(+), 53 deletions(-) create mode 100644 sickbeard/numdict.py create mode 100644 tests/numdict_tests.py diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 311652323..54d8d0b8c 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -39,7 +39,7 @@ from sickbeard.providers.generic import GenericProvider from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \ naming_ep_type from sickbeard import searchBacklog, showUpdater, versionChecker, properFinder, autoPostProcesser, \ - subtitles, traktChecker + subtitles, traktChecker, numdict from sickbeard import db from sickbeard import helpers from sickbeard import scheduler diff --git a/sickbeard/common.py b/sickbeard/common.py index 7cdd25229..a20d543ea 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -22,7 +22,13 @@ import operator import platform import re import uuid -from UserDict import UserDict +from numdict import NumDict + +import sys +import os.path + +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from random import shuffle @@ -513,72 +519,43 @@ qualityPresetStrings = {SD: "SD", ANY: "Any"} -class StatusStrings(UserDict): +class StatusStrings(NumDict): """ Dictionary containing strings for status codes - - Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until - the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. - - Membership checks using __contains__ (i.e. 'x in y') do not raise a ValueError to match expected dict functionality """ # todo: Deprecate StatusStrings().statusStrings and use StatusStrings() directly # todo: Deprecate .has_key and switch to 'x in y' - # todo: Switch from raising ValueError to a saner KeyError - # todo: Raise KeyError when unable to resolve a missing key instead of returning '' - # todo: Make key of None match dict() functionality + # todo: Make views return Qualities too + # todo: + + qualities = Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED @property def statusStrings(self): # for backwards compatibility return self.data - def __setitem__(self, key, value): - self.data[int(key)] = value # make sure all keys being assigned values are ints - def __missing__(self, key): """ - If the key is not found, search for the missing key in qualities + If the key is not found try to determine a status from Quality - Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until - the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. + :param key: A numeric key or None + :raise KeyError: if the key is invalid and can't be determined from Quality """ - if isinstance(key, int): # if the key is already an int... - if key in self.keys() + Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED: - status, quality = Quality.splitCompositeStatus(key) - if quality == Quality.NONE: # If a Quality is not listed... (shouldn't this be 'if not quality:'?) - return self[status] # ...return the status... - else: - return self[status] + " (" + Quality.qualityStrings[quality] + ")" # ...otherwise append the quality to the status - else: - return '' # return '' to match old functionality when the numeric key is not found - return self[int(key)] # Since the key was not an int, let's try int(key) instead - - # Keep this until all has_key() checks are converted to 'key in dict' - # or else has_keys() won't search __missing__ for keys - def has_key(self, key): - """ - Override has_key() to test membership using an 'x in y' search - - Keys must be convertible to int or a ValueError will be raised. This is intentional to match old functionality until - the old StatusStrings is fully deprecated, then we will raise a KeyError instead, where appropriate. - """ - return key in self # This will raise a ValueError if __missing__ can't convert the key to int + key = self.numeric(key) # try to convert the key to a number which will raise KeyError if it can't + if key in self.qualities: # the key wasn't found locally so check in qualities + status, quality = Quality.splitCompositeStatus(key) + return self[status] if not quality else self[status] + " (" + Quality.qualityStrings[quality] + ")" + else: # the key wasn't found in qualities either + raise KeyError(key) # ... so the key is invalid def __contains__(self, key): - """ - Checks for existence of key - - Unlike has_key() and __missing__() this will NOT raise a ValueError to match expected functionality - when checking for 'key in dict' - """ try: - # This will raise a ValueError if we can't convert the key to int - return ((int(key) in self.data) or - (int(key) in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.ARCHIVED)) - except ValueError: # The key is not numeric and since we only want numeric keys... - # ...and we don't want this function to fail... - pass # ...suppress the ValueError and do nothing, the key does not exist + key = self.numeric(key) + return key in self.data or key in self.qualities + except KeyError: + return False +# Assign strings to statuses statusStrings = StatusStrings( {UNKNOWN: "Unknown", UNAIRED: "Unaired", @@ -592,11 +569,11 @@ statusStrings = StatusStrings( SUBTITLED: "Subtitled", FAILED: "Failed", SNATCHED_BEST: "Snatched (Best)" - }) + } +) # pylint: disable=R0903 class Overview(object): - UNAIRED = UNAIRED # 1 QUAL = 2 WANTED = WANTED # 3 @@ -621,4 +598,4 @@ XML_NSMAP = {'xsi': 'http://www.w3.org/2001/XMLSchema-instance', countryList = {'Australia': 'AU', 'Canada': 'CA', 'USA': 'US' - } + } diff --git a/sickbeard/numdict.py b/sickbeard/numdict.py new file mode 100644 index 000000000..8549ba6d2 --- /dev/null +++ b/sickbeard/numdict.py @@ -0,0 +1,126 @@ +# coding=utf-8 + +""" +class NumDict - A dict with numeric keys +""" + +from collections import MutableMapping + + +class NumDict(MutableMapping): + """ + NumDict() -> new empty dictionary + + NumDict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs + + NumDict(iterable) -> new dictionary initialized as if via: + d = {} + for k, v in iterable: + d[k] = v + + NumDict(**kwargs) -> TypeError - key words cannot be numeric + + All keys must be numeric or None + """ + + def __init__(self, iterable=None, **kwargs): + self.data = {} + iterable = kwargs.pop('dict', None) if iterable is None else iterable + if iterable is not None: + self.update(iterable) + if len(kwargs): + self.update(kwargs) + + def __len__(self): + return len(self.data) + + def __getitem__(self, key): + key = self.numeric(key) + if key in self.data: + return self.data[key] + if hasattr(self.__class__, "__missing__"): + # noinspection PyUnresolvedReferences + return self.__class__.__missing__(self, key) + raise KeyError(key) + + def __setitem__(self, key, item): + try: + key = self.numeric(key) + except KeyError: + raise TypeError(key) + self.data[key] = item + + def __delitem__(self, key): + key = self.numeric(key) + del self.data[key] + + def __iter__(self): + return iter(self.data) + + def __contains__(self, key): + try: + key = self.numeric(key) + return key in self.data + except KeyError: + return False + + def __repr__(self): + return repr(self.data) + + def has_key(self, key): + """ + DEPRECATED: Check for existence of key + + :param key: A numeric key + :return: True if key is found, else False + """ + return key in self + + def copy(self): + """ + Create a copy of a NumDict + :return: A copy + """ + if self.__class__ is NumDict: + return NumDict(self.data.copy()) + import copy + data = self.data + try: + self.data = {} + c = copy.copy(self) + finally: + self.data = data + c.update(self) + return c + + @classmethod + def fromkeys(cls, iterable, value=None): + """ + Build a NumDict from a dictionary + + :param iterable: + :param value: + :return: + """ + d = cls() + for key in iterable: + key = cls.numeric(key) + d[key] = value + return d + + @staticmethod + def numeric(key): + """ + Converts a key to its numeric representation + + :param key: numeric dict key + :raise KeyError: if key can't be converted to an integer + :return: a numeric key + :rtype: int + """ + try: + return int(key) + except (TypeError, ValueError): + if key is not None: + raise KeyError(key) diff --git a/tests/common_tests.py b/tests/common_tests.py index 024652ab3..eca9777d5 100644 --- a/tests/common_tests.py +++ b/tests/common_tests.py @@ -8,6 +8,7 @@ import unittest from sickbeard import common + class QualityTests(unittest.TestCase): # TODO: repack / proper ? air-by-date ? season rip? multi-ep? @@ -99,6 +100,59 @@ class QualityTests(unittest.TestCase): # self.assertEqual(common.Quality.FULLHDBLURAY, common.Quality.nameQuality("Test Show - S01E02 - 1080p BluRay - GROUP")) # self.assertEqual(common.Quality.UNKNOWN, common.Quality.nameQuality("Test Show - S01E02 - Unknown - SiCKBEARD")) + +class StatusStringsTest(unittest.TestCase): + # todo: Split tests into separate tests and add additional tests + def test_all(self): + ss = common.statusStrings + + valid = 1, 112, '1', '112' + unused = 122, 99998989899878676, '99998989899878676', None + invalid = 'Elephant', (4, 1), [1, 233, 4, None] + + for i in valid: + self.assertTrue(i in ss) + + for i in unused: + self.assertFalse(i in ss) + with self.assertRaises(KeyError): + ss[i] + + for i in ss: + self.assertEqual(ss[i], ss[str(i)]) + self.assertEqual(i in ss, str(i) in ss) + self.assertEqual(ss.has_key(i), ss.has_key(str(i))) + self.assertEqual(i in ss, ss.has_key(i)) + # self.assertEqual(ss.statusStrings[i], ss.statusStrings[str(i)]) # fails with KeyError + + for i in ss.qualities: + self.assertEqual(ss[i], ss[str(i)]) + self.assertEqual(i in ss, str(i) in ss) + self.assertEqual(ss.has_key(i), ss.has_key(str(i))) + self.assertEqual(i in ss, ss.has_key(i)) + # self.assertEqual(ss.statusStrings[i], ss.statusStrings[str(i)]) # fails with KeyError + + for i in invalid: + with self.assertRaises(TypeError): + ss[i] = 1 + + for i in unused: + if i is None: + with self.assertRaises(TypeError): + ss[str(i)] = 1 # converting None to a string makes this invalid since 'None' != None... + ss[i] = 1 # ...but None can still be used as a key + else: + ss[str(i)] = 1 + self.assertEqual(ss[i], 1) + if __name__ == '__main__': + print "=======================" + print "STARTING - COMMON TESTS" + print "=======================" + print "######################################################################" + suite = unittest.TestLoader().loadTestsFromTestCase(QualityTests) unittest.TextTestRunner(verbosity=2).run(suite) + + suite = unittest.TestLoader().loadTestsFromTestCase(StatusStringsTest) + unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/tests/numdict_tests.py b/tests/numdict_tests.py new file mode 100644 index 000000000..f2ed80c7b --- /dev/null +++ b/tests/numdict_tests.py @@ -0,0 +1,499 @@ +# coding=utf-8 + +""" +Unit Tests for sickbeard/numdict.py +""" + +import sys +import os.path +import unittest + +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) +sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +from sickbeard.numdict import NumDict + +PY3 = sys.version_info >= (3, ) + +if PY3: + from collections import UserDict +else: + from UserDict import UserDict + + +class NumDictTest(unittest.TestCase): + """ + Test the NumDict class + """ + def test_constructors(self): + """ + Test NumDict constructors + """ + # dicts for testing + d0 = {} # Empty dictionary + d1 = {1: 'Elephant'} # Single numeric key + d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + d3 = {'3': 'Aardvark'} # Numeric string key + d4 = {'3': 'Aardvark', '4': 'Ant'} # Multiple numeric string keys + d5 = {5: 'Cat', '6': 'Dog'} # Mixed numeric and numeric string keys + d6 = {1: None, '2': None} # None as values + d7 = {None: 'Empty'} # None as key + + # Construct NumDicts from dicts + n = NumDict() + n0 = NumDict(d0) + n1 = NumDict(d1) + n2 = NumDict(d2) + n3 = NumDict(d3) + n4 = NumDict(d4) + n5 = NumDict(d5) + n6 = NumDict(d6) + n7 = NumDict(d7) + + # Most NumDicts from dicts should compare equal... + self.assertEqual(n, {}) + self.assertEqual(n0, d0) + self.assertEqual(n1, d1) + self.assertEqual(n2, d2) + + # ...however, numeric keys are not equal to numeric string keys... + self.assertNotEqual(n3, d3) + self.assertNotEqual(n4, d4) + self.assertNotEqual(n5, d5) + self.assertNotEqual(n6, d6) + + # ...but None keys work just fine + self.assertEqual(n7, d7) + + # Construct dicts from NumDicts + dn = dict(n) + dn1 = dict(n1) + dn2 = dict(n2) + dn3 = dict(n3) + dn4 = dict(n4) + dn5 = dict(n5) + dn6 = dict(n6) + dn7 = dict(n7) + + # All dicts from NumDicts should compare equal + self.assertEqual(n, dn) + self.assertEqual(n1, dn1) + self.assertEqual(n2, dn2) + self.assertEqual(n3, dn3) + self.assertEqual(n4, dn4) + self.assertEqual(n5, dn5) + self.assertEqual(n6, dn6) + self.assertEqual(n7, dn7) + + # Construct NumDicts from NumDicts + nn = NumDict(n) + nn0 = NumDict(n0) + nn1 = NumDict(n1) + nn2 = NumDict(n2) + nn3 = NumDict(n3) + nn4 = NumDict(n4) + nn5 = NumDict(n5) + nn6 = NumDict(n6) + nn7 = NumDict(n7) + + # All NumDicts from NumDicts should compare equal + self.assertEqual(n, nn) + self.assertEqual(n0, nn0) + self.assertEqual(n1, nn1) + self.assertEqual(n2, nn2) + self.assertEqual(n3, nn3) + self.assertEqual(n4, nn4) + self.assertEqual(n5, nn5) + self.assertEqual(n6, nn6) + self.assertEqual(n7, nn7) + + # keyword arg constructor should fail + with self.assertRaises(TypeError): + NumDict(one=1, two=2) # Raise TypeError since we can't have numeric keywords + + # item sequence constructors work fine... + self.assertEqual(NumDict([(1, 'Elephant'), (2, 'Mouse')]), dn2) + self.assertEqual(NumDict(dict=[(1, 'Elephant'), (2, 'Mouse')]), dn2) + self.assertEqual(NumDict([(1, 'Elephant'), ('2', 'Mouse')]), dn2) + self.assertEqual(NumDict(dict=[('1', 'Elephant'), (2, 'Mouse')]), dn2) + + # ...unless you have a non-numeric key + with self.assertRaises(TypeError): + NumDict([('Rat', 11), ('Snake', 12)]) + with self.assertRaises(TypeError): + NumDict(dict=[('Rat', 11), ('Snake', 12)]) + + # combining item sequence constructors with keyword args does not work + with self.assertRaises(TypeError): # Raise TypeError since we can't have numeric keywords + NumDict([(1, 'one'), (2, 'two')], two=3, five=4) + + # alternate constructors + d8 = {1: 'Echo', 2: 'Echo'} + + self.assertEqual(NumDict.fromkeys('1 2'.split()), dn6) + self.assertEqual(NumDict().fromkeys('1 2'.split()), dn6) + self.assertEqual(NumDict.fromkeys('1 2'.split(), 'Echo'), d8) + self.assertEqual(NumDict().fromkeys('1 2'.split(), 'Echo'), d8) + self.assertTrue(n1.fromkeys('1 2'.split()) is not n1) + self.assertIsInstance(n1.fromkeys('1 2'.split()), NumDict) + self.assertIsInstance(n2.fromkeys('1 2'.split()), NumDict) + self.assertIsInstance(n3.fromkeys('1 2'.split()), NumDict) + self.assertIsInstance(n4.fromkeys('1 2'.split()), NumDict) + + def test_repr(self): + # dicts for testing + d0 = {} # Empty dictionary + d1 = {1: 'Elephant'} # Single numeric key + d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + d3 = {'3': 'Aardvark'} # Numeric string key + d4 = {'3': 'Aardvark', '4': 'Ant'} # Multiple numeric string keys + d5 = {5: 'Cat', '6': 'Dog'} # Mixed numeric and numeric string keys + d6 = {1: None, '2': None} # None as values + d7 = {None: 'Empty'} # None as key + + # Construct NumDicts from dicts + n = NumDict() + n0 = NumDict(d0) + n1 = NumDict(d1) + n2 = NumDict(d2) + n3 = NumDict(d3) + n4 = NumDict(d4) + n5 = NumDict(d5) + n6 = NumDict(d6) + n7 = NumDict(d7) + + reps = ( + "{}", + "{1: 'Elephant'}", + "{1: 'Elephant', 2: 'Mouse'}", + "'3': 'Aardvark'", + "{'3': 'Aardvark', '4': 'Ant'}", + "{5: 'Cat', '6': 'Dog'}", + "{1: None, '2': None}", + "{None: 'Empty'}", + ) + + # Most representations of NumDicts should compare equal to dicts... + self.assertEqual(str(n), str({})) + self.assertEqual(repr(n), repr({})) + self.assertIn(repr(n), reps) + + self.assertEqual(str(n0), str(d0)) + self.assertEqual(repr(n0), repr(d0)) + self.assertIn(repr(n0), reps) + + self.assertEqual(str(n1), str(d1)) + self.assertEqual(repr(n1), repr(d1)) + self.assertIn(repr(n1), reps) + + self.assertEqual(str(n2), str(d2)) + self.assertEqual(repr(n2), repr(d2)) + self.assertIn(repr(n2), reps) + + # ...however, numeric keys are not equal to numeric string keys... + # ...so the string representations for those are different... + self.assertNotEqual(str(n3), str(d3)) + self.assertNotEqual(repr(n3), repr(d3)) + self.assertNotIn(repr(n3), reps) + + self.assertNotEqual(str(n4), str(d4)) + self.assertNotEqual(repr(n4), repr(d4)) + self.assertNotIn(repr(n4), reps) + + self.assertNotEqual(str(n5), str(d5)) + self.assertNotEqual(repr(n5), repr(d5)) + self.assertNotIn(repr(n5), reps) + + self.assertNotEqual(str(n6), str(d6)) + self.assertNotEqual(repr(n6), repr(d6)) + self.assertNotIn(repr(n6), reps) + + # ...but None keys work just fine + self.assertEqual(str(n7), str(d7)) + self.assertEqual(repr(n7), repr(d7)) + self.assertIn(repr(n7), reps) + + def test_rich_comparison_and_len(self): + # dicts for testing + d0 = {} # Empty dictionary + d1 = {1: 'Elephant'} # Single numeric key + d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + + # Construct NumDicts from dicts + n = NumDict() + n0 = NumDict(d0) + n1 = NumDict(d1) + n2 = NumDict(d2) + + # Construct NumDicts from NumDicts + nn = NumDict(n) + nn0 = NumDict(n0) + nn1 = NumDict(n1) + nn2 = NumDict(n2) + + all_dicts = [d0, d1, d2, n, n0, n1, n2, nn, nn0, nn1, nn2] + for a in all_dicts: + for b in all_dicts: + self.assertEqual(a == b, len(a) == len(b)) + + def test_dict_access_and_modification(self): + # dicts for testing + d0 = {} # Empty dictionary + d1 = {1: 'Elephant'} # Single numeric key + d2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys + + # Construct NumDicts from dicts + n0 = NumDict() + n1 = NumDict(d1) + n2 = NumDict(d2) + + # test __getitem__ + self.assertEqual(n2[1], 'Elephant') + with self.assertRaises(KeyError): + n1['Mouse'] # key is not numeric + with self.assertRaises(KeyError): + n1.__getitem__('Mouse') # key is not numeric + with self.assertRaises(KeyError): + n1[None] # key does not exist + with self.assertRaises(KeyError): + n1.__getitem__(None) # key does not exist + + # Test __setitem__ + n3 = NumDict(n2) + self.assertEqual(n2, n3) + + n3[2] = 'Frog' + self.assertNotEqual(n2, n3) + + # Check None keys and numeric key conversion + n3['3'] = 'Armadillo' + n3[None] = 'Cockroach' + + # Check long ints + n3[12390809518259081208909880312] = 'Squid' + n3['12390809518259081208909880312'] = 'Octopus' + self.assertEqual(n3[12390809518259081208909880312], 'Octopus') + + with self.assertRaises(TypeError): + n3.__setitem__('Gorilla', 1) # key is not numeric + with self.assertRaises(TypeError): + n3['Chimpanzee'] = 1 # key is not numeric + with self.assertRaises(TypeError): + n3[(4, 1)] = 1 # key is not numeric + with self.assertRaises(TypeError): + n3[[1, 3, 4]] = 1 # key is not numeric and is not hashable + + # Test __delitem__ + del n3[3] + del n3[None] + with self.assertRaises(KeyError): + del n3[3] # already deleted + with self.assertRaises(KeyError): + n3.__delitem__(3) # already deleted + with self.assertRaises(KeyError): + del n3['Mouse'] # key would not exist, since it is not numeric + + # Test clear + n3.clear() + self.assertEqual(n3, {}) + + # Test copy() + n2a = d2.copy() + self.assertEqual(n2, n2a) + n2b = n2.copy() + self.assertEqual(n2b, n2) + n2c = UserDict({1: 'Elephant', 2: 'Mouse'}) + n2d = n2c.copy() # making a copy of a UserDict is special cased + self.assertEqual(n2c, n2d) + + class MyNumDict(NumDict): + """ + subclass Numdict for testing + """ + def display(self): + """ + add a method to subclass to differentiate from superclass + """ + print('MyNumDict:', self) + + m2 = MyNumDict(n2) + m2a = m2.copy() + self.assertEqual(m2a, m2) + + m2[1] = 'Frog' + self.assertNotEqual(m2a, m2) + + # Test keys, items, values + self.assertEqual(sorted(n2.keys()), sorted(d2.keys())) + self.assertEqual(sorted(n2.items()), sorted(d2.items())) + self.assertEqual(sorted(n2.values()), sorted(d2.values())) + + # Test "in". + for i in n2: + self.assertIn(i, n2) + self.assertEqual(i in n1, i in d1) + self.assertEqual(i in n0, i in d0) + + self.assertFalse(None in n2) + self.assertEqual(None in n2, None in d2) + + d2[None] = 'Cow' + n2[None] = d2[None] + self.assertTrue(None in n2) + self.assertEqual(None in n2, None in d2) + + self.assertEqual(n2.has_key(None), None in d2) + if not PY3: + self.assertEqual(n2.has_key(None), d2.has_key(None)) + self.assertFalse('Penguin' in n2) + + # Test update + t = NumDict() + t.update(d2) + self.assertEqual(t, n2) + + # Test get + for i in n2: + self.assertEqual(n2.get(i), n2[i]) + self.assertEqual(n1.get(i), d1.get(i)) + self.assertEqual(n0.get(i), d0.get(i)) + + for i in ['purple', None, 12312301924091284, 23]: + self.assertEqual(n2.get(i), d2.get(i), i) + + with self.assertRaises(AssertionError): + i = '1' + self.assertEqual(n2.get(i), d2.get(i), i) # d2 expects string key which does not exist + + # Test "in" iteration. + n2b = n2 + for i in range(20): + n2[i] = str(i) + n2b[str(i)] = str(i) + self.assertEqual(n2, n2b) + + ikeys = [] + for k in n2: + ikeys.append(k) + self.assertEqual(set(ikeys), set(n2.keys())) + + # Test setdefault + x = 1 + t = NumDict() + self.assertEqual(t.setdefault(x, 42), 42) + self.assertEqual(t.setdefault(x, '42'), 42) + self.assertNotEqual(t.setdefault(x, 42), '42') + self.assertNotEqual(t.setdefault(x, '42'), '42') + self.assertIn(x, t) + + self.assertEqual(t.setdefault(x, 23), 42) + self.assertEqual(t.setdefault(x, '23'), 42) + self.assertNotEqual(t.setdefault(x, 23), '42') + self.assertNotEqual(t.setdefault(x, '23'), '42') + self.assertIn(x, t) + + # Test pop + x = 1 + t = NumDict({x: 42}) + self.assertEqual(t.pop(x), 42) + self.assertRaises(KeyError, t.pop, x) + self.assertEqual(t.pop(x, 1), 1) + t[x] = 42 + self.assertEqual(t.pop(x, 1), 42) + + # Test popitem + x = 1 + t = NumDict({x: 42}) + self.assertEqual(t.popitem(), (x, 42)) + self.assertRaises(KeyError, t.popitem) + + def test_missing(self): + # Make sure NumDict doesn't have a __missing__ method + self.assertEqual(hasattr(NumDict, "__missing__"), False) + + class D(NumDict): + """ + subclass defines __missing__ method returning a value + """ + def __missing__(self, key): + return 42 + + d = D({1: 2, 3: 4}) + self.assertEqual(d[1], 2) + self.assertEqual(d[3], 4) + self.assertNotIn(2, d) + self.assertNotIn(2, d.keys()) + self.assertEqual(d[2], 42) + + class E(NumDict): + """ + subclass defines __missing__ method raising RuntimeError + """ + def __missing__(self, key): + raise RuntimeError(key) + + e = E() + try: + e[42] + except RuntimeError as err: + self.assertEqual(err.args, (42,)) + else: + self.fail("e[42] didn't raise RuntimeError") + + class F(NumDict): + """ + subclass sets __missing__ instance variable (no effect) + """ + def __init__(self): + # An instance variable __missing__ should have no effect + self.__missing__ = lambda key: None + NumDict.__init__(self) + f = F() + try: + f[42] + except KeyError as err: + self.assertEqual(err.args, (42,)) + else: + self.fail("f[42] didn't raise KeyError") + + class G(NumDict): + """ + subclass doesn't define __missing__ at a all + """ + pass + + g = G() + try: + g[42] + except KeyError as err: + self.assertEqual(err.args, (42,)) + else: + self.fail("g[42] didn't raise KeyError") + + class H(D): + """ + subclass calls super classes __missing__ and modifies the value before returning it + """ + def __missing__(self, key): + return super(H, self).__missing__(key) + 1 + + h = H() + self.assertEqual(h[None], d[None]+1) + + +def test_main(): + import logging + log = logging.getLogger(__name__) + logging.basicConfig(level=logging.DEBUG) + + log.info("=======================") + log.info("STARTING - COMMON TESTS") + log.info("=======================") + log.info("######################################################################") + + suite = unittest.TestLoader().loadTestsFromTestCase(NumDictTest) + unittest.TextTestRunner(verbosity=2).run(suite) + + +if __name__ == "__main__": + test_main() -- GitLab From 38e56b3bf5b168942b1d1e4ae5537dfd2da59edf Mon Sep 17 00:00:00 2001 From: labrys <labrys@useres.noreply.github.com> Date: Sun, 15 Nov 2015 10:25:54 -0500 Subject: [PATCH 211/215] Streamline common tests and PEPs --- tests/common_tests.py | 284 ++++++++++++++++++++++++++++-------------- 1 file changed, 190 insertions(+), 94 deletions(-) diff --git a/tests/common_tests.py b/tests/common_tests.py index eca9777d5..1ba62d02d 100644 --- a/tests/common_tests.py +++ b/tests/common_tests.py @@ -1,155 +1,251 @@ +# coding=utf-8 + +""" +Unit Tests for sickbeard/common.py +""" + import sys import os.path +import unittest sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))) sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -import unittest - from sickbeard import common class QualityTests(unittest.TestCase): + """ + Test Case for common.Quality + """ # TODO: repack / proper ? air-by-date ? season rip? multi-ep? def test_SDTV(self): - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.PDTV.XViD-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.PDTV.x264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.HDTV.XViD-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.HDTV.x264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.DSR.XViD-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.DSR.x264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.TVRip.XViD-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.TVRip.x264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.WEBRip.XViD-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.WEBRip.x264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.WEB-DL.x264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.WEB-DL.AAC2.0.H.264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02 WEB-DL H 264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02_WEB-DL_H_264-GROUP")) - self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test.Show.S01E02.WEB-DL.AAC2.0.H264-GROUP")) + """ + Test SDTV against nameQuality + """ + tests = [ + "Test.Show.S01E02.PDTV.XViD-GROUP", + "Test.Show.S01E02.PDTV.x264-GROUP", + "Test.Show.S01E02.HDTV.XViD-GROUP", + "Test.Show.S01E02.HDTV.x264-GROUP", + "Test.Show.S01E02.DSR.XViD-GROUP", + "Test.Show.S01E02.DSR.x264-GROUP", + "Test.Show.S01E02.TVRip.XViD-GROUP", + "Test.Show.S01E02.TVRip.x264-GROUP", + "Test.Show.S01E02.WEBRip.XViD-GROUP", + "Test.Show.S01E02.WEBRip.x264-GROUP", + "Test.Show.S01E02.WEB-DL.x264-GROUP", + "Test.Show.S01E02.WEB-DL.AAC2.0.H.264-GROUP", + "Test.Show.S01E02 WEB-DL H 264-GROUP", + "Test.Show.S01E02_WEB-DL_H_264-GROUP", + "Test.Show.S01E02.WEB-DL.AAC2.0.H264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality(test)) def test_SDDVD(self): - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.DVDRiP.XViD-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.DVDRiP.DiVX-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.DVDRiP.x264-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.DVDRip.WS.XViD-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.DVDRip.WS.DiVX-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.DVDRip.WS.x264-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.BDRIP.XViD-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.BDRIP.DiVX-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.BDRIP.x264-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.BDRIP.WS.XViD-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.BDRIP.WS.DiVX-GROUP")) - self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test.Show.S01E02.BDRIP.WS.x264-GROUP")) + """ + Test SDDVD against nameQuality + """ + tests = [ + "Test.Show.S01E02.DVDRiP.XViD-GROUP", + "Test.Show.S01E02.DVDRiP.DiVX-GROUP", + "Test.Show.S01E02.DVDRiP.x264-GROUP", + "Test.Show.S01E02.DVDRip.WS.XViD-GROUP", + "Test.Show.S01E02.DVDRip.WS.DiVX-GROUP", + "Test.Show.S01E02.DVDRip.WS.x264-GROUP", + "Test.Show.S01E02.BDRIP.XViD-GROUP", + "Test.Show.S01E02.BDRIP.DiVX-GROUP", + "Test.Show.S01E02.BDRIP.x264-GROUP", + "Test.Show.S01E02.BDRIP.WS.XViD-GROUP", + "Test.Show.S01E02.BDRIP.WS.DiVX-GROUP", + "Test.Show.S01E02.BDRIP.WS.x264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality(test)) def test_HDTV(self): - self.assertEqual(common.Quality.HDTV, common.Quality.nameQuality("Test.Show.S01E02.720p.HDTV.x264-GROUP")) - self.assertEqual(common.Quality.HDTV, common.Quality.nameQuality("Test.Show.S01E02.HR.WS.PDTV.x264-GROUP")) + """ + Test HDTV against nameQuality + """ + tests = [ + "Test.Show.S01E02.720p.HDTV.x264-GROUP", + "Test.Show.S01E02.HR.WS.PDTV.x264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.HDTV, common.Quality.nameQuality(test)) def test_RAWHDTV(self): - self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality("Test.Show.S01E02.720p.HDTV.DD5.1.MPEG2-GROUP")) - self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality("Test.Show.S01E02.1080i.HDTV.DD2.0.MPEG2-GROUP")) - self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality("Test.Show.S01E02.1080i.HDTV.H.264.DD2.0-GROUP")) - self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality("Test Show - S01E02 - 1080i HDTV MPA1.0 H.264 - GROUP")) - self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality("Test.Show.S01E02.1080i.HDTV.DD.5.1.h264-GROUP")) + """ + Test RAWHDTV against nameQuality + """ + tests = [ + "Test.Show.S01E02.720p.HDTV.DD5.1.MPEG2-GROUP", + "Test.Show.S01E02.1080i.HDTV.DD2.0.MPEG2-GROUP", + "Test.Show.S01E02.1080i.HDTV.H.264.DD2.0-GROUP", + "Test Show - S01E02 - 1080i HDTV MPA1.0 H.264 - GROUP", + "Test.Show.S01E02.1080i.HDTV.DD.5.1.h264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality(test)) def test_FULLHDTV(self): - self.assertEqual(common.Quality.FULLHDTV, common.Quality.nameQuality("Test.Show.S01E02.1080p.HDTV.x264-GROUP")) + """ + Test FULLHDTV against nameQuality + """ + tests = [ + "Test.Show.S01E02.1080p.HDTV.x264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.FULLHDTV, common.Quality.nameQuality(test)) def test_HDWEBDL(self): - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.720p.WEB-DL-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.720p.WEBRip-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.WEBRip.720p.H.264.AAC.2.0-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.720p.WEB-DL.AAC2.0.H.264-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test Show S01E02 720p WEB-DL AAC2 0 H 264-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test_Show.S01E02_720p_WEB-DL_AAC2.0_H264-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.720p.WEB-DL.AAC2.0.H264-GROUP")) - self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.720p.iTunes.Rip.H264.AAC-GROUP")) + """ + Test HDWEBDL against nameQuality + """ + tests = [ + "Test.Show.S01E02.720p.WEB-DL-GROUP", + "Test.Show.S01E02.720p.WEBRip-GROUP", + "Test.Show.S01E02.WEBRip.720p.H.264.AAC.2.0-GROUP", + "Test.Show.S01E02.720p.WEB-DL.AAC2.0.H.264-GROUP", + "Test Show S01E02 720p WEB-DL AAC2 0 H 264-GROUP", + "Test_Show.S01E02_720p_WEB-DL_AAC2.0_H264-GROUP", + "Test.Show.S01E02.720p.WEB-DL.AAC2.0.H264-GROUP", + "Test.Show.S01E02.720p.iTunes.Rip.H264.AAC-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality(test)) def test_FULLHDWEBDL(self): - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.1080p.WEB-DL-GROUP")) - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.1080p.WEBRip-GROUP")) - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.WEBRip.1080p.H.264.AAC.2.0-GROUP")) - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.WEBRip.1080p.H264.AAC.2.0-GROUP")) - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test.Show.S01E02.1080p.iTunes.H.264.AAC-GROUP")) - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test Show S01E02 1080p iTunes H 264 AAC-GROUP")) - self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test_Show_S01E02_1080p_iTunes_H_264_AAC-GROUP")) + """ + Test FULLHDWEBDL against nameQuality + """ + tests = [ + "Test.Show.S01E02.1080p.WEB-DL-GROUP", + "Test.Show.S01E02.1080p.WEBRip-GROUP", + "Test.Show.S01E02.WEBRip.1080p.H.264.AAC.2.0-GROUP", + "Test.Show.S01E02.WEBRip.1080p.H264.AAC.2.0-GROUP", + "Test.Show.S01E02.1080p.iTunes.H.264.AAC-GROUP", + "Test Show S01E02 1080p iTunes H 264 AAC-GROUP", + "Test_Show_S01E02_1080p_iTunes_H_264_AAC-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality(test)) def test_HDBLURAY(self): - self.assertEqual(common.Quality.HDBLURAY, common.Quality.nameQuality("Test.Show.S01E02.720p.BluRay.x264-GROUP")) - self.assertEqual(common.Quality.HDBLURAY, common.Quality.nameQuality("Test.Show.S01E02.720p.HDDVD.x264-GROUP")) + """ + Test HDBLURAY against nameQuality + """ + tests = [ + "Test.Show.S01E02.720p.BluRay.x264-GROUP", + "Test.Show.S01E02.720p.HDDVD.x264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.HDBLURAY, common.Quality.nameQuality(test)) def test_FULLHDBLURAY(self): - self.assertEqual(common.Quality.FULLHDBLURAY, common.Quality.nameQuality("Test.Show.S01E02.1080p.BluRay.x264-GROUP")) - self.assertEqual(common.Quality.FULLHDBLURAY, common.Quality.nameQuality("Test.Show.S01E02.1080p.HDDVD.x264-GROUP")) + """ + Test FULLHDBLURAY against nameQuality + """ + tests = [ + "Test.Show.S01E02.1080p.BluRay.x264-GROUP", + "Test.Show.S01E02.1080p.HDDVD.x264-GROUP", + ] + for test in tests: + self.assertEqual(common.Quality.FULLHDBLURAY, common.Quality.nameQuality(test)) def test_UNKNOWN(self): - self.assertEqual(common.Quality.UNKNOWN, common.Quality.nameQuality("Test.Show.S01E02-SiCKBEARD")) - -# def test_reverse_parsing(self): -# self.assertEqual(common.Quality.SDTV, common.Quality.nameQuality("Test Show - S01E02 - SDTV - GROUP")) -# self.assertEqual(common.Quality.SDDVD, common.Quality.nameQuality("Test Show - S01E02 - SD DVD - GROUP")) -# self.assertEqual(common.Quality.HDTV, common.Quality.nameQuality("Test Show - S01E02 - HDTV - GROUP")) -# self.assertEqual(common.Quality.RAWHDTV, common.Quality.nameQuality("Test Show - S01E02 - RawHD - GROUP")) -# self.assertEqual(common.Quality.FULLHDTV, common.Quality.nameQuality("Test Show - S01E02 - 1080p HDTV - GROUP")) -# self.assertEqual(common.Quality.HDWEBDL, common.Quality.nameQuality("Test Show - S01E02 - 720p WEB-DL - GROUP")) -# self.assertEqual(common.Quality.FULLHDWEBDL, common.Quality.nameQuality("Test Show - S01E02 - 1080p WEB-DL - GROUP")) -# self.assertEqual(common.Quality.HDBLURAY, common.Quality.nameQuality("Test Show - S01E02 - 720p BluRay - GROUP")) -# self.assertEqual(common.Quality.FULLHDBLURAY, common.Quality.nameQuality("Test Show - S01E02 - 1080p BluRay - GROUP")) -# self.assertEqual(common.Quality.UNKNOWN, common.Quality.nameQuality("Test Show - S01E02 - Unknown - SiCKBEARD")) + """ + Test UNKNOWN against nameQuality + """ + tests = [ + "Test.Show.S01E02-SiCKBEARD", + ] + for test in tests: + self.assertEqual(common.Quality.UNKNOWN, common.Quality.nameQuality(test)) + + @unittest.expectedFailure + # reverse parsing does not work + def test_reverse_parsing(self): + """ + Test reverse parsing for all qualities + """ + tests = [ + (common.Quality.SDTV, "Test Show - S01E02 - SDTV - GROUP"), + (common.Quality.SDDVD, "Test Show - S01E02 - SD DVD - GROUP"), + (common.Quality.HDTV, "Test Show - S01E02 - HDTV - GROUP"), + (common.Quality.RAWHDTV, "Test Show - S01E02 - RawHD - GROUP"), + (common.Quality.FULLHDTV, "Test Show - S01E02 - 1080p HDTV - GROUP"), + (common.Quality.HDWEBDL, "Test Show - S01E02 - 720p WEB-DL - GROUP"), + (common.Quality.FULLHDWEBDL, "Test Show - S01E02 - 1080p WEB-DL - GROUP"), + (common.Quality.HDBLURAY, "Test Show - S01E02 - 720p BluRay - GROUP"), + (common.Quality.FULLHDBLURAY, "Test Show - S01E02 - 1080p BluRay - GROUP"), + (common.Quality.UNKNOWN, "Test Show - S01E02 - Unknown - SiCKBEARD"), + ] + for test in tests: + quality, test = test + self.assertEqual(quality, common.Quality.nameQuality(test), + (quality, common.Quality.nameQuality(test), test)) class StatusStringsTest(unittest.TestCase): - # todo: Split tests into separate tests and add additional tests + """ + Test Case for common.StatusStrings + """ + # TODO: Split tests into separate tests and add additional tests + + # Until .has_key() is removed from SickRage, we will test that it still works as expected + # pylint disable:W0402 + # Use of a deprecated module def test_all(self): - ss = common.statusStrings + """ + Run all status strings tests + """ + status_strings = common.statusStrings valid = 1, 112, '1', '112' unused = 122, 99998989899878676, '99998989899878676', None invalid = 'Elephant', (4, 1), [1, 233, 4, None] for i in valid: - self.assertTrue(i in ss) + self.assertTrue(i in status_strings) for i in unused: - self.assertFalse(i in ss) + self.assertFalse(i in status_strings) with self.assertRaises(KeyError): - ss[i] - - for i in ss: - self.assertEqual(ss[i], ss[str(i)]) - self.assertEqual(i in ss, str(i) in ss) - self.assertEqual(ss.has_key(i), ss.has_key(str(i))) - self.assertEqual(i in ss, ss.has_key(i)) - # self.assertEqual(ss.statusStrings[i], ss.statusStrings[str(i)]) # fails with KeyError - - for i in ss.qualities: - self.assertEqual(ss[i], ss[str(i)]) - self.assertEqual(i in ss, str(i) in ss) - self.assertEqual(ss.has_key(i), ss.has_key(str(i))) - self.assertEqual(i in ss, ss.has_key(i)) - # self.assertEqual(ss.statusStrings[i], ss.statusStrings[str(i)]) # fails with KeyError + self.assertTrue(status_strings[i]) + + for i in status_strings: + self.assertEqual(status_strings[i], status_strings[str(i)]) + self.assertEqual(i in status_strings, str(i) in status_strings) + self.assertEqual(status_strings.has_key(i), status_strings.has_key(str(i))) + self.assertEqual(i in status_strings, status_strings.has_key(i)) + + for i in status_strings.qualities: + self.assertEqual(status_strings[i], status_strings[str(i)]) + self.assertEqual(i in status_strings, str(i) in status_strings) + self.assertEqual(status_strings.has_key(i), status_strings.has_key(str(i))) + self.assertEqual(i in status_strings, status_strings.has_key(i)) for i in invalid: with self.assertRaises(TypeError): - ss[i] = 1 + status_strings[i] = 1 for i in unused: if i is None: with self.assertRaises(TypeError): - ss[str(i)] = 1 # converting None to a string makes this invalid since 'None' != None... - ss[i] = 1 # ...but None can still be used as a key + status_strings[str(i)] = 1 # 'None' != None + status_strings[i] = 1 # ...but None can still be used as a key else: - ss[str(i)] = 1 - self.assertEqual(ss[i], 1) + status_strings[str(i)] = 1 + self.assertEqual(status_strings[i], 1) if __name__ == '__main__': print "=======================" print "STARTING - COMMON TESTS" print "=======================" - print "######################################################################" suite = unittest.TestLoader().loadTestsFromTestCase(QualityTests) unittest.TextTestRunner(verbosity=2).run(suite) -- GitLab From a1b993727e925792176262c22233b553a2921ec4 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Mon, 16 Nov 2015 13:50:24 +1030 Subject: [PATCH 212/215] fix failedDownload each loop --- gui/slick/js/failedDownloads.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/slick/js/failedDownloads.js b/gui/slick/js/failedDownloads.js index 7b8a16a81..f599e4129 100644 --- a/gui/slick/js/failedDownloads.js +++ b/gui/slick/js/failedDownloads.js @@ -23,7 +23,7 @@ $(document).ready(function(){ }); if($('.removeCheck').length){ - $('.removeCheck').forEach(function(name) { + $('.removeCheck').each(function(name) { var lastCheck = null; $(name).click(function(event) { if(!lastCheck || !event.shiftKey) { -- GitLab From 9ec13644e2d3494761c793511e43300a842411de Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Mon, 16 Nov 2015 14:07:33 +1030 Subject: [PATCH 213/215] add bootstrap-formhelpers --- .build/Gruntfile.js | 3 +++ .build/bower.json | 3 ++- gui/slick/js/vender.min.js | Bin 658226 -> 948578 bytes 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.build/Gruntfile.js b/.build/Gruntfile.js index 470fad0bf..56bac94ee 100644 --- a/.build/Gruntfile.js +++ b/.build/Gruntfile.js @@ -14,6 +14,9 @@ module.exports = function(grunt) { 'dist/js/widgets/widget-columnSelector.min.js', 'dist/js/widgets/widget-stickyHeaders.min.js', 'dist/css/theme.blue.min.css' + ], + 'bootstrap-formhelpers': [ + 'dist/js/bootstrap-formhelpers.min.js' ] }, bowerOptions: { diff --git a/.build/bower.json b/.build/bower.json index 431e80790..8954ee4c8 100644 --- a/.build/bower.json +++ b/.build/bower.json @@ -23,6 +23,7 @@ "pnotify": "~2.1.0", "qtip2": "~2.2.1", "tablesorter": "jquery.tablesorter#~2.24.5", - "jquery-confirm": "~2.5.2" + "jquery-confirm": "~2.5.2", + "bootstrap-formhelpers": "~2.3.0" } } diff --git a/gui/slick/js/vender.min.js b/gui/slick/js/vender.min.js index c245f1543ebd54fe038c79c995029862505ada3e..183aaff7e388bfb2a7c84d7927c2a2dd9d0f255f 100644 GIT binary patch delta 284852 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 delta 355 zcmaF#$#T;)jfO3ZnV!=HU$ZJ~@9|`8)}1a;&S=48&9&X5oKZe;I(HH;*Y^2tY?0#A zvtrovw`;_)g|aYmZLdvYyHT+{>^7Sz3rKPIeYQ&#+v6hG>p+rsV%Qf}OkaAPJ$(Ds ztL$7Lq5C)44^(Vl5X3PN#4`-%=&9Jg?>t8ph-YzyqpxE7aUaem5YID^b6Umr2PZkV zvoLZ^FFeJmzx~)bPMwPFpWV1tgA~m3=Gsy*-De*c_x89WTtOhA4JWv^RZJK3=FZrD z!I3)~<fQ3m{JAe~_qFAAVcH(x$!$|QeNqO`r0oj(xz#}CehB8#+g@^*Td`vMG;5wC zAVZ=Yc)}~TZ`#4L6Qp3FIIqO^=Dj?%726rjcsGL-Y_Z}!S+TutGp`p56Ic24joWxd ix8K{&yRc&W(i^;BpUB_k)nT3Psmsp2-O!59&>jG`vw=1M -- GitLab From 926c17ac4b00d3db86c68b9da0b5504de6039e15 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Mon, 16 Nov 2015 14:40:28 +1030 Subject: [PATCH 214/215] remove incorrect classes for modal --- gui/slick/js/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/slick/js/core.js b/gui/slick/js/core.js index abd37f301..1fcbeae56 100644 --- a/gui/slick/js/core.js +++ b/gui/slick/js/core.js @@ -3,7 +3,7 @@ var srRoot = getMeta('srRoot'), themeSpinner = getMeta('themeSpinner'), anonURL = getMeta('anonURL'), - topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', + topImageHtml = '<img src="' + srRoot + '/images/top.gif" width="31" height="11" alt="Jump to top" />', // jshint ignore:line loading = '<img src="' + srRoot + '/images/loading16' + themeSpinner + '.gif" height="16" width="16" />'; var configSuccess = function(){ -- GitLab From 3d95f8c9346ac6b93b204fc8173e477eb0484284 Mon Sep 17 00:00:00 2001 From: Alexis Tyler <xo@wvvw.me> Date: Mon, 16 Nov 2015 14:40:46 +1030 Subject: [PATCH 215/215] add jscsrc --- .build/.jscsrc | 3 --- .jscsrc | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 .build/.jscsrc create mode 100644 .jscsrc diff --git a/.build/.jscsrc b/.build/.jscsrc deleted file mode 100644 index f5387e9af..000000000 --- a/.build/.jscsrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "preset": "jquery" -} diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 000000000..c13d13dcf --- /dev/null +++ b/.jscsrc @@ -0,0 +1,3 @@ +{ + "validateIndentation": 4 +} -- GitLab