├── .gitignore ├── LICENSE ├── README.md ├── background.js ├── css ├── index.css └── loader.css ├── customData.js ├── img ├── 1.png ├── 2.png ├── add.png ├── edit.png ├── refresh.png ├── rss.png ├── rss_128.png ├── rss_32.png ├── rss_64.png └── top.png ├── index.html ├── js ├── add.js ├── getDate.js ├── index.js ├── jquery.min.js ├── rss.js ├── source.js ├── store.js ├── visiblity.js └── xml2json.js ├── manifest.json └── publish.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 文蔺 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## chrome-crawler 3 | 4 | ### 说明 5 | 6 | - 一个简单的 chrome extension,抓取常看的博客 7 | 8 | - 基于 ajax 请求 + jQury DOM parse 9 | 10 | - 创意来自 `whxaxes` 的 [node-test](https://github.com/whxaxes/node-test/tree/master/server/creeper) 项目 11 | 12 | - 为避免浪费请求,应用已经使用 localStorage 做了 10 min 的缓存,如需强制刷新,可以到点击页面提供的刷新按钮 13 | 14 | ### 使用 15 | 16 | 1. 下载代码并解压 17 | 18 | 2. 在扩展程序管理界面中选中 `开发者模式` 19 | 20 | 3. 点击 `加载已解压的扩展程序...` 按钮,选择代码所在文件夹 21 | 22 | 4. 打开方法1:直接点击图标 23 | 24 | 5. 打开方法2:找到扩展程序的 ID,地址栏中打开 `chrome-extension://{your_extension_id}/index.html`(可以加入到你的书签) 25 | 26 | 6. 添加自己喜欢的网页:修改 `./js/source.js` OR 点击页面上的“+”按钮填写对应的网址及选择器,也支持添加 rss XML 页面。 27 | 28 | ### rss 页面添加 29 | 30 | | 内容 | 值示例 | 备注 | 31 | | ------------- |:-------------:|:-------------:| 32 | | 单列选择器 | rss.channel.entry | `.` 分隔父子层级 | 33 | | 内容选择器 | title | 使用标签名 | 34 | | 属性选择器 | link.$href | 使用标签属性 | 35 | 36 | 37 | ### 38 | 39 | ### Todo 40 | 41 | - 添加自定义页面 42 | 43 | - 自定义数据来源 44 | 45 | - 代码重构 46 | 47 | - 修改编辑数据源 48 | 49 | - 添加更加完备的日期格式化(选择器、正则匹配) 50 | 51 | ---------- 52 | 53 | 54 | 如有问题,欢迎与我联系: 55 | 56 | - angusfu1126@qq.com 57 | 58 | - [https://segmentfault.com/u/wemlin](https://segmentfault.com/u/wemlin) 59 | 60 | -------------------------------------------------------------------------------- /background.js: -------------------------------------------------------------------------------- 1 | 2 | chrome.browserAction.onClicked.addListener(function updateIcon() { 3 | 4 | chrome.tabs.query({ 5 | url: location.protocol + '//' + location.host + '/index.html' 6 | }, function (tabs) { 7 | if (!tabs.length) { 8 | chrome.tabs.create({ 9 | url: "./index.html" 10 | }); 11 | } else { 12 | chrome.tabs.update(tabs[0].id, { selected : true }); 13 | } 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /css/index.css: -------------------------------------------------------------------------------- 1 | 2 | /* Let's get this party started */ 3 | ::-webkit-scrollbar { 4 | width: 6px; 5 | } 6 | /* Handle */ 7 | ::-webkit-scrollbar-thumb { 8 | background: #e2b83d; 9 | } 10 | 11 | html, 12 | body { 13 | margin: 0; 14 | padding: 0; 15 | } 16 | 17 | * { 18 | font-family: "微软雅黑"; 19 | } 20 | 21 | .wrap { 22 | width: 100%; 23 | overflow: hidden; 24 | padding-bottom: 50px; 25 | } 26 | 27 | ul, 28 | li { 29 | margin: 0; 30 | padding: 0; 31 | list-style-type: none !important; 32 | } 33 | 34 | .content { 35 | margin-top: 30px; 36 | -webkit-transition: padding .3s; 37 | transition: padding .3s; 38 | padding-left: 15px; 39 | } 40 | 41 | .mb-nav { 42 | width: 100%; 43 | margin-bottom: 30px; 44 | } 45 | 46 | .mb-blog-name { 47 | display: block; 48 | margin: 10px; 49 | font-size: 20px; 50 | font-weight: bold; 51 | -webkit-transition: color .3s; 52 | transition: color .3s; 53 | } 54 | 55 | .mb-item, 56 | .no-data { 57 | -webkit-transition: background-color .3s; 58 | transition: background-color .3s; 59 | } 60 | 61 | .mb-item { 62 | display: -webkit-box; 63 | display: flex; 64 | } 65 | 66 | a { 67 | outline: none; 68 | color: #333; 69 | text-decoration: none !important; 70 | } 71 | 72 | .mb-item a { 73 | display: block; 74 | padding: 0 20px; 75 | line-height: 30px; 76 | -webkit-transition: padding .3s; 77 | transition: padding .3s; 78 | 79 | flex: 1; 80 | -webkit-box-flex: 1; 81 | overflow: hidden; 82 | white-space: nowrap; 83 | -ms-text-overflow: ellipsis; 84 | text-overflow: ellipsis; 85 | } 86 | 87 | .blog-time { 88 | font-size: 13px; 89 | line-height: 30px; 90 | } 91 | 92 | .left-side { 93 | position: fixed; 94 | width: 200px; 95 | top: 20px; 96 | bottom: 20px; 97 | left: 50px; 98 | margin: auto; 99 | z-index: 999; 100 | -webkit-transition: -webkit-transform .3s; 101 | transition: transform .3s; 102 | -webkit-transform: translate3d(-185px, 0, 0); 103 | transform: translate3d(-185px, 0, 0); 104 | cursor: pointer; 105 | overflow-y: auto; 106 | } 107 | 108 | .keys { 109 | margin-top: 30px; 110 | } 111 | 112 | .close { 113 | position: absolute; 114 | display: none; 115 | color: #eee; 116 | width: 30px; 117 | line-height: 30px; 118 | right: 5px; 119 | top: 5px; 120 | text-align: center; 121 | } 122 | 123 | .close:hover { 124 | color: #FFF; 125 | } 126 | 127 | .keys li { 128 | display: block; 129 | color: #333; 130 | padding: 5px 10px; 131 | opacity: .8; 132 | } 133 | 134 | .keys li:hover { 135 | opacity: 1; 136 | } 137 | 138 | .keys .loading { 139 | opacity: .2 !important; 140 | } 141 | /*显示左边栏*/ 142 | 143 | .show-side .close { 144 | display: block; 145 | } 146 | 147 | .show-side .left-side { 148 | -webkit-transform: translate3d(0, 0, 0); 149 | transform: translate3d(0, 0, 0); 150 | } 151 | 152 | .show-side .content { 153 | /*padding-left: 200px;*/ 154 | width: 600px; 155 | margin: auto; 156 | } 157 | 158 | .hide { 159 | display: none; 160 | } 161 | #loader { 162 | position: absolute; 163 | top: 50%; 164 | bottom: 0; 165 | right: 0; 166 | left: 50%; 167 | width: 100px; 168 | height: 100px; 169 | margin-top: -50px; 170 | margin-left: -50px; 171 | } 172 | .load3 { 173 | margin: 0; 174 | } 175 | 176 | @media screen and (max-width: 1120px){ 177 | .left-side { 178 | display: none; 179 | } 180 | .show-side .content { 181 | width: 600px; 182 | } 183 | } 184 | 185 | @media screen and (min-width: 1400px){ 186 | .show-side .content { 187 | width: 900px; 188 | } 189 | } 190 | 191 | .tools { 192 | position: fixed; 193 | right: 60px; 194 | bottom: 60px; 195 | } 196 | .tools > div { 197 | cursor: pointer; 198 | width: 30px; 199 | height: 30px; 200 | margin-top: 5px; 201 | transition: all .5s; 202 | } 203 | #refresh { 204 | background: #fff url(../img/refresh.png) center center no-repeat; 205 | background-size: 50%; 206 | } 207 | #toTop { 208 | background: #fff url(../img/top.png) center center no-repeat; 209 | background-size: 50%; 210 | } 211 | #addRes { 212 | background: #fff url(../img/add.png) center center no-repeat; 213 | background-size: 50%; 214 | } 215 | #editRes { 216 | background: #fff url(../img/edit.png) center center no-repeat; 217 | background-size: 50%; 218 | } 219 | #addRSS { 220 | background: #fff url(../img/rss.png) center center no-repeat; 221 | background-size: 50%; 222 | } 223 | .tools > div:hover { 224 | opacity: .6; 225 | transform: scale(1.1) 226 | } 227 | .new { 228 | color: red !important; 229 | } 230 | .trans-bg { 231 | z-index: 999; 232 | display: none; 233 | position: fixed; 234 | left: 0; 235 | top: 0; 236 | bottom: 0; 237 | right: 0; 238 | background-color: rgba(172, 172, 172, .8); 239 | } 240 | #addPop { 241 | position: fixed; 242 | top: 50%; 243 | left: 50%; 244 | width: 600px; 245 | height: 480px; 246 | margin-left: -300px; 247 | margin-top: -240px; 248 | background-color: #fff; 249 | -webkit-box-sizing: border-box; 250 | -moz-box-sizing: border-box; 251 | box-sizing: border-box; 252 | padding: 20px; 253 | } 254 | .trans-bg input { 255 | display: block; 256 | -webkit-box-sizing: border-box; 257 | -moz-box-sizing: border-box; 258 | box-sizing: border-box; 259 | width: 100%; 260 | height: 30px; 261 | padding: 0 15px; 262 | font-size: 12px; 263 | margin: 20px 0; 264 | } 265 | #rssPop { 266 | position: fixed; 267 | top: 50%; 268 | left: 50%; 269 | width: 600px; 270 | height: 480px; 271 | margin-left: -300px; 272 | margin-top: -240px; 273 | background-color: #fff; 274 | -webkit-box-sizing: border-box; 275 | -moz-box-sizing: border-box; 276 | box-sizing: border-box; 277 | padding: 20px; 278 | } -------------------------------------------------------------------------------- /css/loader.css: -------------------------------------------------------------------------------- 1 | /* load1 */ 2 | .load1 { 3 | margin: 100px auto; 4 | width: 50px; 5 | height: 60px; 6 | text-align: center; 7 | font-size: 10px; 8 | } 9 | .load1 > div { 10 | background-color: #67CF22; 11 | height: 100%; 12 | width: 6px; 13 | display: inline-block; 14 | -webkit-animation: stretchdelay 1.2s infinite ease-in-out; 15 | animation: stretchdelay 1.2s infinite ease-in-out; 16 | } 17 | .load1 .rect2 { 18 | -webkit-animation-delay: -1.1s; 19 | animation-delay: -1.1s; 20 | } 21 | .load1 .rect3 { 22 | -webkit-animation-delay: -1.0s; 23 | animation-delay: -1.0s; 24 | } 25 | .load1 .rect4 { 26 | -webkit-animation-delay: -0.9s; 27 | animation-delay: -0.9s; 28 | } 29 | .load1 .rect5 { 30 | -webkit-animation-delay: -0.8s; 31 | animation-delay: -0.8s; 32 | } 33 | @-webkit-keyframes stretchdelay { 34 | 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } 35 | 20% { -webkit-transform: scaleY(1.0) } 36 | } 37 | @keyframes stretchdelay { 38 | 0%, 40%, 100% { 39 | transform: scaleY(0.4); 40 | -webkit-transform: scaleY(0.4); 41 | } 20% { 42 | transform: scaleY(1.0); 43 | -webkit-transform: scaleY(1.0); 44 | } 45 | } 46 | 47 | /* load2 */ 48 | .load2 { 49 | width: 60px; 50 | height: 60px; 51 | background-color: #67CF22; 52 | margin: 100px auto; 53 | -webkit-animation: rotateplane 1.2s infinite ease-in-out; 54 | animation: rotateplane 1.2s infinite ease-in-out; 55 | } 56 | @-webkit-keyframes rotateplane { 57 | 0% { -webkit-transform: perspective(120px) } 58 | 50% { -webkit-transform: perspective(120px) rotateY(180deg) } 59 | 100% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) } 60 | } 61 | @keyframes rotateplane { 62 | 0% { 63 | transform: perspective(120px) rotateX(0deg) rotateY(0deg); 64 | -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg) 65 | } 50% { 66 | transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); 67 | -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg) 68 | } 100% { 69 | transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 70 | -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); 71 | } 72 | } 73 | 74 | /* load3 */ 75 | .load3 { 76 | width: 60px; 77 | height: 60px; 78 | position: relative; 79 | margin: 100px auto; 80 | } 81 | .double-bounce1, .double-bounce2 { 82 | width: 100%; 83 | height: 100%; 84 | border-radius: 50%; 85 | background-color: #67CF22; 86 | opacity: 0.6; 87 | position: absolute; 88 | top: 0; 89 | left: 0; 90 | 91 | -webkit-animation: bounce 2.0s infinite ease-in-out; 92 | animation: bounce 2.0s infinite ease-in-out; 93 | } 94 | .double-bounce2 { 95 | -webkit-animation-delay: -1.0s; 96 | animation-delay: -1.0s; 97 | } 98 | @-webkit-keyframes bounce { 99 | 0%, 100% { -webkit-transform: scale(0.0) } 100 | 50% { -webkit-transform: scale(1.0) } 101 | } 102 | @keyframes bounce { 103 | 0%, 100% { 104 | transform: scale(0.0); 105 | -webkit-transform: scale(0.0); 106 | } 50% { 107 | transform: scale(1.0); 108 | -webkit-transform: scale(1.0); 109 | } 110 | } 111 | 112 | /* load4 */ 113 | .load4 { 114 | margin: 100px auto; 115 | width: 32px; 116 | height: 32px; 117 | position: relative; 118 | } 119 | .cube1, .cube2 { 120 | background-color: #67CF22; 121 | width: 30px; 122 | height: 30px; 123 | position: absolute; 124 | top: 0; 125 | left: 0; 126 | -webkit-animation: cubemove 1.8s infinite ease-in-out; 127 | animation: cubemove 1.8s infinite ease-in-out; 128 | } 129 | .cube2 { 130 | -webkit-animation-delay: -0.9s; 131 | animation-delay: -0.9s; 132 | } 133 | @-webkit-keyframes cubemove { 134 | 25% { -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5) } 135 | 50% { -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg) } 136 | 75% { -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5) } 137 | 100% { -webkit-transform: rotate(-360deg) } 138 | } 139 | @keyframes cubemove { 140 | 25% { 141 | transform: translateX(42px) rotate(-90deg) scale(0.5); 142 | -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); 143 | } 50% { 144 | transform: translateX(42px) translateY(42px) rotate(-179deg); 145 | -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); 146 | } 50.1% { 147 | transform: translateX(42px) translateY(42px) rotate(-180deg); 148 | -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); 149 | } 75% { 150 | transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); 151 | -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); 152 | } 100% { 153 | transform: rotate(-360deg); 154 | -webkit-transform: rotate(-360deg); 155 | } 156 | } 157 | 158 | /* load5 */ 159 | .load5 { 160 | margin: 100px auto; 161 | width: 90px; 162 | height: 90px; 163 | position: relative; 164 | text-align: center; 165 | -webkit-animation: rotate 2.0s infinite linear; 166 | animation: rotate 2.0s infinite linear; 167 | } 168 | .dot1, .dot2 { 169 | width: 60%; 170 | height: 60%; 171 | display: inline-block; 172 | position: absolute; 173 | top: 0; 174 | background-color: #67CF22; 175 | border-radius: 100%; 176 | -webkit-animation: bounce 2.0s infinite ease-in-out; 177 | animation: bounce 2.0s infinite ease-in-out; 178 | } 179 | .dot2 { 180 | top: auto; 181 | bottom: 0px; 182 | -webkit-animation-delay: -1.0s; 183 | animation-delay: -1.0s; 184 | } 185 | @-webkit-keyframes rotate { 100% { -webkit-transform: rotate(360deg) }} 186 | @keyframes rotate { 100% { transform: rotate(360deg); -webkit-transform: rotate(360deg) }} 187 | @-webkit-keyframes bounce { 188 | 0%, 100% { -webkit-transform: scale(0.0) } 189 | 50% { -webkit-transform: scale(1.0) } 190 | } 191 | @keyframes bounce { 192 | 0%, 100% { 193 | transform: scale(0.0); 194 | -webkit-transform: scale(0.0); 195 | } 50% { 196 | transform: scale(1.0); 197 | -webkit-transform: scale(1.0); 198 | } 199 | } 200 | 201 | /* load6 */ 202 | .load6 { 203 | margin: 100px auto 0; 204 | width: 150px; 205 | text-align: center; 206 | } 207 | .load6 > div { 208 | width: 30px; 209 | height: 30px; 210 | background-color: #67CF22; 211 | border-radius: 100%; 212 | display: inline-block; 213 | -webkit-animation: bouncedelay 1.4s infinite ease-in-out; 214 | animation: bouncedelay 1.4s infinite ease-in-out; 215 | -webkit-animation-fill-mode: both; 216 | animation-fill-mode: both; 217 | } 218 | .load6 .bounce1 { 219 | -webkit-animation-delay: -0.32s; 220 | animation-delay: -0.32s; 221 | } 222 | .load6 .bounce2 { 223 | -webkit-animation-delay: -0.16s; 224 | animation-delay: -0.16s; 225 | } 226 | @-webkit-keyframes bouncedelay { 227 | 0%, 80%, 100% { -webkit-transform: scale(0.0) } 228 | 40% { -webkit-transform: scale(1.0) } 229 | } 230 | @keyframes bouncedelay { 231 | 0%, 80%, 100% { 232 | transform: scale(0.0); 233 | -webkit-transform: scale(0.0); 234 | } 40% { 235 | transform: scale(1.0); 236 | -webkit-transform: scale(1.0); 237 | } 238 | } 239 | 240 | /* load7 */ 241 | .load7 { 242 | width: 40px; 243 | height: 40px; 244 | margin: 100px auto; 245 | background-color: #333; 246 | border-radius: 100%; 247 | -webkit-animation: scaleout 1.0s infinite ease-in-out; 248 | animation: scaleout 1.0s infinite ease-in-out; 249 | } 250 | @-webkit-keyframes scaleout { 251 | 0% { -webkit-transform: scale(0.0) } 252 | 100% { 253 | -webkit-transform: scale(1.0); 254 | opacity: 0; 255 | } 256 | } 257 | @keyframes scaleout { 258 | 0% { 259 | transform: scale(0.0); 260 | -webkit-transform: scale(0.0); 261 | } 100% { 262 | transform: scale(1.0); 263 | -webkit-transform: scale(1.0); 264 | opacity: 0; 265 | } 266 | } 267 | 268 | /* load8 */ 269 | .load8 { 270 | margin: 100px auto; 271 | width: 20px; 272 | height: 20px; 273 | position: relative; 274 | } 275 | .container1 > div, .container2 > div, .container3 > div { 276 | width: 6px; 277 | height: 6px; 278 | background-color: #333; 279 | border-radius: 100%; 280 | position: absolute; 281 | -webkit-animation: bouncedelay 1.2s infinite ease-in-out; 282 | animation: bouncedelay 1.2s infinite ease-in-out; 283 | -webkit-animation-fill-mode: both; 284 | animation-fill-mode: both; 285 | } 286 | .load8 .load8-container { 287 | position: absolute; 288 | width: 100%; 289 | height: 100%; 290 | } 291 | .container2 { 292 | -webkit-transform: rotateZ(45deg); 293 | transform: rotateZ(45deg); 294 | } 295 | .container3 { 296 | -webkit-transform: rotateZ(90deg); 297 | transform: rotateZ(90deg); 298 | } 299 | .circle1 { top: 0; left: 0; } 300 | .circle2 { top: 0; right: 0; } 301 | .circle3 { right: 0; bottom: 0; } 302 | .circle4 { left: 0; bottom: 0; } 303 | .container2 .circle1 { 304 | -webkit-animation-delay: -1.1s; 305 | animation-delay: -1.1s; 306 | } 307 | .container3 .circle1 { 308 | -webkit-animation-delay: -1.0s; 309 | animation-delay: -1.0s; 310 | } 311 | .container1 .circle2 { 312 | -webkit-animation-delay: -0.9s; 313 | animation-delay: -0.9s; 314 | } 315 | .container2 .circle2 { 316 | -webkit-animation-delay: -0.8s; 317 | animation-delay: -0.8s; 318 | } 319 | .container3 .circle2 { 320 | -webkit-animation-delay: -0.7s; 321 | animation-delay: -0.7s; 322 | } 323 | .container1 .circle3 { 324 | -webkit-animation-delay: -0.6s; 325 | animation-delay: -0.6s; 326 | } 327 | .container2 .circle3 { 328 | -webkit-animation-delay: -0.5s; 329 | animation-delay: -0.5s; 330 | } 331 | .container3 .circle3 { 332 | -webkit-animation-delay: -0.4s; 333 | animation-delay: -0.4s; 334 | } 335 | .container1 .circle4 { 336 | -webkit-animation-delay: -0.3s; 337 | animation-delay: -0.3s; 338 | } 339 | .container2 .circle4 { 340 | -webkit-animation-delay: -0.2s; 341 | animation-delay: -0.2s; 342 | } 343 | .container3 .circle4 { 344 | -webkit-animation-delay: -0.1s; 345 | animation-delay: -0.1s; 346 | } 347 | @-webkit-keyframes bouncedelay { 348 | 0%, 80%, 100% { -webkit-transform: scale(0.0) } 349 | 40% { -webkit-transform: scale(1.0) } 350 | } 351 | @keyframes bouncedelay { 352 | 0%, 80%, 100% { 353 | transform: scale(0.0); 354 | -webkit-transform: scale(0.0); 355 | } 40% { 356 | transform: scale(1.0); 357 | -webkit-transform: scale(1.0); 358 | } 359 | } 360 | -------------------------------------------------------------------------------- /customData.js: -------------------------------------------------------------------------------- 1 | window.customData = { 2 | "risingstack": { 3 | "_c_": true, 4 | "url": "https://blog.risingstack.com/", 5 | "colum": ".main-inner article", 6 | "title": "h1 a", 7 | "time": ".post-time .fulldate", 8 | "link": "h1 a" 9 | }, 10 | 11 | "thoughtram": { 12 | "_c_": true, 13 | "url": "http://blog.thoughtram.io/categories/angular-2/", 14 | "colum": ".thtrm-three-column-list li", 15 | "title": "h2", 16 | "time": "", 17 | "link": ".thtrm-cta.thtrm-cta--small" 18 | }, 19 | 20 | "wolksoftware": { 21 | "_c_": true, 22 | "url": "http://blog.wolksoftware.com/", 23 | "colum": "#container article", 24 | "title": ".article_title a", 25 | "time": "", 26 | "link": ".article_title a" 27 | }, 28 | 29 | "Nicholas Zakas": { 30 | "_c_": true, 31 | "url": "https://www.nczonline.net/", 32 | "colum": ".post-content .post-snippet", 33 | "title": ".post-head h3 a", 34 | "time": ".post-head .byline", 35 | "link": ".post-head h3 a" 36 | }, 37 | 38 | "2ality": { 39 | "_c_":true, 40 | "url":"http://www.2ality.com/", 41 | "colum":"#page-core > div > div:not(.index-date)", 42 | "title":"h2 a", 43 | "time":".date-and-tags", 44 | "link":"h2 a" 45 | }, 46 | 47 | "W3cplus": { 48 | url: "http://www.w3cplus.com/", 49 | colum: ".region-content .node-blog", 50 | handle: function($colum) { 51 | var time = $colum.find(".submitted").text().match(TIME_REG_2); 52 | return { 53 | url: $colum.find("h1>a").attr("href"), 54 | title: $colum.find("h1>a").text(), 55 | time: (time instanceof Array) ? time[0] : "" 56 | } 57 | } 58 | }, 59 | 60 | "W3ctech": { 61 | url: "http://www.w3ctech.com/topic/index", 62 | colum: ".bd_box .topic_list_content", 63 | handle: function($colum) { 64 | var ignoreList = ["意见与建议", "新闻", "活动", "thinkjs"]; 65 | if (ignoreList.indexOf($colum.find(".badge_category").text()) >= 0) return; 66 | 67 | var _time = $colum.find(".relative-date").text(); 68 | var time = _time.match(TIME_REG_2); 69 | return { 70 | url: $colum.find(".topic_title a").attr("href"), 71 | title: $colum.find(".topic_title a").text(), 72 | time: (time instanceof Array) ? time[0] : _time 73 | } 74 | } 75 | }, 76 | 77 | "伯乐在线": { 78 | url: "http://web.jobbole.com/all-posts/", 79 | colum: ".post", 80 | handle: function($colum) { 81 | var time = $colum.find(" .post-meta p").eq(0).text().match(TIME_REG_3); 82 | return { 83 | url: $colum.find(".archive-title").attr("href"), 84 | title: $colum.find(".archive-title").text(), 85 | time: (time instanceof Array) ? time[0] : "" 86 | } 87 | } 88 | }, 89 | 90 | "众成翻译": { 91 | url: 'http://www.zcfy.cc/article/archive', 92 | colum: '.article-list ol li', 93 | handle: function($colum) { 94 | return { 95 | url: $colum.find('a').attr('href'), 96 | title: $colum.find('a').text(), 97 | time: '' 98 | } 99 | } 100 | }, 101 | 102 | "EtherDream": { 103 | "_r_": true, 104 | url: "http://feed.cnblogs.com/blog/u/83633/rss", 105 | "colum": "feed.entry", 106 | "title": "title", 107 | "time": "published", 108 | "link": "id" 109 | }, 110 | 111 | "阮一峰": { 112 | url: "http://www.ruanyifeng.com/blog/javascript/", 113 | colum: "#alpha .module-list-item", 114 | handle: function($colum) { 115 | var time = $colum.find(".hint").text().match(TIME_REG_4); 116 | return { 117 | url: $colum.find("a").attr("href"), 118 | title: $colum.find("a").text(), 119 | time: (time instanceof Array) ? time[0] : "" 120 | } 121 | } 122 | }, 123 | 124 | "张鑫旭": { 125 | url: "http://www.zhangxinxu.com/wordpress/", 126 | colum: ".the_main .post", 127 | handle: function($colum) { 128 | return { 129 | url: $colum.find(".entry-title").attr("href"), 130 | title: $colum.find(".entry-title").text(), 131 | time: $colum.find(".date").text() 132 | } 133 | } 134 | }, 135 | 136 | "小胡子": { 137 | url: 'http://barretlee.com/blog/archives/', 138 | colum: '.cate-detail li', 139 | handle: function($colum) { 140 | var time = time_reg.exec($colum.find("span").text()); 141 | return { 142 | url: $colum.find("a").attr("href"), 143 | title: $colum.find("a").text(), 144 | time: time && time[0] || '' 145 | } 146 | } 147 | }, 148 | 149 | 150 | "叶小钗": { 151 | url: "http://www.cnblogs.com/yexiaochai/", 152 | colum: ".day", 153 | handle: function($colum) { 154 | var time = $colum.find(".dayTitle").text().match(TIME_REG_1); 155 | if (!time) return; 156 | 157 | return { 158 | url: $colum.find(".postTitle a").attr("href"), 159 | title: $colum.find(".postTitle a").text(), 160 | time: time[0] 161 | } 162 | } 163 | }, 164 | 165 | 166 | "月影": { 167 | url: 'https://www.h5jun.com/archives/', 168 | colum: '.entry-content ul li', 169 | handle: function($colum) { 170 | return { 171 | url: $colum.find("a").attr("href"), 172 | title: $colum.find("a").text(), 173 | time: $colum.find("span").text() 174 | } 175 | } 176 | }, 177 | 178 | 179 | "QuQu": { 180 | url: 'https://imququ.com/post/archives.html', 181 | colum: '.entry-content > ul li', 182 | handle: function($colum) { 183 | return { 184 | url: $colum.find("a").attr("href"), 185 | title: $colum.find("a").text(), 186 | time: $colum.find("span").text() 187 | } 188 | } 189 | }, 190 | 191 | "AlloyTeam": { 192 | url: "http://www.alloyteam.com/page/0/", 193 | colum: ".articlemenu>li", 194 | handle: function($colum) { 195 | var time = $colum.find(".blogPs").text().match(TIME_REG_1); 196 | return { 197 | url: $colum.find(".blogTitle").attr("href"), 198 | title: $colum.find(".blogTitle").text().trim(), 199 | time: (time instanceof Array) ? time[0] : "" 200 | } 201 | } 202 | }, 203 | 204 | "meowni.ca": { 205 | "_c_": true, 206 | "url": "http://meowni.ca/", 207 | "colum": ".listing li", 208 | "title": "a", 209 | "time": "span", 210 | "link": "a" 211 | }, 212 | 213 | "FEX": { 214 | url: "http://fex.baidu.com/", 215 | colum: ".container .post-list>li", 216 | handle: function($colum) { 217 | var time = $colum.find(".date").text().split(" "); 218 | time = time.slice(time.length - 3, time.length).join(" "); 219 | return { 220 | url: $colum.find("a").attr("href"), 221 | title: $colum.find("p").text(), 222 | time: time 223 | } 224 | } 225 | }, 226 | 227 | "Taobao FED": { 228 | url: 'http://taobaofed.org/', 229 | colum: '.article-summary', 230 | handle: function($colum) { 231 | return { 232 | url: $colum.find(".article-summary-inner a").attr("href"), 233 | title: $colum.find(".article-summary-inner a").text(), 234 | time: $colum.find("time").text() 235 | } 236 | } 237 | }, 238 | 239 | "凹凸实验室": { 240 | url: "https://aotu.io/fragments/index/", 241 | colum: '.mod-post', 242 | handle: function($colum) { 243 | var url = $colum.find("a").attr("href"); 244 | var time = url.match(time_reg); 245 | return { 246 | url: $colum.find("a").attr("href"), 247 | title: $colum.find("a").attr("title"), 248 | time: (time instanceof Array) ? time[0] : "" 249 | } 250 | } 251 | }, 252 | 253 | "Isux": { 254 | url: "https://isux.tencent.com/category/fd", 255 | colum: ".masonry-post", 256 | handle: function($colum) { 257 | return { 258 | url: $colum.find("h2 a").attr("href"), 259 | title:$colum.find("h2 a").text(), 260 | time: $colum.find('.isux-date').text() 261 | } 262 | } 263 | }, 264 | 265 | "SVGTrick": { 266 | "_c_": true, 267 | "url": "http://svgtrick.com/", 268 | "colum": ".trick-card", 269 | "title": ".trick-card-title", 270 | "time": "", 271 | "link": ".trick-card-title", 272 | "max": "8" 273 | }, 274 | 275 | "icodeit": { 276 | "_r_": true, 277 | "url": "http://icodeit.org/atom.xml", 278 | "colum": "feed.entry", 279 | "title": "title", 280 | "time": "updated", 281 | "link": "id" 282 | }, 283 | 284 | "紫云飞": { 285 | "_c_": true, 286 | "url": "http://www.cnblogs.com/ziyunfei/", 287 | "colum": "#mainContent .day", 288 | "title": ".postTitle a", 289 | "time": ".postDesc", 290 | "link": ".postTitle a" 291 | }, 292 | 293 | "jackpu": { 294 | "_c_": true, 295 | "url": "http://www.jackpu.com/tag/web/", 296 | "colum": ".content article", 297 | "title": ".post-title a", 298 | "time": ".post-date", 299 | "link": ".post-title a" 300 | }, 301 | 302 | // "前端开发日报": { 303 | // "_c_": true, 304 | // "url": "https://github.com/kujian/frontendDaily/issues", 305 | // "colum": ".Box-body.js-navigation-container .Box-body-row", 306 | // "title": "a", 307 | // "time": "", 308 | // "link": "a", 309 | // "max": 3 310 | // }, 311 | 312 | "BaiduEFE": { 313 | "_c_": true, 314 | "url": "http://efe.baidu.com/", 315 | "colum": "main > .article-index", 316 | "title": "h2 a", 317 | "time": ".article-meta", 318 | "link": "h2 a" 319 | }, 320 | 321 | "DDFE": { 322 | "_c_": true, 323 | "url": "https://defed.github.io/archives/", 324 | "colum": "#content article", 325 | "title": "h1 a span", 326 | "time": ".post-meta", 327 | "link": "h1 a" 328 | }, 329 | 330 | "饿了么": { 331 | "_r_": true, 332 | "url": "https://fe.ele.me/rss/", 333 | "colum": "rss.channel.item", 334 | "title": "title", 335 | "time": "pubDate", 336 | "link": "link" 337 | }, 338 | 339 | "css-tricks": { 340 | "_c_": true, 341 | "url": "https://css-tricks.com/", 342 | "colum": ".article-card", 343 | "title": "h2 a", 344 | "time": ".bar-time", 345 | "link": "h2 a" 346 | }, 347 | "mumu": { 348 | "_c_": true, 349 | "url": "https://my.oschina.net/mumu/blog", 350 | "colum": ".list-item", 351 | "title": ".blog-title", 352 | "time": ".time", 353 | "link": ".blog-title" 354 | }, 355 | "csswizardry": { 356 | "_c_": true, 357 | "url": "http://csswizardry.com/", 358 | "colum": ".list-ui__item", 359 | "title": ".post__title a", 360 | "time": ".post__time", 361 | "link": ".post__title a" 362 | }, 363 | "simurai.com": { 364 | "_c_": true, 365 | "url": "http://simurai.com/blog/", 366 | "colum": ".Index-item--blog", 367 | "title": ".Index-meta h2", 368 | "time": ".Index-meta time", 369 | "link": ".Index-meta" 370 | }, 371 | "mgechev": { 372 | "_c_": true, 373 | "url": "http://blog.mgechev.com/posts/", 374 | "colum": "#index article", 375 | "title": "h2 a", 376 | "time": "", 377 | "link": "h2 a" 378 | }, 379 | "tphangout": { 380 | "_c_": true, 381 | "url": "http://tphangout.com/", 382 | "colum": ".site-main > article", 383 | "title": ".entry-title a", 384 | "time": ".entry-date", 385 | "link": ".entry-title a" 386 | }, 387 | 388 | "souche": { 389 | "_c_": true, 390 | "url": "https://blog.souche.com/", 391 | "colum": ".article-list > article", 392 | "title": ".c-post-list__title a", 393 | "time": ".c-post-list__meta", 394 | "link": ".c-post-list__title a" 395 | }, 396 | 397 | "yubangweb": { 398 | "_c_": true, 399 | "url": "http://blog.yubangweb.com/", 400 | "colum": "#content .post", 401 | "title": ".post-title a", 402 | "time": ".post-date", 403 | "link": ".post-title a" 404 | }, 405 | "developers.google.com": { 406 | "_c_": true, 407 | "url": "https://developers.google.com/web/updates/", 408 | "colum": ".devsite-landing-row-item", 409 | "title": "a", 410 | "time": "", 411 | "link": "a" 412 | }, 413 | "今日头条技术": { 414 | "_c_": true, 415 | "url": "https://techblog.toutiao.com/", 416 | "colum": ".content article", 417 | "title": ".article-title", 418 | "time": "time", 419 | "link": ".article-title" 420 | }, 421 | "美团点评技术团队": { 422 | "_c_": true, 423 | "url": "http://tech.meituan.com/", 424 | "colum": ".post-list article", 425 | "title": ".post-title a", 426 | "time": ".post-meta-ctime", 427 | "link": ".post-title a" 428 | }, 429 | "人人网 FED": { 430 | "_c_": true, 431 | "url": "http://www.renfed.com", 432 | "colum": "#main-content article", 433 | "title": ".posttitle a", 434 | "time": ".entry-date time", 435 | "link": ".posttitle a" 436 | } 437 | } 438 | -------------------------------------------------------------------------------- /img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/1.png -------------------------------------------------------------------------------- /img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/2.png -------------------------------------------------------------------------------- /img/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/add.png -------------------------------------------------------------------------------- /img/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/edit.png -------------------------------------------------------------------------------- /img/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/refresh.png -------------------------------------------------------------------------------- /img/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/rss.png -------------------------------------------------------------------------------- /img/rss_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/rss_128.png -------------------------------------------------------------------------------- /img/rss_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/rss_32.png -------------------------------------------------------------------------------- /img/rss_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/rss_64.png -------------------------------------------------------------------------------- /img/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AngusFu/chrome-crawler/d1aa379da5b094ed2ef17b5dea230fa237386430/img/top.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 博客爬虫 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |
17 |
18 |
19 |
20 | 21 |
22 |
23 | 24 |
25 |
26 |
27 |
28 | 29 |
30 |
31 |
32 | 33 |
34 | 35 |
36 | 37 |
38 | 39 |
40 |
41 |

添加来源

42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 |
52 | 53 |
54 |
55 |

添加 RSS 源

56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /js/add.js: -------------------------------------------------------------------------------- 1 | $('#addRes').click(function() { 2 | $('#addPopCon').fadeIn(500); 3 | }); 4 | 5 | $('#addPopCon').on('click', function(e) { 6 | if ($(e.target).attr('id') === 'addPopCon') { 7 | $('#addPopCon').fadeOut(500); 8 | } 9 | }); 10 | 11 | $('#addPop button').click(function() { 12 | var cacheData = localStorage['__user__data__']; 13 | 14 | try { 15 | cacheData = JSON.parse(cacheData || '{}'); 16 | } catch (e) { 17 | cacheData = {}; 18 | } 19 | 20 | var name = $('#sietName').val().trim(), 21 | url = $('#siteURL').val().trim(), 22 | colum = $('#siteColum').val().trim(), 23 | title = $('#colTitle').val().trim(), 24 | link = $('#colLink').val().trim(), 25 | time = $('#colTime').val().trim(), 26 | max = $('#maxCount').val().trim(); 27 | 28 | if (name && url && colum && title && link) { 29 | cacheData[name] = { 30 | _c_: true, 31 | url: url, 32 | colum: colum, 33 | title: title, 34 | time: time, 35 | link: link, 36 | max: max || 10 37 | }; 38 | 39 | localStorage['__user__data__'] = JSON.stringify(cacheData); 40 | location.reload(); 41 | } else { 42 | alert('输入有误!'); 43 | } 44 | }); -------------------------------------------------------------------------------- /js/getDate.js: -------------------------------------------------------------------------------- 1 | ;(function () { 2 | let re_zh = /(\d{4})\s*[^x00-xff]\s*(\d{1,2})\s*[^x00-xff]\s*(\d{1,2})\s*[^x00-xff]/, 3 | re_ymd = /\d{4}([\/\-\.])\d{1,2}(\1)\d{1,2}/, 4 | re_mdy = /\d{1,2}([\/\-\.])\d{1,2}(\1)\d{4}/, 5 | re_en = new RegExp([ 6 | /(\w{3}) (\w{3}) (\d{2}) (\d{4})/.source, // DateString 7 | /(\w{3}), (\d{2}) (\w{3}) (\d{4}) ((\d{2}):(\d{2}):(\d{2})) GMT/.source, // UTC 8 | /(\w{3}) (\w{3}) (\d{2}) (\d{4}) ((\d{2}):(\d{2}):(\d{2})) GMT\+\d{4}/.source, // Greenwich 9 | /(\d{4})-(\d{2})-(\d{2})T((\d{2}):(\d{2}):(\d{2}))\.(\d{3})Z/.source, // ISO 10 | ].join('|'), 'm'); 11 | 12 | window.getDate = function(strdate = '') { 13 | var tmp = null; 14 | if (!strdate) return strdate; 15 | 16 | strdate = String(strdate); 17 | 18 | if (tmp = strdate.match(re_zh)) { 19 | return ymd([tmp[1], tmp[2], tmp[3]].join('/')); 20 | } 21 | 22 | if (tmp = strdate.match(re_ymd)) { 23 | return ymd(tmp[0].replace(/[\/\-\.]/g, '/')); 24 | } 25 | 26 | if (tmp = strdate.match(re_mdy)) { 27 | return ymd(tmp[0].replace(/[\/\-\.]/g, '/')); 28 | } 29 | 30 | if (tmp = strdate.match(re_en)) { 31 | return ymd(new Date(tmp[0])) 32 | }; 33 | 34 | return ''; 35 | }; 36 | 37 | function ymd(d) { 38 | var pad = function (i) { 39 | return (i < 10 ? '0' : '') + i; 40 | }; 41 | d = typeof d === 'string' ? new Date(d) : d; 42 | return [ d.getFullYear(), d.getMonth() + 1, d.getDate() ].map(pad).join('-'); 43 | } 44 | }()); -------------------------------------------------------------------------------- /js/index.js: -------------------------------------------------------------------------------- 1 | 2 | var $wrap = $(".wrap"); 3 | var $menu = $('.keys'); 4 | var $content = $('.content'); 5 | 6 | // 初始化 7 | source.forEach(function(index, id){ 8 | $menu.append(` 9 |
  • 10 | ${id}(0) 11 |
  • 12 | `); 13 | 14 | $content.append(``); 15 | }); 16 | 17 | $content.on('click', '.mb-title', function() { 18 | var $this = $(this); 19 | var id = $this.closest('ul').attr('id'); 20 | $this.removeClass('new'); 21 | $('[data-key="' + id + '"]').removeClass('new'); 22 | }); 23 | // 导航定位 24 | $(".left-side").click(function(e){ 25 | var li = e.target.tagName == "LI" ? e.target : (e.target.parentNode.tagName == "LI") ? e.target.parentNode : null 26 | 27 | if(li){ 28 | var id = $(li).attr("data-key") 29 | var $dom = $("#"+id); 30 | if($dom.length){ 31 | $('html,body').animate({ 32 | scrollTop: $dom.offset().top 33 | }, 400); 34 | } 35 | } 36 | }); 37 | 38 | // 强制刷新 39 | // 不使用缓存 40 | $('#refresh').click(function() { 41 | store.clearAll(); 42 | initData(); 43 | }); 44 | 45 | // 回到顶部 46 | $('#toTop').click(function() { 47 | $('html,body').animate({ 48 | scrollTop: 0 49 | }, 400); 50 | }); 51 | 52 | 53 | // 页面显示隐藏时刷新 54 | // pageVisibility.visibilitychange(function() { 55 | // if (!pageVisibility.hidden) { 56 | // initData(); 57 | // } 58 | // }); 59 | 60 | // 延时 1 s 61 | // 避免浪费请求 62 | setTimeout(function() { 63 | // 刷新数据并回到顶部 64 | initData(true).then(function() { 65 | $('#toTop').trigger('click'); 66 | }); 67 | }, 1000); 68 | 69 | /** 70 | * 71 | * @param {Boolean} noCacheRender 使用缓存时候是否仍然强制重新渲染 72 | * 73 | * @return {Promise} 74 | * 75 | */ 76 | function initData(noCacheRender) { 77 | var promises = []; 78 | 79 | source.forEach(function(index, id){ 80 | var nowSource = this; 81 | 82 | /**================================================================== 83 | * 84 | * 先进行缓存验证 85 | * 86 | */ 87 | var storeInfo = null; 88 | var info = null; 89 | try { 90 | storeInfo = JSON.parse(store.get(id)); 91 | } catch (e) {} 92 | 93 | // 缓存有效 94 | if (storeInfo && store.checkValid(id)) { 95 | if (noCacheRender) { 96 | updateDOMContent(index, id, storeInfo, this); 97 | console.log('[', id, '] use cache'); 98 | } 99 | return; 100 | } 101 | 102 | var $menuLi = $menu.find('[data-key="dom_' + index + '"]'); 103 | $menuLi.removeClass('new').find('.count').text(0); 104 | 105 | // 缓存过期 先清除掉 106 | store.del(id); 107 | 108 | $('.wrap, .tools').hide(); 109 | $('#loader').show(); 110 | 111 | promises[promises.length] = $.ajax({ 112 | url: this.url, 113 | method: 'get', 114 | dataType: 'text' 115 | }).done(function(_data) { 116 | var data = nowSource['_r_'] && _data || processData(_data); 117 | info = parseData(data, nowSource, _data); 118 | 119 | // 缓存 10 min 120 | store.set(id, JSON.stringify(info), 60 * 10); 121 | 122 | // 对比 storeInfo 与info 123 | // 然后再更新 124 | // 保证能告诉用户哪些内容是新的 125 | if (storeInfo && info) { 126 | // 只要 info 中有未在 storeInfo 中 127 | // 出现的元素 128 | // 那么就认为是新内容 129 | info.forEach(function(item) { 130 | var itemIsOld = storeInfo.some(function(sItem) { 131 | return sItem.url === item.url && sItem.title === item.title; 132 | }); 133 | 134 | if (!itemIsOld) { 135 | item._is_new_ = true; 136 | } 137 | }); 138 | } 139 | 140 | updateDOMContent(index, id, info, nowSource); 141 | }); 142 | }); 143 | 144 | // 都完成之后才显示 145 | return $.when(promises).then(function() { 146 | $('.wrap, .tools').fadeIn(300); 147 | $('#loader').fadeOut(400); 148 | }); 149 | } 150 | 151 | /** 152 | * 153 | * 初步处理返回的字符串 154 | * 155 | * @param {String} data 156 | * @return {String} 157 | * 158 | */ 159 | function processData(data) { 160 | data = data.replace(/src=/gim, 'xsrc=') 161 | .replace(//gim, 'template>') 167 | .replace(/])+results=/gim, '])*>/gim, '') 170 | .trim(); 171 | 172 | if (data.indexOf('') < 0) return data; 173 | 174 | return data.substring( 175 | data.indexOf('') + 6, 176 | 177 | data.lastIndexOf('') > 0 178 | ? data.lastIndexOf('') 179 | : data.length 180 | ); 181 | } 182 | 183 | /** 184 | * 185 | * 根据当前的处理对象和 data 字符串 186 | * 生成相应的提供渲染的数组 187 | * 188 | * @param {Object} data 189 | * @param {Object} source 190 | * @return {Array} 191 | * 192 | */ 193 | function parseData(data, source, raw) { 194 | if (typeof source.parse === 'function') { 195 | return source.parse(data, raw); 196 | } 197 | 198 | var info = []; 199 | 200 | // 如果是 localStorage 中配置的 rss 201 | if (source._r_) { 202 | var data = $.xml2json(data); 203 | var keys = source.colum.trim().split('.'); 204 | var i = 0; 205 | 206 | while (i < keys.length) { 207 | if (data[keys[i]]) { 208 | data = data[keys[i++]]; 209 | } else { 210 | return info; 211 | } 212 | } 213 | 214 | data = data.slice(0, source.max); 215 | info = data.map(function(item) { 216 | var getText = function(data, keys) { 217 | keys = keys.split('.'); 218 | var i = 0; 219 | 220 | while (i < keys.length) { 221 | if (data[keys[i]]) { 222 | data = data[keys[i++]]; 223 | } else { 224 | return ''; 225 | } 226 | } 227 | 228 | return typeof data !== 'string' ? data['_'] : data; 229 | }; 230 | 231 | var cdata = /^\<\!\[CDARA\[(.+)\]\]>$/, 232 | title = getText(item, source.title), 233 | match = title.match(cdata); 234 | 235 | var time = getText(item, source.time); 236 | if (!time) { 237 | for (var k in item) { 238 | if ({}.hasOwnProperty.call(item, k)) { 239 | if (k.toLowerCase().indexOf('pub') === 0) { 240 | time = item[k]; 241 | break; 242 | } 243 | } 244 | } 245 | } 246 | 247 | var url = getText(item, source.link); 248 | if (url && typeof url !== 'string') { 249 | url = url.$.href; 250 | } 251 | 252 | 253 | var timeParsed = null; 254 | 255 | try { 256 | timeParsed = Date.parse(time); 257 | } catch (e){}; 258 | 259 | if (timeParsed) { 260 | time = (new Date(timeParsed)).toLocaleDateString(); 261 | } 262 | 263 | var timeMatch = time.match(/\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/); 264 | time = timeMatch && timeMatch[0] || ''; 265 | return { 266 | url: url || '', 267 | title: (match && match[1] || title).trim(), 268 | time: time 269 | }; 270 | }); 271 | return info; 272 | } 273 | 274 | var $columns = $('
    ').html(data).find(source.colum); 275 | var temp = null, $colum = null; 276 | 277 | // 如果是 localStorage 中配置的 selector 278 | if (source._c_) { 279 | for (var i = 0, len = $columns.length; i < len && i < (source.max || 10); i++) { 280 | $colum = $columns.eq(i); 281 | 282 | temp = { 283 | url: $colum.find(source.link).attr('href'), 284 | title: $colum.find(source.title).text(), 285 | time: source.time && $colum.find(source.time).text() || '', 286 | }; 287 | 288 | if (!/^http/.test(temp.url)) { 289 | temp.url = (new URL(temp.url, source.url)).href; 290 | } 291 | 292 | info.push(temp); 293 | } 294 | 295 | return info; 296 | } 297 | 298 | for (var i = 0, len = $columns.length; i < len && i < (source.max || 10); i++) { 299 | temp = source.handle.call(source, $columns.eq(i)); 300 | 301 | if (temp) { 302 | if (!/^http/.test(temp.url)) { 303 | temp.url = (new URL(temp.url, source.url)).href; 304 | } 305 | temp.title = temp.title.trim(); 306 | info.push(temp); 307 | } 308 | } 309 | 310 | return info; 311 | } 312 | 313 | 314 | /** 315 | * Escape the given string of `html`. 316 | */ 317 | function escapeHtml(html){ 318 | return String(html) 319 | .replace(/&(?!\w+;)/g, '&') 320 | .replace(//g, '>') 322 | .replace(/"/g, '"'); 323 | }; 324 | 325 | /** 326 | * 生成内容 327 | */ 328 | function getRenderContent(info, source, id) { 329 | var titleText = `${id}`; 330 | var linksText = info.reduce(function(prev, curr) { 331 | return prev + `
  • 332 | 333 | ${escapeHtml(curr.title)} 334 | 335 | ${window.getDate(curr.time)} 336 |
  • `; 337 | }, ''); 338 | 339 | return titleText + linksText; 340 | } 341 | 342 | /** 343 | * 更新 DOM 344 | */ 345 | function updateDOMContent(index, id, info, source) { 346 | if (!info) return; 347 | var content = getRenderContent(info, source, id); 348 | 349 | $('#dom_' + index).empty().html(content); 350 | 351 | var isAnyNew = info.some(function(item) { 352 | return item._is_new_; 353 | }); 354 | 355 | $menu.find('[data-key="dom_' + index + '"]') 356 | .addClass(isAnyNew ? 'new' : '') 357 | .find(".count") 358 | .html($("#dom_" + index + " li").length || 0); 359 | }; 360 | -------------------------------------------------------------------------------- /js/jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v2.2.1 | (c) jQuery Foundation | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c); 3 | }else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("