├── README.md ├── __pycache__ ├── app.cpython-37.pyc ├── fake_user_agent.cpython-37.pyc ├── spider_modul.cpython-37.pyc └── useful_functions.cpython-37.pyc ├── app.py ├── fake_user_agent.py ├── guanchazhe.sql ├── img-storage ├── image-20200720154016179.png ├── image-20200720154157803.png ├── search.gif ├── word_cloud.gif └── words_weights.gif ├── model ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ └── forms.cpython-37.pyc └── forms.py ├── spider_modul.py ├── static ├── assets │ ├── css │ │ └── style.css │ ├── img │ │ ├── about.jpg │ │ ├── apple-touch-icon.png │ │ ├── favicon.png │ │ ├── key_word.jpg │ │ ├── portfolio │ │ │ ├── portfolio-1.jpg │ │ │ ├── portfolio-2.jpg │ │ │ ├── portfolio-3.jpg │ │ │ ├── portfolio-4.jpg │ │ │ ├── portfolio-5.jpg │ │ │ ├── portfolio-6.jpg │ │ │ ├── portfolio-7.jpg │ │ │ ├── portfolio-8.jpg │ │ │ └── portfolio-9.jpg │ │ ├── slide │ │ │ ├── slide-1.jpg │ │ │ ├── slide-2.jpg │ │ │ └── slide-3.jpg │ │ ├── team │ │ │ ├── team-1.jpg │ │ │ ├── team-2.jpg │ │ │ ├── team-3.jpg │ │ │ ├── team-4.jpg │ │ │ └── tree.jpg │ │ ├── tree.jpg │ │ └── word.png │ ├── js │ │ ├── echarts.min.js │ │ └── main.js │ └── vendor │ │ ├── animate.css │ │ ├── animate.css │ │ └── animate.min.css │ │ ├── aos │ │ ├── aos.css │ │ └── aos.js │ │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-grid.css │ │ │ ├── bootstrap-grid.css.map │ │ │ ├── bootstrap-grid.min.css │ │ │ ├── bootstrap-grid.min.css.map │ │ │ ├── bootstrap-reboot.css │ │ │ ├── bootstrap-reboot.css.map │ │ │ ├── bootstrap-reboot.min.css │ │ │ ├── bootstrap-reboot.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ └── js │ │ │ ├── bootstrap.bundle.js │ │ │ ├── bootstrap.bundle.js.map │ │ │ ├── bootstrap.bundle.min.js │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.js.map │ │ │ ├── bootstrap.min.js │ │ │ └── bootstrap.min.js.map │ │ ├── boxicons │ │ ├── css │ │ │ ├── animations.css │ │ │ ├── boxicons.css │ │ │ ├── boxicons.min.css │ │ │ └── transformations.css │ │ └── fonts │ │ │ ├── boxicons.eot │ │ │ ├── boxicons.svg │ │ │ ├── boxicons.ttf │ │ │ ├── boxicons.woff │ │ │ └── boxicons.woff2 │ │ ├── counterup │ │ └── counterup.min.js │ │ ├── icofont │ │ ├── fonts │ │ │ ├── icofont.woff │ │ │ └── icofont.woff2 │ │ └── icofont.min.css │ │ ├── isotope-layout │ │ ├── isotope.pkgd.js │ │ └── isotope.pkgd.min.js │ │ ├── jquery-sticky │ │ └── jquery.sticky.js │ │ ├── jquery.easing │ │ └── jquery.easing.min.js │ │ ├── jquery │ │ ├── jquery.min.js │ │ └── jquery.min.map │ │ ├── venobox │ │ ├── venobox.css │ │ ├── venobox.js │ │ └── venobox.min.js │ │ └── waypoints │ │ └── jquery.waypoints.min.js └── spatial │ ├── assets │ ├── css │ │ ├── font-awesome.min.css │ │ ├── images │ │ │ └── overlay.png │ │ ├── main.css │ │ └── paginate.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ └── js │ │ ├── jquery.min.js │ │ ├── main.js │ │ ├── skel.min.js │ │ └── util.js │ └── images │ ├── banner.jpg │ ├── caledonie.jpg │ ├── pic01.jpg │ ├── pic02.jpg │ ├── pic03.jpg │ ├── pic04.jpg │ ├── pic05.jpg │ ├── pic06.jpg │ └── pic07.jpg ├── templates ├── analysis.html ├── index.html ├── news.html ├── news_result.html ├── search.html ├── team.html ├── temp.html ├── test │ ├── echarts.min.js │ └── test_echarts.html └── word.html ├── upload ├── image-20200720163344959.png ├── image-20200720163623725.png ├── image-20200720163827319.png └── image-20200720164113633.png ├── useful_functions.py └── word_cloud.py /README.md: -------------------------------------------------------------------------------- 1 | 项目中更新了sql文件,但是我没有测试过是否可行,如果在数据库连接部分还有问题,请见issues。 2 | 3 | # 观察者新闻网爬虫(新闻爬虫) 4 | 5 | ## 项目包含技术 6 | 7 | 爬虫: Requests + etree + Xpath 8 | 9 | 可视化: Flask + Echarts + WordCloud 10 | 11 | 文本分析:jieba分词 12 | 13 | 数据库: MySQL 14 | 15 | ## 说明 16 | 17 | 本项目是完成学校实训的作业,实现了对观察者新闻网的新闻内容爬取,存储,文本分析与可视化。(只供学习,如果涉及新闻版权等问题,作者立刻删仓库跑路!) 18 | 19 | 完成的时间很仓促,项目整个完成时间大约4天。这期间,由于没有任何爬虫基础,所以边学边做,项目疏漏的地方一定很多,欢迎指正! 20 | 21 | 本项目在实现过程中参考了以下内容 22 | 23 | B站: [基础python+Flask+爬虫 ](https://www.bilibili.com/video/BV12E411A7ZQ?from=search&seid=17327553224685529336) 通过这个课程了解了爬虫的基础知识并且学习了网站搭建的知识(负基础教程,老师讲的很细很细,我是跳着看的 24 | 25 | 爬虫模块,参考了一个爬取观察者网的代码(但是我找不到链接了,找到了再来补,在上面做了很多改进) 26 | 27 | B站:[Xpath相关内容](https://www.bilibili.com/video/BV1mW411D7wC?from=search&seid=2199964054070293764) 通过这个学习的Xpath 讲的也很清楚 28 | 29 | 搜索界面的网页模板参考的是github上一个demo [搜索界面UI](https://github.com/kaibush/flask_search_ui) 30 | 31 | ## 使用 32 | 33 | > 因为时间匆忙,忘记创建虚拟环境,所以暂时无法提供requrements.txt, 不过用的都是很常见的库,都可以通过pip来安装! 34 | 35 | 1. 配置环境 36 | 37 | ``` 38 | pip install XXX 39 | ``` 40 | 41 | 2. 运行app, 然后点击命令行中的地址 42 | 43 | ![启动](https://github.com/hunter-lee1/guanchazhe_spider/blob/master/img-storage/image-20200720154016179.png) 44 | 45 | 46 | 47 | ![image-20200720154157803](https://github.com/hunter-lee1/guanchazhe_spider/blob/master/img-storage/image-20200720154157803.png) 48 | 49 | ## 实现效果 50 | 51 | 1. 词频可视化![词频可视化页](https://github.com/hunter-lee1/guanchazhe_spider/blob/master/img-storage/words_weights.gif) 52 | 53 | 2. 词云![词云](https://github.com/hunter-lee1/guanchazhe_spider/blob/master/img-storage/word_cloud.gif) 54 | 55 | 3. 搜索![搜索](https://github.com/hunter-lee1/guanchazhe_spider/blob/master/img-storage/search.gif) 56 | 57 | 58 | -------------------------------------------------------------------------------- /__pycache__/app.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/__pycache__/app.cpython-37.pyc -------------------------------------------------------------------------------- /__pycache__/fake_user_agent.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/__pycache__/fake_user_agent.cpython-37.pyc -------------------------------------------------------------------------------- /__pycache__/spider_modul.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/__pycache__/spider_modul.cpython-37.pyc -------------------------------------------------------------------------------- /__pycache__/useful_functions.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/__pycache__/useful_functions.cpython-37.pyc -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask,render_template 2 | import pymysql 3 | from model.forms import SearchForm 4 | from flask import request 5 | import useful_functions 6 | import spider_modul 7 | # 这里对数据库内容进行提取 8 | # spider_modul.run() 9 | datalist = useful_functions.get_datalist() 10 | # datalist_reverse = datalist 11 | # datalist_reverse.reverse() 12 | 13 | # 这里分析数据库内容,提炼出数据库信息,并对文本内容分词 14 | datainfo1, string = useful_functions.get_datalist_info(datalist) 15 | 16 | # 计算 topK=8 的词汇对应的词频 17 | words,weights = useful_functions.get_word_weights(string, topK=8) 18 | 19 | app = Flask(__name__) 20 | app.config["SECRET_KEY"] = "12345678" 21 | 22 | 23 | 24 | 25 | 26 | # 首页重定位 27 | @app.route('/index') 28 | def home_page(): 29 | return index() 30 | 31 | 32 | @app.route('/temp') 33 | def temp_page(): 34 | return index() 35 | 36 | 37 | # 首页 38 | @app.route('/') 39 | def index(): 40 | global weights 41 | global words 42 | global data_info 43 | print(words, weights) 44 | data_info = datainfo1 45 | return render_template("index.html", news_info=data_info) 46 | 47 | # 新闻缩略页 48 | @app.route('/news') 49 | def news_page(): 50 | return render_template("news.html",news=datalist) 51 | 52 | 53 | # 基于词频绘制的词云 54 | @app.route('/word') 55 | def word_page(): 56 | return render_template("word.html",news_info=data_info) 57 | 58 | 59 | # 链接到我的个人主页 60 | @app.route('/team') 61 | def team_page(): 62 | return render_template("team.html") 63 | 64 | 65 | # 数据库文本信息分析,topK8的词语及频率,暂时用的是直方图 66 | @app.route('/analysis') 67 | def analysis_page(): 68 | return render_template("analysis.html",words = words,weights = weights) 69 | 70 | 71 | # 搜索界面 72 | @app.route('/search') 73 | def search_page(): 74 | form = SearchForm() 75 | return render_template('search.html', form=form) 76 | 77 | 78 | # 搜索结果返回界面,返回时展示数据库中所有内容,包括正文文本 79 | @app.route('/news_result',methods=['POST','GET']) 80 | def newsResult_page(): 81 | form = SearchForm() 82 | search = request.args.get("query") 83 | search_list = [] 84 | cnn_search = pymysql.connect(host='127.0.0.1', user='root', password='shujuku', port=3306, database='news_with_keyword', 85 | charset='utf8') 86 | cursor_search = cnn_search.cursor() 87 | sql_search = "select * from guanchazhe where content like '{}'".format('%'+search+'%') 88 | print(sql_search) 89 | cursor_search.execute(sql_search) 90 | for item_search in cursor_search.fetchall(): 91 | search_list.append(item_search) 92 | cursor_search.close() 93 | cnn_search.close() 94 | print(search_list) 95 | return render_template("news_result.html",form=form,news=search_list) 96 | 97 | 98 | if __name__ == '__main__': 99 | app.run() 100 | -------------------------------------------------------------------------------- /fake_user_agent.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | FAKE_USER_AGENT = [ 4 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 5 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", 6 | "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 7 | "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", 8 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", 9 | "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", 10 | "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", 11 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", 12 | "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", 13 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", 14 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", 15 | "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", 16 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", 17 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", 18 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", 19 | "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", 20 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", 21 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", 22 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", 23 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", 24 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER", 25 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", 26 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", 27 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", 28 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)", 29 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", 30 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", 31 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1", 32 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1", 33 | "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", 34 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre", 35 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0", 36 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", 37 | "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10", 38 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/53" 39 | ] 40 | 41 | 42 | def useragent_random(): 43 | return {"User-Agent": random.choice(FAKE_USER_AGENT)} -------------------------------------------------------------------------------- /img-storage/image-20200720154016179.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/img-storage/image-20200720154016179.png -------------------------------------------------------------------------------- /img-storage/image-20200720154157803.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/img-storage/image-20200720154157803.png -------------------------------------------------------------------------------- /img-storage/search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/img-storage/search.gif -------------------------------------------------------------------------------- /img-storage/word_cloud.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/img-storage/word_cloud.gif -------------------------------------------------------------------------------- /img-storage/words_weights.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/img-storage/words_weights.gif -------------------------------------------------------------------------------- /model/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/model/__init__.py -------------------------------------------------------------------------------- /model/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/model/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /model/__pycache__/forms.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/model/__pycache__/forms.cpython-37.pyc -------------------------------------------------------------------------------- /model/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField,SubmitField 3 | from wtforms.validators import DataRequired 4 | 5 | class SearchForm(FlaskForm): 6 | search_creater=StringField('creater',validators=[DataRequired()]) 7 | submit=SubmitField('搜索') -------------------------------------------------------------------------------- /spider_modul.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import queue 3 | import pymysql 4 | from lxml import etree 5 | import threading 6 | import re 7 | import useful_functions 8 | import fake_user_agent 9 | 10 | # headers = { 11 | # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36' 12 | # } 13 | 14 | # 代理池 15 | headers = fake_user_agent.useragent_random() 16 | 17 | # 爬取线程 18 | class MyThread(threading.Thread): 19 | def __init__(self, url_queue): 20 | super(MyThread, self).__init__() 21 | self.url_queue = url_queue 22 | self.urls = [] 23 | 24 | # 连接Mysql数据库 25 | self.cnn = pymysql.connect(host='127.0.0.1', user='root', password='shujuku', port=3306, database='news_with_keyword', 26 | charset='utf8') 27 | self.cursor = self.cnn.cursor() 28 | self.sql = 'insert into guanchazhe(title, author, publish_time, content, url, key_word) values(%s, %s, %s, %s, %s, %s)' 29 | 30 | # 获取已爬取的url数据并写入列表,用于判断 31 | sql = 'select url from guanchazhe' 32 | self.cursor.execute(sql) 33 | for url in self.cursor.fetchall(): 34 | self.urls.append(url[0]) 35 | 36 | 37 | def run(self): 38 | self.spider() 39 | 40 | def spider(self): 41 | while not self.url_queue.empty(): 42 | item = {} 43 | url = self.url_queue.get() 44 | if self.check_url(url): 45 | print(f'正在爬取{url}') 46 | response = requests.get(url, headers=headers) 47 | response.encoding = "utf-8" 48 | html = etree.HTML(response.text) 49 | results = html.xpath('//ul/li[contains(@class,"left left-main")]') 50 | for result in results: 51 | item['url'] = url 52 | author = result.xpath('./ul/li/div[contains(@class,author-intro)]/p/a/text()') 53 | if not author: 54 | author = html.xpath('//div[contains(@class,"time")]/span[3]/text()') 55 | if not author: 56 | self.get_news(response.text, item) 57 | continue 58 | item['author'] = author[0] 59 | 60 | item['title'] = result.xpath('./h3/text()')[0] 61 | 62 | item['publish_time'] = result.xpath('./div[contains(@class,"time")]/span[1]/text()')[0] 63 | 64 | content = result.xpath('./div[contains(@class,"content")]/p/text()') 65 | content = ''.join(content) 66 | content = re.sub('\s', '', content) 67 | item['content'] = content 68 | 69 | key_word = result.xpath("//div[@class='key-word fix mt15']/a/text()") 70 | key_word = ",".join(key_word) 71 | if not key_word: 72 | key_word = useful_functions.get_keyword_from_content(content) 73 | item['key_word'] = key_word 74 | print(key_word) 75 | 76 | self.save(item) 77 | 78 | def save(self, item): 79 | self.cursor.execute(self.sql, 80 | [item['title'], item['author'], item['publish_time'],item['content'], item['url'],item['key_word']]) 81 | self.cnn.commit() 82 | 83 | def check_url(self, url): 84 | # 查看数据库中是否存在当前爬取的url,如果存在则放弃爬取 85 | if url in self.urls: 86 | print(f'{url}已存在') 87 | return False 88 | else: 89 | self.urls.append(url) 90 | return True 91 | 92 | def get_news(self, text, item): 93 | # 获取js渲染后的网址并请求 94 | str = re.search('window.location.href=".*?"', text).group() 95 | link = re.split('"', str)[1] + '&page=0' 96 | 97 | response = requests.get(url=link, headers=headers) 98 | response.encoding = "utf-8" 99 | html = etree.HTML(response.text) 100 | item['author'] = \ 101 | html.xpath('//div[contains(@class,"article-content")]/div[2]/div[@class="user-main"]/h4/a/text()')[0] 102 | 103 | item['title'] = html.xpath('//div[@class="article-content"]/h1/text()')[0] 104 | 105 | item['publish_time'] = html.xpath('//span[@class="time1"]/text()')[0] 106 | 107 | content = html.xpath('//div[@class="article-txt-content"]/p/text()') 108 | content = ''.join(content) 109 | content = re.sub('\s', '', content) 110 | item['content'] = content 111 | 112 | key_word = html.xpath("//div[@class='key-word fix mt15']/a/text()") 113 | key_word = ",".join(key_word) 114 | if not key_word: 115 | key_word = useful_functions.get_keyword_from_content(content) 116 | if not key_word: 117 | key_word = '无关键词' 118 | else: 119 | key_word.append() 120 | key_word = ", ".join(key_word) 121 | item['key_word'] = key_word 122 | 123 | # 将获取到的url添加到队列中去 124 | def add_urls(urls, queue): 125 | for url in urls: 126 | url = 'https://www.guancha.cn' + url 127 | queue.put(url) 128 | 129 | # 从观察者网首页网页中获取url 130 | def get_url(queue): 131 | url = 'https://www.guancha.cn/' 132 | response = requests.get(url, headers=headers).text 133 | html = etree.HTML(response) 134 | head_line = html.xpath("//div[(@class ='content-headline')]/a/@href") 135 | left_urls = html.xpath('//ul[contains(@class, "Review-item")]/li/a[contains(@class, "module-img")]/@href') 136 | center_right_urls = html.xpath('//ul[contains(@class, "img-List")]/li/h4[contains(@class, "module-title")]/a/@href') 137 | # right_urls = html.xpath('//ul[contains(@class, "fengwen-list")]/li/h4[contains(@class, "module-title")]/a/@href') 138 | add_urls(left_urls, queue) 139 | add_urls(center_right_urls, queue) 140 | add_urls(head_line,queue) 141 | 142 | # 从观察者网首页末尾的更多网页中获取url 143 | def get_urlFromMore(queue): 144 | for index in range(1,16): 145 | url = f'https://www.guancha.cn/mainnews-yw/list_{index}.shtml' 146 | response = requests.get(url, headers=headers).text 147 | html = etree.HTML(response) 148 | more_urls = html.xpath("//div[@class = 'right fn']/h4/a/@href") 149 | add_urls(more_urls,queue) 150 | 151 | # 爬虫运行程序 152 | def run(): 153 | threads = [] 154 | 155 | url_que = queue.Queue() 156 | get_urlFromMore(url_que) 157 | 158 | for i in range(10): 159 | thread = MyThread(url_que) 160 | threads.append(thread) 161 | thread.start() 162 | -------------------------------------------------------------------------------- /static/assets/img/about.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/about.jpg -------------------------------------------------------------------------------- /static/assets/img/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/apple-touch-icon.png -------------------------------------------------------------------------------- /static/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/favicon.png -------------------------------------------------------------------------------- /static/assets/img/key_word.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/key_word.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-1.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-2.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-3.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-4.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-5.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-6.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-7.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-8.jpg -------------------------------------------------------------------------------- /static/assets/img/portfolio/portfolio-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/portfolio/portfolio-9.jpg -------------------------------------------------------------------------------- /static/assets/img/slide/slide-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/slide/slide-1.jpg -------------------------------------------------------------------------------- /static/assets/img/slide/slide-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/slide/slide-2.jpg -------------------------------------------------------------------------------- /static/assets/img/slide/slide-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/slide/slide-3.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/team/team-1.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/team/team-2.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/team/team-3.jpg -------------------------------------------------------------------------------- /static/assets/img/team/team-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/team/team-4.jpg -------------------------------------------------------------------------------- /static/assets/img/team/tree.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/team/tree.jpg -------------------------------------------------------------------------------- /static/assets/img/tree.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/tree.jpg -------------------------------------------------------------------------------- /static/assets/img/word.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/img/word.png -------------------------------------------------------------------------------- /static/assets/js/main.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Template Name: Mamba - v2.0.1 3 | * Template URL: https://bootstrapmade.com/mamba-one-page-bootstrap-template-free/ 4 | * Author: BootstrapMade.com 5 | * License: https://bootstrapmade.com/license/ 6 | */ 7 | !(function($) { 8 | "use strict"; 9 | 10 | // Toggle .header-scrolled class to #header when page is scrolled 11 | $(window).scroll(function() { 12 | if ($(this).scrollTop() > 100) { 13 | $('#header').addClass('header-scrolled'); 14 | } else { 15 | $('#header').removeClass('header-scrolled'); 16 | } 17 | }); 18 | 19 | if ($(window).scrollTop() > 100) { 20 | $('#header').addClass('header-scrolled'); 21 | } 22 | 23 | // Stick the header at top on scroll 24 | $("#header").sticky({ 25 | topSpacing: 0, 26 | zIndex: '50' 27 | }); 28 | 29 | // Smooth scroll for the navigation menu and links with .scrollto classes 30 | $(document).on('click', '.nav-menu a, .mobile-nav a, .scrollto', function(e) { 31 | if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) { 32 | e.preventDefault(); 33 | var target = $(this.hash); 34 | if (target.length) { 35 | 36 | var scrollto = target.offset().top; 37 | var scrolled = 2; 38 | 39 | if ($('#header-sticky-wrapper').length) { 40 | scrollto -= $('#header-sticky-wrapper').outerHeight() - scrolled; 41 | } 42 | 43 | if ($(this).attr("href") == '#header') { 44 | scrollto = 0; 45 | } 46 | 47 | $('html, body').animate({ 48 | scrollTop: scrollto 49 | }, 1500, 'easeInOutExpo'); 50 | 51 | if ($(this).parents('.nav-menu, .mobile-nav').length) { 52 | $('.nav-menu .active, .mobile-nav .active').removeClass('active'); 53 | $(this).closest('li').addClass('active'); 54 | } 55 | 56 | if ($('body').hasClass('mobile-nav-active')) { 57 | $('body').removeClass('mobile-nav-active'); 58 | $('.mobile-nav-toggle i').toggleClass('icofont-navigation-menu icofont-close'); 59 | $('.mobile-nav-overly').fadeOut(); 60 | } 61 | return false; 62 | } 63 | } 64 | }); 65 | 66 | // Mobile Navigation 67 | if ($('.nav-menu').length) { 68 | var $mobile_nav = $('.nav-menu').clone().prop({ 69 | class: 'mobile-nav d-lg-none' 70 | }); 71 | $('body').append($mobile_nav); 72 | $('body').prepend(''); 73 | $('body').append('
'); 74 | 75 | $(document).on('click', '.mobile-nav-toggle', function(e) { 76 | $('body').toggleClass('mobile-nav-active'); 77 | $('.mobile-nav-toggle i').toggleClass('icofont-navigation-menu icofont-close'); 78 | $('.mobile-nav-overly').toggle(); 79 | }); 80 | 81 | $(document).on('click', '.mobile-nav .drop-down > a', function(e) { 82 | e.preventDefault(); 83 | $(this).next().slideToggle(300); 84 | $(this).parent().toggleClass('active'); 85 | }); 86 | 87 | $(document).click(function(e) { 88 | var container = $(".mobile-nav, .mobile-nav-toggle"); 89 | if (!container.is(e.target) && container.has(e.target).length === 0) { 90 | if ($('body').hasClass('mobile-nav-active')) { 91 | $('body').removeClass('mobile-nav-active'); 92 | $('.mobile-nav-toggle i').toggleClass('icofont-navigation-menu icofont-close'); 93 | $('.mobile-nav-overly').fadeOut(); 94 | } 95 | } 96 | }); 97 | } else if ($(".mobile-nav, .mobile-nav-toggle").length) { 98 | $(".mobile-nav, .mobile-nav-toggle").hide(); 99 | } 100 | 101 | // Intro carousel 102 | var heroCarousel = $("#heroCarousel"); 103 | var heroCarouselIndicators = $("#hero-carousel-indicators"); 104 | heroCarousel.find(".carousel-inner").children(".carousel-item").each(function(index) { 105 | (index === 0) ? 106 | heroCarouselIndicators.append("
  • "): 107 | heroCarouselIndicators.append("
  • "); 108 | }); 109 | 110 | heroCarousel.on('slid.bs.carousel', function(e) { 111 | $(this).find('h2').addClass('animated fadeInDown'); 112 | $(this).find('p').addClass('animated fadeInUp'); 113 | $(this).find('.btn-get-started').addClass('animated fadeInUp'); 114 | }); 115 | 116 | // Back to top button 117 | $(window).scroll(function() { 118 | if ($(this).scrollTop() > 100) { 119 | $('.back-to-top').fadeIn('slow'); 120 | } else { 121 | $('.back-to-top').fadeOut('slow'); 122 | } 123 | }); 124 | 125 | $('.back-to-top').click(function() { 126 | $('html, body').animate({ 127 | scrollTop: 0 128 | }, 1500, 'easeInOutExpo'); 129 | return false; 130 | }); 131 | 132 | // Initiate the venobox plugin 133 | $(window).on('load', function() { 134 | $('.venobox').venobox(); 135 | }); 136 | 137 | // jQuery counterUp 138 | $('[data-toggle="counter-up"]').counterUp({ 139 | delay: 10, 140 | time: 1000 141 | }); 142 | 143 | // Porfolio isotope and filter 144 | $(window).on('load', function() { 145 | var portfolioIsotope = $('.portfolio-container').isotope({ 146 | itemSelector: '.portfolio-item', 147 | layoutMode: 'fitRows' 148 | }); 149 | 150 | $('#portfolio-flters li').on('click', function() { 151 | $("#portfolio-flters li").removeClass('filter-active'); 152 | $(this).addClass('filter-active'); 153 | 154 | portfolioIsotope.isotope({ 155 | filter: $(this).data('filter') 156 | }); 157 | }); 158 | 159 | // Initiate venobox (lightbox feature used in portofilo) 160 | $(document).ready(function() { 161 | $('.venobox').venobox(); 162 | }); 163 | }); 164 | 165 | // Initi AOS 166 | AOS.init({ 167 | duration: 1000, 168 | easing: "ease-in-out-back" 169 | }); 170 | 171 | })(jQuery); -------------------------------------------------------------------------------- /static/assets/vendor/aos/aos.css: -------------------------------------------------------------------------------- 1 | [data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)} -------------------------------------------------------------------------------- /static/assets/vendor/aos/aos.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},M=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},_=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?M():(x.disableMutationObserver||d.default.isSupported()||(console.info('\n aos: MutationObserver is not supported on this browser,\n code mutations observing has been disabled.\n You may have to call "refreshHard()" by yourself.\n '),x.disableMutationObserver=!0),document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||d.default.ready("[data-aos]",O),w)};e.exports={init:_,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(f,t),M?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=O();return c(e)?d(e):void(h=setTimeout(f,a(e)))}function d(e){return h=void 0,_&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),o(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,k=0,M=!1,S=!1,_=!0;if("function"!=typeof e)throw new TypeError(s);return t=u(t)||0,i(n)&&(M=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(s);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return f;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?f:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s="Expected a function",f=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(f,t),M?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function s(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=j();return s(e)?d(e):void(h=setTimeout(f,u(e)))}function d(e){return h=void 0,_&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=s(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),i(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,O=0,M=!1,S=!1,_=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(M=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==f}function a(e){if("number"==typeof e)return e;if(r(e))return s;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?s:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",s=NaN,f="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e){var t=void 0,o=void 0,i=void 0;for(t=0;te.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])}); -------------------------------------------------------------------------------- /static/assets/vendor/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.4.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-family: sans-serif; 16 | line-height: 1.15; 17 | -webkit-text-size-adjust: 100%; 18 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 19 | } 20 | 21 | article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 28 | font-size: 1rem; 29 | font-weight: 400; 30 | line-height: 1.5; 31 | color: #212529; 32 | text-align: left; 33 | background-color: #fff; 34 | } 35 | 36 | [tabindex="-1"]:focus:not(:focus-visible) { 37 | outline: 0 !important; 38 | } 39 | 40 | hr { 41 | box-sizing: content-box; 42 | height: 0; 43 | overflow: visible; 44 | } 45 | 46 | h1, h2, h3, h4, h5, h6 { 47 | margin-top: 0; 48 | margin-bottom: 0.5rem; 49 | } 50 | 51 | p { 52 | margin-top: 0; 53 | margin-bottom: 1rem; 54 | } 55 | 56 | abbr[title], 57 | abbr[data-original-title] { 58 | text-decoration: underline; 59 | -webkit-text-decoration: underline dotted; 60 | text-decoration: underline dotted; 61 | cursor: help; 62 | border-bottom: 0; 63 | -webkit-text-decoration-skip-ink: none; 64 | text-decoration-skip-ink: none; 65 | } 66 | 67 | address { 68 | margin-bottom: 1rem; 69 | font-style: normal; 70 | line-height: inherit; 71 | } 72 | 73 | ol, 74 | ul, 75 | dl { 76 | margin-top: 0; 77 | margin-bottom: 1rem; 78 | } 79 | 80 | ol ol, 81 | ul ul, 82 | ol ul, 83 | ul ol { 84 | margin-bottom: 0; 85 | } 86 | 87 | dt { 88 | font-weight: 700; 89 | } 90 | 91 | dd { 92 | margin-bottom: .5rem; 93 | margin-left: 0; 94 | } 95 | 96 | blockquote { 97 | margin: 0 0 1rem; 98 | } 99 | 100 | b, 101 | strong { 102 | font-weight: bolder; 103 | } 104 | 105 | small { 106 | font-size: 80%; 107 | } 108 | 109 | sub, 110 | sup { 111 | position: relative; 112 | font-size: 75%; 113 | line-height: 0; 114 | vertical-align: baseline; 115 | } 116 | 117 | sub { 118 | bottom: -.25em; 119 | } 120 | 121 | sup { 122 | top: -.5em; 123 | } 124 | 125 | a { 126 | color: #007bff; 127 | text-decoration: none; 128 | background-color: transparent; 129 | } 130 | 131 | a:hover { 132 | color: #0056b3; 133 | text-decoration: underline; 134 | } 135 | 136 | a:not([href]) { 137 | color: inherit; 138 | text-decoration: none; 139 | } 140 | 141 | a:not([href]):hover { 142 | color: inherit; 143 | text-decoration: none; 144 | } 145 | 146 | pre, 147 | code, 148 | kbd, 149 | samp { 150 | font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 151 | font-size: 1em; 152 | } 153 | 154 | pre { 155 | margin-top: 0; 156 | margin-bottom: 1rem; 157 | overflow: auto; 158 | } 159 | 160 | figure { 161 | margin: 0 0 1rem; 162 | } 163 | 164 | img { 165 | vertical-align: middle; 166 | border-style: none; 167 | } 168 | 169 | svg { 170 | overflow: hidden; 171 | vertical-align: middle; 172 | } 173 | 174 | table { 175 | border-collapse: collapse; 176 | } 177 | 178 | caption { 179 | padding-top: 0.75rem; 180 | padding-bottom: 0.75rem; 181 | color: #6c757d; 182 | text-align: left; 183 | caption-side: bottom; 184 | } 185 | 186 | th { 187 | text-align: inherit; 188 | } 189 | 190 | label { 191 | display: inline-block; 192 | margin-bottom: 0.5rem; 193 | } 194 | 195 | button { 196 | border-radius: 0; 197 | } 198 | 199 | button:focus { 200 | outline: 1px dotted; 201 | outline: 5px auto -webkit-focus-ring-color; 202 | } 203 | 204 | input, 205 | button, 206 | select, 207 | optgroup, 208 | textarea { 209 | margin: 0; 210 | font-family: inherit; 211 | font-size: inherit; 212 | line-height: inherit; 213 | } 214 | 215 | button, 216 | input { 217 | overflow: visible; 218 | } 219 | 220 | button, 221 | select { 222 | text-transform: none; 223 | } 224 | 225 | select { 226 | word-wrap: normal; 227 | } 228 | 229 | button, 230 | [type="button"], 231 | [type="reset"], 232 | [type="submit"] { 233 | -webkit-appearance: button; 234 | } 235 | 236 | button:not(:disabled), 237 | [type="button"]:not(:disabled), 238 | [type="reset"]:not(:disabled), 239 | [type="submit"]:not(:disabled) { 240 | cursor: pointer; 241 | } 242 | 243 | button::-moz-focus-inner, 244 | [type="button"]::-moz-focus-inner, 245 | [type="reset"]::-moz-focus-inner, 246 | [type="submit"]::-moz-focus-inner { 247 | padding: 0; 248 | border-style: none; 249 | } 250 | 251 | input[type="radio"], 252 | input[type="checkbox"] { 253 | box-sizing: border-box; 254 | padding: 0; 255 | } 256 | 257 | input[type="date"], 258 | input[type="time"], 259 | input[type="datetime-local"], 260 | input[type="month"] { 261 | -webkit-appearance: listbox; 262 | } 263 | 264 | textarea { 265 | overflow: auto; 266 | resize: vertical; 267 | } 268 | 269 | fieldset { 270 | min-width: 0; 271 | padding: 0; 272 | margin: 0; 273 | border: 0; 274 | } 275 | 276 | legend { 277 | display: block; 278 | width: 100%; 279 | max-width: 100%; 280 | padding: 0; 281 | margin-bottom: .5rem; 282 | font-size: 1.5rem; 283 | line-height: inherit; 284 | color: inherit; 285 | white-space: normal; 286 | } 287 | 288 | progress { 289 | vertical-align: baseline; 290 | } 291 | 292 | [type="number"]::-webkit-inner-spin-button, 293 | [type="number"]::-webkit-outer-spin-button { 294 | height: auto; 295 | } 296 | 297 | [type="search"] { 298 | outline-offset: -2px; 299 | -webkit-appearance: none; 300 | } 301 | 302 | [type="search"]::-webkit-search-decoration { 303 | -webkit-appearance: none; 304 | } 305 | 306 | ::-webkit-file-upload-button { 307 | font: inherit; 308 | -webkit-appearance: button; 309 | } 310 | 311 | output { 312 | display: inline-block; 313 | } 314 | 315 | summary { 316 | display: list-item; 317 | cursor: pointer; 318 | } 319 | 320 | template { 321 | display: none; 322 | } 323 | 324 | [hidden] { 325 | display: none !important; 326 | } 327 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /static/assets/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.4.1 (https://getbootstrap.com/) 3 | * Copyright 2011-2019 The Bootstrap Authors 4 | * Copyright 2011-2019 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} 8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /static/assets/vendor/boxicons/css/animations.css: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes spin 2 | { 3 | 0% 4 | { 5 | -webkit-transform: rotate(0); 6 | transform: rotate(0); 7 | } 8 | 100% 9 | { 10 | -webkit-transform: rotate(359deg); 11 | transform: rotate(359deg); 12 | } 13 | } 14 | @keyframes spin 15 | { 16 | 0% 17 | { 18 | -webkit-transform: rotate(0); 19 | transform: rotate(0); 20 | } 21 | 100% 22 | { 23 | -webkit-transform: rotate(359deg); 24 | transform: rotate(359deg); 25 | } 26 | } 27 | @-webkit-keyframes burst 28 | { 29 | 0% 30 | { 31 | -webkit-transform: scale(1); 32 | transform: scale(1); 33 | 34 | opacity: 1; 35 | } 36 | 90% 37 | { 38 | -webkit-transform: scale(1.5); 39 | transform: scale(1.5); 40 | 41 | opacity: 0; 42 | } 43 | } 44 | @keyframes burst 45 | { 46 | 0% 47 | { 48 | -webkit-transform: scale(1); 49 | transform: scale(1); 50 | 51 | opacity: 1; 52 | } 53 | 90% 54 | { 55 | -webkit-transform: scale(1.5); 56 | transform: scale(1.5); 57 | 58 | opacity: 0; 59 | } 60 | } 61 | @-webkit-keyframes flashing 62 | { 63 | 0% 64 | { 65 | opacity: 1; 66 | } 67 | 45% 68 | { 69 | opacity: 0; 70 | } 71 | 90% 72 | { 73 | opacity: 1; 74 | } 75 | } 76 | @keyframes flashing 77 | { 78 | 0% 79 | { 80 | opacity: 1; 81 | } 82 | 45% 83 | { 84 | opacity: 0; 85 | } 86 | 90% 87 | { 88 | opacity: 1; 89 | } 90 | } 91 | @-webkit-keyframes fade-left 92 | { 93 | 0% 94 | { 95 | -webkit-transform: translateX(0); 96 | transform: translateX(0); 97 | 98 | opacity: 1; 99 | } 100 | 75% 101 | { 102 | -webkit-transform: translateX(-20px); 103 | transform: translateX(-20px); 104 | 105 | opacity: 0; 106 | } 107 | } 108 | @keyframes fade-left 109 | { 110 | 0% 111 | { 112 | -webkit-transform: translateX(0); 113 | transform: translateX(0); 114 | 115 | opacity: 1; 116 | } 117 | 75% 118 | { 119 | -webkit-transform: translateX(-20px); 120 | transform: translateX(-20px); 121 | 122 | opacity: 0; 123 | } 124 | } 125 | @-webkit-keyframes fade-right 126 | { 127 | 0% 128 | { 129 | -webkit-transform: translateX(0); 130 | transform: translateX(0); 131 | 132 | opacity: 1; 133 | } 134 | 75% 135 | { 136 | -webkit-transform: translateX(20px); 137 | transform: translateX(20px); 138 | 139 | opacity: 0; 140 | } 141 | } 142 | @keyframes fade-right 143 | { 144 | 0% 145 | { 146 | -webkit-transform: translateX(0); 147 | transform: translateX(0); 148 | 149 | opacity: 1; 150 | } 151 | 75% 152 | { 153 | -webkit-transform: translateX(20px); 154 | transform: translateX(20px); 155 | 156 | opacity: 0; 157 | } 158 | } 159 | @-webkit-keyframes fade-up 160 | { 161 | 0% 162 | { 163 | -webkit-transform: translateY(0); 164 | transform: translateY(0); 165 | 166 | opacity: 1; 167 | } 168 | 75% 169 | { 170 | -webkit-transform: translateY(-20px); 171 | transform: translateY(-20px); 172 | 173 | opacity: 0; 174 | } 175 | } 176 | @keyframes fade-up 177 | { 178 | 0% 179 | { 180 | -webkit-transform: translateY(0); 181 | transform: translateY(0); 182 | 183 | opacity: 1; 184 | } 185 | 75% 186 | { 187 | -webkit-transform: translateY(-20px); 188 | transform: translateY(-20px); 189 | 190 | opacity: 0; 191 | } 192 | } 193 | @-webkit-keyframes fade-down 194 | { 195 | 0% 196 | { 197 | -webkit-transform: translateY(0); 198 | transform: translateY(0); 199 | 200 | opacity: 1; 201 | } 202 | 75% 203 | { 204 | -webkit-transform: translateY(20px); 205 | transform: translateY(20px); 206 | 207 | opacity: 0; 208 | } 209 | } 210 | @keyframes fade-down 211 | { 212 | 0% 213 | { 214 | -webkit-transform: translateY(0); 215 | transform: translateY(0); 216 | 217 | opacity: 1; 218 | } 219 | 75% 220 | { 221 | -webkit-transform: translateY(20px); 222 | transform: translateY(20px); 223 | 224 | opacity: 0; 225 | } 226 | } 227 | @-webkit-keyframes tada 228 | { 229 | from 230 | { 231 | -webkit-transform: scale3d(1, 1, 1); 232 | transform: scale3d(1, 1, 1); 233 | } 234 | 235 | 10%, 236 | 20% 237 | { 238 | -webkit-transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg); 239 | transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg); 240 | } 241 | 242 | 30%, 243 | 50%, 244 | 70%, 245 | 90% 246 | { 247 | -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg); 248 | transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg); 249 | } 250 | 251 | 40%, 252 | 60%, 253 | 80% 254 | { 255 | -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg); 256 | transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg); 257 | } 258 | 259 | to 260 | { 261 | -webkit-transform: scale3d(1, 1, 1); 262 | transform: scale3d(1, 1, 1); 263 | } 264 | } 265 | 266 | @keyframes tada 267 | { 268 | from 269 | { 270 | -webkit-transform: scale3d(1, 1, 1); 271 | transform: scale3d(1, 1, 1); 272 | } 273 | 274 | 10%, 275 | 20% 276 | { 277 | -webkit-transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg); 278 | transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg); 279 | } 280 | 281 | 30%, 282 | 50%, 283 | 70%, 284 | 90% 285 | { 286 | -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg); 287 | transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg); 288 | } 289 | 290 | 40%, 291 | 60%, 292 | 80% 293 | { 294 | -webkit-transform: rotate3d(0, 0, 1, -10deg); 295 | transform: rotate3d(0, 0, 1, -10deg); 296 | } 297 | 298 | to 299 | { 300 | -webkit-transform: scale3d(1, 1, 1); 301 | transform: scale3d(1, 1, 1); 302 | } 303 | } 304 | .bx-spin 305 | { 306 | -webkit-animation: spin 2s linear infinite; 307 | animation: spin 2s linear infinite; 308 | } 309 | .bx-spin-hover:hover 310 | { 311 | -webkit-animation: spin 2s linear infinite; 312 | animation: spin 2s linear infinite; 313 | } 314 | 315 | .bx-tada 316 | { 317 | -webkit-animation: tada 1.5s ease infinite; 318 | animation: tada 1.5s ease infinite; 319 | } 320 | .bx-tada-hover:hover 321 | { 322 | -webkit-animation: tada 1.5s ease infinite; 323 | animation: tada 1.5s ease infinite; 324 | } 325 | 326 | .bx-flashing 327 | { 328 | -webkit-animation: flashing 1.5s infinite linear; 329 | animation: flashing 1.5s infinite linear; 330 | } 331 | .bx-flashing-hover:hover 332 | { 333 | -webkit-animation: flashing 1.5s infinite linear; 334 | animation: flashing 1.5s infinite linear; 335 | } 336 | 337 | .bx-burst 338 | { 339 | -webkit-animation: burst 1.5s infinite linear; 340 | animation: burst 1.5s infinite linear; 341 | } 342 | .bx-burst-hover:hover 343 | { 344 | -webkit-animation: burst 1.5s infinite linear; 345 | animation: burst 1.5s infinite linear; 346 | } 347 | .bx-fade-up 348 | { 349 | -webkit-animation: fade-up 1.5s infinite linear; 350 | animation: fade-up 1.5s infinite linear; 351 | } 352 | .bx-fade-up-hover:hover 353 | { 354 | -webkit-animation: fade-up 1.5s infinite linear; 355 | animation: fade-up 1.5s infinite linear; 356 | } 357 | .bx-fade-down 358 | { 359 | -webkit-animation: fade-down 1.5s infinite linear; 360 | animation: fade-down 1.5s infinite linear; 361 | } 362 | .bx-fade-down-hover:hover 363 | { 364 | -webkit-animation: fade-down 1.5s infinite linear; 365 | animation: fade-down 1.5s infinite linear; 366 | } 367 | .bx-fade-left 368 | { 369 | -webkit-animation: fade-left 1.5s infinite linear; 370 | animation: fade-left 1.5s infinite linear; 371 | } 372 | .bx-fade-left-hover:hover 373 | { 374 | -webkit-animation: fade-left 1.5s infinite linear; 375 | animation: fade-left 1.5s infinite linear; 376 | } 377 | .bx-fade-right 378 | { 379 | -webkit-animation: fade-right 1.5s infinite linear; 380 | animation: fade-right 1.5s infinite linear; 381 | } 382 | .bx-fade-right-hover:hover 383 | { 384 | -webkit-animation: fade-right 1.5s infinite linear; 385 | animation: fade-right 1.5s infinite linear; 386 | } -------------------------------------------------------------------------------- /static/assets/vendor/boxicons/css/transformations.css: -------------------------------------------------------------------------------- 1 | .bx-rotate-90 2 | { 3 | transform: rotate(90deg); 4 | 5 | -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)'; 6 | } 7 | .bx-rotate-180 8 | { 9 | transform: rotate(180deg); 10 | 11 | -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2)'; 12 | } 13 | .bx-rotate-270 14 | { 15 | transform: rotate(270deg); 16 | 17 | -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)'; 18 | } 19 | .bx-flip-horizontal 20 | { 21 | transform: scaleX(-1); 22 | 23 | -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)'; 24 | } 25 | .bx-flip-vertical 26 | { 27 | transform: scaleY(-1); 28 | 29 | -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)'; 30 | } 31 | -------------------------------------------------------------------------------- /static/assets/vendor/boxicons/fonts/boxicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/vendor/boxicons/fonts/boxicons.eot -------------------------------------------------------------------------------- /static/assets/vendor/boxicons/fonts/boxicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/vendor/boxicons/fonts/boxicons.ttf -------------------------------------------------------------------------------- /static/assets/vendor/boxicons/fonts/boxicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/vendor/boxicons/fonts/boxicons.woff -------------------------------------------------------------------------------- /static/assets/vendor/boxicons/fonts/boxicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/vendor/boxicons/fonts/boxicons.woff2 -------------------------------------------------------------------------------- /static/assets/vendor/counterup/counterup.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery.counterup.js 2.1.0 3 | * 4 | * Copyright 2013, Benjamin Intal http://gambit.ph @bfintal 5 | * Released under the GPL v2 License 6 | * 7 | * Amended by Jeremy Paris, Ciro Mattia Gonano and others 8 | * 9 | * Date: Feb 24, 2017 10 | */ 11 | (function($){"use strict";$.fn.counterUp=function(options){var settings=$.extend({time:400,delay:10,offset:100,beginAt:0,formatter:false,context:"window",callback:function(){}},options),s;return this.each(function(){var $this=$(this),counter={time:$(this).data("counterup-time")||settings.time,delay:$(this).data("counterup-delay")||settings.delay,offset:$(this).data("counterup-offset")||settings.offset,beginAt:$(this).data("counterup-beginat")||settings.beginAt,context:$(this).data("counterup-context")||settings.context};var counterUpper=function(){var nums=[];var divisions=counter.time/counter.delay;var num=$(this).attr("data-num")?$(this).attr("data-num"):$this.text();var isComma=/[0-9]+,[0-9]+/.test(num);num=num.replace(/,/g,"");var decimalPlaces=(num.split(".")[1]||[]).length;if(counter.beginAt>num)counter.beginAt=num;var isTime=/[0-9]+:[0-9]+:[0-9]+/.test(num);if(isTime){var times=num.split(":"),m=1;s=0;while(times.length>0){s+=m*parseInt(times.pop(),10);m*=60}}for(var i=divisions;i>=counter.beginAt/num*divisions;i--){var newNum=parseFloat(num/divisions*i).toFixed(decimalPlaces);if(isTime){newNum=parseInt(s/divisions*i);var hours=parseInt(newNum/3600)%24;var minutes=parseInt(newNum/60)%60;var seconds=parseInt(newNum%60,10);newNum=(hours<10?"0"+hours:hours)+":"+(minutes<10?"0"+minutes:minutes)+":"+(seconds<10?"0"+seconds:seconds)}if(isComma){while(/(\d+)(\d{3})/.test(newNum.toString())){newNum=newNum.toString().replace(/(\d+)(\d{3})/,"$1"+","+"$2")}}if(settings.formatter){newNum=settings.formatter.call(this,newNum)}nums.unshift(newNum)}$this.data("counterup-nums",nums);$this.text(counter.beginAt);var f=function(){if(!$this.data("counterup-nums")){settings.callback.call(this);return}$this.html($this.data("counterup-nums").shift());if($this.data("counterup-nums").length){setTimeout($this.data("counterup-func"),counter.delay)}else{$this.data("counterup-nums",null);$this.data("counterup-func",null);settings.callback.call(this)}};$this.data("counterup-func",f);setTimeout($this.data("counterup-func"),counter.delay)};$this.waypoint(function(direction){counterUpper();this.destroy()},{offset:counter.offset+"%",context:counter.context})})}})(jQuery); 12 | -------------------------------------------------------------------------------- /static/assets/vendor/icofont/fonts/icofont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/vendor/icofont/fonts/icofont.woff -------------------------------------------------------------------------------- /static/assets/vendor/icofont/fonts/icofont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/assets/vendor/icofont/fonts/icofont.woff2 -------------------------------------------------------------------------------- /static/assets/vendor/jquery-sticky/jquery.sticky.js: -------------------------------------------------------------------------------- 1 | // Sticky Plugin v1.0.4 for jQuery 2 | // ============= 3 | // Author: Anthony Garand 4 | // Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk) 5 | // Improvements by Leonardo C. Daronco (daronco) 6 | // Created: 02/14/2011 7 | // Date: 07/20/2015 8 | // Website: http://stickyjs.com/ 9 | // Description: Makes an element on the page stick on the screen as you scroll 10 | // It will only set the 'top' and 'position' of your element, you 11 | // might need to adjust the width in some cases. 12 | 13 | (function (factory) { 14 | if (typeof define === 'function' && define.amd) { 15 | // AMD. Register as an anonymous module. 16 | define(['jquery'], factory); 17 | } else if (typeof module === 'object' && module.exports) { 18 | // Node/CommonJS 19 | module.exports = factory(require('jquery')); 20 | } else { 21 | // Browser globals 22 | factory(jQuery); 23 | } 24 | }(function ($) { 25 | var slice = Array.prototype.slice; // save ref to original slice() 26 | var splice = Array.prototype.splice; // save ref to original slice() 27 | 28 | var defaults = { 29 | topSpacing: 0, 30 | bottomSpacing: 0, 31 | className: 'is-sticky', 32 | wrapperClassName: 'sticky-wrapper', 33 | center: false, 34 | getWidthFrom: '', 35 | widthFromWrapper: true, // works only when .getWidthFrom is empty 36 | responsiveWidth: false, 37 | zIndex: 'auto' 38 | }, 39 | $window = $(window), 40 | $document = $(document), 41 | sticked = [], 42 | windowHeight = $window.height(), 43 | scroller = function() { 44 | var scrollTop = $window.scrollTop(), 45 | documentHeight = $document.height(), 46 | dwh = documentHeight - windowHeight, 47 | extra = (scrollTop > dwh) ? dwh - scrollTop : 0; 48 | 49 | for (var i = 0, l = sticked.length; i < l; i++) { 50 | var s = sticked[i], 51 | elementTop = s.stickyWrapper.offset().top, 52 | etse = elementTop - s.topSpacing - extra; 53 | 54 | //update height in case of dynamic content 55 | s.stickyWrapper.css('height', s.stickyElement.outerHeight()); 56 | 57 | if (scrollTop <= etse) { 58 | if (s.currentTop !== null) { 59 | s.stickyElement 60 | .css({ 61 | 'width': '', 62 | 'position': '', 63 | 'top': '', 64 | 'z-index': '' 65 | }); 66 | s.stickyElement.parent().removeClass(s.className); 67 | s.stickyElement.trigger('sticky-end', [s]); 68 | s.currentTop = null; 69 | } 70 | } 71 | else { 72 | var newTop = documentHeight - s.stickyElement.outerHeight() 73 | - s.topSpacing - s.bottomSpacing - scrollTop - extra; 74 | if (newTop < 0) { 75 | newTop = newTop + s.topSpacing; 76 | } else { 77 | newTop = s.topSpacing; 78 | } 79 | if (s.currentTop !== newTop) { 80 | var newWidth; 81 | if (s.getWidthFrom) { 82 | newWidth = $(s.getWidthFrom).width() || null; 83 | } else if (s.widthFromWrapper) { 84 | newWidth = s.stickyWrapper.width(); 85 | } 86 | if (newWidth == null) { 87 | newWidth = s.stickyElement.width(); 88 | } 89 | s.stickyElement 90 | .css('width', newWidth) 91 | .css('position', 'fixed') 92 | .css('top', newTop) 93 | .css('z-index', s.zIndex); 94 | 95 | s.stickyElement.parent().addClass(s.className); 96 | 97 | if (s.currentTop === null) { 98 | s.stickyElement.trigger('sticky-start', [s]); 99 | } else { 100 | // sticky is started but it have to be repositioned 101 | s.stickyElement.trigger('sticky-update', [s]); 102 | } 103 | 104 | if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) { 105 | // just reached bottom || just started to stick but bottom is already reached 106 | s.stickyElement.trigger('sticky-bottom-reached', [s]); 107 | } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) { 108 | // sticky is started && sticked at topSpacing && overflowing from top just finished 109 | s.stickyElement.trigger('sticky-bottom-unreached', [s]); 110 | } 111 | 112 | s.currentTop = newTop; 113 | } 114 | 115 | // Check if sticky has reached end of container and stop sticking 116 | var stickyWrapperContainer = s.stickyWrapper.parent(); 117 | var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing); 118 | 119 | if( unstick ) { 120 | s.stickyElement 121 | .css('position', 'absolute') 122 | .css('top', '') 123 | .css('bottom', 0) 124 | .css('z-index', ''); 125 | } else { 126 | s.stickyElement 127 | .css('position', 'fixed') 128 | .css('top', newTop) 129 | .css('bottom', '') 130 | .css('z-index', s.zIndex); 131 | } 132 | } 133 | } 134 | }, 135 | resizer = function() { 136 | windowHeight = $window.height(); 137 | 138 | for (var i = 0, l = sticked.length; i < l; i++) { 139 | var s = sticked[i]; 140 | var newWidth = null; 141 | if (s.getWidthFrom) { 142 | if (s.responsiveWidth) { 143 | newWidth = $(s.getWidthFrom).width(); 144 | } 145 | } else if(s.widthFromWrapper) { 146 | newWidth = s.stickyWrapper.width(); 147 | } 148 | if (newWidth != null) { 149 | s.stickyElement.css('width', newWidth); 150 | } 151 | } 152 | }, 153 | methods = { 154 | init: function(options) { 155 | var o = $.extend({}, defaults, options); 156 | return this.each(function() { 157 | var stickyElement = $(this); 158 | 159 | var stickyId = stickyElement.attr('id'); 160 | var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName; 161 | var wrapper = $('
    ') 162 | .attr('id', wrapperId) 163 | .addClass(o.wrapperClassName); 164 | 165 | stickyElement.wrapAll(wrapper); 166 | 167 | var stickyWrapper = stickyElement.parent(); 168 | 169 | if (o.center) { 170 | stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"}); 171 | } 172 | 173 | if (stickyElement.css("float") === "right") { 174 | stickyElement.css({"float":"none"}).parent().css({"float":"right"}); 175 | } 176 | 177 | o.stickyElement = stickyElement; 178 | o.stickyWrapper = stickyWrapper; 179 | o.currentTop = null; 180 | 181 | sticked.push(o); 182 | 183 | methods.setWrapperHeight(this); 184 | methods.setupChangeListeners(this); 185 | }); 186 | }, 187 | 188 | setWrapperHeight: function(stickyElement) { 189 | var element = $(stickyElement); 190 | var stickyWrapper = element.parent(); 191 | if (stickyWrapper) { 192 | stickyWrapper.css('height', element.outerHeight()); 193 | } 194 | }, 195 | 196 | setupChangeListeners: function(stickyElement) { 197 | if (window.MutationObserver) { 198 | var mutationObserver = new window.MutationObserver(function(mutations) { 199 | if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) { 200 | methods.setWrapperHeight(stickyElement); 201 | } 202 | }); 203 | mutationObserver.observe(stickyElement, {subtree: true, childList: true}); 204 | } else { 205 | stickyElement.addEventListener('DOMNodeInserted', function() { 206 | methods.setWrapperHeight(stickyElement); 207 | }, false); 208 | stickyElement.addEventListener('DOMNodeRemoved', function() { 209 | methods.setWrapperHeight(stickyElement); 210 | }, false); 211 | } 212 | }, 213 | update: scroller, 214 | unstick: function(options) { 215 | return this.each(function() { 216 | var that = this; 217 | var unstickyElement = $(that); 218 | 219 | var removeIdx = -1; 220 | var i = sticked.length; 221 | while (i-- > 0) { 222 | if (sticked[i].stickyElement.get(0) === that) { 223 | splice.call(sticked,i,1); 224 | removeIdx = i; 225 | } 226 | } 227 | if(removeIdx !== -1) { 228 | unstickyElement.unwrap(); 229 | unstickyElement 230 | .css({ 231 | 'width': '', 232 | 'position': '', 233 | 'top': '', 234 | 'float': '', 235 | 'z-index': '' 236 | }) 237 | ; 238 | } 239 | }); 240 | } 241 | }; 242 | 243 | // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer): 244 | if (window.addEventListener) { 245 | window.addEventListener('scroll', scroller, false); 246 | window.addEventListener('resize', resizer, false); 247 | } else if (window.attachEvent) { 248 | window.attachEvent('onscroll', scroller); 249 | window.attachEvent('onresize', resizer); 250 | } 251 | 252 | $.fn.sticky = function(method) { 253 | if (methods[method]) { 254 | return methods[method].apply(this, slice.call(arguments, 1)); 255 | } else if (typeof method === 'object' || !method ) { 256 | return methods.init.apply( this, arguments ); 257 | } else { 258 | $.error('Method ' + method + ' does not exist on jQuery.sticky'); 259 | } 260 | }; 261 | 262 | $.fn.unstick = function(method) { 263 | if (methods[method]) { 264 | return methods[method].apply(this, slice.call(arguments, 1)); 265 | } else if (typeof method === 'object' || !method ) { 266 | return methods.unstick.apply( this, arguments ); 267 | } else { 268 | $.error('Method ' + method + ' does not exist on jQuery.sticky'); 269 | } 270 | }; 271 | $(function() { 272 | setTimeout(scroller, 0); 273 | }); 274 | })); 275 | -------------------------------------------------------------------------------- /static/assets/vendor/jquery.easing/jquery.easing.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){$.easing.jswing=$.easing.swing;var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})}); -------------------------------------------------------------------------------- /static/assets/vendor/venobox/venobox.css: -------------------------------------------------------------------------------- 1 | /* ------ venobox.css --------*/ 2 | .vbox-overlay *, .vbox-overlay *:before, .vbox-overlay *:after{ 3 | -webkit-backface-visibility: hidden; 4 | -webkit-box-sizing:border-box; 5 | -moz-box-sizing:border-box; 6 | box-sizing:border-box; 7 | } 8 | .vbox-overlay * { 9 | -webkit-backface-visibility: visible; 10 | backface-visibility: visible; 11 | } 12 | .vbox-overlay{ 13 | display: -webkit-flex; 14 | display: flex; 15 | -webkit-flex-direction: column; 16 | flex-direction: column; 17 | -webkit-justify-content: center; 18 | justify-content: center; 19 | -webkit-align-items: center; 20 | align-items: center; 21 | position: fixed; 22 | left: 0; 23 | top: 0; 24 | bottom: 0; 25 | right: 0; 26 | z-index: 1040; 27 | -webkit-transform:translateZ(1000px); 28 | transform: translateZ(1000px); 29 | transform-style: preserve-3d; 30 | } 31 | 32 | /* ----- navigation ----- */ 33 | .vbox-title{ 34 | width: 100%; 35 | height: 40px; 36 | float: left; 37 | text-align: center; 38 | line-height: 28px; 39 | font-size: 12px; 40 | padding: 6px 40px; 41 | overflow: hidden; 42 | position: fixed; 43 | display: none; 44 | left: 0; 45 | z-index: 1050; 46 | } 47 | .vbox-close{ 48 | cursor: pointer; 49 | position: fixed; 50 | top: -1px; 51 | right: 0; 52 | width: 50px; 53 | height: 40px; 54 | padding: 6px; 55 | display: block; 56 | background-position:10px center; 57 | overflow: hidden; 58 | font-size: 24px; 59 | line-height: 1; 60 | text-align: center; 61 | z-index: 1050; 62 | } 63 | .vbox-num{ 64 | cursor: pointer; 65 | position: fixed; 66 | left: 0; 67 | height: 40px; 68 | display: block; 69 | overflow: hidden; 70 | line-height: 28px; 71 | font-size: 12px; 72 | padding: 6px 10px; 73 | display: none; 74 | z-index: 1050; 75 | } 76 | /* ----- navigation ARROWS ----- */ 77 | .vbox-next, .vbox-prev{ 78 | position: fixed; 79 | top: 50%; 80 | margin-top: -15px; 81 | overflow: hidden; 82 | cursor: pointer; 83 | display: block; 84 | width: 45px; 85 | height: 45px; 86 | z-index: 1050; 87 | } 88 | .vbox-next span, .vbox-prev span{ 89 | position: relative; 90 | width: 20px; 91 | height: 20px; 92 | border: 2px solid transparent; 93 | border-top-color: #B6B6B6; 94 | border-right-color: #B6B6B6; 95 | text-indent: -100px; 96 | position: absolute; 97 | top: 8px; 98 | display: block; 99 | } 100 | .vbox-prev{ 101 | left: 15px; 102 | } 103 | .vbox-next{ 104 | right: 15px; 105 | } 106 | .vbox-prev span{ 107 | left: 10px; 108 | -ms-transform: rotate(-135deg); 109 | -webkit-transform: rotate(-135deg); 110 | transform: rotate(-135deg); 111 | } 112 | .vbox-next span{ 113 | -ms-transform: rotate(45deg); 114 | -webkit-transform: rotate(45deg); 115 | transform: rotate(45deg); 116 | right: 10px; 117 | } 118 | /* ------- inline window ------ */ 119 | .vbox-inline{ 120 | width: 420px; 121 | height: 315px; 122 | height: 70vh; 123 | padding: 10px; 124 | background: #fff; 125 | margin: 0 auto; 126 | overflow: auto; 127 | text-align: left; 128 | } 129 | /* ------- Video & iFrames window ------ */ 130 | .venoframe{ 131 | max-width: 100%; 132 | width: 100%; 133 | border: none; 134 | width: 100%; 135 | height: 260px; 136 | height: 70vh; 137 | } 138 | .venoframe.vbvid{ 139 | height: 260px; 140 | } 141 | @media (min-width: 768px) { 142 | .venoframe, .vbox-inline{ 143 | width: 90%; 144 | height: 360px; 145 | height: 70vh; 146 | } 147 | .venoframe.vbvid{ 148 | width: 640px; 149 | height: 360px; 150 | } 151 | } 152 | @media (min-width: 992px) { 153 | .venoframe, .vbox-inline{ 154 | max-width: 1200px; 155 | width: 80%; 156 | height: 540px; 157 | height: 70vh; 158 | } 159 | .venoframe.vbvid{ 160 | width: 960px; 161 | height: 540px; 162 | } 163 | } 164 | /* 165 | Please do NOT edit this part! 166 | or at least read this note: http://i.imgur.com/7C0ws9e.gif 167 | */ 168 | .vbox-open{ 169 | overflow: hidden; 170 | } 171 | .vbox-container{ 172 | position: absolute; 173 | left: 0; 174 | right: 0; 175 | top: 0; 176 | bottom: 0; 177 | overflow-x: hidden; 178 | overflow-y: scroll; 179 | overflow-scrolling: touch; 180 | -webkit-overflow-scrolling: touch; 181 | z-index: 20; 182 | max-height: 100%; 183 | 184 | } 185 | 186 | .vbox-content{ 187 | text-align: center; 188 | float: left; 189 | width: 100%; 190 | position: relative; 191 | overflow: hidden; 192 | padding: 20px 10px; 193 | } 194 | .vbox-container img{ 195 | max-width: 100%; 196 | height: auto; 197 | } 198 | .vbox-figlio{ 199 | box-shadow: 0 0 12px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); 200 | max-width: 100%; 201 | text-align: initial; 202 | } 203 | img.vbox-figlio{ 204 | -webkit-user-select: none; 205 | -khtml-user-select: none; 206 | -moz-user-select: none; 207 | -o-user-select: none; 208 | user-select: none; 209 | } 210 | .vbox-content.swipe-left{ 211 | margin-left: -200px !important; 212 | } 213 | .vbox-content.swipe-right{ 214 | margin-left: 200px !important; 215 | } 216 | .vbox-animated{ 217 | webkit-transition: margin 300ms ease-out; 218 | transition: margin 300ms ease-out; 219 | } 220 | 221 | /* ---------- preloader ---------- 222 | * SPINKIT 223 | * http://tobiasahlin.com/spinkit/ 224 | -------------------------------- */ 225 | .sk-double-bounce,.sk-rotating-plane{width:40px;height:40px;margin:40px auto}.sk-rotating-plane{background-color:#333;-webkit-animation:sk-rotatePlane 1.2s infinite ease-in-out;animation:sk-rotatePlane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0) rotateY(0);transform:perspective(120px) rotateX(0) rotateY(0)}50%{-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0);transform:perspective(120px) rotateX(-180.1deg) rotateY(0)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}@keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0) rotateY(0);transform:perspective(120px) rotateX(0) rotateY(0)}50%{-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0);transform:perspective(120px) rotateX(-180.1deg) rotateY(0)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}.sk-double-bounce{position:relative}.sk-double-bounce .sk-child{width:100%;height:100%;border-radius:50%;background-color:#333;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-doubleBounce 2s infinite ease-in-out;animation:sk-doubleBounce 2s infinite ease-in-out}.sk-chasing-dots .sk-child,.sk-spinner-pulse,.sk-three-bounce .sk-child{background-color:#333;border-radius:100%}.sk-double-bounce .sk-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-wave{margin:40px auto;width:50px;height:40px;text-align:center;font-size:10px}.sk-wave .sk-rect{background-color:#333;height:100%;width:6px;display:inline-block;-webkit-animation:sk-waveStretchDelay 1.2s infinite ease-in-out;animation:sk-waveStretchDelay 1.2s infinite ease-in-out}.sk-wave .sk-rect1{-webkit-animation-delay:-1.2s;animation-delay:-1.2s}.sk-wave .sk-rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-wave .sk-rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-wave .sk-rect4{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-wave .sk-rect5{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-waveStretchDelay{0%,100%,40%{-webkit-transform:scaleY(.4);transform:scaleY(.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes sk-waveStretchDelay{0%,100%,40%{-webkit-transform:scaleY(.4);transform:scaleY(.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}.sk-wandering-cubes{margin:40px auto;width:40px;height:40px;position:relative}.sk-wandering-cubes .sk-cube{background-color:#333;width:10px;height:10px;position:absolute;top:0;left:0;-webkit-animation:sk-wanderingCube 1.8s ease-in-out -1.8s infinite both;animation:sk-wanderingCube 1.8s ease-in-out -1.8s infinite both}.sk-chasing-dots,.sk-spinner-pulse{width:40px;height:40px;margin:40px auto}.sk-wandering-cubes .sk-cube2{-webkit-animation-delay:-.9s;animation-delay:-.9s}@-webkit-keyframes sk-wanderingCube{0%{-webkit-transform:rotate(0);transform:rotate(0)}25%{-webkit-transform:translateX(30px) rotate(-90deg) scale(.5);transform:translateX(30px) rotate(-90deg) scale(.5)}50%{-webkit-transform:translateX(30px) translateY(30px) rotate(-179deg);transform:translateX(30px) translateY(30px) rotate(-179deg)}50.1%{-webkit-transform:translateX(30px) translateY(30px) rotate(-180deg);transform:translateX(30px) translateY(30px) rotate(-180deg)}75%{-webkit-transform:translateX(0) translateY(30px) rotate(-270deg) scale(.5);transform:translateX(0) translateY(30px) rotate(-270deg) scale(.5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes sk-wanderingCube{0%{-webkit-transform:rotate(0);transform:rotate(0)}25%{-webkit-transform:translateX(30px) rotate(-90deg) scale(.5);transform:translateX(30px) rotate(-90deg) scale(.5)}50%{-webkit-transform:translateX(30px) translateY(30px) rotate(-179deg);transform:translateX(30px) translateY(30px) rotate(-179deg)}50.1%{-webkit-transform:translateX(30px) translateY(30px) rotate(-180deg);transform:translateX(30px) translateY(30px) rotate(-180deg)}75%{-webkit-transform:translateX(0) translateY(30px) rotate(-270deg) scale(.5);transform:translateX(0) translateY(30px) rotate(-270deg) scale(.5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.sk-spinner-pulse{-webkit-animation:sk-pulseScaleOut 1s infinite ease-in-out;animation:sk-pulseScaleOut 1s infinite ease-in-out}@-webkit-keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.sk-chasing-dots{position:relative;text-align:center;-webkit-animation:sk-chasingDotsRotate 2s infinite linear;animation:sk-chasingDotsRotate 2s infinite linear}.sk-chasing-dots .sk-child{width:60%;height:60%;display:inline-block;position:absolute;top:0;-webkit-animation:sk-chasingDotsBounce 2s infinite ease-in-out;animation:sk-chasingDotsBounce 2s infinite ease-in-out}.sk-chasing-dots .sk-dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-three-bounce{margin:40px auto;width:80px;text-align:center}.sk-three-bounce .sk-child{width:20px;height:20px;display:inline-block;-webkit-animation:sk-three-bounce 1.4s ease-in-out 0s infinite both;animation:sk-three-bounce 1.4s ease-in-out 0s infinite both}.sk-circle .sk-child:before,.sk-fading-circle .sk-circle:before{display:block;border-radius:100%;content:'';background-color:#333}.sk-three-bounce .sk-bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.sk-three-bounce .sk-bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes sk-three-bounce{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-three-bounce{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-circle{margin:40px auto;width:40px;height:40px;position:relative}.sk-circle .sk-child{width:100%;height:100%;position:absolute;left:0;top:0}.sk-circle .sk-child:before{margin:0 auto;width:15%;height:15%;-webkit-animation:sk-circleBounceDelay 1.2s infinite ease-in-out both;animation:sk-circleBounceDelay 1.2s infinite ease-in-out both}.sk-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-circle .sk-circle4:before{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-circle .sk-circle5:before{-webkit-animation-delay:-.8s;animation-delay:-.8s}.sk-circle .sk-circle6:before{-webkit-animation-delay:-.7s;animation-delay:-.7s}.sk-circle .sk-circle7:before{-webkit-animation-delay:-.6s;animation-delay:-.6s}.sk-circle .sk-circle8:before{-webkit-animation-delay:-.5s;animation-delay:-.5s}.sk-circle .sk-circle9:before{-webkit-animation-delay:-.4s;animation-delay:-.4s}.sk-circle .sk-circle10:before{-webkit-animation-delay:-.3s;animation-delay:-.3s}.sk-circle .sk-circle11:before{-webkit-animation-delay:-.2s;animation-delay:-.2s}.sk-circle .sk-circle12:before{-webkit-animation-delay:-.1s;animation-delay:-.1s}@-webkit-keyframes sk-circleBounceDelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-circleBounceDelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-cube-grid{width:40px;height:40px;margin:40px auto}.sk-cube-grid .sk-cube{width:33.33%;height:33.33%;background-color:#333;float:left;-webkit-animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out;animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out}.sk-cube-grid .sk-cube1{-webkit-animation-delay:.2s;animation-delay:.2s}.sk-cube-grid .sk-cube2{-webkit-animation-delay:.3s;animation-delay:.3s}.sk-cube-grid .sk-cube3{-webkit-animation-delay:.4s;animation-delay:.4s}.sk-cube-grid .sk-cube4{-webkit-animation-delay:.1s;animation-delay:.1s}.sk-cube-grid .sk-cube5{-webkit-animation-delay:.2s;animation-delay:.2s}.sk-cube-grid .sk-cube6{-webkit-animation-delay:.3s;animation-delay:.3s}.sk-cube-grid .sk-cube7{-webkit-animation-delay:0ms;animation-delay:0ms}.sk-cube-grid .sk-cube8{-webkit-animation-delay:.1s;animation-delay:.1s}.sk-cube-grid .sk-cube9{-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-cubeGridScaleDelay{0%,100%,70%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}@keyframes sk-cubeGridScaleDelay{0%,100%,70%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}.sk-fading-circle{margin:40px auto;width:40px;height:40px;position:relative}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{margin:0 auto;width:15%;height:15%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out both;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-fading-circle .sk-circle4:before{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{-webkit-animation-delay:-.8s;animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{-webkit-animation-delay:-.7s;animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{-webkit-animation-delay:-.6s;animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{-webkit-animation-delay:-.5s;animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{-webkit-animation-delay:-.4s;animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{-webkit-animation-delay:-.3s;animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{-webkit-animation-delay:-.2s;animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{-webkit-animation-delay:-.1s;animation-delay:-.1s}@-webkit-keyframes sk-circleFadeDelay{0%,100%,39%{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,100%,39%{opacity:0}40%{opacity:1}}.sk-folding-cube{margin:40px auto;width:40px;height:40px;position:relative;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}.sk-folding-cube .sk-cube{float:left;width:50%;height:50%;position:relative;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.sk-folding-cube .sk-cube:before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background-color:#333;-webkit-animation:sk-foldCubeAngle 2.4s infinite linear both;animation:sk-foldCubeAngle 2.4s infinite linear both;-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.sk-folding-cube .sk-cube2{-webkit-transform:scale(1.1) rotateZ(90deg);transform:scale(1.1) rotateZ(90deg)}.sk-folding-cube .sk-cube3{-webkit-transform:scale(1.1) rotateZ(180deg);transform:scale(1.1) rotateZ(180deg)}.sk-folding-cube .sk-cube4{-webkit-transform:scale(1.1) rotateZ(270deg);transform:scale(1.1) rotateZ(270deg)}.sk-folding-cube .sk-cube2:before{-webkit-animation-delay:.3s;animation-delay:.3s}.sk-folding-cube .sk-cube3:before{-webkit-animation-delay:.6s;animation-delay:.6s}.sk-folding-cube .sk-cube4:before{-webkit-animation-delay:.9s;animation-delay:.9s}@-webkit-keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}}@keyframes sk-foldCubeAngle{0%,10%{-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg);opacity:0}25%,75%{-webkit-transform:perspective(140px) rotateX(0);transform:perspective(140px) rotateX(0);opacity:1}100%,90%{-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg);opacity:0}} 226 | -------------------------------------------------------------------------------- /static/assets/vendor/venobox/venobox.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * VenoBox - jQuery Plugin 3 | * version: 1.8.6 4 | * @requires jQuery >= 1.7.0 5 | * 6 | * Examples at http://veno.es/venobox/ 7 | * License: MIT License 8 | * License URI: https://github.com/nicolafranchini/VenoBox/blob/master/LICENSE 9 | * Copyright 2013-2019 Nicola Franchini - @nicolafranchini 10 | * 11 | */ 12 | !function(e){"use strict";var s,i,a,c,o,t,d,l,r,n,v,u,b,k,p,m,h,f,g,x,y,w,C,_,B,P,E,O,D,M,N,U,V,I,z,R,X,Y,j,W,q;e.fn.extend({venobox:function($){var A=this,H=e.extend({arrowsColor:"#B6B6B6",autoplay:!1,bgcolor:"#fff",border:"0",closeBackground:"#161617",closeColor:"#d2d2d2",framewidth:"",frameheight:"",gallItems:!1,infinigall:!1,htmlClose:"×",htmlNext:"Next",htmlPrev:"Prev",numeratio:!1,numerationBackground:"#161617",numerationColor:"#d2d2d2",numerationPosition:"top",overlayClose:!0,overlayColor:"rgba(23,23,23,0.85)",spinner:"double-bounce",spinColor:"#d2d2d2",titleattr:"title",titleBackground:"#161617",titleColor:"#d2d2d2",titlePosition:"top",cb_pre_open:function(){return!0},cb_post_open:function(){},cb_pre_close:function(){return!0},cb_post_close:function(){},cb_post_resize:function(){},cb_after_nav:function(){},cb_content_loaded:function(){},cb_init:function(){}},$);return H.cb_init(A),this.each(function(){if((D=e(this)).data("venobox"))return!0;function $(){y=D.data("gall"),h=D.data("numeratio"),u=D.data("gallItems"),b=D.data("infinigall"),k=u||e('.vbox-item[data-gall="'+y+'"]'),w=k.eq(k.index(D)+1),C=k.eq(k.index(D)-1),w.length||!0!==b||(w=k.eq(0)),k.length>=1?(M=k.index(D)+1,a.html(M+" / "+k.length)):M=1,!0===h?a.show():a.hide(),""!==x?c.show():c.hide(),w.length||!0===b?(e(".vbox-next").css("display","block"),_=!0):(e(".vbox-next").css("display","none"),_=!1),k.index(D)>0||!0===b?(e(".vbox-prev").css("display","block"),B=!0):(e(".vbox-prev").css("display","none"),B=!1),!0!==B&&!0!==_||(d.on(K.DOWN,F),d.on(K.MOVE,G),d.on(K.UP,J))}function Q(e){return!(e.length<1)&&(!p&&(p=!0,f=e.data("overlay")||e.data("overlaycolor"),n=e.data("framewidth"),v=e.data("frameheight"),o=e.data("border"),i=e.data("bgcolor"),l=e.data("href")||e.attr("href"),s=e.data("autoplay"),x=e.data("titleattr")&&e.attr(e.data("titleattr"))||"",e===C&&d.addClass("vbox-animated").addClass("swipe-right"),e===w&&d.addClass("vbox-animated").addClass("swipe-left"),E.show(),void d.animate({opacity:0},500,function(){g.css("background",f),d.removeClass("vbox-animated").removeClass("swipe-left").removeClass("swipe-right").css({"margin-left":0,"margin-right":0}),"iframe"==e.data("vbtype")?ae():"inline"==e.data("vbtype")?oe():"ajax"==e.data("vbtype")?ie():"video"==e.data("vbtype")?ce(s):(d.html(''),te()),D=e,$(),p=!1,H.cb_after_nav(D,M,w,C)})))}function S(e){27===e.keyCode&&T(),37==e.keyCode&&!0===B&&Q(C),39==e.keyCode&&!0===_&&Q(w)}function T(){if(!1===H.cb_pre_close(D,M,w,C))return!1;e("body").off("keydown",S).removeClass("vbox-open"),D.focus(),g.animate({opacity:0},500,function(){g.remove(),p=!1,H.cb_post_close()})}A.VBclose=function(){T()},D.addClass("vbox-item"),D.data("framewidth",H.framewidth),D.data("frameheight",H.frameheight),D.data("border",H.border),D.data("bgcolor",H.bgcolor),D.data("numeratio",H.numeratio),D.data("gallItems",H.gallItems),D.data("infinigall",H.infinigall),D.data("overlaycolor",H.overlayColor),D.data("titleattr",H.titleattr),D.data("venobox",!0),D.on("click",function(u){if(u.preventDefault(),D=e(this),!1===H.cb_pre_open(D))return!1;switch(A.VBnext=function(){Q(w)},A.VBprev=function(){Q(C)},f=D.data("overlay")||D.data("overlaycolor"),n=D.data("framewidth"),v=D.data("frameheight"),s=D.data("autoplay")||H.autoplay,o=D.data("border"),i=D.data("bgcolor"),_=!1,B=!1,p=!1,l=D.data("href")||D.attr("href"),r=D.data("css")||"",x=D.attr(D.data("titleattr"))||"",P='
    ',H.spinner){case"rotating-plane":P+='
    ';break;case"double-bounce":P+='
    ';break;case"wave":P+='
    ';break;case"wandering-cubes":P+='
    ';break;case"spinner-pulse":P+='
    ';break;case"chasing-dots":P+='
    ';break;case"three-bounce":P+='
    ';break;case"circle":P+='
    ';break;case"cube-grid":P+='
    ';break;case"fading-circle":P+='
    ';break;case"folding-cube":P+='
    '}return P+="
    ",O=''+H.htmlNext+''+H.htmlPrev+"",U='
    0/0
    '+H.htmlClose+"
    ",t='
    '+P+'
    '+U+O+"
    ",e("body").append(t).addClass("vbox-open"),e(".vbox-preloader div:not(.sk-circle) .sk-child, .vbox-preloader .sk-rotating-plane, .vbox-preloader .sk-rect, .vbox-preloader div:not(.sk-folding-cube) .sk-cube, .vbox-preloader .sk-spinner-pulse").css("background-color",H.spinColor),g=e(".vbox-overlay"),e(".vbox-container"),d=e(".vbox-content"),a=e(".vbox-num"),c=e(".vbox-title"),(E=e(".vbox-preloader")).show(),c.css(H.titlePosition,"-1px"),c.css({color:H.titleColor,"background-color":H.titleBackground}),e(".vbox-close").css({color:H.closeColor,"background-color":H.closeBackground}),e(".vbox-num").css(H.numerationPosition,"-1px"),e(".vbox-num").css({color:H.numerationColor,"background-color":H.numerationBackground}),e(".vbox-next span, .vbox-prev span").css({"border-top-color":H.arrowsColor,"border-right-color":H.arrowsColor}),d.html(""),d.css("opacity","0"),g.css("opacity","0"),$(),g.animate({opacity:1},250,function(){"iframe"==D.data("vbtype")?ae():"inline"==D.data("vbtype")?oe():"ajax"==D.data("vbtype")?ie():"video"==D.data("vbtype")?ce(s):(d.html(''),te()),H.cb_post_open(D,M,w,C)}),e("body").keydown(S),e(".vbox-prev").on("click",function(){Q(C)}),e(".vbox-next").on("click",function(){Q(w)}),!1});var Z=".vbox-overlay";function F(e){d.addClass("vbox-animated"),I=R=e.pageY,z=X=e.pageX,N=!0}function G(e){if(!0===N){X=e.pageX,R=e.pageY,j=X-z,W=R-I;var s=Math.abs(j);s>Math.abs(W)&&s<=100&&(e.preventDefault(),d.css("margin-left",j))}}function J(e){if(!0===N){N=!1;var s=D,i=!1;(Y=X-z)<0&&!0===_&&(s=w,i=!0),Y>0&&!0===B&&(s=C,i=!0),Math.abs(Y)>=q&&!0===i?Q(s):d.css({"margin-left":0,"margin-right":0})}}H.overlayClose||(Z=".vbox-close"),e("body").on("click touchstart",Z,function(s){(e(s.target).is(".vbox-overlay")||e(s.target).is(".vbox-content")||e(s.target).is(".vbox-close")||e(s.target).is(".vbox-preloader")||e(s.target).is(".vbox-container"))&&T()}),z=0,X=0,Y=0,q=50,N=!1;var K={DOWN:"touchmousedown",UP:"touchmouseup",MOVE:"touchmousemove"},L=function(s){var i;switch(s.type){case"mousedown":i=K.DOWN;break;case"mouseup":case"mouseout":i=K.UP;break;case"mousemove":i=K.MOVE;break;default:return}var a=se(i,s,s.pageX,s.pageY);e(s.target).trigger(a)},ee=function(s){var i;switch(s.type){case"touchstart":i=K.DOWN;break;case"touchend":i=K.UP;break;case"touchmove":i=K.MOVE;break;default:return}var a,c=s.originalEvent.touches[0];a=i==K.UP?se(i,s,null,null):se(i,s,c.pageX,c.pageY),e(s.target).trigger(a)},se=function(s,i,a,c){return e.Event(s,{pageX:a,pageY:c,originalEvent:i})};function ie(){e.ajax({url:l,cache:!1}).done(function(e){d.html('
    '+e+"
    "),te()}).fail(function(){d.html('

    Error retrieving contents, please retry

    '),de()})}function ae(){d.html(''),de()}function ce(e){var s,i=function(e){var s;e.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),RegExp.$3.indexOf("youtu")>-1?s="youtube":RegExp.$3.indexOf("vimeo")>-1&&(s="vimeo");return{type:s,id:RegExp.$6}}(l),a=(e?"?rel=0&autoplay=1":"?rel=0")+function(e){var s="",i=decodeURIComponent(e).split("?");if(void 0!==i[1]){var a,c,o=i[1].split("&");for(c=0;c'),de()}function oe(){d.html('
    '+e(l).html()+"
    "),de()}function te(){(V=d.find("img")).length?V.each(function(){e(this).one("load",function(){de()})}):de()}function de(){c.html(x),d.find(">:first-child").addClass("vbox-figlio").css({width:n,height:v,padding:o,background:i}),e("img.vbox-figlio").on("dragstart",function(e){e.preventDefault()}),le(),d.animate({opacity:"1"},"slow",function(){E.hide()}),H.cb_content_loaded(D,M,w,C)}function le(){var s=d.outerHeight(),i=e(window).height();m=s+60n;n++)e[n][t]()},t.destroyAll=function(){t.invokeAll("destroy")},t.disableAll=function(){t.invokeAll("disable")},t.enableAll=function(){t.Context.refreshAll();for(var e in i)i[e].enabled=!0;return this},t.refreshAll=function(){t.Context.refreshAll()},t.viewportHeight=function(){return window.innerHeight||document.documentElement.clientHeight},t.viewportWidth=function(){return document.documentElement.clientWidth},t.adapters=[],t.defaults={context:window,continuous:!0,enabled:!0,group:"default",horizontal:!1,offset:0},t.offsetAliases={"bottom-in-view":function(){return this.context.innerHeight()-this.adapter.outerHeight()},"right-in-view":function(){return this.context.innerWidth()-this.adapter.outerWidth()}},window.Waypoint=t}(),function(){"use strict";function t(t){window.setTimeout(t,1e3/60)}function e(t){this.element=t,this.Adapter=n.Adapter,this.adapter=new this.Adapter(t),this.key="waypoint-context-"+i,this.didScroll=!1,this.didResize=!1,this.oldScroll={x:this.adapter.scrollLeft(),y:this.adapter.scrollTop()},this.waypoints={vertical:{},horizontal:{}},t.waypointContextKey=this.key,o[t.waypointContextKey]=this,i+=1,n.windowContext||(n.windowContext=!0,n.windowContext=new e(window)),this.createThrottledScrollHandler(),this.createThrottledResizeHandler()}var i=0,o={},n=window.Waypoint,r=window.onload;e.prototype.add=function(t){var e=t.options.horizontal?"horizontal":"vertical";this.waypoints[e][t.key]=t,this.refresh()},e.prototype.checkEmpty=function(){var t=this.Adapter.isEmptyObject(this.waypoints.horizontal),e=this.Adapter.isEmptyObject(this.waypoints.vertical),i=this.element==this.element.window;t&&e&&!i&&(this.adapter.off(".waypoints"),delete o[this.key])},e.prototype.createThrottledResizeHandler=function(){function t(){e.handleResize(),e.didResize=!1}var e=this;this.adapter.on("resize.waypoints",function(){e.didResize||(e.didResize=!0,n.requestAnimationFrame(t))})},e.prototype.createThrottledScrollHandler=function(){function t(){e.handleScroll(),e.didScroll=!1}var e=this;this.adapter.on("scroll.waypoints",function(){(!e.didScroll||n.isTouch)&&(e.didScroll=!0,n.requestAnimationFrame(t))})},e.prototype.handleResize=function(){n.Context.refreshAll()},e.prototype.handleScroll=function(){var t={},e={horizontal:{newScroll:this.adapter.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.adapter.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};for(var i in e){var o=e[i],n=o.newScroll>o.oldScroll,r=n?o.forward:o.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s];if(null!==a.triggerPoint){var l=o.oldScroll=a.triggerPoint,p=l&&h,u=!l&&!h;(p||u)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}}for(var c in t)t[c].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?n.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?n.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var o=0,n=t.length;n>o;o++)t[o].destroy()},e.prototype.refresh=function(){var t,e=this.element==this.element.window,i=e?void 0:this.adapter.offset(),o={};this.handleScroll(),t={horizontal:{contextOffset:e?0:i.left,contextScroll:e?0:this.oldScroll.x,contextDimension:this.innerWidth(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:e?0:i.top,contextScroll:e?0:this.oldScroll.y,contextDimension:this.innerHeight(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};for(var r in t){var s=t[r];for(var a in this.waypoints[r]){var l,h,p,u,c,d=this.waypoints[r][a],f=d.options.offset,w=d.triggerPoint,y=0,g=null==w;d.element!==d.element.window&&(y=d.adapter.offset()[s.offsetProp]),"function"==typeof f?f=f.apply(d):"string"==typeof f&&(f=parseFloat(f),d.options.offset.indexOf("%")>-1&&(f=Math.ceil(s.contextDimension*f/100))),l=s.contextScroll-s.contextOffset,d.triggerPoint=Math.floor(y+l-f),h=w=s.oldScroll,u=h&&p,c=!h&&!p,!g&&u?(d.queueTrigger(s.backward),o[d.group.id]=d.group):!g&&c?(d.queueTrigger(s.forward),o[d.group.id]=d.group):g&&s.oldScroll>=d.triggerPoint&&(d.queueTrigger(s.forward),o[d.group.id]=d.group)}}return n.requestAnimationFrame(function(){for(var t in o)o[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in o)o[t].refresh()},e.findByElement=function(t){return o[t.waypointContextKey]},window.onload=function(){r&&r(),e.refreshAll()},n.requestAnimationFrame=function(e){var i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||t;i.call(window,e)},n.Context=e}(),function(){"use strict";function t(t,e){return t.triggerPoint-e.triggerPoint}function e(t,e){return e.triggerPoint-t.triggerPoint}function i(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),o[this.axis][this.name]=this}var o={vertical:{},horizontal:{}},n=window.Waypoint;i.prototype.add=function(t){this.waypoints.push(t)},i.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},i.prototype.flushTriggers=function(){for(var i in this.triggerQueues){var o=this.triggerQueues[i],n="up"===i||"left"===i;o.sort(n?e:t);for(var r=0,s=o.length;s>r;r+=1){var a=o[r];(a.options.continuous||r===o.length-1)&&a.trigger([i])}}this.clearTriggerQueues()},i.prototype.next=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints),o=i===this.waypoints.length-1;return o?null:this.waypoints[i+1]},i.prototype.previous=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints);return i?this.waypoints[i-1]:null},i.prototype.queueTrigger=function(t,e){this.triggerQueues[e].push(t)},i.prototype.remove=function(t){var e=n.Adapter.inArray(t,this.waypoints);e>-1&&this.waypoints.splice(e,1)},i.prototype.first=function(){return this.waypoints[0]},i.prototype.last=function(){return this.waypoints[this.waypoints.length-1]},i.findOrCreate=function(t){return o[t.axis][t.name]||new i(t)},n.Group=i}(),function(){"use strict";function t(t){this.$element=e(t)}var e=window.jQuery,i=window.Waypoint;e.each(["innerHeight","innerWidth","off","offset","on","outerHeight","outerWidth","scrollLeft","scrollTop"],function(e,i){t.prototype[i]=function(){var t=Array.prototype.slice.call(arguments);return this.$element[i].apply(this.$element,t)}}),e.each(["extend","inArray","isEmptyObject"],function(i,o){t[o]=e[o]}),i.adapters.push({name:"jquery",Adapter:t}),i.Adapter=t}(),function(){"use strict";function t(t){return function(){var i=[],o=arguments[0];return t.isFunction(arguments[0])&&(o=t.extend({},arguments[1]),o.handler=arguments[0]),this.each(function(){var n=t.extend({},o,{element:this});"string"==typeof n.context&&(n.context=t(this).closest(n.context)[0]),i.push(new e(n))}),i}}var e=window.Waypoint;window.jQuery&&(window.jQuery.fn.waypoint=t(window.jQuery)),window.Zepto&&(window.Zepto.fn.waypoint=t(window.Zepto))}(); -------------------------------------------------------------------------------- /static/spatial/assets/css/images/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/assets/css/images/overlay.png -------------------------------------------------------------------------------- /static/spatial/assets/css/paginate.css: -------------------------------------------------------------------------------- 1 | // Import icon font, I've used Entypo (http://entypo.com/) 2 | @import url(http://weloveiconfonts.com/api/?family=entypo); 3 | 4 | // Import Roboto font 5 | @import url(https://fonts.googleapis.com/css?family=Roboto:300); 6 | 7 | html, body { 8 | font-family: 'Roboto', sans-serif; 9 | font-size: 16px; 10 | line-height: 24px; 11 | } 12 | 13 | .pagination-container { 14 | /*margin-top: 1em; 15 | padding-top: 2em; 16 | border-top: 1px solid #d7dadb;*/ 17 | text-align: center; 18 | } 19 | 20 | .pagination-item { 21 | list-style-type: none; 22 | display: inline-block; 23 | border-right: 1px solid #d7dadb; 24 | 25 | transform: scale(1) rotate(19deg) translateX(0px) translateY(0px) skewX(-10deg) skewY(-20deg); 26 | } 27 | 28 | .pagination-item:hover .pagination-link, 29 | .pagination-item.is-active .pagination-link { 30 | color: #fff !important; 31 | } 32 | 33 | .pagination-item:hover, 34 | .pagination-item.is-active { 35 | background-color: rgb(0, 0, 238);; 36 | border-right: 1px solid #fff !important; 37 | } 38 | 39 | .pagination-item.first-number { 40 | border-left: 1px solid #d7dadb; 41 | } 42 | 43 | .pagination-link { 44 | padding: 1.1em 1.6em; 45 | display: inline-block; 46 | text-decoration: none; 47 | color: #8b969c; 48 | 49 | transform: scale(1) rotate(0deg) translateX(0px) translateY(0px) skewX(20deg) skewY(0deg); 50 | } 51 | 52 | .pagination-item--wide { 53 | //@extend .pagination-item; 54 | list-style-type: none; 55 | display: inline-block; 56 | } 57 | 58 | .pagination-item--wide a.disabled { 59 | pointer-events: none; 60 | cursor: default; 61 | opacity: 0.6; 62 | } 63 | .pagination-item--wide.first { 64 | margin: 0 1em 0 0; 65 | } 66 | 67 | .pagination-item--wide.last { 68 | margin: 0 0 0 1em; 69 | } 70 | 71 | .pagination-link--wide { 72 | text-decoration: none; 73 | color: #8b969c; 74 | padding: 1.1em 1.6em; 75 | } 76 | 77 | .pagination-link--wide:hover { 78 | color: rgba(13, 34, 243, 0.96); 79 | } 80 | 81 | .pagination-link--wide.first:before, 82 | .pagination-link--wide.last:after { 83 | font-family: 'entypo'; 84 | speak: none; 85 | font-style: normal; 86 | font-weight: normal; 87 | font-variant: normal; 88 | text-transform: none; 89 | line-height: 1; 90 | 91 | // Better Font Rendering 92 | -webkit-font-smoothing: antialiased; 93 | -moz-osx-font-smoothing: grayscale; 94 | } 95 | 96 | .pagination-link--wide.first::before { 97 | content: "\E765"; 98 | margin-right: 0.5em; 99 | } 100 | 101 | .pagination-link--wide.last::after { 102 | content: "\E766"; 103 | margin-left: 0.5em; 104 | } 105 | -------------------------------------------------------------------------------- /static/spatial/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/spatial/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/spatial/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/spatial/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/spatial/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/spatial/assets/js/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | Spatial by TEMPLATED 3 | templated.co @templatedco 4 | Released for free under the Creative Commons Attribution 3.0 license (templated.co/license) 5 | */ 6 | 7 | (function($) { 8 | 9 | skel.breakpoints({ 10 | xlarge: '(max-width: 1680px)', 11 | large: '(max-width: 1280px)', 12 | medium: '(max-width: 980px)', 13 | small: '(max-width: 736px)', 14 | xsmall: '(max-width: 480px)' 15 | }); 16 | 17 | $(function() { 18 | 19 | var $window = $(window), 20 | $body = $('body'); 21 | 22 | // Disable animations/transitions until the page has loaded. 23 | $body.addClass('is-loading'); 24 | 25 | $window.on('load', function() { 26 | window.setTimeout(function() { 27 | $body.removeClass('is-loading'); 28 | }, 100); 29 | }); 30 | 31 | // Fix: Placeholder polyfill. 32 | $('form').placeholder(); 33 | 34 | // Prioritize "important" elements on medium. 35 | skel.on('+medium -medium', function() { 36 | $.prioritize( 37 | '.important\\28 medium\\29', 38 | skel.breakpoint('medium').active 39 | ); 40 | }); 41 | 42 | // Off-Canvas Navigation. 43 | 44 | // Navigation Panel Toggle. 45 | /*$('') 46 | .appendTo($body); 47 | $( 48 | '' 52 | ) 53 | .appendTo($body) 54 | .panel({ 55 | delay: 500, 56 | hideOnClick: true, 57 | hideOnSwipe: true, 58 | resetScroll: true, 59 | resetForms: true, 60 | side: 'right' 61 | });*/ 62 | 63 | // Fix: Remove transitions on WP<10 (poor/buggy performance). 64 | if (skel.vars.os == 'wp' && skel.vars.osVersion < 10) 65 | $('#navPanel') 66 | .css('transition', 'none'); 67 | 68 | // submit query form 69 | $("#queryeditable").keypress(function(e){ 70 | if(e.which == 13){ 71 | $("#query").val($(this).text()); 72 | $("form[name=search]").submit(); 73 | } 74 | return true; 75 | }); 76 | 77 | $(".container h2 svg").on("click", function(){ 78 | $("#query").val($("#queryeditable").text()); 79 | $("form[name=search]").submit(); 80 | }) 81 | 82 | // reference form 83 | $("form[name=reference]").on("submit", function(){ 84 | $.ajax({ 85 | method: "POST", 86 | url: "/reference", 87 | data: { url: $("input[name=url]").val(), email: $("input[name=email]").val() } 88 | }) 89 | .done(function( msg ) { 90 | alert(msg ); 91 | }); 92 | return false; 93 | }) 94 | 95 | }); 96 | 97 | })(jQuery); 98 | -------------------------------------------------------------------------------- /static/spatial/assets/js/skel.min.js: -------------------------------------------------------------------------------- 1 | /* skel.js v3.0.0 | (c) n33 | skel.io | MIT licensed */ 2 | var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),Array.prototype.indexOf?t.indexOf=function(t,e){return t.indexOf(e)}:t.indexOf=function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},Array.isArray?t.isArray=function(t){return Array.isArray(t)}:t.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},Object.keys?t.iterate=function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:t.iterate=function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},window.matchMedia?t.matchesMedia=function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?t.matchesMedia=function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?t.matchesMedia=function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:t.matchesMedia=function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;for(i=t.split(/\s+and\s+/),e=0;er["max-width"]||null!==r["min-height"]&&cr["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML=' ",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["wp",/Windows Phone ([0-9\.]+)/,null],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel}); 3 | -------------------------------------------------------------------------------- /static/spatial/assets/js/util.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | /** 4 | * Generate an indented list of links from a nav. Meant for use with panel(). 5 | * @return {jQuery} jQuery object. 6 | */ 7 | $.fn.navList = function() { 8 | 9 | var $this = $(this); 10 | $a = $this.find('a'), 11 | b = []; 12 | 13 | $a.each(function() { 14 | 15 | var $this = $(this), 16 | indent = Math.max(0, $this.parents('li').length - 1), 17 | href = $this.attr('href'), 18 | target = $this.attr('target'); 19 | 20 | b.push( 21 | '' + 26 | '' + 27 | $this.text() + 28 | '' 29 | ); 30 | 31 | }); 32 | 33 | return b.join(''); 34 | 35 | }; 36 | 37 | /** 38 | * Panel-ify an element. 39 | * @param {object} userConfig User config. 40 | * @return {jQuery} jQuery object. 41 | */ 42 | $.fn.panel = function(userConfig) { 43 | 44 | // No elements? 45 | if (this.length == 0) 46 | return $this; 47 | 48 | // Multiple elements? 49 | if (this.length > 1) { 50 | 51 | for (var i=0; i < this.length; i++) 52 | $(this[i]).panel(userConfig); 53 | 54 | return $this; 55 | 56 | } 57 | 58 | // Vars. 59 | var $this = $(this), 60 | $body = $('body'), 61 | $window = $(window), 62 | id = $this.attr('id'), 63 | config; 64 | 65 | // Config. 66 | config = $.extend({ 67 | 68 | // Delay. 69 | delay: 0, 70 | 71 | // Hide panel on link click. 72 | hideOnClick: false, 73 | 74 | // Hide panel on escape keypress. 75 | hideOnEscape: false, 76 | 77 | // Hide panel on swipe. 78 | hideOnSwipe: false, 79 | 80 | // Reset scroll position on hide. 81 | resetScroll: false, 82 | 83 | // Reset forms on hide. 84 | resetForms: false, 85 | 86 | // Side of viewport the panel will appear. 87 | side: null, 88 | 89 | // Target element for "class". 90 | target: $this, 91 | 92 | // Class to toggle. 93 | visibleClass: 'visible' 94 | 95 | }, userConfig); 96 | 97 | // Expand "target" if it's not a jQuery object already. 98 | if (typeof config.target != 'jQuery') 99 | config.target = $(config.target); 100 | 101 | // Panel. 102 | 103 | // Methods. 104 | $this._hide = function(event) { 105 | 106 | // Already hidden? Bail. 107 | if (!config.target.hasClass(config.visibleClass)) 108 | return; 109 | 110 | // If an event was provided, cancel it. 111 | if (event) { 112 | 113 | event.preventDefault(); 114 | event.stopPropagation(); 115 | 116 | } 117 | 118 | // Hide. 119 | config.target.removeClass(config.visibleClass); 120 | 121 | // Post-hide stuff. 122 | window.setTimeout(function() { 123 | 124 | // Reset scroll position. 125 | if (config.resetScroll) 126 | $this.scrollTop(0); 127 | 128 | // Reset forms. 129 | if (config.resetForms) 130 | $this.find('form').each(function() { 131 | this.reset(); 132 | }); 133 | 134 | }, config.delay); 135 | 136 | }; 137 | 138 | // Vendor fixes. 139 | $this 140 | .css('-ms-overflow-style', '-ms-autohiding-scrollbar') 141 | .css('-webkit-overflow-scrolling', 'touch'); 142 | 143 | // Hide on click. 144 | if (config.hideOnClick) { 145 | 146 | $this.find('a') 147 | .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); 148 | 149 | $this 150 | .on('click', 'a', function(event) { 151 | 152 | var $a = $(this), 153 | href = $a.attr('href'), 154 | target = $a.attr('target'); 155 | 156 | if (!href || href == '#' || href == '' || href == '#' + id) 157 | return; 158 | 159 | // Cancel original event. 160 | event.preventDefault(); 161 | event.stopPropagation(); 162 | 163 | // Hide panel. 164 | $this._hide(); 165 | 166 | // Redirect to href. 167 | window.setTimeout(function() { 168 | 169 | if (target == '_blank') 170 | window.open(href); 171 | else 172 | window.location.href = href; 173 | 174 | }, config.delay + 10); 175 | 176 | }); 177 | 178 | } 179 | 180 | // Event: Touch stuff. 181 | $this.on('touchstart', function(event) { 182 | 183 | $this.touchPosX = event.originalEvent.touches[0].pageX; 184 | $this.touchPosY = event.originalEvent.touches[0].pageY; 185 | 186 | }) 187 | 188 | $this.on('touchmove', function(event) { 189 | 190 | if ($this.touchPosX === null 191 | || $this.touchPosY === null) 192 | return; 193 | 194 | var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, 195 | diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, 196 | th = $this.outerHeight(), 197 | ts = ($this.get(0).scrollHeight - $this.scrollTop()); 198 | 199 | // Hide on swipe? 200 | if (config.hideOnSwipe) { 201 | 202 | var result = false, 203 | boundary = 20, 204 | delta = 50; 205 | 206 | switch (config.side) { 207 | 208 | case 'left': 209 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); 210 | break; 211 | 212 | case 'right': 213 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); 214 | break; 215 | 216 | case 'top': 217 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); 218 | break; 219 | 220 | case 'bottom': 221 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); 222 | break; 223 | 224 | default: 225 | break; 226 | 227 | } 228 | 229 | if (result) { 230 | 231 | $this.touchPosX = null; 232 | $this.touchPosY = null; 233 | $this._hide(); 234 | 235 | return false; 236 | 237 | } 238 | 239 | } 240 | 241 | // Prevent vertical scrolling past the top or bottom. 242 | if (($this.scrollTop() < 0 && diffY < 0) 243 | || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { 244 | 245 | event.preventDefault(); 246 | event.stopPropagation(); 247 | 248 | } 249 | 250 | }); 251 | 252 | // Event: Prevent certain events inside the panel from bubbling. 253 | $this.on('click touchend touchstart touchmove', function(event) { 254 | event.stopPropagation(); 255 | }); 256 | 257 | // Event: Hide panel if a child anchor tag pointing to its ID is clicked. 258 | $this.on('click', 'a[href="#' + id + '"]', function(event) { 259 | 260 | event.preventDefault(); 261 | event.stopPropagation(); 262 | 263 | config.target.removeClass(config.visibleClass); 264 | 265 | }); 266 | 267 | // Body. 268 | 269 | // Event: Hide panel on body click/tap. 270 | $body.on('click touchend', function(event) { 271 | $this._hide(event); 272 | }); 273 | 274 | // Event: Toggle. 275 | $body.on('click', 'a[href="#' + id + '"]', function(event) { 276 | 277 | event.preventDefault(); 278 | event.stopPropagation(); 279 | 280 | config.target.toggleClass(config.visibleClass); 281 | 282 | }); 283 | 284 | // Window. 285 | 286 | // Event: Hide on ESC. 287 | if (config.hideOnEscape) 288 | $window.on('keydown', function(event) { 289 | 290 | if (event.keyCode == 27) 291 | $this._hide(event); 292 | 293 | }); 294 | 295 | return $this; 296 | 297 | }; 298 | 299 | /** 300 | * Apply "placeholder" attribute polyfill to one or more forms. 301 | * @return {jQuery} jQuery object. 302 | */ 303 | $.fn.placeholder = function() { 304 | 305 | // Browser natively supports placeholders? Bail. 306 | if (typeof (document.createElement('input')).placeholder != 'undefined') 307 | return $(this); 308 | 309 | // No elements? 310 | if (this.length == 0) 311 | return $this; 312 | 313 | // Multiple elements? 314 | if (this.length > 1) { 315 | 316 | for (var i=0; i < this.length; i++) 317 | $(this[i]).placeholder(); 318 | 319 | return $this; 320 | 321 | } 322 | 323 | // Vars. 324 | var $this = $(this); 325 | 326 | // Text, TextArea. 327 | $this.find('input[type=text],textarea') 328 | .each(function() { 329 | 330 | var i = $(this); 331 | 332 | if (i.val() == '' 333 | || i.val() == i.attr('placeholder')) 334 | i 335 | .addClass('polyfill-placeholder') 336 | .val(i.attr('placeholder')); 337 | 338 | }) 339 | .on('blur', function() { 340 | 341 | var i = $(this); 342 | 343 | if (i.attr('name').match(/-polyfill-field$/)) 344 | return; 345 | 346 | if (i.val() == '') 347 | i 348 | .addClass('polyfill-placeholder') 349 | .val(i.attr('placeholder')); 350 | 351 | }) 352 | .on('focus', function() { 353 | 354 | var i = $(this); 355 | 356 | if (i.attr('name').match(/-polyfill-field$/)) 357 | return; 358 | 359 | if (i.val() == i.attr('placeholder')) 360 | i 361 | .removeClass('polyfill-placeholder') 362 | .val(''); 363 | 364 | }); 365 | 366 | // Password. 367 | $this.find('input[type=password]') 368 | .each(function() { 369 | 370 | var i = $(this); 371 | var x = $( 372 | $('
    ') 373 | .append(i.clone()) 374 | .remove() 375 | .html() 376 | .replace(/type="password"/i, 'type="text"') 377 | .replace(/type=password/i, 'type=text') 378 | ); 379 | 380 | if (i.attr('id') != '') 381 | x.attr('id', i.attr('id') + '-polyfill-field'); 382 | 383 | if (i.attr('name') != '') 384 | x.attr('name', i.attr('name') + '-polyfill-field'); 385 | 386 | x.addClass('polyfill-placeholder') 387 | .val(x.attr('placeholder')).insertAfter(i); 388 | 389 | if (i.val() == '') 390 | i.hide(); 391 | else 392 | x.hide(); 393 | 394 | i 395 | .on('blur', function(event) { 396 | 397 | event.preventDefault(); 398 | 399 | var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 400 | 401 | if (i.val() == '') { 402 | 403 | i.hide(); 404 | x.show(); 405 | 406 | } 407 | 408 | }); 409 | 410 | x 411 | .on('focus', function(event) { 412 | 413 | event.preventDefault(); 414 | 415 | var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); 416 | 417 | x.hide(); 418 | 419 | i 420 | .show() 421 | .focus(); 422 | 423 | }) 424 | .on('keypress', function(event) { 425 | 426 | event.preventDefault(); 427 | x.val(''); 428 | 429 | }); 430 | 431 | }); 432 | 433 | // Events. 434 | $this 435 | .on('submit', function() { 436 | 437 | $this.find('input[type=text],input[type=password],textarea') 438 | .each(function(event) { 439 | 440 | var i = $(this); 441 | 442 | if (i.attr('name').match(/-polyfill-field$/)) 443 | i.attr('name', ''); 444 | 445 | if (i.val() == i.attr('placeholder')) { 446 | 447 | i.removeClass('polyfill-placeholder'); 448 | i.val(''); 449 | 450 | } 451 | 452 | }); 453 | 454 | }) 455 | .on('reset', function(event) { 456 | 457 | event.preventDefault(); 458 | 459 | $this.find('select') 460 | .val($('option:first').val()); 461 | 462 | $this.find('input,textarea') 463 | .each(function() { 464 | 465 | var i = $(this), 466 | x; 467 | 468 | i.removeClass('polyfill-placeholder'); 469 | 470 | switch (this.type) { 471 | 472 | case 'submit': 473 | case 'reset': 474 | break; 475 | 476 | case 'password': 477 | i.val(i.attr('defaultValue')); 478 | 479 | x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 480 | 481 | if (i.val() == '') { 482 | i.hide(); 483 | x.show(); 484 | } 485 | else { 486 | i.show(); 487 | x.hide(); 488 | } 489 | 490 | break; 491 | 492 | case 'checkbox': 493 | case 'radio': 494 | i.attr('checked', i.attr('defaultValue')); 495 | break; 496 | 497 | case 'text': 498 | case 'textarea': 499 | i.val(i.attr('defaultValue')); 500 | 501 | if (i.val() == '') { 502 | i.addClass('polyfill-placeholder'); 503 | i.val(i.attr('placeholder')); 504 | } 505 | 506 | break; 507 | 508 | default: 509 | i.val(i.attr('defaultValue')); 510 | break; 511 | 512 | } 513 | }); 514 | 515 | }); 516 | 517 | return $this; 518 | 519 | }; 520 | 521 | /** 522 | * Moves elements to/from the first positions of their respective parents. 523 | * @param {jQuery} $elements Elements (or selector) to move. 524 | * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. 525 | */ 526 | $.prioritize = function($elements, condition) { 527 | 528 | var key = '__prioritize'; 529 | 530 | // Expand $elements if it's not already a jQuery object. 531 | if (typeof $elements != 'jQuery') 532 | $elements = $($elements); 533 | 534 | // Step through elements. 535 | $elements.each(function() { 536 | 537 | var $e = $(this), $p, 538 | $parent = $e.parent(); 539 | 540 | // No parent? Bail. 541 | if ($parent.length == 0) 542 | return; 543 | 544 | // Not moved? Move it. 545 | if (!$e.data(key)) { 546 | 547 | // Condition is false? Bail. 548 | if (!condition) 549 | return; 550 | 551 | // Get placeholder (which will serve as our point of reference for when this element needs to move back). 552 | $p = $e.prev(); 553 | 554 | // Couldn't find anything? Means this element's already at the top, so bail. 555 | if ($p.length == 0) 556 | return; 557 | 558 | // Move element to top of parent. 559 | $e.prependTo($parent); 560 | 561 | // Mark element as moved. 562 | $e.data(key, $p); 563 | 564 | } 565 | 566 | // Moved already? 567 | else { 568 | 569 | // Condition is true? Bail. 570 | if (condition) 571 | return; 572 | 573 | $p = $e.data(key); 574 | 575 | // Move element back to its original location (using our placeholder). 576 | $e.insertAfter($p); 577 | 578 | // Unmark element as moved. 579 | $e.removeData(key); 580 | 581 | } 582 | 583 | }); 584 | 585 | }; 586 | 587 | })(jQuery); -------------------------------------------------------------------------------- /static/spatial/images/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/banner.jpg -------------------------------------------------------------------------------- /static/spatial/images/caledonie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/caledonie.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic01.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic02.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic03.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic04.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic05.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic06.jpg -------------------------------------------------------------------------------- /static/spatial/images/pic07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/static/spatial/images/pic07.jpg -------------------------------------------------------------------------------- /templates/analysis.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 | 60 | 61 | 62 |
    63 |
    64 | 65 |
    66 |

    新闻内容关键词频率分布

    67 |
    68 | 69 | 70 |
    71 |
    72 | 73 | 74 |
    75 | 76 | 77 |
    78 |
    79 | 80 |
    81 |
    82 | 83 | 123 | 124 | 125 | 126 |
    127 | 128 | 129 |
    130 | 133 | 134 |
    135 |
    136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /templates/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 | 60 | 61 | 62 |
    63 |
    64 | 65 |
    66 |

    观察者网新闻数据可视化

    67 |

    应用Python爬虫、Flask框架、Echarts、WordCloud等技术实现

    68 |
    69 | 70 | 71 |
    72 | 120 |
    121 | 122 |
    123 |
    124 | 125 | 126 | 127 | 128 |
    129 | 130 |
    131 | 134 | 135 |
    136 |
    137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /templates/news.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 | 59 | 60 | 61 |
    62 |
    63 | 64 |
    65 |

    观察者网新闻列表

    66 |
    67 | 68 | 69 |
    70 |
    71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | {# #} 80 | 81 | {# #} 82 | 83 | 84 | {% for new in news %} 85 | 86 | 87 | 92 | 93 | 94 | 95 | {# #} 96 | {# #} 97 | 98 | 99 | {% endfor %} 100 | 101 | 102 |
    编号标题作者发布时间内容关键字其他信息
    {{new[0]}} 88 | 89 | {{ new[1] }} 90 | 91 | {{new[2]}}{{new[3]}}{{new[6]}}{{new[6]}}{{movie[8]}}
    103 | 104 | 105 |
    106 | 107 | 108 | 109 | 110 |
    111 | 112 | 113 |
    114 | 117 | 118 |
    119 |
    120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /templates/news_result.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 | 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 | 81 | {% for new in news %} 82 | 83 | 84 | 89 | 90 | 91 | 92 | 93 | {# #} 94 | 95 | 96 | {% endfor %} 97 | 98 | 99 |
    编号标题作者发布时间内容关键字其他信息
    {{new[0]}} 85 | 86 | {{ new[1] }} 87 | 88 | {{new[2]}}{{new[3]}}{{new[4]}}{{new[6]}}{{movie[8]}}
    100 | 101 | 102 |
    103 | 104 |
    105 |
    106 | 107 |
    108 |
    109 | 110 | 111 | 112 |
    113 | 114 | 115 |
    116 | 119 | 120 |
    121 |
    122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /templates/search.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 | 64 | 65 | 66 | 71 | 72 | 73 | 74 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |
    96 | 97 |
    98 | 101 | 102 |
    103 |
    104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /templates/team.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 豆瓣Top250数据分析 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 | 59 | 60 | 61 |
    62 |
    63 | 64 |
    65 |

    Our Team

    66 |

    Magnam dolores commodi suscipit. Necessitatibus eius consequatur ex aliquid fuga eum quidem.

    67 |
    68 | 69 |
    70 | 71 |
    72 |
    73 |
    74 |
    75 |

    Walter White

    76 | Chief Executive Officer 77 | 83 |
    84 |
    85 |
    86 | 87 |
    88 |
    89 |
    90 |
    91 |

    Sarah Jhonson

    92 | Product Manager 93 | 99 |
    100 |
    101 |
    102 | 103 |
    104 |
    105 |
    106 |
    107 |

    William Anderson

    108 | CTO 109 | 115 |
    116 |
    117 |
    118 | 119 |
    120 |
    121 |
    122 |
    123 |

    Amanda Jepson

    124 | Accountant 125 | 131 |
    132 |
    133 |
    134 | 135 |
    136 | 137 |
    138 |
    139 | 140 | 141 | 142 | 143 | 144 |
    145 | 146 |
    147 | 150 | 151 |
    152 |
    153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /templates/test/test_echarts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ECharts 5 | 6 | 7 | 8 | 9 | 10 |
    11 | 38 | 39 | -------------------------------------------------------------------------------- /templates/word.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 | 59 | 60 | 61 |
    62 |
    63 | 64 |
    65 |
    66 | 67 | 68 |
    69 | 70 |
    71 | 72 |
    73 |

    词频统计

    74 |

    根据 {{ news_info[0] }} 条新闻的描述,从 {{ news_info[2] }} 个字中提炼出词云树,可以让我们更加清晰的感受到新闻热点

    75 |
    76 | 77 |
    78 |
    79 |

    关于新闻

    80 |

    不知道你从这些热点词中悟到了什么呢?

    81 |
    82 | 83 | 84 |
    85 |
    86 | 87 |
    88 |
    89 | 90 | 91 | 92 | 93 | 94 |
    95 | 96 |
    97 | 100 | 101 |
    102 |
    103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /upload/image-20200720163344959.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/upload/image-20200720163344959.png -------------------------------------------------------------------------------- /upload/image-20200720163623725.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/upload/image-20200720163623725.png -------------------------------------------------------------------------------- /upload/image-20200720163827319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/upload/image-20200720163827319.png -------------------------------------------------------------------------------- /upload/image-20200720164113633.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hunter-lee1/guanchazhe_spider/4dc16f84f45098273c9624cde1bdab0bdda4abdf/upload/image-20200720164113633.png -------------------------------------------------------------------------------- /useful_functions.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | import jieba.analyse 3 | 4 | 5 | HOST = '127.0.0.1' 6 | USER = 'root' 7 | PASSWORD = 'shujuku' 8 | PORT = 3306 9 | DATABASE = 'news_with_keyword' 10 | CHAREST = 'utf8' 11 | 12 | 13 | # 连接数据库并提取数据库内容 14 | def get_datalist(): 15 | datalist = [] 16 | cnn = pymysql.connect(host=HOST, user=USER, password=PASSWORD, port=PORT, database=DATABASE, 17 | charset=CHAREST) 18 | cursor = cnn.cursor() 19 | sql = ' select * from guanchazhe ORDER BY publish_time DESC' 20 | cursor.execute(sql) 21 | for item in cursor.fetchall(): 22 | datalist.append(item) 23 | cursor.close() 24 | cnn.close() 25 | return datalist 26 | 27 | 28 | # 对数据库文本内容进行分词,并返回 data_inf0 = [新闻数,词云数,词汇数,作者人数] ->首页展示的三个内容 29 | def get_datalist_info(datalist): 30 | text = "" 31 | for item in datalist: 32 | text = text + item[4] 33 | 34 | # 分词 35 | cut = jieba.cut(text) 36 | string = ' '.join(cut) 37 | data_info = [len(datalist), 1, len(string), 1] 38 | return data_info,string 39 | 40 | 41 | # 对输入文本进行分词,并返回词汇权重 42 | def get_word_weights(string, topK): 43 | words = [] 44 | weights = [] 45 | for x, w in jieba.analyse.textrank(string, withWeight=True, topK=topK): 46 | words.append(x) 47 | weights.append(w) 48 | return words,weights 49 | 50 | 51 | # 文本关键字提取 52 | def get_keyword_from_content(content): 53 | print(content) 54 | cut = jieba.cut(content) 55 | string = ' '.join(cut) 56 | words,_=get_word_weights(string, topK=5) 57 | return words.append('(自动生成)') -------------------------------------------------------------------------------- /word_cloud.py: -------------------------------------------------------------------------------- 1 | # import jieba #分词 2 | from matplotlib import pyplot as plt #绘图,数据可视化 3 | from wordcloud import WordCloud #词云 4 | from PIL import Image #图片处理 5 | import numpy as np #矩阵运算 6 | import pymysql #数据库 7 | import jieba.analyse 8 | 9 | 10 | #准备词云所需的文字(词) 11 | 12 | datalist = [] 13 | cnn = pymysql.connect(host='127.0.0.1', user='root', password='shujuku', port=3306, database='news_with_keyword', 14 | charset='utf8') 15 | cursor = cnn.cursor() 16 | sql = ' select * from guanchazhe' 17 | cursor.execute(sql) 18 | for item in cursor.fetchall(): 19 | datalist.append(item) 20 | cursor.close() 21 | cnn.close() 22 | 23 | text = " " 24 | # 取出数据库中的新闻内容,进行分词 25 | for item in datalist: 26 | text = text + item[4] 27 | cut = jieba.cut(text) 28 | string = ' '.join(cut) 29 | 30 | img = Image.open(r'.\static\assets\img\tree.jpg') #打开遮罩图片 31 | img_array = np.array(img) #将图片转换为数组 32 | wc = WordCloud( 33 | background_color='white', 34 | mask=img_array, 35 | font_path="msyh.ttc" #字体所在位置:C:\Windows\Fonts 36 | ) 37 | wc.generate_from_text(string) 38 | 39 | #绘制图片 40 | fig = plt.figure(1) 41 | plt.imshow(wc) 42 | plt.axis('off') #是否显示坐标轴 43 | 44 | plt.show() #显示生成的词云图片 45 | 46 | #输出词云图片到文件 47 | plt.savefig(r'.\static\assets\img\key_word.jpg',dpi=500) 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | --------------------------------------------------------------------------------