@ -1,91 +0,0 @@ | |||
# Byte-compiled / optimized / DLL files | |||
__pycache__/ | |||
.idea/ | |||
*.py[cod] | |||
*$py.class | |||
# C extensions | |||
*.so | |||
# Distribution / packaging | |||
.Python | |||
env/ | |||
develop-eggs/ | |||
dist/ | |||
downloads/ | |||
eggs/ | |||
.eggs/ | |||
lib/ | |||
lib64/ | |||
parts/ | |||
sdist/ | |||
var/ | |||
*.egg-info/ | |||
.installed.cfg | |||
*.egg | |||
# PyInstaller | |||
# Usually these files are written by a python script from a template | |||
# before PyInstaller builds the exe, so as to inject date/other infos into it. | |||
*.manifest | |||
*.spec | |||
# Installer logs | |||
pip-log.txt | |||
pip-delete-this-directory.txt | |||
# Unit test / coverage reports | |||
htmlcov/ | |||
.tox/ | |||
.coverage | |||
.coverage.* | |||
.cache | |||
nosetests.xml | |||
coverage.xml | |||
*,cover | |||
.hypothesis/ | |||
# Translations | |||
*.mo | |||
*.pot | |||
# Django stuff: | |||
*.log | |||
local_settings.py | |||
# Flask stuff: | |||
instance/ | |||
.webassets-cache | |||
# Scrapy stuff: | |||
.scrapy | |||
# Sphinx documentation | |||
docs/_build/ | |||
# PyBuilder | |||
target/ | |||
# IPython Notebook | |||
.ipynb_checkpoints | |||
# pyenv | |||
.python-version | |||
# celery beat schedule file | |||
celerybeat-schedule | |||
# dotenv | |||
.env | |||
# virtualenv | |||
venv/ | |||
ENV/ | |||
# Spyder project settings | |||
.spyderproject | |||
# Rope project settings | |||
.ropeproject | |||
conn_mongodb.py |
@ -1,15 +0,0 @@ | |||
{ | |||
// 使用 IntelliSense 了解相关属性。 | |||
// 悬停以查看现有属性的描述。 | |||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 | |||
"version": "0.2.0", | |||
"configurations": [ | |||
{ | |||
"name": "Python: 当前文件", | |||
"type": "python", | |||
"request": "launch", | |||
"program": "${file}", | |||
"console": "integratedTerminal" | |||
} | |||
] | |||
} |
@ -1,7 +0,0 @@ | |||
# Readgazer | |||
1.打开mongodb数据库,运行cnn_story压缩包中的python文件,初始化数据库。 | |||
2.运行add_testinfo.py,存入补充数据 | |||
3.运行pdf_online_demo.py启动项目 |
@ -1,35 +0,0 @@ | |||
import os | |||
import pymongo | |||
import time | |||
client = pymongo.MongoClient("mongodb://admin:readgazer_2022@81.69.98.171:27017/test") | |||
# print(client.list_database_names()) # 查看所有数据库名字 | |||
# 清空数据库 | |||
# client["Qiangwei"].command("dropDatabase") | |||
# 选择(创建)数据库 | |||
db = client["Qiangwei"] | |||
# 选择(创建)集合 | |||
docs_col = db.docs | |||
localtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) | |||
path=r"./static/doc/qiangwei" | |||
namelist=os.listdir(path) | |||
# # 导入数据————文本内容 | |||
for i in range(len(namelist)): | |||
upper = "admin" | |||
# query = {"_id": str(i), "content": fp_c.read(), "highlight": highlight} | |||
query = {"_id":str(i),"filename": namelist[i], "upper": upper,"upload_time":localtime,"kind":"5A","status":"release","upload_time":localtime,"frequency":0} | |||
id = docs_col.insert_one(query).inserted_id | |||
# print(id) | |||
# print(docs_col.find()[0]) | |||
@ -1,109 +0,0 @@ | |||
import pymongo | |||
import time | |||
import json | |||
from conn_mongodb import * | |||
# client = pymongo.MongoClient("mongodb://localhost:27017/") | |||
# client = pymongo.MongoClient("mongodb://admin:readgazer_2022@81.69.98.171:27017/test") | |||
# db = client["ReaderGazer"] # 或者用db = client.cnnStories | |||
def save_data_simple(email, myfilename,mysecond,transfermsg,freq,seqlist,pagefreq,pagefreqoff): | |||
# history_col = db.historyInfo | |||
print("saving!!") | |||
localtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) | |||
query = {"email":email,"filename": myfilename,"mysecond":mysecond,"transfermsg":transfermsg,"freq":freq,"seqlist":seqlist,"pagefreq":pagefreq,"pagefreqoff":pagefreqoff,"time":localtime} | |||
# query = {"email":email,"filename": myfilename,"mysecond":mysecond,"transfermsg":transfermsg,"freq":freq,"seqlist":seqlist,"pagefreq":pagefreq,"pagefreqoff":pagefreqoff,"first_fixation":first_fixation,"avg_fixation":avg_fixation,"back_rate":back_rate,"time":localtime} | |||
a=history_col.insert_one(query) | |||
print("save data!") | |||
# print(historyInfo_col.find_one(query)) | |||
return 'OK' | |||
def save_data(email, myfilename,mysecond,transfermsg,freq,seqlist,pagefreq,pagefreqoff): | |||
# history_col = db.historyInfo | |||
print("saving!!") | |||
localtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) | |||
avg_fixation=cal_avg_fixation(seqlist,freq) | |||
back_rate=back_percent(seqlist) | |||
first_fixation=get_first_fixation(seqlist,freq) | |||
query = {"email":email,"filename": myfilename,"mysecond":mysecond,"transfermsg":transfermsg,"freq":freq,"seqlist":seqlist,"pagefreq":pagefreq,"pagefreqoff":pagefreqoff,"first_fixation":first_fixation,"avg_fixation":avg_fixation,"back_rate":back_rate,"time":localtime} | |||
# query = {"email":email,"filename": myfilename,"mysecond":mysecond,"transfermsg":transfermsg,"freq":freq,"seqlist":seqlist,"pagefreq":pagefreq,"pagefreqoff":pagefreqoff,"first_fixation":first_fixation,"avg_fixation":avg_fixation,"back_rate":back_rate,"time":localtime} | |||
a=history_col.insert_one(query) | |||
print("save data!") | |||
# print(historyInfo_col.find_one(query)) | |||
return 'OK' | |||
def save_result(email, res,filename): | |||
userTest_col = db_2.userTestResult | |||
localtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) | |||
query = {"email":email,"filename":filename,"result": res,"time":localtime} | |||
a=userTest_col.insert_one(query) | |||
print("save result!") | |||
return 'OK' | |||
def cal_avg_fixation(seqlist,freq): | |||
# seq=json.loads(seqlist) | |||
# freq=json.loads(freq) | |||
seq=seqlist | |||
avg_fixation=[] | |||
print(type(seq[0])) | |||
for i in range(len(freq)): | |||
avg_fixation_t=[] | |||
for j in range(len(freq[0])): | |||
avg_fixation_t.append(0) | |||
avg_fixation.append(avg_fixation_t) | |||
for i in range(len(seq)-1): | |||
avg_fixation[seq[i][0]][seq[i][1]]+=seq[i+1][2]-seq[i][2] | |||
return str(avg_fixation) | |||
def back_percent(seqlist): | |||
# seq=json.loads(seqlist) | |||
seq=seqlist | |||
ordinary=0 | |||
back=0 | |||
for i in range(len(seq)-1): | |||
ordinary+=1 | |||
if(seq[i][0]>seq[i+1][0]): | |||
back+=1 | |||
elif(seq[i][0]==seq[i+1][0] and seq[i][1]>seq[i+1][1]): | |||
back+=1 | |||
return 1.0*back/ordinary | |||
def get_first_fixation(seqlist,freq): | |||
# seq=json.loads(seqlist) | |||
# freq=json.loads(freq) | |||
seq=seqlist | |||
first_fixation=[] | |||
second_fixation=[] | |||
for i in range(len(freq)): | |||
first_fixation_t=[] | |||
second_fixation_t=[] | |||
for j in range(len(freq[0])): | |||
first_fixation_t.append(0) | |||
second_fixation_t.append(0) | |||
first_fixation.append(first_fixation_t) | |||
second_fixation.append(second_fixation_t) | |||
for i in range(len(seq)): | |||
if(first_fixation[seq[i][0]][seq[i][1]]==0): | |||
first_fixation[seq[i][0]][seq[i][1]]=seq[i][2] | |||
elif(first_fixation[seq[i][0]][seq[i][1]]!=0 and second_fixation[seq[i][0]][seq[i][1]]==0): | |||
second_fixation[seq[i][0]][seq[i][1]]=seq[i][2] | |||
for i in range(len(second_fixation)): | |||
for j in range(len(second_fixation[0])): | |||
if(second_fixation[i][j]!=0): | |||
second_fixation[i][j]=second_fixation[i][j]-first_fixation[i][j] | |||
# print(seq[0][2]) | |||
# print(second_fixation) | |||
return str(second_fixation) | |||
def save_accuracy(email, onlinelist,offlinelist,testseqlist,evallist): | |||
accuracyInfo_col = db.accuracyInfo | |||
localtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) | |||
query = {"email":email,"onlinelist": onlinelist,"offlinelist":offlinelist,"testseqlist":testseqlist,"evallist":evallist,"time":localtime} | |||
a=accuracyInfo_col.insert_one(query) | |||
return 'OK' | |||
# save_data(1, 1,1,1,1,1,1,1) |
@ -1,38 +0,0 @@ | |||
import pymongo | |||
from conn_mongodb import * | |||
# client = pymongo.MongoClient("mongodb://admin:readgazer_2022@81.69.91.171:27017/test") | |||
# db = client["ReaderGazer"] # 或者用db = client.cnnStories | |||
# userInfo_col = db.userInfo | |||
# userInfo_col.insert_one({"email": "admin", "username": "admin", "password": "admin", "status": "admin"}) | |||
def signup(email, username, password): | |||
res = userInfo_col.find_one({"email": email}) | |||
if (res == None): | |||
query = {"email": email, "username": username, "password": password, "status": "stu"} | |||
print(userInfo_col.insert_one(query)) | |||
return email | |||
else: | |||
return "NO" | |||
def login(email, password): | |||
res = userInfo_col.find_one({"email": email}) | |||
if (res == None): | |||
return "signup" | |||
elif (password == res["password"]): | |||
if (res["status"] == "admin"): | |||
return "admin" | |||
else: | |||
return email | |||
else: | |||
return "wrong" | |||
# t=login("1", "1") | |||
# print(userInfo_col.find()[0]) | |||
# t=userInfo_col.find()[0] | |||
# print(t) |
@ -1,414 +0,0 @@ | |||
import os | |||
import time | |||
import json | |||
import csv | |||
import time | |||
import flask | |||
from flask import jsonify | |||
from flask import Flask, render_template, request, session | |||
from flask_bootstrap import Bootstrap | |||
import test | |||
import logincheck | |||
import eel | |||
from conn_mongodb import * | |||
import add_testinfo | |||
app = Flask(__name__) | |||
bootstrap = Bootstrap(app) | |||
UPLOAD_FOLDER = './static/doc' | |||
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 设置文件上传的目标文件夹 | |||
app.secret_key = "lyc" | |||
app.config['SESSION_COOKIE_NAME'] = "session_key" # 这是配置网页中sessions显示的key | |||
# app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(seconds=20) | |||
@app.route('/') | |||
def show_index(): | |||
return render_template("index.html") | |||
# def hello_world(): | |||
# return 'Hello World!' | |||
@app.route('/upload', methods=["GET", "POST"]) | |||
def upload_test(): | |||
return render_template("upload.html") | |||
@app.route('/show', methods=["GET", "POST"]) | |||
def show_test(): | |||
return render_template("index.html") | |||
# return render_template("viewer.html") | |||
@app.route("/api/upload", methods=["GET", "POST"]) | |||
def upload(): | |||
file = request.files.get("file_data") | |||
msg = api_upload(app, file) | |||
upload_msg = json.loads(msg.data.decode("utf-8")) | |||
errmsg = upload_msg.get("errmsg") | |||
return jsonify({"msg": errmsg}) | |||
@app.route('/setvalue', methods=["POST", "GET"]) | |||
def setValue(): | |||
value = request.values.get("str") | |||
# print(value) | |||
result = test.summary(value) | |||
# print(result) | |||
return result, 200 | |||
@app.route('/analyze', methods=["POST", "GET"]) | |||
def analyze(): | |||
result = {} # The return type must be a string, dict, tuple, Response instance, or WSGI callable | |||
# 摘要 | |||
filename = request.values.get("filename") | |||
highlight = stories_col.find_one({"_id": int(filename)}) | |||
print(filename, type(filename), highlight, type(highlight)) | |||
result["highlight"] = highlight["highlight"] | |||
# 相似文本 | |||
simId = similarity_col.find({"$or": [{"id": filename}, {"file_id": filename}]}).sort("sim_value", -1) # 降序排列 | |||
simIds = [] | |||
for i in range(6): | |||
simIds.append([simId[i]["file_id"], simId[i]["sim_value"]]) | |||
result["sim"] = simIds | |||
return result, 200 | |||
@app.route('/getbook', methods=["POST", "GET"]) | |||
def getbook(): | |||
result = {} | |||
# 摘要 | |||
filename = request.values.get("filename") | |||
highlight = stories_col.find_one({"_id": int(filename)}) | |||
result["highlight"] = highlight["highlight"] | |||
# 文本info | |||
info = stories_col.find().sort("_id", 1) | |||
Ids = [] | |||
for i in range(10): | |||
Ids.append({"_id": info[i]["_id"], "frequency": info[i]["frequency"], "highlight": info[i]["highlight"]}) | |||
result["info"] = Ids | |||
return result, 200 | |||
@app.route('/getbook_qiangwei', methods=["POST", "GET"]) | |||
def getbook_qiangwei(): | |||
result = {} | |||
# 文本info | |||
info = docs_col.find().sort("_id", 1) | |||
Ids = [] | |||
for i in range(info.count()): | |||
Ids.append({"_id": info[i]["_id"], "filename": info[i]["filename"], "upper": info[i]["upper"], "upload_time": info[i]["upload_time"], "kind": info[i]["kind"], "status": info[i]["status"],"frequency": info[i]["frequency"]}) | |||
result["info"] = Ids | |||
return result, 200 | |||
@app.route('/get_userhistory_qiangwei', methods=["POST", "GET"]) | |||
def get_userhistory_qiangwei(): | |||
result = {} | |||
# 文本info | |||
info = history_col.find() | |||
Ids = [] | |||
for i in range(info.count()): | |||
Ids.append({"_id": str(info[i]["_id"]), "email": info[i]["email"], "filename": info[i]["filename"], "mysecond": info[i]["mysecond"], "time": info[i]["time"]}) | |||
result["info"] = Ids | |||
# print(result) | |||
return result, 200 | |||
@app.route('/get_one_userhistory_qiangwei', methods=["POST", "GET"]) | |||
def get_one_userhistory_qiangwei(): | |||
email = request.values.get("email") | |||
result = {} | |||
# 文本info | |||
info = history_col.find({"email":email}) | |||
print(info) | |||
Ids = [] | |||
for i in range(info.count()): | |||
Ids.append({"_id": str(info[i]["_id"]), "email": info[i]["email"], "filename": info[i]["filename"], "mysecond": info[i]["mysecond"], "time": info[i]["time"]}) | |||
result["info"] = Ids | |||
# print(result) | |||
return result, 200 | |||
@app.route('/get_userresult_qiangwei', methods=["POST", "GET"]) | |||
def get_userresult_qiangwei(): | |||
# email = request.values.get("email") | |||
result = {} | |||
# 文本info | |||
info = result_col.find() | |||
print(info) | |||
Ids = [] | |||
for i in range(info.count()): | |||
Ids.append({"_id": str(info[i]["_id"]), "email": info[i]["email"], "filename": info[i]["filename"], "result": info[i]["result"], "time": info[i]["time"]}) | |||
result["info"] = Ids | |||
# print(result) | |||
return result, 200 | |||
@app.route('/get_one_userresult_qiangwei', methods=["POST", "GET"]) | |||
def get_one_userresult_qiangwei(): | |||
email = request.values.get("email") | |||
result = {} | |||
# 文本info | |||
info = result_col.find({"email":email}) | |||
print(info) | |||
Ids = [] | |||
for i in range(info.count()): | |||
Ids.append({"_id": str(info[i]["_id"]), "email": info[i]["email"], "filename": info[i]["filename"], "result": info[i]["result"], "time": info[i]["time"]}) | |||
result["info"] = Ids | |||
# print(result) | |||
return result, 200 | |||
@app.route('/freq_add', methods=["POST", "GET"]) | |||
def freq_add(): | |||
filename = request.values.get("filename") | |||
freq = stories_col.find_one({"_id": int(filename)})["frequency"] | |||
stories_col.update_one({"_id": int(filename)}, {"$set": {"frequency": freq + 1}}) # 更新阅读次数 | |||
return filename, 200 | |||
@app.route('/freq_add_qiangwei', methods=["POST", "GET"]) | |||
def freq_add_qiangwei(): | |||
filename = request.values.get("filename") | |||
freq = docs_col.find_one({"filename": filename})["frequency"] | |||
docs_col.update_one({"filename": filename}, {"$set": {"frequency": freq + 1}}) # 更新阅读次数 | |||
return filename, 200 | |||
@app.route('/get_username', methods=["POST", "GET"]) | |||
def get_username(): | |||
email = request.values.get("email") | |||
username = userInfo_col.find_one({"email": str(email)})['username'] | |||
return username, 200 | |||
@app.route('/get_userinfos', methods=["POST", "GET"]) | |||
def get_userinfos(): | |||
ret, users, his = {}, {}, {} | |||
# 用户信息 | |||
user_infos = userInfo_col.find() | |||
for info in user_infos: | |||
users[info["username"]] = [info["email"], info["status"]] | |||
ret["user"] = users | |||
# 用户行为数据 | |||
his_infos = history_col.find() | |||
id = 0 | |||
print(his_infos) | |||
for info in his_infos: | |||
his[id] = [info["email"], info["filename"], info["mysecond"], info["time"]] | |||
id += 1 | |||
ret["his"] = his | |||
return ret, 200 | |||
# @app.route('/get_userinfos', methods=["POST", "GET"]) | |||
# def get_userinfos(): | |||
# ret, users, his = {}, {}, {} | |||
# # 用户信息 | |||
# user_infos = userInfo_col.find() | |||
# for info in user_infos: | |||
# print("user:", info) | |||
# users[info["username"]] = [info["email"], info["status"]] | |||
# ret["user"] = users | |||
# # 用户行为数据 | |||
# his_infos = history_col.find() | |||
# id = 0 | |||
# for info in his_infos: | |||
# print("his:", info) | |||
# # his[[info["_id"]]] = {"username": info["username"], "filename": info["filename"], "time": info["time"], | |||
# # "percent": info["percent"]} | |||
# his[id] = [info["username"], info["filename"], info["time"], info["percent"]] | |||
# id += 1 | |||
# ret["his"] = his | |||
# return ret, 200 | |||
@app.route('/login', methods=["POST", "GET"]) | |||
def login(): | |||
return render_template("login.html") | |||
@app.route('/login_check', methods=["POST", "GET"]) | |||
def login_check(): | |||
if request.method == 'GET': | |||
email = request.values.get('email') | |||
password = request.values.get('password') | |||
if not email: # 账号不能为空 | |||
return "null" | |||
result = logincheck.login(email, password) | |||
if (result == "wrong"): | |||
return 'wrong' | |||
elif (result == "signup"): | |||
return 'signup' | |||
else: | |||
session['email'] = email | |||
session.permanent = True | |||
if (result == "admin"): | |||
return 'admin' | |||
else: | |||
return 'ok' | |||
@app.route('/signup_check', methods=["POST", "GET"]) | |||
def signup_check(): | |||
if request.method == 'GET': | |||
email = request.values.get('email') | |||
password = request.values.get('password') | |||
username = request.values.get('username') | |||
if not email: # 账号不能为空 | |||
return "null" | |||
result = logincheck.signup(email, username, password) | |||
if (result == "NO"): | |||
return 'NO' | |||
else: | |||
session['email'] = email | |||
session.permanent = True | |||
return result | |||
@app.route('/save_test', methods=["POST", "GET"]) | |||
def save_test(): | |||
print("saving") | |||
if request.method == 'POST': | |||
data=request.get_json() | |||
print(data) | |||
email = data['email'] | |||
myfilename = data['filename'] | |||
mysecond = int(data['mysecond']) | |||
transfermsg = data['transfermsg'] | |||
freq = data['freq'] | |||
seqlist = data['seqlist'] | |||
pagefreq = data['pagefreq'] | |||
pagefreqoff = data['pagefreqoff'] | |||
# transfermsg = eval(data['transfermsg']) | |||
# freq = eval(data['freq']) | |||
# seqlist = eval(data['seqlist']) | |||
# pagefreq = eval(data['pagefreq']) | |||
# pagefreqoff = eval(data['pagefreqoff']) | |||
# email = request.values.get('email') | |||
# myfilename = request.values.get('filename') | |||
# mysecond = request.values.get('mysecond') | |||
# transfermsg = request.values.get('transfermsg') | |||
# freq = request.values.get('freq') | |||
# seqlist = request.values.get('seqlist') | |||
# pagefreq = request.values.get('pagefreq') | |||
# pagefreqoff = request.values.get('pagefreqoff') | |||
# close_list= request.values.get('close_list') | |||
# print(pagefreqoff) | |||
if not email: # 账号不能为空 | |||
return "null" | |||
result = add_testinfo.save_data_simple(email, myfilename,mysecond,transfermsg,freq,seqlist,pagefreq,pagefreqoff) | |||
if (result == "OK"): | |||
return 'OK' | |||
else: | |||
return 'NO' | |||
print("NO") | |||
return "NO" | |||
@app.route('/save_test_result', methods=["POST", "GET"]) | |||
def save_test_result(): | |||
if request.method == 'POST': | |||
data=request.get_json() | |||
email = data['email'] | |||
testresult = data['testresult'] | |||
filename = data['filename'] | |||
if not email: # 账号不能为空 | |||
return "null" | |||
print("mydata:",testresult) | |||
result = add_testinfo.save_result(email, testresult,filename) | |||
if (result == "OK"): | |||
print("OK") | |||
return "OK" | |||
else: | |||
return "NO" | |||
@app.route('/save_test_accuracy', methods=["POST", "GET"]) | |||
def save_test_accuracy(): | |||
if request.method == 'GET': | |||
email = request.values.get('email') | |||
onlinelist = request.values.get('onlinelist') | |||
offlinelist = request.values.get('offlinelist') | |||
testseqlist = request.values.get('testseqlist') | |||
evallist = request.values.get('evallist') | |||
if not email: # 账号不能为空 | |||
return "null" | |||
print("mydata:",onlinelist) | |||
result = add_testinfo.save_accuracy(email, onlinelist,offlinelist,testseqlist,evallist) | |||
if (result == "OK"): | |||
print("OK") | |||
return 'OK' | |||
else: | |||
return "NO" | |||
@app.route('/calculate_freq_per_sentence', methods=["POST", "GET"]) | |||
def calculate_freq_per_sentence(): | |||
data = json.loads(request.get_data(as_text=True)) | |||
print(data) | |||
print(type(data)) | |||
transfermsg = json.loads(data['transfermsg']) | |||
timestamp = data['timestamp'] | |||
print(timestamp) | |||
splited_text_filepath = 'result2.txt' | |||
sents_base = [] | |||
sents_pdfjs = [] # 记录transfermsg中的items | |||
freq_pdfjs = [] # 记录transfermsg中的freq | |||
str1 = str2 = '' | |||
with open(splited_text_filepath, 'r', encoding='utf-8') as f: | |||
for line in f.readlines(): | |||
line = line.strip() | |||
if (line == ''): | |||
continue | |||
# 每一句后都补一个空格 | |||
line += ' ' | |||
sents_base.append(line) | |||
str1 += line | |||
for it in transfermsg: | |||
# 块最后不为空格 就补一个空格 | |||
block_item = it['items'] | |||
if block_item[-1] != ' ': | |||
block_item += ' ' | |||
sents_pdfjs.append(block_item) | |||
freq_pdfjs.append(it['freq']) | |||
str2 += block_item | |||
# 此时需要保证str1与str2相等(起码长度相等) 否则会出问题 | |||
print(len(str1), len(str2)) | |||
belong = [0 for _ in range(len(str1))] # 记录每个字符属于第几句话 | |||
freq = [0 for _ in range(len(sents_base))] # 记录每句话的注视频率 | |||
j = 0 # 记录累计统计了多少个字符 | |||
for i in range(len(sents_base)): # 分句到第i句 | |||
for _ in range(len(sents_base[i])): | |||
belong[j] = i | |||
j += 1 | |||
j = 0 | |||
for i in range(len(sents_pdfjs)): | |||
for _ in range(len(sents_pdfjs[i])): | |||
# print(belong[j]) | |||
freq[belong[j]] += freq_pdfjs[i] / len(sents_pdfjs[i]) # 相当于把每个块的freq平均到每个字符上 | |||
j += 1 | |||
print(freq) | |||
basedir = os.path.abspath(os.path.dirname(__file__)) # 获取当前项目的绝对路径 | |||
print(basedir) | |||
tmp_filepath = os.path.join('static', 'statistic', 'data%s.txt' % (timestamp)) | |||
csv_filepath = os.path.join(basedir, tmp_filepath) | |||
print(csv_filepath) | |||
with open(csv_filepath, 'w', encoding = 'utf-8', newline = '') as csvfile: | |||
writer = csv.DictWriter(csvfile, fieldnames=['freq','sentence']) | |||
writer.writeheader() | |||
for i in range(len(sents_base)): | |||
writer.writerow({'freq': freq[i], 'sentence': sents_base[i]}) | |||
csvfile.close() | |||
# print(sents) | |||
return 'OK' | |||
def api_upload(app_boj, file): | |||
basedir = os.path.abspath(os.path.dirname(__file__)) # 获取当前项目的绝对路径 | |||
file_dir = os.path.join(basedir, app_boj.config['UPLOAD_FOLDER']) # 拼接成合法文件夹地址 | |||
if not os.path.exists(file_dir): | |||
os.makedirs(file_dir) # 文件夹不存在就创建 | |||
fname = file.filename | |||
ext = fname.rsplit('.', 1)[1] # 获取文件后缀 | |||
unix_time = int(time.time()) | |||
new_filename = str(unix_time) + '.' + ext # 修改文件名 | |||
file.save(os.path.join(file_dir, new_filename)) # 保存文件到upload目录 | |||
return jsonify({"result": 1, "new_name": new_filename, "errmsg": "上传成功"}) | |||
if __name__ == '__main__': | |||
app.run(debug=False) |
@ -1,628 +0,0 @@ | |||
A Wasted Day | |||
When its turn came, the private secretary, somewhat apologetically, laid the letter in front of the Wisest Man in Wall Street. | |||
“From Mrs. Austin, probation officer, Court of General Sessions,” he explained. | |||
“Wants a letter about Spear. | |||
He’s been convicted of theft. | |||
Comes up for sentence Tuesday.” | |||
“Spear?” | |||
repeated Arnold Thorndike. | |||
“Young fellow, stenographer, used to do your letters last summer going in and out on the train.” | |||
The great man nodded. | |||
“I remember. | |||
What about him?” | |||
The habitual gloom of the private secretary was lightened by a grin. | |||
“Went on the loose; had with him about five hundred dollars belonging to the firm; he’s with Isaacs & Sons now, shoe people on Sixth Avenue. | |||
Met a woman, and woke up without the money. | |||
The next morning he offered to make good, but Isaacs called in a policeman. | |||
When they looked into it, they found the boy had been drunk. | |||
They tried to withdraw the charge, but he’d been committed. | |||
Now, the probation officer is trying to get the judge to suspend sentence. | |||
A letter from you, sir, would—” | |||
It was evident the mind of the great man was elsewhere. | |||
Young men who, drunk or sober, spent the firm’s money on women who disappeared before sunrise did not appeal to him. | |||
Another letter submitted that morning had come from his art agent in Europe. | |||
In Florence he had discovered the Correggio he had been sent to find. | |||
It was undoubtedly genuine, and he asked to be instructed by cable. | |||
The price was forty thousand dollars. | |||
With one eye closed, and the other keenly regarding the inkstand, Mr. Thorndike decided to pay the price; and with the facility of long practice dismissed the Correggio, and snapped his mind back to the present. | |||
“Spear had a letter from us when he left, didn’t he?” | |||
he asked. | |||
“What he has developed into, SINCE he left us—” he shrugged his shoulders. | |||
The secretary withdrew the letter, and slipped another in its place. | |||
“Homer Firth, the landscape man,” he chanted, “wants permission to use blue flint on the new road, with turf gutters, and to plant silver firs each side. | |||
Says it will run to about five thousand dollars a mile.” | |||
“No!” | |||
protested the great man firmly, “blue flint makes a country place look like a cemetery. | |||
Mine looks too much like a cemetery now. | |||
Landscape gardeners!” | |||
he exclaimed impatiently. | |||
“Their only idea is to insult nature. | |||
The place was better the day I bought it, when it was running wild; you could pick flowers all the way to the gates.” | |||
Pleased that it should have recurred to him, the great man smiled. | |||
“Why, Spear,” he exclaimed, “always took in a bunch of them for his mother. | |||
Don’t you remember, we used to see him before breakfast wandering around the grounds picking flowers?” | |||
Mr. Thorndike nodded briskly. | |||
“I like his taking flowers to his mother.” | |||
“He SAID it was to his mother,” suggested the secretary gloomily. | |||
“Well, he picked the flowers, anyway,” laughed Mr. Thorndike. | |||
“He didn’t pick our pockets. | |||
And he had the run of the house in those days. | |||
As far as we know,” he dictated, “he was satisfactory. | |||
Don’t say more than that.” | |||
The secretary scribbled a mark with his pencil. | |||
“And the landscape man?” | |||
“Tell him,” commanded Thorndike, “I want a wood road, suitable to a farm; and to let the trees grow where God planted them.” | |||
As his car slid downtown on Tuesday morning the mind of Arnold Thorndike was occupied with such details of daily routine as the purchase of a railroad, the Japanese loan, the new wing to his art gallery, and an attack that morning, in his own newspaper, upon his pet trust. | |||
But his busy mind was not too occupied to return the salutes of the traffic policemen who cleared the way for him. | |||
Or, by some genius of memory, to recall the fact that it was on this morning young Spear was to be sentenced for theft. | |||
It was a charming morning. | |||
The spring was at full tide, and the air was sweet and clean. | |||
Mr. Thorndike considered whimsically that to send a man to jail with the memory of such a morning clinging to him was adding a year to his sentence. | |||
He regretted he had not given the probation officer a stronger letter. | |||
He remembered the young man now, and favorably. | |||
A shy, silent youth, deft in work, and at other times conscious and embarrassed. | |||
But that, on the part of a stenographer, in the presence of the Wisest Man in Wall Street, was not unnatural. | |||
On occasions, Mr. Thorndike had put even royalty—frayed, impecunious royalty, on the lookout for a loan—at its ease. | |||
The hood of the car was down, and the taste of the air, warmed by the sun, was grateful. | |||
It was at this time, a year before, that young Spear picked the spring flowers to take to his mother. | |||
A year from now where would young Spear be? | |||
It was characteristic of the great man to act quickly, so quickly that his friends declared he was a slave to impulse. | |||
It was these same impulses, leading so invariably to success, that made his enemies call him the Wisest Man. | |||
He leaned forward and touched the chauffeur’s shoulder. | |||
“Stop at the Court of General Sessions,” he commanded. | |||
What he proposed to do would take but a few minutes. | |||
A word, a personal word from him to the district attorney, or the judge, would be enough. | |||
He recalled that a Sunday Special had once calculated that the working time of Arnold Thorndike brought him in two hundred dollars a minute. | |||
At that rate, keeping Spear out of prison would cost a thousand dollars. | |||
Out of the sunshine Mr. Thorndike stepped into the gloom of an echoing rotunda, shut in on every side, hung by balconies, lit, many stories overhead, by a dirty skylight. | |||
The place was damp, the air acrid with the smell of stale tobacco juice, and foul with the presence of many unwashed humans. | |||
A policeman, chewing stolidly, nodded toward an elevator shaft, and other policemen nodded him further on to the office of the district attorney. | |||
There Arnold Thorndike breathed more freely. | |||
He was again among his own people. | |||
He could not help but appreciate the dramatic qualities of the situation; that the richest man in Wall Street should appear in person to plead for a humble and weaker brother. | |||
He knew he could not escape recognition, his face was too well known, but, he trusted, for the sake of Spear, the reporters would make no display of his visit. | |||
With a deprecatory laugh, he explained why he had come. | |||
But the outburst of approbation he had anticipated did not follow. | |||
The district attorney ran his finger briskly down a printed card. | |||
“Henry Spear,” he exclaimed, “that’s your man. | |||
Part Three, Judge Fallon. | |||
Andrews is in that court.” | |||
He walked to the door of his private office. | |||
“Andrews!” | |||
he called. | |||
He introduced an alert, broad-shouldered young man of years of much indiscretion and with a charming and inconsequent manner. | |||
“Mr. | |||
Thorndike is interested in Henry Spear, coming up for sentence in Part Three this morning. | |||
Wants to speak for him. | |||
Take him over with you.” | |||
The district attorney shook hands quickly, and retreated to his private office. | |||
Mr. Andrews took out a cigarette and, as he crossed the floor, lit it. | |||
“Come with me,” he commanded. | |||
Somewhat puzzled, slightly annoyed, but enjoying withal the novelty of the environment and the curtness of his reception, Mr. Thorndike followed. | |||
He decided that, in his ignorance, he had wasted his own time and that of the prosecuting attorney. | |||
He should at once have sent in his card to the judge. | |||
As he understood it, Mr. Andrews was now conducting him to that dignitary, and, in a moment, he would be free to return to his own affairs, which were the affairs of two continents. | |||
But Mr. Andrews led him to an office, bare and small, and offered him a chair, and handed him a morning newspaper. | |||
There were people waiting in the room; strange people, only like those Mr. Thorndike had seen on ferry-boats. | |||
They leaned forward toward young Mr. Andrews, fawning, their eyes wide with apprehension. | |||
Mr. Thorndike refused the newspaper. | |||
“I thought I was going to see the judge,” he suggested. | |||
“Court doesn’t open for a few minutes yet,” said the assistant district attorney. | |||
“Judge is always late, anyway.” | |||
Mr. Thorndike suppressed an exclamation. | |||
He wanted to protest, but his clear mind showed him that there was nothing against which, with reason, he could protest. | |||
He could not complain because these people were not apparently aware of the sacrifice he was making. | |||
He had come among them to perform a kindly act. | |||
He recognized that he must not stultify it by a show of irritation. | |||
He had precipitated himself into a game of which he did not know the rules. | |||
That was all. | |||
Next time he would know better. | |||
Next time he would send a clerk. | |||
But he was not without a sense of humor, and the situation as it now was forced upon him struck him as amusing. | |||
He laughed good-naturedly and reached for the desk telephone. | |||
“May I use this?” | |||
he asked. | |||
He spoke to the Wall Street office. | |||
He explained he would be a few minutes late. | |||
He directed what should be done if the market opened in a certain way. | |||
He gave rapid orders on many different matters, asked to have read to him a cablegram he expected from Petersburg, and one from Vienna. | |||
“They answer each other,” was his final instruction. | |||
“It looks like peace.” | |||
Mr. Andrews with genial patience had remained silent. | |||
Now he turned upon his visitors. | |||
A Levantine, burly, unshaven, and soiled, towered truculently above him. | |||
Young Mr. Andrews with his swivel chair tilted back, his hands clasped behind his head, his cigarette hanging from his lips, regarded the man dispassionately. | |||
“You gotta hell of a nerve to come to see me,” he commented cheerfully. | |||
To Mr. Thorndike, the form of greeting was novel. | |||
So greatly did it differ from the procedure of his own office, that he listened with interest. | |||
“Was it you,” demanded young Andrews, in a puzzled tone, “or your brother who tried to knife me?” | |||
Mr. Thorndike, unaccustomed to cross the pavement to his office unless escorted by bank messengers and plain-clothes men, felt the room growing rapidly smaller; the figure of the truculent Greek loomed to heroic proportions. | |||
The hand of the banker went vaguely to his chin, and from there fell to his pearl pin, which he hastily covered. | |||
“Get out!” | |||
said young Andrews, “and don’t show your face here—” | |||
The door slammed upon the flying Greek. | |||
Young Andrews swung his swivel chair so that, over his shoulder, he could see Mr. Thorndike. | |||
“I don’t like his face,” he explained. | |||
A kindly eyed, sad woman with a basket on her knee smiled upon Andrews with the familiarity of an old acquaintance. | |||
“Is that woman going to get a divorce from my son,” she asked, “now that he’s in trouble?” | |||
“Now that he’s in Sing Sing?” | |||
corrected Mr. Andrews. | |||
“I HOPE so! | |||
She deserves it. | |||
That son of yours, Mrs. Bernard,” he declared emphatically, “is no good!” | |||
The brutality shocked Mr. Thorndike. | |||
For the woman he felt a thrill of sympathy, but at once saw that it was superfluous. | |||
From the secure and lofty heights of motherhood, Mrs. Bernard smiled down upon the assistant district attorney as upon a naughty child. | |||
She did not even deign a protest. | |||
She continued merely to smile. | |||
The smile reminded Thorndike of the smile on the face of a mother in a painting by Murillo he had lately presented to the chapel in the college he had given to his native town. | |||
“That son of yours,” repeated young Andrews, “is a leech. | |||
He’s robbed you, robbed his wife. | |||
Best thing I ever did for YOU was to send him up the river.” | |||
The mother smiled upon him beseechingly. | |||
“Could you give me a pass?” | |||
she said. | |||
Young Andrews flung up his hands and appealed to Thorndike. | |||
“Isn’t that just like a mother?” | |||
he protested. | |||
“That son of hers has broken her heart, tramped on her, cheated her; hasn’t left her a cent; and she comes to me for a pass, so she can kiss him through the bars! | |||
And I’ll bet she’s got a cake for him in that basket!” | |||
The mother laughed happily; she knew now she would get the pass. | |||
“Mothers,” explained Mr. Andrews, from the depth of his wisdom, “are all like that; your mother, my mother. | |||
If you went to jail, your mother would be just like that.” | |||
Mr. Thorndike bowed his head politely. | |||
He had never considered going to jail, or whether, if he did, his mother would bring him cake in a basket. | |||
Apparently there were many aspects and accidents of life not included in his experience. | |||
Young Andrews sprang to his feet, and, with the force of a hose flushing a gutter, swept his soiled visitors into the hall. | |||
“Come on,” he called to the Wisest Man, “the court is open.” | |||
In the corridors were many people, and with his eyes on the broad shoulders of the assistant district attorney, Thorndike pushed his way through them. | |||
The people who blocked his progress were of the class unknown to him. | |||
Their looks were anxious, furtive, miserable. | |||
They stood in little groups, listening eagerly to a sharp-faced lawyer, or, in sullen despair, eying each other. | |||
At a door a tipstaff laid his hand roughly on the arm of Mr. Thorndike. | |||
“That’s all right, Joe,” called young Mr. Andrews, “he’s with ME.” | |||
They entered the court and passed down an aisle to a railed enclosure in which were high oak chairs. | |||
Again, in his effort to follow, Mr. Thorndike was halted, but the first tipstaff came to his rescue. | |||
“All right,” he signalled, “he’s with Mr. Andrews.” | |||
Mr. Andrews pointed to one of the oak chairs. | |||
“You sit there,” he commanded, “it’s reserved for members of the bar, but it’s all right. | |||
You’re with ME.” | |||
Distinctly annoyed, slightly bewildered, the banker sank between the arms of a chair. | |||
He felt he had lost his individuality. | |||
Andrews had become his sponsor. | |||
Because of Andrews he was tolerated. | |||
Because Andrews had a pull he was permitted to sit as an equal among police-court lawyers. | |||
No longer was he Arnold Thorndike. | |||
He was merely the man “with Mr. Andrews.” | |||
Then even Andrews abandoned him. | |||
“The judge’ll be here in a minute, now,” said the assistant district attorney, and went inside a railed enclosure in front of the judge’s bench. | |||
There he greeted another assistant district attorney whose years were those of even greater indiscretion than the years of Mr. Andrews. | |||
Seated on the rail, with their hands in their pockets and their backs turned to Mr. Thorndike, they laughed and talked together. | |||
The subject of their discourse was one Mike Donlin, as he appeared in vaudeville. | |||
To Mr. Thorndike it was evident that young Andrews had entirely forgotten him. | |||
He arose, and touched his sleeve. | |||
With infinite sarcasm Mr. Thorndike began: “My engagements are not pressing, but—” | |||
A court attendant beat with his palm upon the rail. | |||
“Sit down!” | |||
whispered Andrews. | |||
“The judge is coming.” | |||
Mr. Thorndike sat down. | |||
The court attendant droned loudly words Mr. Thorndike could not distinguish. | |||
There was a rustle of silk, and from a door behind him the judge stalked past. | |||
He was a young man, the type of the Tammany politician. | |||
On his shrewd, alert, Irish-American features was an expression of unnatural gloom. | |||
With a smile Mr. Thorndike observed that it was as little suited to the countenance of the young judge as was the robe to his shoulders. | |||
Mr. Thorndike was still smiling when young Andrews leaned over the rail. | |||
“Stand up!” | |||
he hissed. | |||
Mr. Thorndike stood up. | |||
After the court attendant had uttered more unintelligible words, every one sat down; and the financier again moved hurriedly to the rail. | |||
“I would like to speak to him now before he begins,” he whispered. | |||
“I can’t wait.” | |||
Mr. Andrews stared in amazement. | |||
The banker had not believed the young man could look so serious. | |||
“Speak to him, NOW!” | |||
exclaimed the district attorney. | |||
‘You’ve got to wait till your man comes up. | |||
If you speak to the judge, NOW—” The voice of Andrews faded away in horror. | |||
Not knowing in what way he had offended, but convinced that it was only by the grace of Andrews he had escaped a dungeon, Mr. Thorndike retreated to his arm-chair. | |||
The clock on the wall showed him that, already, he had given to young Spear one hour and a quarter. | |||
The idea was preposterous. | |||
No one better than himself knew what his time was really worth. | |||
In half an hour there was a board meeting; later, he was to hold a post mortem on a railroad; at every moment questions were being asked by telegraph, by cable, questions that involved the credit of individuals, of firms, of even the country. | |||
And the one man who could answer them was risking untold sums only that he might say a good word for an idle apprentice. | |||
Inside the railed enclosure a lawyer was reading a typewritten speech. | |||
He assured his honor that he must have more time to prepare his case. | |||
It was one of immense importance. | |||
The name of a most respectable business house was involved, and a sum of no less than nine hundred dollars. | |||
Nine hundred dollars! | |||
The contrast struck Mr. Thorndike’s sense of humor full in the centre. | |||
Unknowingly, he laughed, and found himself as conspicuous as though he had appeared suddenly in his night-clothes. | |||
The tipstaffs beat upon the rail, the lawyer he had interrupted uttered an indignant exclamation, Andrews came hurriedly toward him, and the young judge slowly turned his head. | |||
“Those persons,” he said, “who cannot respect the dignity of this court will leave it.” | |||
As he spoke, with his eyes fixed on those of Mr. Thorndike, the latter saw that the young judge had suddenly recognized him. | |||
But the fact of his identity did not cause the frown to relax or the rebuke to halt unuttered. | |||
In even, icy tones the judge continued: “And it is well they should remember that the law is no respecter of persons and that the dignity of this court will be enforced, no matter who the offender may happen to be.” | |||
Andrews slipped into the chair beside Mr. Thorndike, and grinned sympathetically. | |||
“Sorry!” | |||
he whispered. | |||
“Should have warned you. | |||
We won’t be long now,” he added encouragingly. | |||
“As soon as this fellow finishes his argument, the judge’ll take up the sentences. | |||
Your man seems to have other friends; Isaacs & Sons are here, and the type-writer firm who taught him; but what YOU say will help most. | |||
It won’t be more than a couple of hours now.” | |||
“A couple of hours!” | |||
Mr. Thorndike raged inwardly. | |||
A couple of hours in this place where he had been publicly humiliated. | |||
He smiled, a thin, shark-like smile. | |||
Those who made it their business to study his expressions, on seeing it, would have fled. | |||
Young Andrews, not being acquainted with the moods of the great man, added cheerfully: “By one o’clock, anyway.” | |||
Mr. Thorndike began grimly to pull on his gloves. | |||
For all he cared now young Spear could go hang. | |||
Andrews nudged his elbow. | |||
“See that old lady in the front row?” | |||
he whispered. | |||
“That’s Mrs. | |||
Spear. | |||
What did I tell you; mothers are all alike. | |||
She’s not taken her eyes off you since court opened. | |||
She knows you’re her one best bet.” | |||
Impatiently Mr. Thorndike raised his head. | |||
He saw a little, white-haired woman who stared at him. | |||
In her eyes was the same look he had seen in the eyes of men who, at times of panic, fled to him, beseeching, entreating, forcing upon him what was left of the wreck of their fortunes, if only he would save their honor. | |||
“And here come the prisoners,” Andrews whispered. | |||
“See Spear? | |||
Third man from the last.” | |||
A long line, guarded in front and rear, shuffled into the court-room, and, as ordered, ranged themselves against the wall. | |||
Among them were old men and young boys, well dressed, clever-looking rascals, collarless tramps, fierce-eyed aliens, smooth-shaven, thin-lipped Broadwayards—and Spear. | |||
Spear, his head hanging, with lips white and cheeks ashen, and his eyes heavy with shame. | |||
Mr. Thorndike had risen, and, in farewell, was holding out his hand to Andrews. | |||
He turned, and across the court-room the eyes of the financier and the stenographer met. | |||
At the sight of the great man, Spear flushed crimson, and then his look of despair slowly disappeared; and into his eyes there came incredulously hope and gratitude. | |||
He turned his head suddenly to the wall. | |||
Mr. Thorndike stood irresolute, and then sank back into his chair. | |||
The first man in the line was already at the railing, and the questions put to him by the judge were being repeated to him by the other assistant district attorney and a court attendant. | |||
His muttered answers were in turn repeated to the judge. | |||
“Says he’s married, naturalized citizen, Lutheran Church, die-cutter by profession.” | |||
The probation officer, her hands filled with papers, bustled forward and whispered. | |||
“Mrs. | |||
Austin says,” continued the district attorney, “she’s looked into this case, and asks to have the man turned over to her. | |||
He has a wife and three children; has supported them for five years.” | |||
“Is the wife in court?” | |||
the judge said. | |||
A thin, washed-out, pretty woman stood up, and clasped her hands in front of her. | |||
“Has this man been a good husband to you, madam?” | |||
asked the young judge. | |||
The woman broke into vehement assurances. | |||
No man could have been a better husband. | |||
Would she take him back? | |||
Indeed she would take him back. | |||
She held out her hands as though she would physically drag her husband from the pillory. | |||
The judge bowed toward the probation officer, and she beckoned the prisoner to her. | |||
Other men followed, and in the fortune of each Mr. Thorndike found himself, to his surprise, taking a personal interest. | |||
It was as good as a play. | |||
It reminded him of the Sicilians he had seen in London in their little sordid tragedies. | |||
Only these actors were appearing in their proper persons in real dramas of a life he did not know, but which appealed to something that had been long untouched, long in disuse. | |||
It was an uncomfortable sensation that left him restless because, as he appreciated, it needed expression, an outlet. | |||
He found this, partially, in praising, through Andrews, the young judge who had publicly rebuked him. | |||
Mr. Thorndike found him astute, sane; his queries intelligent, his comments just. | |||
And this probation officer, she, too, was capable, was she not? | |||
Smiling at his interest in what to him was an old story, the younger man nodded. | |||
“I like her looks,” whispered the great man. | |||
“Like her clear eyes and clean skin. | |||
She strikes me as able, full of energy, and yet womanly. | |||
These men when they come under her charge,” he insisted, eagerly, “need money to start again, don’t they?” | |||
He spoke anxiously. | |||
He believed he had found the clew to his restlessness. | |||
It was a desire to help; to be of use to these failures who had fallen and who were being lifted to their feet. | |||
Andrews looked at him curiously. | |||
“Anything you give her,” he answered, “would be well invested.” | |||
“If you will tell me her name and address?” | |||
whispered the banker. | |||
He was much given to charity, but it had been perfunctory, it was extended on the advice of his secretary. | |||
In helping here, he felt a genial glow of personal pleasure. | |||
It was much more satisfactory than giving an Old Master to his private chapel. | |||
In the rear of the court-room there was a scuffle that caused every one to turn and look. | |||
A man, who had tried to force his way past the tipstaffs, was being violently ejected, and, as he disappeared, he waved a paper toward Mr. Thorndike. | |||
The banker recognized him as his chief clerk. | |||
Andrews rose anxiously. | |||
“That man wanted to get to you. | |||
I’ll see what it is. | |||
Maybe it’s important.” | |||
Mr. Thorndike pulled him back. | |||
“Maybe it is,” he said dryly. | |||
“But I can’t see him now, I’m busy.” | |||
Slowly the long line of derelicts, of birds of prey, of sorry, weak failures, passed before the seat of judgment. | |||
Mr. Thorndike had moved into a chair nearer to the rail, and from time to time made a note upon the back of an envelope. | |||
He had forgotten the time or had chosen to disregard it. | |||
So great was his interest that he had forgotten the particular derelict he had come to serve, until Spear stood almost at his elbow. | |||
Thorndike turned eagerly to the judge, and saw that he was listening to a rotund, gray little man with beady, bird-like eyes who, as he talked, bowed and gesticulated. | |||
Behind him stood a younger man, a more modern edition of the other. | |||
He also bowed and, behind gold eye-glasses, smiled ingratiatingly. | |||
The judge nodded, and leaning forward, for a few moments fixed his eyes upon the prisoner. | |||
“You are a very fortunate young man,” he said. | |||
He laid his hand upon a pile of letters. | |||
“When you were your own worst enemy, your friends came to help you. | |||
These letters speak for you; your employers, whom you robbed, have pleaded with me in your favor. | |||
It is urged, in your behalf, that at the time you committed the crime of which you are found guilty, you were intoxicated. | |||
In the eyes of the law, that is no excuse. | |||
Some men can drink and keep their senses. | |||
It appears you can not. | |||
When you drink you are a menace to yourself—and, as is shown by this crime, to the community. | |||
Therefore, you must not drink. | |||
In view of the good character to which your friends have testified, and on the condition that you do not touch liquor, I will not sentence you to jail, but will place you in charge of the probation officer.” | |||
The judge leaned back in his chair and beckoned to Mr. Andrews. | |||
It was finished. | |||
Spear was free, and from different parts of the courtroom people were moving toward the door. | |||
Their numbers showed that the friends of the young man had been many. | |||
Mr. Thorndike felt a certain twinge of disappointment. | |||
Even though the result relieved and pleased him, he wished, in bringing it about, he had had some part. | |||
He begrudged to Isaacs & Sons the credit of having given Spear his liberty. | |||
His morning had been wasted. | |||
He had neglected his own interests, and in no way assisted those of Spear. | |||
He was moving out of the railed enclosure when Andrews called him by name. | |||
“His honor,” he said impressively, “wishes to speak to you.” | |||
The judge leaned over his desk and shook Mr. Thorndike by the hand. | |||
Then he made a speech. | |||
The speech was about public-spirited citizens who, to the neglect of their own interests, came to assist the ends of justice, and fellow-creatures in misfortune. | |||
He purposely spoke in a loud voice, and every one stopped to listen. | |||
“The law, Mr. Thorndike, is not vindictive,” he said. | |||
“It wishes only to be just. | |||
Nor can it be swayed by wealth or political or social influences. | |||
But when there is good in a man, I, personally, want to know it, and when gentlemen like yourself, of your standing in this city, come here to speak a good word for a man, we would stultify the purpose of justice if we did not listen. | |||
I thank you for coming, and I wish more of our citizens were as unselfish and public-spirited.” | |||
It was all quite absurd and most embarrassing, but inwardly Mr. Thorndike glowed with pleasure. | |||
It was a long time since any one had had the audacity to tell him he had done well. | |||
From the friends of Spear there was a ripple of applause, which no tipstaff took it upon himself to suppress, and to the accompaniment of this, Mr. Thorndike walked to the corridor. | |||
He was pleased with himself and with his fellow-men. | |||
He shook hands with Isaacs & Sons, and congratulated them upon their public spirit, and the type-writer firm upon their public spirit. | |||
And then he saw Spear standing apart regarding him doubtfully. | |||
Spear did not offer his hand, but Mr. Thorndike took it, and shook it, and said: “I want to meet your mother.” | |||
And when Mrs. | |||
Spear tried to stop sobbing long enough to tell him how happy she was, and how grateful, he instead told her what a fine son she had, and that he remembered when Spear used to carry flowers to town for her. | |||
And she remembered it, too, and thanked him for the flowers. | |||
And he told Spear, when Isaacs & Sons went bankrupt, which at the rate they were giving away their money to the Hebrew Hospital would be very soon, Spear must come back to him. | |||
And Isaacs & Sons were delighted at the great man’s pleasantry, and afterward repeated it many times, calling upon each other to bear witness, and Spear felt as though some one had given him a new backbone, and Andrews, who was guiding Thorndike out of the building, was thinking to himself what a great confidence man had been lost when Thorndike became a banker. | |||
The chief clerk and two bank messengers were waiting by the automobile with written calls for help from the office. | |||
They pounced upon the banker and almost lifted him into the car. | |||
“There’s still time!” | |||
panted the chief clerk. | |||
“There is not!” | |||
answered Mr. Thorndike. | |||
His tone was rebellious, defiant. | |||
It carried all the authority of a spoiled child of fortune. | |||
“I’ve wasted most of this day,” he declared, “and I intend to waste the rest of it. | |||
Andrews,” he called, “jump in, and I’ll give you a lunch at Sherry’s.” | |||
The vigilant protector of the public dashed back into the building. | |||
“Wait till I get my hat!” | |||
he called. | |||
As the two truants rolled up the avenue the spring sunshine warmed them, the sense of duties neglected added zest to their holiday, and young Mr. Andrews laughed aloud. | |||
Mr. Thorndike raised his eyebrows inquiringly. | |||
“I was wondering,” said Andrews, “how much it cost you to keep Spear out of jail?” | |||
“I don’t care,” said the great man guiltily; “it was worth it.” | |||
@ -1,219 +0,0 @@ | |||
A Wasted Day | |||
When its turn came, the private secretary, somewhat apologetically, laid the letter in front of the Wisest Man in Wall Street. | |||
“From Mrs. Austin, probation officer, Court of General Sessions,” he explained. | |||
“Wants a letter about Spear. | |||
He’s been convicted of theft. | |||
Comes up for sentence Tuesday.” | |||
“Spear?” | |||
repeated Arnold Thorndike. | |||
“Young fellow, stenographer, used to do your letters last summer going in and out on the train.” | |||
The great man nodded. | |||
“I remember. | |||
What about him?” | |||
The habitual gloom of the private secretary was lightened by a grin. | |||
“Went on the loose; had with him about five hundred dollars belonging to the firm; he’s with Isaacs & Sons now, shoe people on Sixth Avenue. | |||
Met a woman, and woke up without the money. | |||
The next morning he offered to make good, but Isaacs called in a policeman. | |||
When they looked into it, they found the boy had been drunk. | |||
They tried to withdraw the charge, but he’d been committed. | |||
Now, the probation officer is trying to get the judge to suspend sentence. | |||
A letter from you, sir, would—” | |||
It was evident the mind of the great man was elsewhere. | |||
Young men who, drunk or sober, spent the firm’s money on women who disappeared before sunrise did not appeal to him. | |||
Another letter submitted that morning had come from his art agent in Europe. | |||
In Florence he had discovered the Correggio he had been sent to find. | |||
It was undoubtedly genuine, and he asked to be instructed by cable. | |||
The price was forty thousand dollars. | |||
With one eye closed, and the other keenly regarding the inkstand, Mr. Thorndike decided to pay the price; and with the facility of long practice dismissed the Correggio, and snapped his mind back to the present. | |||
“Spear had a letter from us when he left, didn’t he?” | |||
he asked. | |||
“What he has developed into, SINCE he left us—” he shrugged his shoulders. | |||
The secretary withdrew the letter, and slipped another in its place. | |||
“Homer Firth, the landscape man,” he chanted, “wants permission to use blue flint on the new road, with turf gutters, and to plant silver firs each side. | |||
Says it will run to about five thousand dollars a mile.” | |||
“No!” | |||
protested the great man firmly, “blue flint makes a country place look like a cemetery. | |||
Mine looks too much like a cemetery now. | |||
Landscape gardeners!” | |||
he exclaimed impatiently. | |||
“Their only idea is to insult nature. | |||
The place was better the day I bought it, when it was running wild; you could pick flowers all the way to the gates.” | |||
Pleased that it should have recurred to him, the great man smiled. | |||
“Why, Spear,” he exclaimed, “always took in a bunch of them for his mother. | |||
Don’t you remember, we used to see him before breakfast wandering around the grounds picking flowers?” | |||
Mr. Thorndike nodded briskly. | |||
“I like his taking flowers to his mother.” | |||
“He SAID it was to his mother,” suggested the secretary gloomily. | |||
“Well, he picked the flowers, anyway,” laughed Mr. Thorndike. | |||
“He didn’t pick our pockets. | |||
And he had the run of the house in those days. | |||
As far as we know,” he dictated, “he was satisfactory. | |||
Don’t say more than that.” | |||
The secretary scribbled a mark with his pencil. | |||
“And the landscape man?” | |||
“Tell him,” commanded Thorndike, “I want a wood road, suitable to a farm; and to let the trees grow where God planted them.” | |||
As his car slid downtown on Tuesday morning the mind of Arnold Thorndike was occupied with such details of daily routine as the purchase of a railroad, the Japanese loan, the new wing to his art gallery, and an attack that morning, in his own newspaper, upon his pet trust. | |||
But his busy mind was not too occupied to return the salutes of the traffic policemen who cleared the way for him. | |||
Or, by some genius of memory, to recall the fact that it was on this morning young Spear was to be sentenced for theft. | |||
It was a charming morning. | |||
The spring was at full tide, and the air was sweet and clean. | |||
Mr. Thorndike considered whimsically that to send a man to jail with the memory of such a morning clinging to him was adding a year to his sentence. | |||
He regretted he had not given the probation officer a stronger letter. | |||
He remembered the young man now, and favorably. | |||
A shy, silent youth, deft in work, and at other times conscious and embarrassed. | |||
But that, on the part of a stenographer, in the presence of the Wisest Man in Wall Street, was not unnatural. | |||
On occasions, Mr. Thorndike had put even royalty—frayed, impecunious royalty, on the lookout for a loan—at its ease. | |||
The hood of the car was down, and the taste of the air, warmed by the sun, was grateful. | |||
It was at this time, a year before, that young Spear picked the spring flowers to take to his mother. | |||
A year from now where would young Spear be? | |||
It was characteristic of the great man to act quickly, so quickly that his friends declared he was a slave to impulse. | |||
It was these same impulses, leading so invariably to success, that made his enemies call him the Wisest Man. | |||
He leaned forward and touched the chauffeur’s shoulder. | |||
“Stop at the Court of General Sessions,” he commanded. | |||
What he proposed to do would take but a few minutes. | |||
A word, a personal word from him to the district attorney, or the judge, would be enough. | |||
He recalled that a Sunday Special had once calculated that the working time of Arnold Thorndike brought him in two hundred dollars a minute. | |||
At that rate, keeping Spear out of prison would cost a thousand dollars. | |||
Out of the sunshine Mr. Thorndike stepped into the gloom of an echoing rotunda, shut in on every side, hung by balconies, lit, many stories overhead, by a dirty skylight. | |||
The place was damp, the air acrid with the smell of stale tobacco juice, and foul with the presence of many unwashed humans. | |||
A policeman, chewing stolidly, nodded toward an elevator shaft, and other policemen nodded him further on to the office of the district attorney. | |||
There Arnold Thorndike breathed more freely. | |||
He was again among his own people. | |||
He could not help but appreciate the dramatic qualities of the situation; that the richest man in Wall Street should appear in person to plead for a humble and weaker brother. | |||
He knew he could not escape recognition, his face was too well known, but, he trusted, for the sake of Spear, the reporters would make no display of his visit. | |||
With a deprecatory laugh, he explained why he had come. | |||
But the outburst of approbation he had anticipated did not follow. | |||
The district attorney ran his finger briskly down a printed card. | |||
“Henry Spear,” he exclaimed, “that’s your man. | |||
Part Three, Judge Fallon. | |||
Andrews is in that court.” | |||
He walked to the door of his private office. | |||
“Andrews!” | |||
he called. | |||
He introduced an alert, broad-shouldered young man of years of much indiscretion and with a charming and inconsequent manner. | |||
“Mr. | |||
Thorndike is interested in Henry Spear, coming up for sentence in Part Three this morning. | |||
Wants to speak for him. | |||
Take him over with you.” | |||
The district attorney shook hands quickly, and retreated to his private office. | |||
Mr. Andrews took out a cigarette and, as he crossed the floor, lit it. | |||
“Come with me,” he commanded. | |||
Somewhat puzzled, slightly annoyed, but enjoying withal the novelty of the environment and the curtness of his reception, Mr. Thorndike followed. | |||
He decided that, in his ignorance, he had wasted his own time and that of the prosecuting attorney. | |||
He should at once have sent in his card to the judge. | |||
As he understood it, Mr. Andrews was now conducting him to that dignitary, and, in a moment, he would be free to return to his own affairs, which were the affairs of two continents. | |||
But Mr. Andrews led him to an office, bare and small, and offered him a chair, and handed him a morning newspaper. | |||
There were people waiting in the room; strange people, only like those Mr. Thorndike had seen on ferry-boats. | |||
They leaned forward toward young Mr. Andrews, fawning, their eyes wide with apprehension. | |||
Mr. Thorndike refused the newspaper. | |||
“I thought I was going to see the judge,” he suggested. | |||
“Court doesn’t open for a few minutes yet,” said the assistant district attorney. | |||
“Judge is always late, anyway.” | |||
Mr. Thorndike suppressed an exclamation. | |||
He wanted to protest, but his clear mind showed him that there was nothing against which, with reason, he could protest. | |||
He could not complain because these people were not apparently aware of the sacrifice he was making. | |||
He had come among them to perform a kindly act. | |||
He recognized that he must not stultify it by a show of irritation. | |||
He had precipitated himself into a game of which he did not know the rules. | |||
That was all. | |||
Next time he would know better. | |||
Next time he would send a clerk. | |||
But he was not without a sense of humor, and the situation as it now was forced upon him struck him as amusing. | |||
He laughed good-naturedly and reached for the desk telephone. | |||
“May I use this?” | |||
he asked. | |||
He spoke to the Wall Street office. | |||
He explained he would be a few minutes late. | |||
He directed what should be done if the market opened in a certain way. | |||
He gave rapid orders on many different matters, asked to have read to him a cablegram he expected from Petersburg, and one from Vienna. | |||
“They answer each other,” was his final instruction. | |||
“It looks like peace.” | |||
Mr. Andrews with genial patience had remained silent. | |||
Now he turned upon his visitors. | |||
A Levantine, burly, unshaven, and soiled, towered truculently above him. | |||
Young Mr. Andrews with his swivel chair tilted back, his hands clasped behind his head, his cigarette hanging from his lips, regarded the man dispassionately. | |||
“You gotta hell of a nerve to come to see me,” he commented cheerfully. | |||
To Mr. Thorndike, the form of greeting was novel. | |||
So greatly did it differ from the procedure of his own office, that he listened with interest. | |||
“Was it you,” demanded young Andrews, in a puzzled tone, “or your brother who tried to knife me?” | |||
Mr. Thorndike, unaccustomed to cross the pavement to his office unless escorted by bank messengers and plain-clothes men, felt the room growing rapidly smaller; the figure of the truculent Greek loomed to heroic proportions. | |||
The hand of the banker went vaguely to his chin, and from there fell to his pearl pin, which he hastily covered. | |||
“Get out!” | |||
said young Andrews, “and don’t show your face here—” | |||
The door slammed upon the flying Greek. | |||
Young Andrews swung his swivel chair so that, over his shoulder, he could see Mr. Thorndike. | |||
“I don’t like his face,” he explained. | |||
A kindly eyed, sad woman with a basket on her knee smiled upon Andrews with the familiarity of an old acquaintance. | |||
“Is that woman going to get a divorce from my son,” she asked, “now that he’s in trouble?” |
@ -1,2 +0,0 @@ | |||
#! /bin/sh | |||
gunicorn -w 3 --certfile=server.crt --keyfile=server.key -b 0.0.0.0:3389 pdf_online_demo:app |
@ -1,401 +0,0 @@ | |||
/*! | |||
* bootstrap-fileinput v4.3.6 | |||
* http://plugins.krajee.com/file-input | |||
* | |||
* Author: Kartik Visweswaran | |||
* Copyright: 2014 - 2016, Kartik Visweswaran, Krajee.com | |||
* | |||
* Licensed under the BSD 3-Clause | |||
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md | |||
*/ | |||
.file-loading { | |||
top: 0; | |||
right: 0; | |||
width: 25px; | |||
height: 25px; | |||
font-size: 999px; | |||
text-align: right; | |||
color: #fff; | |||
background: transparent url('../img/loading.gif') top left no-repeat; | |||
border: none; | |||
} | |||
.file-object { | |||
margin: 0 0 -5px 0; | |||
padding: 0; | |||
} | |||
.btn-file { | |||
position: relative; | |||
overflow: hidden; | |||
} | |||
.btn-file input[type=file] { | |||
position: absolute; | |||
top: 0; | |||
right: 0; | |||
min-width: 100%; | |||
min-height: 100%; | |||
text-align: right; | |||
opacity: 0; | |||
background: none repeat scroll 0 0 transparent; | |||
cursor: inherit; | |||
display: block; | |||
} | |||
.file-caption-name { | |||
display: inline-block; | |||
overflow: hidden; | |||
height: 20px; | |||
word-break: break-all; | |||
} | |||
.input-group-lg .file-caption-name { | |||
height: 25px; | |||
} | |||
.file-zoom-dialog { | |||
text-align: left; | |||
} | |||
.file-error-message { | |||
color: #a94442; | |||
background-color: #f2dede; | |||
margin: 5px; | |||
border: 1px solid #ebccd1; | |||
border-radius: 4px; | |||
padding: 15px; | |||
} | |||
.file-error-message pre, .file-error-message ul { | |||
margin: 0; | |||
text-align: left; | |||
} | |||
.file-error-message pre { | |||
margin: 5px 0; | |||
} | |||
.file-caption-disabled { | |||
background-color: #EEEEEE; | |||
cursor: not-allowed; | |||
opacity: 1; | |||
} | |||
.file-preview { | |||
border-radius: 5px; | |||
border: 1px solid #ddd; | |||
padding: 5px; | |||
width: 100%; | |||
margin-bottom: 5px; | |||
} | |||
.file-preview-frame { | |||
position: relative; | |||
display: table; | |||
margin: 8px; | |||
height: 160px; | |||
border: 1px solid #ddd; | |||
box-shadow: 1px 1px 5px 0 #a2958a; | |||
padding: 6px; | |||
float: left; | |||
text-align: center; | |||
vertical-align: middle; | |||
} | |||
.file-preview-frame:not(.file-preview-error):hover { | |||
box-shadow: 3px 3px 5px 0 #333; | |||
} | |||
.file-preview-image { | |||
vertical-align: middle; | |||
image-orientation: from-image; | |||
} | |||
.file-preview-text { | |||
display: block; | |||
color: #428bca; | |||
border: 1px solid #ddd; | |||
font-family: Menlo, Monaco, Consolas, "Courier New", monospace; | |||
outline: none; | |||
padding: 8px; | |||
resize: none; | |||
} | |||
.file-preview-html { | |||
border: 1px solid #ddd; | |||
padding: 8px; | |||
overflow: auto; | |||
} | |||
.file-zoom-dialog .file-preview-text { | |||
font-size: 1.2em; | |||
} | |||
.file-preview-other { | |||
left: 0; | |||
top: 0; | |||
right: 0; | |||
bottom: 0; | |||
margin: auto; | |||
text-align: center; | |||
vertical-align: middle; | |||
padding: 10px; | |||
} | |||
.file-preview-other:hover { | |||
opacity: 0.8; | |||
} | |||
.file-actions, .file-other-error { | |||
text-align: left; | |||
} | |||
.file-other-icon { | |||
font-size: 4.8em; | |||
} | |||
/* noinspection CssOverwrittenProperties */ | |||
.file-zoom-dialog .file-other-icon { | |||
font-size: 8em; | |||
font-size: 55vmin; | |||
} | |||
.file-input-new .file-preview, .file-input-new .close, .file-input-new .glyphicon-file, | |||
.file-input-new .fileinput-remove-button, .file-input-new .fileinput-upload-button, | |||
.file-input-ajax-new .fileinput-remove-button, .file-input-ajax-new .fileinput-upload-button { | |||
display: none; | |||
} | |||
.file-caption-main { | |||
width: 100%; | |||
} | |||
.file-input-ajax-new .no-browse .input-group-btn, | |||
.file-input-new .no-browse .input-group-btn { | |||
display: none; | |||
} | |||
.file-input-ajax-new .no-browse .form-control, | |||
.file-input-new .no-browse .form-control { | |||
border-top-right-radius: 4px; | |||
border-bottom-right-radius: 4px; | |||
} | |||
.file-thumb-loading { | |||
background: transparent url('../img/loading.gif') no-repeat scroll center center content-box !important; | |||
} | |||
.file-actions { | |||
margin-top: 15px; | |||
} | |||
.file-footer-buttons { | |||
float: right; | |||
} | |||
.file-upload-indicator { | |||
display: inline; | |||
cursor: default; | |||
opacity: 0.8; | |||
width: 60%; | |||
} | |||
.file-upload-indicator:hover { | |||
font-weight: bold; | |||
opacity: 1; | |||
} | |||
.file-footer-caption { | |||
display: block; | |||
white-space: nowrap; | |||
overflow: hidden; | |||
text-overflow: ellipsis; | |||
width: 160px; | |||
text-align: center; | |||
padding-top: 4px; | |||
font-size: 11px; | |||
color: #777; | |||
margin: 5px auto; | |||
} | |||
.file-preview-error { | |||
opacity: 0.65; | |||
box-shadow: none; | |||
} | |||
.file-preview-frame:not(.file-preview-error) .file-footer-caption:hover { | |||
color: #000; | |||
} | |||
.file-drop-zone { | |||
border: 1px dashed #aaa; | |||
border-radius: 4px; | |||
height: 100%; | |||
text-align: center; | |||
vertical-align: middle; | |||
margin: 12px 15px 12px 12px; | |||
padding: 5px; | |||
} | |||
.file-drop-zone-title { | |||
color: #aaa; | |||
font-size: 1.6em; | |||
padding: 85px 10px; | |||
cursor: default; | |||
} | |||
.file-preview .clickable, | |||
.clickable .file-drop-zone-title { | |||
cursor: pointer; | |||
} | |||
.file-drop-zone.clickable:hover { | |||
border: 2px dashed #999; | |||
} | |||
.file-drop-zone.clickable:focus { | |||
border: 2px solid #5acde2; | |||
} | |||
.file-drop-zone .file-preview-thumbnails { | |||
cursor: default; | |||
} | |||
.file-highlighted { | |||
border: 2px dashed #999 !important; | |||
background-color: #f0f0f0; | |||
} | |||
.file-uploading { | |||
background: url('../img/loading-sm.gif') no-repeat center bottom 10px; | |||
opacity: 0.65; | |||
} | |||
.file-thumb-progress { | |||
height: 10px; | |||
} | |||
.file-thumb-progress .progress, .file-thumb-progress .progress-bar { | |||
height: 10px; | |||
font-size: 9px; | |||
line-height: 10px; | |||
} | |||
.file-thumbnail-footer { | |||
position: relative; | |||
} | |||
.file-thumb-progress { | |||
position: absolute; | |||
top: 35px; | |||
left: 0; | |||
right: 0; | |||
} | |||
.file-zoom-fullscreen.modal { | |||
position: fixed; | |||
top: 0; | |||
right: 0; | |||
bottom: 0; | |||
left: 0; | |||
} | |||
.file-zoom-fullscreen .modal-dialog { | |||
position: fixed; | |||
margin: 0; | |||
width: 100%; | |||
height: 100%; | |||
padding: 0; | |||
} | |||
.file-zoom-fullscreen .modal-content { | |||
border-radius: 0; | |||
box-shadow: none; | |||
} | |||
.file-zoom-fullscreen .modal-body { | |||
overflow-y: auto; | |||
} | |||
.file-zoom-dialog .modal-body { | |||
position: relative !important; | |||
} | |||
.file-zoom-dialog .btn-navigate { | |||
position: absolute; | |||
padding: 0; | |||
margin: 0; | |||
background: transparent; | |||
text-decoration: none; | |||
outline: none; | |||
opacity: 0.7; | |||
top: 45%; | |||
font-size: 4em; | |||
color: #1c94c4; | |||
} | |||
.file-zoom-dialog .floating-buttons { | |||
position: absolute; | |||
top: 5px; | |||
right: 10px; | |||
} | |||
.floating-buttons, .floating-buttons .btn { | |||
z-index: 3000; | |||
} | |||
.file-zoom-dialog .kv-zoom-actions .btn, | |||
.floating-buttons .btn { | |||
margin-left: 3px; | |||
} | |||
.file-zoom-dialog .btn-navigate:not([disabled]):hover, | |||
.file-zoom-dialog .btn-navigate:not([disabled]):focus { | |||
outline: none; | |||
box-shadow: none; | |||
opacity: 0.5; | |||
} | |||
.file-zoom-dialog .btn-navigate[disabled] { | |||
opacity: 0.3; | |||
} | |||
.file-zoom-dialog .btn-prev { | |||
left: 1px; | |||
} | |||
.file-zoom-dialog .btn-next { | |||
right: 1px; | |||
} | |||
.file-drag-handle { | |||
display: inline; | |||
margin-right: 2px; | |||
font-size: 16px; | |||
cursor: move; | |||
cursor: -webkit-grabbing; | |||
} | |||
.file-drag-handle:hover { | |||
opacity: 0.7; | |||
} | |||
.file-zoom-content { | |||
height: 480px; | |||
text-align: center; | |||
} | |||
.file-preview-initial.sortable-chosen { | |||
background-color: #d9edf7; | |||
} | |||
.file-preview-frame.sortable-ghost { | |||
background-color: #eee; | |||
} | |||
/* IE 10 fix */ | |||
.btn-file ::-ms-browse { | |||
width: 100%; | |||
height: 100%; | |||
} |
@ -1,39 +0,0 @@ | |||
/* latin-ext */ | |||
@font-face { | |||
font-family: 'Lato'; | |||
font-style: normal; | |||
font-weight: 400; | |||
src: url(https://fonts.gstatic.com/s/lato/v22/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2'); | |||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; | |||
} | |||
/* latin */ | |||
@font-face { | |||
font-family: 'Lato'; | |||
font-style: normal; | |||
font-weight: 400; | |||
src: url(https://fonts.gstatic.com/s/lato/v22/S6uyw4BMUTPHjx4wXg.woff2) format('woff2'); | |||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; | |||
} | |||
/* fallback */ | |||
@font-face { | |||
font-family: 'Material Icons'; | |||
font-style: normal; | |||
font-weight: 400; | |||
src: url(https://fonts.gstatic.com/s/materialicons/v126/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2'); | |||
} | |||
.material-icons { | |||
font-family: 'Material Icons'; | |||
font-weight: normal; | |||
font-style: normal; | |||
font-size: 24px; | |||
line-height: 1; | |||
letter-spacing: normal; | |||
text-transform: none; | |||
display: inline-block; | |||
white-space: nowrap; | |||
word-wrap: normal; | |||
direction: ltr; | |||
-webkit-font-smoothing: antialiased; | |||
} |
@ -1,349 +0,0 @@ | |||
* { | |||
margin: 0px auto; | |||
padding: 0px; | |||
text-align: center; | |||
font-family: 'Lato', sans-serif; | |||
} | |||
.cotn_principal { | |||
position: absolute; | |||
width: 100%; | |||
height: 100%; | |||
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#cfd8dc+0,607d8b+100,b0bec5+100 */ | |||
background: #aac4bc; /* Old browsers */ | |||
background: -moz-linear-gradient(-45deg, #aac4bc 0%, #eca8a8 100%, #eed5a9 100%); /* FF3.6-15 */ | |||
background: -webkit-linear-gradient(-45deg, #aac4bc 0%,#eca8a8 100%,#eed5a9 100%); /* Chrome10-25,Safari5.1-6 */ | |||
background: linear-gradient(135deg, #aac4bc 0%,#eca8a8 100%,#eed5a9 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ | |||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cfd8dc', endColorstr='#b0bec5',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ | |||
} | |||
.cont_centrar { | |||
position: relative; | |||
float: left; | |||
width: 100%; | |||
} | |||
.cont_login { | |||
position: relative; | |||
width: 640px; | |||
left: 50%; | |||
margin-left: -320px; | |||
} | |||
.cont_back_info { | |||
position: relative; | |||
float: left; | |||
width: 640px; | |||
height: 280px; | |||
overflow: hidden; | |||
background-color: #fff; | |||
margin-top: 100px; | |||
box-shadow: 1px 10px 30px -10px rgba(0,0,0,0.5); | |||
} | |||
.cont_forms { | |||
position: absolute; | |||
overflow: hidden; | |||
top:100px; | |||
left: 0px; | |||
width: 320px; | |||
height: 280px; | |||
background-color: #eee; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_forms_active_login { | |||
box-shadow: 1px 10px 30px -10px rgba(0,0,0,0.5); | |||
height: 420px; | |||
top:20px; | |||
left: 0px; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_forms_active_sign_up { | |||
box-shadow: 1px 10px 30px -10px rgba(0,0,0,0.5); | |||
height: 420px; | |||
top:20px; | |||
left:320px; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_img_back_grey { | |||
position: absolute; | |||
width: 950px; | |||
top:-80px; | |||
left: -116px; | |||
} | |||
.cont_img_back_grey > img { | |||
width: 100%; | |||
-webkit-filter: grayscale(100%); filter: grayscale(100%); | |||
opacity: 0.2; | |||
animation-name: animar_fondo; | |||
animation-duration: 20s; | |||
animation-timing-function: linear; | |||
animation-iteration-count: infinite; | |||
animation-direction: alternate; | |||
} | |||
.cont_img_back_ { | |||
position: absolute; | |||
width: 950px; | |||
top:-80px; | |||
left: -116px; | |||
} | |||
.cont_img_back_ > img { | |||
width: 100%; | |||
opacity: 0.3; | |||
animation-name: animar_fondo; | |||
animation-duration: 20s; | |||
animation-timing-function: linear; | |||
animation-iteration-count: infinite; | |||
animation-direction: alternate; | |||
} | |||
.cont_forms_active_login > .cont_img_back_ { | |||
top:0px; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_forms_active_sign_up > .cont_img_back_ { | |||
top:0px; | |||
left: -435px; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_info_log_sign_up { | |||
position: absolute; | |||
width: 640px; | |||
height: 280px; | |||
top: 100px; | |||
z-index: 1; | |||
} | |||
.col_md_login { | |||
position: relative; | |||
float: left; | |||
width: 50%; | |||
} | |||
.col_md_login > h2 { | |||
font-weight: 400; | |||
margin-top: 70px; | |||
color: #757575; | |||
} | |||
.col_md_login > p { | |||
font-weight: 400; | |||
margin-top: 15px; | |||
width: 80%; | |||
color: #37474F; | |||
} | |||
.btn_login { | |||
background-color: #FF9800; | |||
border: none; | |||
padding: 10px; | |||
width: 200px; | |||
border-radius:3px; | |||
box-shadow: 1px 5px 20px -5px rgba(0,0,0,0.4); | |||
color: #fff; | |||
margin-top: 10px; | |||
cursor: pointer; | |||
} | |||
.col_md_sign_up { | |||
position: relative; | |||
float: left; | |||
width: 50%; | |||
} | |||
.cont_ba_opcitiy > h2 { | |||
font-weight: 400; | |||
color: #fff; | |||
} | |||
.cont_ba_opcitiy > p { | |||
font-weight: 400; | |||
margin-top: 15px; | |||
color: #fff; | |||
} | |||
/* ---------------------------------- | |||
background text | |||
------------------------------------ | |||
*/ | |||
.cont_ba_opcitiy { | |||
position: relative; | |||
background-color: rgba(187, 168, 170, 0.79); | |||
width: 80%; | |||
border-radius:3px ; | |||
margin-top: 60px; | |||
padding: 15px 0px; | |||
} | |||
.btn_sign_up { | |||
background-color: #f44336; | |||
border: none; | |||
padding: 10px; | |||
width: 200px; | |||
border-radius:3px; | |||
box-shadow: 1px 5px 20px -5px rgba(0,0,0,0.4); | |||
color: #fff; | |||
margin-top: 10px; | |||
cursor: pointer; | |||
} | |||
.cont_forms_active_sign_up { | |||
z-index: 2; | |||
} | |||
@-webkit-keyframes animar_fondo { | |||
from { -webkit-transform: scale(1) translate(0px); | |||
-moz-transform: scale(1) translate(0px); | |||
-ms-transform: scale(1) translate(0px); | |||
-o-transform: scale(1) translate(0px); | |||
transform: scale(1) translate(0px); } | |||
to { -webkit-transform: scale(1.5) translate(50px); | |||
-moz-transform: scale(1.5) translate(50px); | |||
-ms-transform: scale(1.5) translate(50px); | |||
-o-transform: scale(1.5) translate(50px); | |||
transform: scale(1.5) translate(50px); } | |||
} | |||
@-o-keyframes identifier { | |||
from { -webkit-transform: scale(1); | |||
-moz-transform: scale(1); | |||
-ms-transform: scale(1); | |||
-o-transform: scale(1); | |||
transform: scale(1); } | |||
to { -webkit-transform: scale(1.5); | |||
-moz-transform: scale(1.5); | |||
-ms-transform: scale(1.5); | |||
-o-transform: scale(1.5); | |||
transform: scale(1.5); } | |||
} | |||
@-moz-keyframes identifier { | |||
from { -webkit-transform: scale(1); | |||
-moz-transform: scale(1); | |||
-ms-transform: scale(1); | |||
-o-transform: scale(1); | |||
transform: scale(1); } | |||
to { -webkit-transform: scale(1.5); | |||
-moz-transform: scale(1.5); | |||
-ms-transform: scale(1.5); | |||
-o-transform: scale(1.5); | |||
transform: scale(1.5); } | |||
} | |||
@keyframes identifier { | |||
from { -webkit-transform: scale(1); | |||
-moz-transform: scale(1); | |||
-ms-transform: scale(1); | |||
-o-transform: scale(1); | |||
transform: scale(1); } | |||
to { -webkit-transform: scale(1.5); | |||
-moz-transform: scale(1.5); | |||
-ms-transform: scale(1.5); | |||
-o-transform: scale(1.5); | |||
transform: scale(1.5); } | |||
} | |||
.cont_form_login { | |||
position: absolute; | |||
opacity: 0; | |||
display: none; | |||
width: 320px; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_forms_active_login { | |||
z-index: 2; | |||
} | |||
.cont_forms_active_login >.cont_form_login { | |||
} | |||
.cont_form_sign_up { | |||
position: absolute; | |||
width: 320px; | |||
float: left; | |||
opacity: 0; | |||
display: none; | |||
-webkit-transition: all 0.5s; | |||
-moz-transition: all 0.5s; | |||
-ms-transition: all 0.5s; | |||
-o-transition: all 0.5s; | |||
transition: all 0.5s; | |||
} | |||
.cont_form_sign_up > input { | |||
text-align: left; | |||
padding: 15px 5px; | |||
margin-left: 10px; | |||
margin-top: 20px; | |||
width: 260px; | |||
border: none; | |||
color: #757575; | |||
} | |||
.cont_form_sign_up > h2 { | |||
margin-top: 50px; | |||
font-weight: 400; | |||
color: #757575; | |||
} | |||
.cont_form_login > input { | |||
padding: 15px 5px; | |||
margin-left: 10px; | |||
margin-top: 20px; | |||
width: 260px; | |||
border: none; | |||
text-align: left; | |||
color: #757575; | |||
} | |||
.cont_form_login > h2 { | |||
margin-top: 110px; | |||
font-weight: 400; | |||
color: #757575; | |||
} | |||
.cont_form_login > a,.cont_form_sign_up > a { | |||
color: #757575; | |||
position: relative; | |||
float: left; | |||
margin: 10px; | |||
margin-left: 30px; | |||
} |
@ -1,188 +0,0 @@ | |||
@charset "UTF-8"; | |||
html, body { | |||
margin: 0; | |||
padding: 0; | |||
width: 100%; | |||
height: 100%; | |||
background-color: #DB4D6D; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
font-family: "微軟正黑體"; | |||
} | |||
.monster { | |||
width: 110px; | |||
height: 110px; | |||
background-color: #E55A54; | |||
border-radius: 20px; | |||
position: relative; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
flex-direction: column; | |||
cursor: pointer; | |||
margin: 10px; | |||
box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.2); | |||
position: relative; | |||
animation: jumping 0.8s infinite alternate; | |||
} | |||
.monster .eye { | |||
width: 40%; | |||
height: 40%; | |||
border-radius: 50%; | |||
background-color: #fff; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
} | |||
.monster .eyeball { | |||
width: 50%; | |||
height: 50%; | |||
border-radius: 50%; | |||
background-color: #0C4475; | |||
} | |||
.monster .mouth { | |||
width: 32%; | |||
height: 12px; | |||
border-radius: 12px; | |||
background-color: white; | |||
margin-top: 15%; | |||
} | |||
.monster:before, .monster:after { | |||
content: ""; | |||
display: block; | |||
width: 20%; | |||
height: 10px; | |||
position: absolute; | |||
left: 50%; | |||
top: -10px; | |||
background-color: #fff; | |||
border-radius: 10px; | |||
} | |||
.monster:before { | |||
transform: translateX(-70%) rotate(45deg); | |||
} | |||
.monster:after { | |||
transform: translateX(-30%) rotate(-45deg); | |||
} | |||
.monster, .monster * { | |||
transition: 0.5s; | |||
} | |||
.monster.blue { | |||
background-color: #0C4475; | |||
animation-delay: 0.5s; | |||
} | |||
.monster.blue .mouth, .monster.blue .eyeball { | |||
background-color: #E55A54; | |||
} | |||
@keyframes jumping { | |||
50% { | |||
top: 0; | |||
box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.2); | |||
} | |||
100% { | |||
top: -50px; | |||
box-shadow: 0px 120px 50px rgba(0, 0, 0, 0.2); | |||
} | |||
} | |||
@keyframes eyemove { | |||
0%,10% { | |||
transform: translate(50%); | |||
} | |||
90%,100% { | |||
transform: translate(-50%); | |||
} | |||
} | |||
.monster .eyeball { | |||
animation: eyemove 1.6s infinite alternate; | |||
} | |||
h2 { | |||
color: white; | |||
font-size: 40px; | |||
margin-right: 50px; | |||
} | |||
h3 { | |||
margin-top: 0; | |||
opacity: 0.5; | |||
color: white; | |||
} | |||
.pageLoading { | |||
position: fixed; | |||
width: 100%; | |||
height: 100%; | |||
left: 0; | |||
top: 0; | |||
display: flex; | |||
justify-content: center; | |||
align-items: center; | |||
background-color: #0C4475; | |||
flex-direction: column; | |||
transition: opacity 0.5s 0.5s; | |||
} | |||
.pageLoading.complete { | |||
opacity: 0; | |||
} | |||
.pageLoading.complete .monster { | |||
transform: scale(0.01) rotate(360deg); | |||
} | |||
.loading { | |||
width: 200px; | |||
height: 8px; | |||
margin-top: 80px; | |||
border-radius: 5px; | |||
background-color: #fff; | |||
overflow: hidden; | |||
transition: 0.5s; | |||
} | |||
.loading .bar { | |||
background-color: #E55A54; | |||
width: 0%; | |||
height: 100%; | |||
} | |||
button { | |||
height: 60px; | |||
padding: 0 2em; | |||
background-color: #1aab8a; | |||
color: #fff; | |||
border: none; | |||
outline: none; | |||
font-size: 16px; | |||
cursor: pointer; | |||
position: relative; | |||
transition: all ease 800ms; | |||
z-index:2; | |||
opacity: 0; | |||
} | |||
button:hover { | |||
background-color: #fff; | |||
color: #1aab8a; | |||
} | |||
button:before, button:after { | |||
content: ''; | |||
position: absolute; | |||
top: 0; | |||
right: 0; | |||
width: 0; | |||
height: 2px; | |||
background-color: #1aab8a; | |||
transition: all ease 400ms; | |||
} | |||
button:after { | |||
top: inherit; | |||
right: inherit; | |||
left: 0; | |||
bottom: 0; | |||
} | |||
button:hover:after, button:hover:before { | |||
width: 100%; | |||
transition: all ease 800ms; | |||
} |
@ -1,21 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<svg width="215px" height="215px" viewBox="0 0 215 215" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | |||
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch --> | |||
<title>portal-logo</title> | |||
<desc>Created with Sketch.</desc> | |||
<defs> | |||
<path d="M51.165,8.742 C54.505,12.619 56.876,17.365 57.892,22.588 C60.148,17.225 65.452,13.46 71.636,13.46 C79.867,13.46 86.541,20.134 86.541,28.365 C86.541,36.597 79.867,43.269 71.636,43.269 C63.404,43.269 56.728,36.597 56.728,28.365 C56.728,12.7 44.03,0 28.365,0 C12.7,0 0,12.7 0,28.365 C0,44.031 12.7,56.731 28.365,56.731 C36.419,56.731 43.695,53.393 48.858,48.003 C45.501,44.117 43.128,39.383 42.108,34.14 C39.852,39.504 34.548,43.269 28.365,43.269 C20.133,43.269 13.46,36.597 13.46,28.365 C13.46,20.134 20.133,13.46 28.365,13.46 C36.966,13.46 43.27,20.577 43.27,28.365 C43.27,44.031 55.97,56.731 71.636,56.731 C87.3,56.731 100,44.031 100,28.365 C100,12.7 87.3,0 71.636,0 C63.589,0 56.327,3.358 51.165,8.742 Z" id="path-1"></path> | |||
</defs> | |||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> | |||
<g id="portal-logo"> | |||
<circle id="Oval" fill="#51B37F" fill-rule="nonzero" cx="107.5" cy="107.5" r="107.5"></circle> | |||
<g id="logo" transform="translate(58.000000, 79.000000)"> | |||
<mask id="mask-2" fill="white"> | |||
<use xlink:href="#path-1"></use> | |||
</mask> | |||
<g id="Clip-2"></g> | |||
<polygon id="Fill-1" fill="#FFFFFE" mask="url(#mask-2)" points="-5 61.73 105 61.73 105 -5 -5 -5"></polygon> | |||
</g> | |||
</g> | |||
</g> | |||
</svg> |
@ -1,21 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<svg width="215px" height="215px" viewBox="0 0 215 215" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | |||
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch --> | |||
<title>portal-logo</title> | |||
<desc>Created with Sketch.</desc> | |||
<defs> | |||
<path d="M51.165,8.742 C54.505,12.619 56.876,17.365 57.892,22.588 C60.148,17.225 65.452,13.46 71.636,13.46 C79.867,13.46 86.541,20.134 86.541,28.365 C86.541,36.597 79.867,43.269 71.636,43.269 C63.404,43.269 56.728,36.597 56.728,28.365 C56.728,12.7 44.03,0 28.365,0 C12.7,0 0,12.7 0,28.365 C0,44.031 12.7,56.731 28.365,56.731 C36.419,56.731 43.695,53.393 48.858,48.003 C45.501,44.117 43.128,39.383 42.108,34.14 C39.852,39.504 34.548,43.269 28.365,43.269 C20.133,43.269 13.46,36.597 13.46,28.365 C13.46,20.134 20.133,13.46 28.365,13.46 C36.966,13.46 43.27,20.577 43.27,28.365 C43.27,44.031 55.97,56.731 71.636,56.731 C87.3,56.731 100,44.031 100,28.365 C100,12.7 87.3,0 71.636,0 C63.589,0 56.327,3.358 51.165,8.742 Z" id="path-1"></path> | |||
</defs> | |||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> | |||
<g id="portal-logo"> | |||
<circle id="Oval" fill="#09B6CA" fill-rule="nonzero" cx="107.5" cy="107.5" r="107.5"></circle> | |||
<g id="logo" transform="translate(58.000000, 79.000000)"> | |||
<mask id="mask-2" fill="white"> | |||
<use xlink:href="#path-1"></use> | |||
</mask> | |||
<g id="Clip-2"></g> | |||
<polygon id="Fill-1" fill="#FFFFFE" mask="url(#mask-2)" points="-5 61.73 105 61.73 105 -5 -5 -5"></polygon> | |||
</g> | |||
</g> | |||
</g> | |||
</svg> |
@ -1,74 +0,0 @@ | |||
/*! | |||
* FileInput <_LANG_> Translations | |||
* | |||
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or | |||
* any HTML markup tags in the messages must not be converted or translated. | |||
* | |||
* @see http://github.com/kartik-v/bootstrap-fileinput | |||
* | |||
* NOTE: this file must be saved in UTF-8 encoding. | |||
*/ | |||
(function ($) { | |||
"use strict"; | |||
$.fn.fileinputLocales['_LANG_'] = { | |||
fileSingle: 'file', | |||
filePlural: 'files', | |||
browseLabel: 'Browse …', | |||
removeLabel: 'Remove', | |||
removeTitle: 'Clear selected files', | |||
cancelLabel: 'Cancel', | |||
cancelTitle: 'Abort ongoing upload', | |||
uploadLabel: 'Upload', | |||
uploadTitle: 'Upload selected files', | |||
msgNo: 'No', | |||
msgNoFilesSelected: 'No files selected', | |||
msgCancelled: 'Cancelled', | |||
msgZoomModalHeading: 'Detailed Preview', | |||
msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.', | |||
msgSizeTooLarge: 'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.', | |||
msgFilesTooLess: 'You must select at least <b>{n}</b> {files} to upload.', | |||
msgFilesTooMany: 'Number of files selected for upload <b>({n})</b> exceeds maximum allowed limit of <b>{m}</b>.', | |||
msgFileNotFound: 'File "{name}" not found!', | |||
msgFileSecured: 'Security restrictions prevent reading the file "{name}".', | |||
msgFileNotReadable: 'File "{name}" is not readable.', | |||
msgFilePreviewAborted: 'File preview aborted for "{name}".', | |||
msgFilePreviewError: 'An error occurred while reading the file "{name}".', | |||
msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".', | |||
msgInvalidFileType: 'Invalid type for file "{name}". Only "{types}" files are supported.', | |||
msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.', | |||
msgUploadAborted: 'The file upload was aborted', | |||
msgUploadThreshold: 'Processing...', | |||
msgValidationError: 'Validation Error', | |||
msgLoading: 'Loading file {index} of {files} …', | |||
msgProgress: 'Loading file {index} of {files} - {name} - {percent}% completed.', | |||
msgSelected: '{n} {files} selected', | |||
msgFoldersNotAllowed: 'Drag & drop files only! Skipped {n} dropped folder(s).', | |||
msgImageWidthSmall: 'Width of image file "{name}" must be at least {size} px.', | |||
msgImageHeightSmall: 'Height of image file "{name}" must be at least {size} px.', | |||
msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px.', | |||
msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px.', | |||
msgImageResizeError: 'Could not get the image dimensions to resize.', | |||
msgImageResizeException: 'Error while resizing the image.<pre>{errors}</pre>', | |||
dropZoneTitle: 'Drag & drop files here …', | |||
dropZoneClickTitle: '<br>(or click to select {files})', | |||
fileActionSettings: { | |||
removeTitle: 'Remove file', | |||
uploadTitle: 'Upload file', | |||
zoomTitle: 'View details', | |||
dragTitle: 'Move / Rearrange', | |||
indicatorNewTitle: 'Not uploaded yet', | |||
indicatorSuccessTitle: 'Uploaded', | |||
indicatorErrorTitle: 'Upload Error', | |||
indicatorLoadingTitle: 'Uploading ...' | |||
}, | |||
previewZoomButtonTitles: { | |||
prev: 'View previous file', | |||
next: 'View next file', | |||
toggleheader: 'Toggle header', | |||
fullscreen: 'Toggle full screen', | |||
borderless: 'Toggle borderless mode', | |||
close: 'Close detailed preview' | |||
} | |||
}; | |||
})(window.jQuery); |
@ -1,96 +0,0 @@ | |||
'use strict'; | |||
/* ===== Enable Bootstrap Popover (on element ====== */ | |||
var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-toggle="popover"]')) | |||
var popoverList = popoverTriggerList.map(function (popoverTriggerEl) { | |||
return new bootstrap.Popover(popoverTriggerEl) | |||
}) | |||
/* ==== Enable Bootstrap Alert ====== */ | |||
var alertList = document.querySelectorAll('.alert') | |||
alertList.forEach(function (alert) { | |||
new bootstrap.Alert(alert) | |||
}); | |||
/* ===== Responsive Sidepanel ====== */ | |||
const sidePanelToggler = document.getElementById('sidepanel-toggler'); | |||
const sidePanel = document.getElementById('app-sidepanel'); | |||
const sidePanelDrop = document.getElementById('sidepanel-drop'); | |||
const sidePanelClose = document.getElementById('sidepanel-close'); | |||
window.addEventListener('load', function(){ | |||
responsiveSidePanel(); | |||
}); | |||
window.addEventListener('resize', function(){ | |||
responsiveSidePanel(); | |||
}); | |||
function responsiveSidePanel() { | |||
let w = window.innerWidth; | |||
if(w >= 1200) { | |||
// if larger | |||
//console.log('larger'); | |||
sidePanel.classList.remove('sidepanel-hidden'); | |||
sidePanel.classList.add('sidepanel-visible'); | |||
} else { | |||
// if smaller | |||
//console.log('smaller'); | |||
sidePanel.classList.remove('sidepanel-visible'); | |||
sidePanel.classList.add('sidepanel-hidden'); | |||
} | |||
}; | |||
// sidePanelToggler.addEventListener('click', () => { | |||
// if (sidePanel.classList.contains('sidepanel-visible')) { | |||
// console.log('visible'); | |||
// sidePanel.classList.remove('sidepanel-visible'); | |||
// sidePanel.classList.add('sidepanel-hidden'); | |||
// } else { | |||
// console.log('hidden'); | |||
// sidePanel.classList.remove('sidepanel-hidden'); | |||
// sidePanel.classList.add('sidepanel-visible'); | |||
// } | |||
// }); | |||
// sidePanelClose.addEventListener('click', (e) => { | |||
// e.preventDefault(); | |||
// sidePanelToggler.click(); | |||
// }); | |||
// sidePanelDrop.addEventListener('click', (e) => { | |||
// sidePanelToggler.click(); | |||
// }); | |||
// /* ====== Mobile search ======= */ | |||
// const searchMobileTrigger = document.querySelector('.search-mobile-trigger'); | |||
// const searchBox = document.querySelector('.app-search-box'); | |||
// searchMobileTrigger.addEventListener('click', () => { | |||
// searchBox.classList.toggle('is-visible'); | |||
// let searchMobileTriggerIcon = document.querySelector('.search-mobile-trigger-icon'); | |||
// if(searchMobileTriggerIcon.classList.contains('fa-search')) { | |||
// searchMobileTriggerIcon.classList.remove('fa-search'); | |||
// searchMobileTriggerIcon.classList.add('fa-times'); | |||
// } else { | |||
// searchMobileTriggerIcon.classList.remove('fa-times'); | |||
// searchMobileTriggerIcon.classList.add('fa-search'); | |||
// } | |||
// }); | |||
@ -1,153 +0,0 @@ | |||
var PointCalibrate = 0; | |||
var CalibrationPoints={}; | |||
/** | |||
* Clear the canvas and the calibration button. | |||
*/ | |||
function ClearCanvas(){ | |||
$(".Calibration").hide(); | |||
var canvas = document.getElementById("plotting_canvas"); | |||
canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height); | |||
} | |||
/** | |||
* Show the instruction of using calibration at the start up screen. | |||
*/ | |||
function PopUpInstruction(){ | |||
ClearCanvas(); | |||
swal({ | |||
title:"校准", | |||
text: "为了校准您的视线焦点的精准度,请点击屏幕上的9个点,每个点需点击5次,直到它变成黄色。", | |||
buttons:{ | |||
cancel: false, | |||
confirm: true | |||
} | |||
}).then(isConfirm => { | |||
ShowCalibrationPoint(); | |||
}); | |||
} | |||
/** | |||
* Show the help instructions right at the start. | |||
*/ | |||
function helpModalShow() { | |||
$('#helpModal').modal('show'); | |||
} | |||
/** | |||
* Load this function when the index page starts. | |||
* This function listens for button clicks on the html page | |||
* checks that all buttons have been clicked 5 times each, and then goes on to measuring the precision | |||
*/ | |||
$(document).ready(function(){ | |||
ClearCanvas(); | |||
helpModalShow(); | |||
$(".Calibration").click(function(){ // click event on the calibration buttons | |||
var id = $(this).attr('id'); | |||
if (!CalibrationPoints[id]){ // initialises if not done | |||
CalibrationPoints[id]=0; | |||
} | |||
CalibrationPoints[id]++; // increments values | |||
if (CalibrationPoints[id]==5){ //only turn to yellow after 5 clicks | |||
$(this).css('background-color','yellow'); | |||
$(this).prop('disabled', true); //disables the button | |||
PointCalibrate++; | |||
}else if (CalibrationPoints[id]<5){ | |||
//Gradually increase the opacity of calibration points when click to give some indication to user. | |||
var opacity = 0.2*CalibrationPoints[id]+0.2; | |||
$(this).css('opacity',opacity); | |||
} | |||
//Show the middle calibration point after all other points have been clicked. | |||
if (PointCalibrate == 8){ | |||
$("#Pt5").show(); | |||
} | |||
if (PointCalibrate >= 9){ // last point is calibrated | |||
//using jquery to grab every element in Calibration class and hide them except the middle point. | |||
$(".Calibration").hide(); | |||
$("#Pt5").show(); | |||
// clears the canvas | |||
var canvas = document.getElementById("plotting_canvas"); | |||
canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height); | |||
// notification for the measurement process | |||
swal({ | |||
title: "正在计算测量的精准度......", | |||
text: "请不要移动鼠标,在接下来的5秒钟内保持目视前方的状态。我们会在接下来一段时间内计算预测的精确度!", | |||
closeOnEsc: false, | |||
allowOutsideClick: false, | |||
closeModal: true | |||
}).then( isConfirm => { | |||
// makes the variables true for 5 seconds & plots the points | |||
$(document).ready(function(){ | |||
store_points_variable(); // start storing the prediction points | |||
sleep(5000).then(() => { | |||
stop_storing_points_variable(); // stop storing the prediction points | |||
var past50 = webgazer.getStoredPoints(); // retrieve the stored points | |||
var precision_measurement = calculatePrecision(past50); | |||
var accuracyLabel = "<a>准确度 | "+precision_measurement+"%</a>"; | |||
document.getElementById("Accuracy").innerHTML = accuracyLabel; // Show the accuracy in the nav bar. | |||
swal({ | |||
title: "你的预测准确度为 " + precision_measurement + "%", | |||
allowOutsideClick: false, | |||
buttons: { | |||
cancel: "再次校准", | |||
confirm: "确认", | |||
} | |||
}).then(isConfirm => { | |||
if (isConfirm){ | |||
//clear the calibration & hide the last middle button | |||
window.location.href="/static/pdfjs/web/viewer.html"; | |||
ClearCanvas(); | |||
} else { | |||
//use restart function to restart the calibration | |||
document.getElementById("Accuracy").innerHTML = "<a>还未进行校准</a>"; | |||
webgazer.clearData(); | |||
ClearCalibration(); | |||
ClearCanvas(); | |||
ShowCalibrationPoint(); | |||
} | |||
}); | |||
}); | |||
}); | |||
}); | |||
} | |||
}); | |||
}); | |||
/** | |||
* Show the Calibration Points | |||
*/ | |||
function ShowCalibrationPoint() { | |||
$(".Calibration").show(); | |||
$("#Pt5").hide(); // initially hides the middle button | |||
} | |||
/** | |||
* This function clears the calibration buttons memory | |||
*/ | |||
function ClearCalibration(){ | |||
// Clear data from WebGazer | |||
$(".Calibration").css('background-color','red'); | |||
$(".Calibration").css('opacity',0.2); | |||
$(".Calibration").prop('disabled',false); | |||
CalibrationPoints = {}; | |||
PointCalibrate = 0; | |||
} | |||
// sleep function because java doesn't have one, sourced from http://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep | |||
function sleep (time) { | |||
return new Promise((resolve) => setTimeout(resolve, time)); | |||
} |
@ -1 +0,0 @@ | |||
!function(a){"use strict";var b=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,c=a.Blob&&function(){try{return Boolean(new Blob)}catch(a){return!1}}(),d=c&&a.Uint8Array&&function(){try{return 100===new Blob([new Uint8Array(100)]).size}catch(a){return!1}}(),e=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,f=(c||e)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var b,f,g,h,i,j;for(b=a.split(",")[0].indexOf("base64")>=0?atob(a.split(",")[1]):decodeURIComponent(a.split(",")[1]),f=new ArrayBuffer(b.length),g=new Uint8Array(f),h=0;h<b.length;h+=1)g[h]=b.charCodeAt(h);return i=a.split(",")[0].split(":")[1].split(";")[0],c?new Blob([d?g:f],{type:i}):(j=new e,j.append(f),j.getBlob(i))};a.HTMLCanvasElement&&!b.toBlob&&(b.mozGetAsFile?b.toBlob=function(a,c,d){a(d&&b.toDataURL&&f?f(this.toDataURL(c,d)):this.mozGetAsFile("blob",c))}:b.toDataURL&&f&&(b.toBlob=function(a,b,c){a(f(this.toDataURL(b,c)))})),"function"==typeof define&&define.amd?define(function(){return f}):a.dataURLtoBlob=f}(window); |
@ -1,119 +0,0 @@ | |||
var Stage = function() { | |||
function t(t, n, i) { | |||
var e = this; | |||
this.canvas = document.getElementById(t), this.ctx = this.canvas.getContext("2d"), this.renderList = [], this.needClear = !0, this.canvas.width = n || $(window).width(), this.canvas.height = i || $(window).height(), $(window).on("resize", function() { | |||
e.canvas.width = n || $(window).width(), e.canvas.height = i || $(window).height() | |||
}) | |||
} | |||
return window.requestAnimationFrame = function() { | |||
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(t) { | |||
window.setTimeout(t, 1e3 / 60) | |||
} | |||
}(), t.prototype.update = function() { | |||
var t = this; | |||
t.needClear && t.ctx.clearRect(0, 0, t.canvas.width, t.canvas.height), t.renderList.forEach(function(n) { | |||
n(t.ctx, t.canvas) | |||
}), requestAnimationFrame(function() { | |||
t.update() | |||
}) | |||
}, t.prototype.onUpdate = function(t) { | |||
this.renderList.push(t) | |||
}, t | |||
}();; | |||
var Twinkle = function() { | |||
function t(t, e, a) { | |||
this.initSymbols(t, e, a), this.particles = [], this._pool = [], this.mouse = new s | |||
} | |||
function s(t, s) { | |||
this.x = t || 0, this.y = s || 0 | |||
} | |||
function e(t, s, e) { | |||
this.color = n(t), this.size = 2 * (s + e); | |||
for(var a = 0, i = o.length; i > a; a++) this.push(this._createSymbol(o[a], s, e)) | |||
} | |||
function a(t, s, e, a, i, o) { | |||
this.init(t, s, e, a, i, o) | |||
} | |||
function i(t, s, e, a, i) { | |||
return "rgba" === t ? "rgba(" + s + "," + e + "," + a + "," + i + ")" : "hsla" === t ? "hsla(" + s + "," + e + "%," + a + "%," + i + ")" : "" | |||
} | |||
if(!document.createElement("canvas").getContext) return $.noop; | |||
var o = [4, 6, 8, 10, 12], | |||
h = 2500; | |||
t.prototype = { | |||
mouse: null, | |||
gravity: .035, | |||
initSymbols: function(t, s, a) { | |||
this._symbols = new e(t, s, a) | |||
}, | |||
render: function(t) { | |||
var s, e, a, i, o, n, r, l, p, c, d, m, u, y, g, f = this.particles, | |||
v = this.mouse, | |||
b = this.gravity, | |||
M = this._symbols, | |||
x = this._symbols.length, | |||
_ = this._symbols.size, | |||
w = .5 * this._symbols.size, | |||
I = t.canvas.width, | |||
$ = t.canvas.height; | |||
if(s = Math.min(.005 * (v.speedX * v.speedX + v.speedY * v.speedY), 1), f.length < h) | |||
for(e = .5 + 4.5 * s, a = .1 + .5 * s, i = .5 + .5 * s, y = (3 * Math.random() | 0) + (20 * s | 0), u = 0; y > u; u++) this._createParticle(a, e, i); | |||
for(p = .5 * -I, c = 1.5 * I, d = .5 * -$, m = 1.5 * $, u = 0, y = f.length; y > u; u++) g = f[u], g.vx += .03 * v.speedX * s, g.vy += .03 * v.speedY * s + b, g.x += g.vx + v.speedX, g.y += g.vy + v.speedY, g.scale -= .005, g.angle += Math.random(), g.x + w < p || g.x - w > c || g.y + w < d || g.y - w > m || g.scale <= 0 ? (this._pool.push(g), f.splice(u, 1), y--, u--) : (l = g.scale, o = M[x * Math.random() | 0], Math.random() < .7 && (l *= .2), n = _ * l, r = .5 * n, t.save(), t.globalCompositeOperation = "lighter", t.translate(g.x, g.y), t.rotate(g.angle), t.drawImage(o, 0, 0, _, _, -r, -r, n, n), t.restore()); | |||
t.fill(), v.speedX = v.speedY = 0 | |||
}, | |||
_createParticle: function(t, s, e) { | |||
var i = t + (s - t) * Math.random(), | |||
o = 2 * Math.PI * Math.random(), | |||
h = this._pool.length ? this._pool.shift() : new a; | |||
h.init(this.mouse.x, this.mouse.y, i * Math.cos(o), i * Math.sin(o), e * Math.random(), 2 * Math.PI * Math.random()), this.particles.push(h) | |||
} | |||
}, s.prototype = { | |||
x: 0, | |||
y: 0, | |||
speedX: 0, | |||
speedY: 0, | |||
update: function(t, s) { | |||
this.speedX = .7 * (this.x - t), this.speedY = .7 * (this.y - s), this.x = t, this.y = s | |||
} | |||
}, e.prototype = [], e.prototype._createSymbol = function(t, s, e) { | |||
var a, o, h = this.size, | |||
n = this.size / 2, | |||
r = this.color; | |||
a = document.createElement("canvas"), a.width = a.height = h, o = a.getContext("2d"), o.fillStyle = i(r[0], r[1], r[2], r[3], r[4]), o.shadowBlur = e, o.shadowColor = i(r[0], r[1], r[2], r[3], .75 * r[4]); | |||
var l, p, c, d; | |||
for(o.beginPath(), l = 1, p = 2 * t; p >= l; l++) c = l % 2 ? .1 * s : s, d = 2 * Math.PI * l / p, o[1 === l ? "moveTo" : "lineTo"](n + c * Math.cos(d), n + c * Math.sin(d)); | |||
return o.fill(), a | |||
}, a.prototype.init = function(t, s, e, a, i, o) { | |||
this.x = t || 0, this.y = s || 0, this.vx = e || 0, this.vy = a || 0, this.scale = i || 0, this.angle = o || 0 | |||
}; | |||
var n = function() { | |||
var t = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/, | |||
s = /^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\s*\)$/, | |||
e = /^hsl\(\s*([\d\.]+)\s*,\s*([\d\.]+)%\s*,\s*([\d\.]+)%\s*\)$/, | |||
a = /^hsla\(\s*([\d\.]+)\s*,\s*([\d\.]+)%\s*,\s*([\d\.]+)%\s*,\s*([\d\.]+)\s*\)$/, | |||
i = /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/; | |||
return function(o) { | |||
o = o.replace(/^\s*#|\s*$/g, ""), o = o.toLowerCase(); | |||
var h; | |||
return(h = o.match(t) || o.match(s)) ? ["rgba", parseInt(h[1], 10), parseInt(h[2], 10), parseInt(h[3], 10), parseFloat(4 === h.length ? 1 : h[4])] : (h = o.match(e) || o.match(a)) ? ["hsla", parseFloat(h[1]), parseFloat(h[2]), parseFloat(h[3]), parseFloat(4 === h.length ? 1 : h[4])] : (3 === o.length && (o = o.replace(/(.)/g, "$1$1")), (h = o.match(i)) ? ["rgba", parseInt(h[1], 16), parseInt(h[2], 16), parseInt(h[3], 16), 1] : null) | |||
} | |||
}(); | |||
return t | |||
}();; | |||
var Index = function() { | |||
var h = function() { | |||
return /(msie|trident)/.test(navigator.userAgent.toLowerCase()) | |||
}; | |||
if(!document.createElement("canvas").getContext || h()) return void $("canvas").remove(); | |||
var v = new Stage("stage1"), | |||
m = new Twinkle("#eec142", 14, 1); | |||
m.mouse.update(0, 0), $(window).on("mousemove", function(e) { | |||
m.mouse.update(e.clientX, e.clientY) | |||
}), v.onUpdate(function(e) { | |||
m.render(e) | |||
}), v.update(); | |||
}(); |
@ -1,366 +0,0 @@ | |||
'use strict'; | |||
/* Chart.js docs: https://www.chartjs.org/ */ | |||
window.chartColors = { | |||
green: '#75c181', // rgba(117,193,129, 1) | |||
blue: '#5b99ea', // rgba(91,153,234, 1) | |||
gray: '#a9b5c9', | |||
text: '#252930', | |||
border: '#e7e9ed' | |||
}; | |||
/* Random number generator for demo purpose */ | |||
var randomDataPoint = function(){ return Math.round(Math.random()*100)}; | |||
//Area line Chart Demo | |||
var lineChartConfig = { | |||
type: 'line', | |||
data: { | |||
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'], | |||
datasets: [{ | |||
label: 'Dataset', | |||
backgroundColor: "rgba(117,193,129,0.2)", | |||
borderColor: "rgba(117,193,129, 0.8)", | |||
data: [ | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint() | |||
], | |||
}] | |||
}, | |||
options: { | |||
responsive: true, | |||
legend: { | |||
display: true, | |||
position: 'bottom', | |||
align: 'end', | |||
}, | |||
tooltips: { | |||
mode: 'index', | |||
intersect: false, | |||
titleMarginBottom: 10, | |||
bodySpacing: 10, | |||
xPadding: 16, | |||
yPadding: 16, | |||
borderColor: window.chartColors.border, | |||
borderWidth: 1, | |||
backgroundColor: '#fff', | |||
bodyFontColor: window.chartColors.text, | |||
titleFontColor: window.chartColors.text, | |||
callbacks: { | |||
label: function(tooltipItem, data) { | |||
return tooltipItem.value + '%'; | |||
} | |||
}, | |||
}, | |||
hover: { | |||
mode: 'nearest', | |||
intersect: true | |||
}, | |||
scales: { | |||
xAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.border, | |||
}, | |||
scaleLabel: { | |||
display: false, | |||
} | |||
}], | |||
yAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.border, | |||
}, | |||
scaleLabel: { | |||
display: false, | |||
}, | |||
ticks: { | |||
beginAtZero: true, | |||
userCallback: function(value, index, values) { | |||
return value.toLocaleString() + '%'; | |||
} | |||
}, | |||
}] | |||
} | |||
} | |||
}; | |||
//Bar Chart Demo | |||
var barChartConfig = { | |||
type: 'bar', | |||
data: { | |||
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'], | |||
datasets: [{ | |||
label: 'Dataset 1', | |||
backgroundColor: "rgba(117,193,129,0.8)", | |||
hoverBackgroundColor: "rgba(117,193,129,1)", | |||
data: [ | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint() | |||
] | |||
}, | |||
{ | |||
label: 'Dataset 2', | |||
backgroundColor: "rgba(91,153,234,0.8)", | |||
hoverBackgroundColor: "rgba(91,153,234,1)", | |||
data: [ | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint() | |||
] | |||
} | |||
] | |||
}, | |||
options: { | |||
responsive: true, | |||
legend: { | |||
position: 'bottom', | |||
align: 'end', | |||
}, | |||
tooltips: { | |||
mode: 'index', | |||
intersect: false, | |||
titleMarginBottom: 10, | |||
bodySpacing: 10, | |||
xPadding: 16, | |||
yPadding: 16, | |||
borderColor: window.chartColors.border, | |||
borderWidth: 1, | |||
backgroundColor: '#fff', | |||
bodyFontColor: window.chartColors.text, | |||
titleFontColor: window.chartColors.text, | |||
callbacks: { | |||
label: function(tooltipItem, data) { | |||
return tooltipItem.value + '%'; | |||
} | |||
}, | |||
}, | |||
scales: { | |||
xAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.border, | |||
}, | |||
}], | |||
yAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.borders, | |||
}, | |||
ticks: { | |||
beginAtZero: true, | |||
userCallback: function(value, index, values) { | |||
return value + '%'; | |||
} | |||
}, | |||
}] | |||
} | |||
} | |||
} | |||
// Pie Chart Demo | |||
var pieChartConfig = { | |||
type: 'pie', | |||
data: { | |||
datasets: [{ | |||
data: [ | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
], | |||
backgroundColor: [ | |||
window.chartColors.green, | |||
window.chartColors.blue, | |||
window.chartColors.gray, | |||
], | |||
label: 'Dataset 1' | |||
}], | |||
labels: [ | |||
'Green', | |||
'Blue', | |||
'Gray', | |||
] | |||
}, | |||
options: { | |||
responsive: true, | |||
legend: { | |||
display: true, | |||
position: 'bottom', | |||
align: 'center', | |||
}, | |||
tooltips: { | |||
titleMarginBottom: 10, | |||
bodySpacing: 10, | |||
xPadding: 16, | |||
yPadding: 16, | |||
borderColor: window.chartColors.border, | |||
borderWidth: 1, | |||
backgroundColor: '#fff', | |||
bodyFontColor: window.chartColors.text, | |||
titleFontColor: window.chartColors.text, | |||
/* Display % in tooltip - https://stackoverflow.com/questions/37257034/chart-js-2-0-doughnut-tooltip-percentages */ | |||
callbacks: { | |||
label: function(tooltipItem, data) { | |||
//get the concerned dataset | |||
var dataset = data.datasets[tooltipItem.datasetIndex]; | |||
//calculate the total of this data set | |||
var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { | |||
return previousValue + currentValue; | |||
}); | |||
//get the current items value | |||
var currentValue = dataset.data[tooltipItem.index]; | |||
//calculate the precentage based on the total and current item, also this does a rough rounding to give a whole number | |||
var percentage = Math.floor(((currentValue/total) * 100)+0.5); | |||
return percentage + "%"; | |||
}, | |||
}, | |||
}, | |||
} | |||
}; | |||
// Doughnut Chart Demo | |||
var doughnutChartConfig = { | |||
type: 'doughnut', | |||
data: { | |||
datasets: [{ | |||
data: [ | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
randomDataPoint(), | |||
], | |||
backgroundColor: [ | |||
window.chartColors.green, | |||
window.chartColors.blue, | |||
window.chartColors.gray, | |||
], | |||
label: 'Dataset 1' | |||
}], | |||
labels: [ | |||
'Green', | |||
'Blue', | |||
'Gray', | |||
] | |||
}, | |||
options: { | |||
responsive: true, | |||
legend: { | |||
display: true, | |||
position: 'bottom', | |||
align: 'center', | |||
}, | |||
tooltips: { | |||
titleMarginBottom: 10, | |||
bodySpacing: 10, | |||
xPadding: 16, | |||
yPadding: 16, | |||
borderColor: window.chartColors.border, | |||
borderWidth: 1, | |||
backgroundColor: '#fff', | |||
bodyFontColor: window.chartColors.text, | |||
titleFontColor: window.chartColors.text, | |||
animation: { | |||
animateScale: true, | |||
animateRotate: true | |||
}, | |||
/* Display % in tooltip - https://stackoverflow.com/questions/37257034/chart-js-2-0-doughnut-tooltip-percentages */ | |||
callbacks: { | |||
label: function(tooltipItem, data) { | |||
//get the concerned dataset | |||
var dataset = data.datasets[tooltipItem.datasetIndex]; | |||
//calculate the total of this data set | |||
var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { | |||
return previousValue + currentValue; | |||
}); | |||
//get the current items value | |||
var currentValue = dataset.data[tooltipItem.index]; | |||
//calculate the precentage based on the total and current item, also this does a rough rounding to give a whole number | |||
var percentage = Math.floor(((currentValue/total) * 100)+0.5); | |||
return percentage + "%"; | |||
}, | |||
}, | |||
}, | |||
} | |||
}; | |||
// Generate charts on load | |||
window.addEventListener('load', function(){ | |||
var lineChart = document.getElementById('chart-line').getContext('2d'); | |||
window.myLine = new Chart(lineChart, lineChartConfig); | |||
var barChart = document.getElementById('chart-bar').getContext('2d'); | |||
window.myBar = new Chart(barChart, barChartConfig); | |||
var pieChart = document.getElementById('chart-pie').getContext('2d'); | |||
window.myPie = new Chart(pieChart, pieChartConfig); | |||
var doughnutChart = document.getElementById('chart-doughnut').getContext('2d'); | |||
window.myDoughnut = new Chart(doughnutChart, doughnutChartConfig); | |||
}); | |||
@ -1,728 +0,0 @@ | |||
/* | |||
* heatmap.js v2.0.5 | JavaScript Heatmap Library | |||
* | |||
* Copyright 2008-2016 Patrick Wied <heatmapjs@patrick-wied.at> - All rights reserved. | |||
* Dual licensed under MIT and Beerware license | |||
* | |||
* :: 2016-09-05 01:16 | |||
*/ | |||
;(function (name, context, factory) { | |||
// Supports UMD. AMD, CommonJS/Node.js and browser context | |||
if (typeof module !== "undefined" && module.exports) { | |||
module.exports = factory(); | |||
} else if (typeof define === "function" && define.amd) { | |||
define(factory); | |||
} else { | |||
context[name] = factory(); | |||
} | |||
})("h337", this, function () { | |||
// Heatmap Config stores default values and will be merged with instance config | |||
var HeatmapConfig = { | |||
defaultRadius: 40, | |||
defaultRenderer: 'canvas2d', | |||
defaultGradient: { 0.25: "rgb(0,0,255)", 0.55: "rgb(0,255,0)", 0.85: "yellow", 1.0: "rgb(255,0,0)"}, | |||
defaultMaxOpacity: 1, | |||
defaultMinOpacity: 0, | |||
defaultBlur: .85, | |||
defaultXField: 'x', | |||
defaultYField: 'y', | |||
defaultValueField: 'value', | |||
plugins: {} | |||
}; | |||
var Store = (function StoreClosure() { | |||
var Store = function Store(config) { | |||
this._coordinator = {}; | |||
this._data = []; | |||
this._radi = []; | |||
this._min = 10; | |||
this._max = 1; | |||
this._xField = config['xField'] || config.defaultXField; | |||
this._yField = config['yField'] || config.defaultYField; | |||
this._valueField = config['valueField'] || config.defaultValueField; | |||
if (config["radius"]) { | |||
this._cfgRadius = config["radius"]; | |||
} | |||
}; | |||
var defaultRadius = HeatmapConfig.defaultRadius; | |||
Store.prototype = { | |||
// when forceRender = false -> called from setData, omits renderall event | |||
_organiseData: function(dataPoint, forceRender) { | |||
var x = dataPoint[this._xField]; | |||
var y = dataPoint[this._yField]; | |||
var radi = this._radi; | |||
var store = this._data; | |||
var max = this._max; | |||
var min = this._min; | |||
var value = dataPoint[this._valueField] || 1; | |||
var radius = dataPoint.radius || this._cfgRadius || defaultRadius; | |||
if (!store[x]) { | |||
store[x] = []; | |||
radi[x] = []; | |||
} | |||
if (!store[x][y]) { | |||
store[x][y] = value; | |||
radi[x][y] = radius; | |||
} else { | |||
store[x][y] += value; | |||
} | |||
var storedVal = store[x][y]; | |||
if (storedVal > max) { | |||
if (!forceRender) { | |||
this._max = storedVal; | |||
} else { | |||
this.setDataMax(storedVal); | |||
} | |||
return false; | |||
} else if (storedVal < min) { | |||
if (!forceRender) { | |||
this._min = storedVal; | |||
} else { | |||
this.setDataMin(storedVal); | |||
} | |||
return false; | |||
} else { | |||
return { | |||
x: x, | |||
y: y, | |||
value: value, | |||
radius: radius, | |||
min: min, | |||
max: max | |||
}; | |||
} | |||
}, | |||
_unOrganizeData: function() { | |||
var unorganizedData = []; | |||
var data = this._data; | |||
var radi = this._radi; | |||
for (var x in data) { | |||
for (var y in data[x]) { | |||
unorganizedData.push({ | |||
x: x, | |||
y: y, | |||
radius: radi[x][y], | |||
value: data[x][y] | |||
}); | |||
} | |||
} | |||
return { | |||
min: this._min, | |||
max: this._max, | |||
data: unorganizedData | |||
}; | |||
}, | |||
_onExtremaChange: function() { | |||
this._coordinator.emit('extremachange', { | |||
min: this._min, | |||
max: this._max | |||
}); | |||
}, | |||
addData: function() { | |||
if (arguments[0].length > 0) { | |||
var dataArr = arguments[0]; | |||
var dataLen = dataArr.length; | |||
while (dataLen--) { | |||
this.addData.call(this, dataArr[dataLen]); | |||
} | |||
} else { | |||
// add to store | |||
var organisedEntry = this._organiseData(arguments[0], true); | |||
if (organisedEntry) { | |||
// if it's the first datapoint initialize the extremas with it | |||
if (this._data.length === 0) { | |||
this._min = this._max = organisedEntry.value; | |||
} | |||
this._coordinator.emit('renderpartial', { | |||
min: this._min, | |||
max: this._max, | |||
data: [organisedEntry] | |||
}); | |||
} | |||
} | |||
return this; | |||
}, | |||
setData: function(data) { | |||
var dataPoints = data.data; | |||
var pointsLen = dataPoints.length; | |||
// reset data arrays | |||
this._data = []; | |||
this._radi = []; | |||
for(var i = 0; i < pointsLen; i++) { | |||
this._organiseData(dataPoints[i], false); | |||
} | |||
this._max = data.max; | |||
this._min = data.min || 0; | |||
this._onExtremaChange(); | |||
this._coordinator.emit('renderall', this._getInternalData()); | |||
return this; | |||
}, | |||
removeData: function() { | |||
// TODO: implement | |||
}, | |||
setDataMax: function(max) { | |||
this._max = max; | |||
this._onExtremaChange(); | |||
this._coordinator.emit('renderall', this._getInternalData()); | |||
return this; | |||
}, | |||
setDataMin: function(min) { | |||
this._min = min; | |||
this._onExtremaChange(); | |||
this._coordinator.emit('renderall', this._getInternalData()); | |||
return this; | |||
}, | |||
setCoordinator: function(coordinator) { | |||
this._coordinator = coordinator; | |||
}, | |||
_getInternalData: function() { | |||
return { | |||
max: this._max, | |||
min: this._min, | |||
data: this._data, | |||
radi: this._radi | |||
}; | |||
}, | |||
getData: function() { | |||
return this._unOrganizeData(); | |||
}/*, | |||
TODO: rethink. | |||
getValueAt: function(point) { | |||
var value; | |||
var radius = 100; | |||
var x = point.x; | |||
var y = point.y; | |||
var data = this._data; | |||
if (data[x] && data[x][y]) { | |||
return data[x][y]; | |||
} else { | |||
var values = []; | |||
// radial search for datapoints based on default radius | |||
for(var distance = 1; distance < radius; distance++) { | |||
var neighbors = distance * 2 +1; | |||
var startX = x - distance; | |||
var startY = y - distance; | |||
for(var i = 0; i < neighbors; i++) { | |||
for (var o = 0; o < neighbors; o++) { | |||
if ((i == 0 || i == neighbors-1) || (o == 0 || o == neighbors-1)) { | |||
if (data[startY+i] && data[startY+i][startX+o]) { | |||
values.push(data[startY+i][startX+o]); | |||
} | |||
} else { | |||
continue; | |||
} | |||
} | |||
} | |||
} | |||
if (values.length > 0) { | |||
return Math.max.apply(Math, values); | |||
} | |||
} | |||
return false; | |||
}*/ | |||
}; | |||
return Store; | |||
})(); | |||
var Canvas2dRenderer = (function Canvas2dRendererClosure() { | |||
var _getColorPalette = function(config) { | |||
var gradientConfig = config.gradient || config.defaultGradient; | |||
var paletteCanvas = document.createElement('canvas'); | |||
var paletteCtx = paletteCanvas.getContext('2d'); | |||
paletteCanvas.width = 256; | |||
paletteCanvas.height = 1; | |||
var gradient = paletteCtx.createLinearGradient(0, 0, 256, 1); | |||
for (var key in gradientConfig) { | |||
gradient.addColorStop(key, gradientConfig[key]); | |||
} | |||
paletteCtx.fillStyle = gradient; | |||
paletteCtx.fillRect(0, 0, 256, 1); | |||
return paletteCtx.getImageData(0, 0, 256, 1).data; | |||
}; | |||
var _getPointTemplate = function(radius, blurFactor) { | |||
var tplCanvas = document.createElement('canvas'); | |||
var tplCtx = tplCanvas.getContext('2d'); | |||
var x = radius; | |||
var y = radius; | |||
tplCanvas.width = tplCanvas.height = radius*2; | |||
if (blurFactor == 1) { | |||
tplCtx.beginPath(); | |||
tplCtx.arc(x, y, radius, 0, 2 * Math.PI, false); | |||
tplCtx.fillStyle = 'rgba(0,0,0,1)'; | |||
tplCtx.fill(); | |||
} else { | |||
var gradient = tplCtx.createRadialGradient(x, y, radius*blurFactor, x, y, radius); | |||
gradient.addColorStop(0, 'rgba(0,0,0,1)'); | |||
gradient.addColorStop(1, 'rgba(0,0,0,0)'); | |||
tplCtx.fillStyle = gradient; | |||
tplCtx.fillRect(0, 0, 2*radius, 2*radius); | |||
} | |||
return tplCanvas; | |||
}; | |||
var _prepareData = function(data) { | |||
var renderData = []; | |||
var min = data.min; | |||
var max = data.max; | |||
var radi = data.radi; | |||
var data = data.data; | |||
var xValues = Object.keys(data); | |||
var xValuesLen = xValues.length; | |||
while(xValuesLen--) { | |||
var xValue = xValues[xValuesLen]; | |||
var yValues = Object.keys(data[xValue]); | |||
var yValuesLen = yValues.length; | |||
while(yValuesLen--) { | |||
var yValue = yValues[yValuesLen]; | |||
var value = data[xValue][yValue]; | |||
var radius = radi[xValue][yValue]; | |||
renderData.push({ | |||
x: xValue, | |||
y: yValue, | |||
value: value, | |||
radius: radius | |||
}); | |||
} | |||
} | |||
return { | |||
min: min, | |||
max: max, | |||
data: renderData | |||
}; | |||
}; | |||
function Canvas2dRenderer(config) { | |||
var container = config.container; | |||
var shadowCanvas = this.shadowCanvas = document.createElement('canvas'); | |||
var canvas = this.canvas = config.canvas || document.createElement('canvas'); | |||
var renderBoundaries = this._renderBoundaries = [10000, 10000, 0, 0]; | |||
var computed = getComputedStyle(config.container) || {}; | |||
canvas.className = 'heatmap-canvas'; | |||
this._width = canvas.width = shadowCanvas.width = config.width || +(computed.width.replace(/px/,'')); | |||
this._height = canvas.height = shadowCanvas.height = config.height || +(computed.height.replace(/px/,'')); | |||
this.shadowCtx = shadowCanvas.getContext('2d'); | |||
this.ctx = canvas.getContext('2d'); | |||
// @TODO: | |||
// conditional wrapper | |||
canvas.style.cssText = shadowCanvas.style.cssText = 'position:absolute;left:0;top:0;'; | |||
container.style.position = 'relative'; | |||
container.appendChild(canvas); | |||
this._palette = _getColorPalette(config); | |||
this._templates = {}; | |||
this._setStyles(config); | |||
}; | |||
Canvas2dRenderer.prototype = { | |||
renderPartial: function(data) { | |||
if (data.data.length > 0) { | |||
this._drawAlpha(data); | |||
this._colorize(); | |||
} | |||
}, | |||
renderAll: function(data) { | |||
// reset render boundaries | |||
this._clear(); | |||
if (data.data.length > 0) { | |||
this._drawAlpha(_prepareData(data)); | |||
this._colorize(); | |||
} | |||
}, | |||
_updateGradient: function(config) { | |||
this._palette = _getColorPalette(config); | |||
}, | |||
updateConfig: function(config) { | |||
if (config['gradient']) { | |||
this._updateGradient(config); | |||
} | |||
this._setStyles(config); | |||
}, | |||
setDimensions: function(width, height) { | |||
this._width = width; | |||
this._height = height; | |||
this.canvas.width = this.shadowCanvas.width = width; | |||
this.canvas.height = this.shadowCanvas.height = height; | |||
}, | |||
_clear: function() { | |||
this.shadowCtx.clearRect(0, 0, this._width, this._height); | |||
this.ctx.clearRect(0, 0, this._width, this._height); | |||
}, | |||
_setStyles: function(config) { | |||
this._blur = (config.blur == 0)?0:(config.blur || config.defaultBlur); | |||
if (config.backgroundColor) { | |||
this.canvas.style.backgroundColor = config.backgroundColor; | |||
} | |||
this._width = this.canvas.width = this.shadowCanvas.width = config.width || this._width; | |||
this._height = this.canvas.height = this.shadowCanvas.height = config.height || this._height; | |||
this._opacity = (config.opacity || 0) * 255; | |||
this._maxOpacity = (config.maxOpacity || config.defaultMaxOpacity) * 255; | |||
this._minOpacity = (config.minOpacity || config.defaultMinOpacity) * 255; | |||
this._useGradientOpacity = !!config.useGradientOpacity; | |||
}, | |||
_drawAlpha: function(data) { | |||
var min = this._min = data.min; | |||
var max = this._max = data.max; | |||
var data = data.data || []; | |||
var dataLen = data.length; | |||
// on a point basis? | |||
var blur = 1 - this._blur; | |||
while(dataLen--) { | |||
var point = data[dataLen]; | |||
var x = point.x; | |||
var y = point.y; | |||
var radius = point.radius; | |||
// if value is bigger than max | |||
// use max as value | |||
var value = Math.min(point.value, max); | |||
var rectX = x - radius; | |||
var rectY = y - radius; | |||
var shadowCtx = this.shadowCtx; | |||
var tpl; | |||
if (!this._templates[radius]) { | |||
this._templates[radius] = tpl = _getPointTemplate(radius, blur); | |||
} else { | |||
tpl = this._templates[radius]; | |||
} | |||
// value from minimum / value range | |||
// => [0, 1] | |||
var templateAlpha = (value-min)/(max-min); | |||
// this fixes #176: small values are not visible because globalAlpha < .01 cannot be read from imageData | |||
shadowCtx.globalAlpha = templateAlpha < .01 ? .01 : templateAlpha; | |||
shadowCtx.drawImage(tpl, rectX, rectY); | |||
// update renderBoundaries | |||
if (rectX < this._renderBoundaries[0]) { | |||
this._renderBoundaries[0] = rectX; | |||
} | |||
if (rectY < this._renderBoundaries[1]) { | |||
this._renderBoundaries[1] = rectY; | |||
} | |||
if (rectX + 2*radius > this._renderBoundaries[2]) { | |||
this._renderBoundaries[2] = rectX + 2*radius; | |||
} | |||
if (rectY + 2*radius > this._renderBoundaries[3]) { | |||
this._renderBoundaries[3] = rectY + 2*radius; | |||
} | |||
} | |||
}, | |||
_colorize: function() { | |||
var x = this._renderBoundaries[0]; | |||
var y = this._renderBoundaries[1]; | |||
var width = this._renderBoundaries[2] - x; | |||
var height = this._renderBoundaries[3] - y; | |||
var maxWidth = this._width; | |||
var maxHeight = this._height; | |||
var opacity = this._opacity; | |||
var maxOpacity = this._maxOpacity; | |||
var minOpacity = this._minOpacity; | |||
var useGradientOpacity = this._useGradientOpacity; | |||
if (x < 0) { | |||
x = 0; | |||
} | |||
if (y < 0) { | |||
y = 0; | |||
} | |||
if (x + width > maxWidth) { | |||
width = maxWidth - x; | |||
} | |||
if (y + height > maxHeight) { | |||
height = maxHeight - y; | |||
} | |||
console.log(width) | |||
if(width>-1&&width<0||width<1&&width>0){} | |||
else{ | |||
var img = this.shadowCtx.getImageData(x, y, width, height); | |||
var imgData = img.data; | |||
var len = imgData.length; | |||
var palette = this._palette; | |||
for (var i = 3; i < len; i+= 4) { | |||
var alpha = imgData[i]; | |||
var offset = alpha * 4; | |||
if (!offset) { | |||
continue; | |||
} | |||
var finalAlpha; | |||
if (opacity > 0) { | |||
finalAlpha = opacity; | |||
} else { | |||
if (alpha < maxOpacity) { | |||
if (alpha < minOpacity) { | |||
finalAlpha = minOpacity; | |||
} else { | |||
finalAlpha = alpha; | |||
} | |||
} else { | |||
finalAlpha = maxOpacity; | |||
} | |||
} | |||
imgData[i-3] = palette[offset]; | |||
imgData[i-2] = palette[offset + 1]; | |||
imgData[i-1] = palette[offset + 2]; | |||
imgData[i] = useGradientOpacity ? palette[offset + 3] : finalAlpha; | |||
} | |||
img.data = imgData; | |||
this.ctx.putImageData(img, x, y); | |||
this._renderBoundaries = [1000, 1000, 0, 0]; | |||
} | |||
}, | |||
getValueAt: function(point) { | |||
var value; | |||
var shadowCtx = this.shadowCtx; | |||
var img = shadowCtx.getImageData(point.x, point.y, 1, 1); | |||
var data = img.data[3]; | |||
var max = this._max; | |||
var min = this._min; | |||
value = (Math.abs(max-min) * (data/255)) >> 0; | |||
return value; | |||
}, | |||
getDataURL: function() { | |||
return this.canvas.toDataURL(); | |||
} | |||
}; | |||
return Canvas2dRenderer; | |||
})(); | |||
var Renderer = (function RendererClosure() { | |||
var rendererFn = false; | |||
if (HeatmapConfig['defaultRenderer'] === 'canvas2d') { | |||
rendererFn = Canvas2dRenderer; | |||
} | |||
return rendererFn; | |||
})(); | |||
var Util = { | |||
merge: function() { | |||
var merged = {}; | |||
var argsLen = arguments.length; | |||
for (var i = 0; i < argsLen; i++) { | |||
var obj = arguments[i] | |||
for (var key in obj) { | |||
merged[key] = obj[key]; | |||
} | |||
} | |||
return merged; | |||
} | |||
}; | |||
// Heatmap Constructor | |||
var Heatmap = (function HeatmapClosure() { | |||
var Coordinator = (function CoordinatorClosure() { | |||
function Coordinator() { | |||
this.cStore = {}; | |||
}; | |||
Coordinator.prototype = { | |||
on: function(evtName, callback, scope) { | |||
var cStore = this.cStore; | |||
if (!cStore[evtName]) { | |||
cStore[evtName] = []; | |||
} | |||
cStore[evtName].push((function(data) { | |||
return callback.call(scope, data); | |||
})); | |||
}, | |||
emit: function(evtName, data) { | |||
var cStore = this.cStore; | |||
if (cStore[evtName]) { | |||
var len = cStore[evtName].length; | |||
for (var i=0; i<len; i++) { | |||
var callback = cStore[evtName][i]; | |||
callback(data); | |||
} | |||
} | |||
} | |||
}; | |||
return Coordinator; | |||
})(); | |||
var _connect = function(scope) { | |||
var renderer = scope._renderer; | |||
var coordinator = scope._coordinator; | |||
var store = scope._store; | |||
coordinator.on('renderpartial', renderer.renderPartial, renderer); | |||
coordinator.on('renderall', renderer.renderAll, renderer); | |||
coordinator.on('extremachange', function(data) { | |||
scope._config.onExtremaChange && | |||
scope._config.onExtremaChange({ | |||
min: data.min, | |||
max: data.max, | |||
gradient: scope._config['gradient'] || scope._config['defaultGradient'] | |||
}); | |||
}); | |||
store.setCoordinator(coordinator); | |||
}; | |||
function Heatmap() { | |||
var config = this._config = Util.merge(HeatmapConfig, arguments[0] || {}); | |||
this._coordinator = new Coordinator(); | |||
if (config['plugin']) { | |||
var pluginToLoad = config['plugin']; | |||
if (!HeatmapConfig.plugins[pluginToLoad]) { | |||
throw new Error('Plugin \''+ pluginToLoad + '\' not found. Maybe it was not registered.'); | |||
} else { | |||
var plugin = HeatmapConfig.plugins[pluginToLoad]; | |||
// set plugin renderer and store | |||
this._renderer = new plugin.renderer(config); | |||
this._store = new plugin.store(config); | |||
} | |||
} else { | |||
this._renderer = new Renderer(config); | |||
this._store = new Store(config); | |||
} | |||
_connect(this); | |||
}; | |||
// @TODO: | |||
// add API documentation | |||
Heatmap.prototype = { | |||
addData: function() { | |||
this._store.addData.apply(this._store, arguments); | |||
return this; | |||
}, | |||
removeData: function() { | |||
this._store.removeData && this._store.removeData.apply(this._store, arguments); | |||
return this; | |||
}, | |||
setData: function() { | |||
this._store.setData.apply(this._store, arguments); | |||
return this; | |||
}, | |||
setDataMax: function() { | |||
this._store.setDataMax.apply(this._store, arguments); | |||
return this; | |||
}, | |||
setDataMin: function() { | |||
this._store.setDataMin.apply(this._store, arguments); | |||
return this; | |||
}, | |||
configure: function(config) { | |||
this._config = Util.merge(this._config, config); | |||
this._renderer.updateConfig(this._config); | |||
this._coordinator.emit('renderall', this._store._getInternalData()); | |||
return this; | |||
}, | |||
repaint: function() { | |||
this._coordinator.emit('renderall', this._store._getInternalData()); | |||
return this; | |||
}, | |||
getData: function() { | |||
return this._store.getData(); | |||
}, | |||
getDataURL: function() { | |||
return this._renderer.getDataURL(); | |||
}, | |||
getValueAt: function(point) { | |||
if (this._store.getValueAt) { | |||
return this._store.getValueAt(point); | |||
} else if (this._renderer.getValueAt) { | |||
return this._renderer.getValueAt(point); | |||
} else { | |||
return null; | |||
} | |||
} | |||
}; | |||
return Heatmap; | |||
})(); | |||
// core | |||
var heatmapFactory = { | |||
create: function(config) { | |||
return new Heatmap(config); | |||
}, | |||
register: function(pluginKey, plugin) { | |||
HeatmapConfig.plugins[pluginKey] = plugin; | |||
} | |||
}; | |||
return heatmapFactory; | |||
}); |
@ -1,255 +0,0 @@ | |||
'use strict'; | |||
/* Chart.js docs: https://www.chartjs.org/ */ | |||
window.chartColors = { | |||
green: '#75c181', | |||
gray: '#a9b5c9', | |||
text: '#252930', | |||
border: '#e7e9ed' | |||
}; | |||
/* Random number generator for demo purpose */ | |||
var randomDataPoint = function(){ return Math.round(Math.random()*10000)}; | |||
//Chart.js Line Chart Example | |||
var labels=[]; | |||
var avgcount=[]; | |||
var tempt; | |||
var transfermsg=JSON.parse(window.localStorage.getItem("transfermsg")); | |||
var mysecond=parseFloat(JSON.parse(window.localStorage.getItem("mysecond"))); | |||
var oncanvas=parseInt(JSON.parse(window.localStorage.getItem("oncanvas"))); | |||
var offcanvas=parseInt(JSON.parse(window.localStorage.getItem("offcanvas"))); | |||
var pagefreq=JSON.parse(window.localStorage.getItem("pagefreq")); | |||
var pagefreqoff=JSON.parse(window.localStorage.getItem("pagefreqoff")); | |||
var pgnum=parseInt(window.localStorage.getItem("pgnum")); | |||
var i=0; | |||
var j=0; | |||
var item=(mysecond/(oncanvas+offcanvas)).toFixed(2); | |||
var time_oncanvas=[]; | |||
var time_offcanvas=[]; | |||
var time_canvas=[]; | |||
tempt=oncanvas*item/pgnum; | |||
for(i=0;i<pgnum;i++){ | |||
labels.push(`第${i+1}页`); | |||
time_oncanvas.push(0); | |||
time_canvas.push(0); | |||
time_offcanvas.push(0); | |||
avgcount.push((tempt).toFixed(2)); | |||
} | |||
for(i=0;i<pagefreq.length;i++){ | |||
pagefreq[i]=parseInt(pagefreq[i]); | |||
pagefreqoff[i]=parseInt(pagefreqoff[i]); | |||
time_canvas[i]+=(pagefreq[i]*item).toFixed(2); | |||
time_offcanvas[i]+=pagefreqoff[i]*item; | |||
} | |||
for(i=0;i<time_canvas.length;i++){ | |||
time_oncanvas[i]=time_canvas[i]-time_offcanvas[i]; | |||
} | |||
console.log(pagefreq,pagefreqoff,time_canvas,time_oncanvas,time_offcanvas); | |||
var lineChartConfig = { | |||
type: 'line', | |||
data: { | |||
labels: labels, | |||
datasets: [{ | |||
label: '您的每页的阅读时长', | |||
fill: false, | |||
backgroundColor: window.chartColors.green, | |||
borderColor: window.chartColors.green, | |||
data: time_canvas, | |||
}, { | |||
label: '您每页平均阅读时长', | |||
borderDash: [3, 5], | |||
backgroundColor: window.chartColors.gray, | |||
borderColor: window.chartColors.gray, | |||
data: avgcount, | |||
fill: false, | |||
}] | |||
}, | |||
options: { | |||
responsive: true, | |||
aspectRatio: 1.5, | |||
legend: { | |||
display: true, | |||
position: 'bottom', | |||
align: 'end', | |||
}, | |||
title: { | |||
display: true, | |||
text: '平均每页注视时长', | |||
}, | |||
tooltips: { | |||
mode: 'index', | |||
intersect: false, | |||
titleMarginBottom: 10, | |||
bodySpacing: 10, | |||
xPadding: 16, | |||
yPadding: 16, | |||
borderColor: window.chartColors.border, | |||
borderWidth: 1, | |||
backgroundColor: '#fff', | |||
bodyFontColor: window.chartColors.text, | |||
titleFontColor: window.chartColors.text, | |||
callbacks: { | |||
//Ref: https://stackoverflow.com/questions/38800226/chart-js-add-commas-to-tooltip-and-y-axis | |||
label: function(tooltipItem, data) { | |||
if (parseInt(tooltipItem.value) >= 10) { | |||
return tooltipItem.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); | |||
} else { | |||
return tooltipItem.value; | |||
} | |||
} | |||
}, | |||
}, | |||
hover: { | |||
mode: 'nearest', | |||
intersect: true | |||
}, | |||
scales: { | |||
xAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.border, | |||
}, | |||
scaleLabel: { | |||
display: false, | |||
} | |||
}], | |||
yAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.border, | |||
}, | |||
scaleLabel: { | |||
display: false, | |||
}, | |||
ticks: { | |||
beginAtZero: true, | |||
userCallback: function(value, index, values) { | |||
return value.toLocaleString(); //Ref: https://stackoverflow.com/questions/38800226/chart-js-add-commas-to-tooltip-and-y-axis | |||
} | |||
}, | |||
}] | |||
} | |||
} | |||
}; | |||
//Bar Chart Demo | |||
var barChartConfig = { | |||
type: 'bar', | |||
data: { | |||
labels:labels, | |||
datasets: [{ | |||
label: '视线在PDF上的时间(秒)', | |||
backgroundColor: "rgba(117,193,129,0.8)", | |||
hoverBackgroundColor: "rgba(117,193,129,1)", | |||
data: time_oncanvas | |||
}, | |||
{ | |||
label: '视线不在PDF上的时间(秒)', | |||
backgroundColor: "rgba(91,153,234,0.8)", | |||
hoverBackgroundColor: "rgba(91,153,234,1)", | |||
data: time_offcanvas | |||
} | |||
] | |||
}, | |||
options: { | |||
responsive: true, | |||
legend: { | |||
position: 'bottom', | |||
align: 'end', | |||
}, | |||
tooltips: { | |||
mode: 'index', | |||
intersect: false, | |||
titleMarginBottom: 10, | |||
bodySpacing: 10, | |||
xPadding: 16, | |||
yPadding: 16, | |||
borderColor: window.chartColors.border, | |||
borderWidth: 1, | |||
backgroundColor: '#fff', | |||
bodyFontColor: window.chartColors.text, | |||
titleFontColor: window.chartColors.text, | |||
callbacks: { | |||
label: function(tooltipItem, data) { | |||
return tooltipItem.value + 's'; | |||
} | |||
}, | |||
}, | |||
scales: { | |||
xAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.border, | |||
}, | |||
}], | |||
yAxes: [{ | |||
display: true, | |||
gridLines: { | |||
drawBorder: false, | |||
color: window.chartColors.borders, | |||
}, | |||
ticks: { | |||
beginAtZero: true, | |||
userCallback: function(value, index, values) { | |||
return value + 's'; | |||
} | |||
}, | |||
}] | |||
} | |||
} | |||
} | |||
// Generate charts on load | |||
window.addEventListener('load', function(){ | |||
var lineChart = document.getElementById('canvas-linechart').getContext('2d'); | |||
window.myLine = new Chart(lineChart, lineChartConfig); | |||
var barChart = document.getElementById('canvas-barchart').getContext('2d'); | |||
window.myBar = new Chart(barChart, barChartConfig); | |||
}); | |||
@ -1,23 +0,0 @@ | |||
var percent = 0 | |||
function eatCount() { | |||
document.querySelector(".monsterText").innerHTML = ("Read<br>Gazer"); | |||
// document.querySelector(".btn").style.setProperty("opacity",1); | |||
document.getElementById("visitor").style.setProperty("opacity", 1); | |||
document.getElementById("login").style.setProperty("opacity", 1); | |||
// $(".monsterText").html("We are<br>SQUARE<br>MONSTER!") | |||
} | |||
var timer = setInterval(function () { | |||
// $(".bar").css("width",percent+"%") | |||
document.querySelector(".bar").style.setProperty("width", percent + "%") | |||
percent += 1 | |||
if (percent > 100) { | |||
// $(".pageLoading").addClass("complete") | |||
document.querySelector(".pageLoading").classList.add("complete"); | |||
setTimeout(eatCount, 1000); | |||
clearInterval(timer); | |||
} | |||
}, 30) |
@ -1,333 +0,0 @@ | |||
Authors ordered by first contribution | |||
A list of current team members is available at http://jqueryui.com/about | |||
Paul Bakaus <paul.bakaus@gmail.com> | |||
Richard Worth <rdworth@gmail.com> | |||
Yehuda Katz <wycats@gmail.com> | |||
Sean Catchpole <sean@sunsean.com> | |||
John Resig <jeresig@gmail.com> | |||
Tane Piper <piper.tane@gmail.com> | |||
Dmitri Gaskin <dmitrig01@gmail.com> | |||
Klaus Hartl <klaus.hartl@gmail.com> | |||
Stefan Petre <stefan.petre@gmail.com> | |||
Gilles van den Hoven <gilles@webunity.nl> | |||
Micheil Bryan Smith <micheil@brandedcode.com> | |||
Jörn Zaefferer <joern.zaefferer@gmail.com> | |||
Marc Grabanski <m@marcgrabanski.com> | |||
Keith Wood <kbwood@iinet.com.au> | |||
Brandon Aaron <brandon.aaron@gmail.com> | |||
Scott González <scott.gonzalez@gmail.com> | |||
Eduardo Lundgren <eduardolundgren@gmail.com> | |||
Aaron Eisenberger <aaronchi@gmail.com> | |||
Joan Piedra <theneojp@gmail.com> | |||
Bruno Basto <b.basto@gmail.com> | |||
Remy Sharp <remy@leftlogic.com> | |||
Bohdan Ganicky <bohdan.ganicky@gmail.com> | |||
David Bolter <david.bolter@gmail.com> | |||
Chi Cheng <cloudream@gmail.com> | |||
Ca-Phun Ung <pazu2k@gmail.com> | |||
Ariel Flesler <aflesler@gmail.com> | |||
Maggie Wachs <maggie@filamentgroup.com> | |||
Scott Jehl <scottjehl@gmail.com> | |||
Todd Parker <todd@filamentgroup.com> | |||
Andrew Powell <andrew@shellscape.org> | |||
Brant Burnett <btburnett3@gmail.com> | |||
Douglas Neiner <doug@dougneiner.com> | |||
Paul Irish <paul.irish@gmail.com> | |||
Ralph Whitbeck <ralph.whitbeck@gmail.com> | |||
Thibault Duplessis <thibault.duplessis@gmail.com> | |||
Dominique Vincent <dominique.vincent@toitl.com> | |||
Jack Hsu <jack.hsu@gmail.com> | |||
Adam Sontag <ajpiano@ajpiano.com> | |||
Carl Fürstenberg <carl@excito.com> | |||
Kevin Dalman <development@allpro.net> | |||
Alberto Fernández Capel <afcapel@gmail.com> | |||
Jacek Jędrzejewski (http://jacek.jedrzejewski.name) | |||
Ting Kuei <ting@kuei.com> | |||
Samuel Cormier-Iijima <sam@chide.it> | |||
Jon Palmer <jonspalmer@gmail.com> | |||
Ben Hollis <bhollis@amazon.com> | |||
Justin MacCarthy <Justin@Rubystars.biz> | |||
Eyal Kobrigo <kobrigo@hotmail.com> | |||
Tiago Freire <tiago.freire@gmail.com> | |||
Diego Tres <diegotres@gmail.com> | |||
Holger Rüprich <holger@rueprich.de> | |||
Ziling Zhao <zilingzhao@gmail.com> | |||
Mike Alsup <malsup@gmail.com> | |||
Robson Braga Araujo <robsonbraga@gmail.com> | |||
Pierre-Henri Ausseil <ph.ausseil@gmail.com> | |||
Christopher McCulloh <cmcculloh@gmail.com> | |||
Andrew Newcomb <ext.github@preceptsoftware.co.uk> | |||
Lim Chee Aun <cheeaun@gmail.com> | |||
Jorge Barreiro <yortx.barry@gmail.com> | |||
Daniel Steigerwald <daniel@steigerwald.cz> | |||
John Firebaugh <john_firebaugh@bigfix.com> | |||
John Enters <github@darkdark.net> | |||
Andrey Kapitcyn <ru.m157y@gmail.com> | |||
Dmitry Petrov <dpetroff@gmail.com> | |||
Eric Hynds <eric@hynds.net> | |||
Chairat Sunthornwiphat <pipo@sixhead.com> | |||
Josh Varner <josh.varner@gmail.com> | |||
Stéphane Raimbault <stephane.raimbault@gmail.com> | |||
Jay Merrifield <fracmak@gmail.com> | |||
J. Ryan Stinnett <jryans@gmail.com> | |||
Peter Heiberg <peter@heiberg.se> | |||
Alex Dovenmuehle <adovenmuehle@gmail.com> | |||
Jamie Gegerson <git@jamiegegerson.com> | |||
Raymond Schwartz <skeetergraphics@gmail.com> | |||
Phillip Barnes <philbar@gmail.com> | |||
Kyle Wilkinson <kai@wikyd.org> | |||
Khaled AlHourani <me@khaledalhourani.com> | |||
Marian Rudzynski <mr@impaled.org> | |||
Jean-Francois Remy <jeff@melix.org> | |||
Doug Blood <dougblood@gmail.com> | |||
Filippo Cavallarin <filippo.cavallarin@codseq.it> | |||
Heiko Henning <heiko@thehennings.ch> | |||
Aliaksandr Rahalevich <saksmlz@gmail.com> | |||
Mario Visic <mario@mariovisic.com> | |||
Xavi Ramirez <xavi.rmz@gmail.com> | |||
Max Schnur <max.schnur@gmail.com> | |||
Saji Nediyanchath <saji89@gmail.com> | |||
Corey Frang <gnarf37@gmail.com> | |||
Aaron Peterson <aaronp123@yahoo.com> | |||
Ivan Peters <ivan@ivanpeters.com> | |||
Mohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr> | |||
Marcos Sousa <falecomigo@marcossousa.com> | |||
Michael DellaNoce <mdellanoce@mailtrust.com> | |||
George Marshall <echosx@gmail.com> | |||
Tobias Brunner <tobias@strongswan.org> | |||
Martin Solli <msolli@gmail.com> | |||
David Petersen <public@petersendidit.com> | |||
Dan Heberden <danheberden@gmail.com> | |||
William Kevin Manire <williamkmanire@gmail.com> | |||
Gilmore Davidson <gilmoreorless@gmail.com> | |||
Michael Wu <michaelmwu@gmail.com> | |||
Adam Parod <mystic414@gmail.com> | |||
Guillaume Gautreau <guillaume+github@ghusse.com> | |||
Marcel Toele <EleotleCram@gmail.com> | |||
Dan Streetman <ddstreet@ieee.org> | |||
Matt Hoskins <matt@nipltd.com> | |||
Giovanni Giacobbi <giovanni@giacobbi.net> | |||
Kyle Florence <kyle.florence@gmail.com> | |||
Pavol Hluchý <lopo@losys.sk> | |||
Hans Hillen <hans.hillen@gmail.com> | |||
Mark Johnson <virgofx@live.com> | |||
Trey Hunner <treyhunner@gmail.com> | |||
Shane Whittet <whittet@gmail.com> | |||
Edward A Faulkner <ef@alum.mit.edu> | |||
Adam Baratz <adam@adambaratz.com> | |||
Kato Kazuyoshi <kato.kazuyoshi@gmail.com> | |||
Eike Send <eike.send@gmail.com> | |||
Kris Borchers <kris.borchers@gmail.com> | |||
Eddie Monge <eddie@eddiemonge.com> | |||
Israel Tsadok <itsadok@gmail.com> | |||
Carson McDonald <carson@ioncannon.net> | |||
Jason Davies <jason@jasondavies.com> | |||
Garrison Locke <gplocke@gmail.com> | |||
David Murdoch <david@davidmurdoch.com> | |||
Benjamin Scott Boyle <benjamins.boyle@gmail.com> | |||
Jesse Baird <jebaird@gmail.com> | |||
Jonathan Vingiano <jvingiano@gmail.com> | |||
Dylan Just <dev@ephox.com> | |||
Hiroshi Tomita <tomykaira@gmail.com> | |||
Glenn Goodrich <glenn.goodrich@gmail.com> | |||
Tarafder Ashek-E-Elahi <mail.ashek@gmail.com> | |||
Ryan Neufeld <ryan@neufeldmail.com> | |||
Marc Neuwirth <marc.neuwirth@gmail.com> | |||
Philip Graham <philip.robert.graham@gmail.com> | |||
Benjamin Sterling <benjamin.sterling@kenzomedia.com> | |||
Wesley Walser <waw325@gmail.com> | |||
Kouhei Sutou <kou@clear-code.com> | |||
Karl Kirch <karlkrch@gmail.com> | |||
Chris Kelly <ckdake@ckdake.com> | |||
Jason Oster <jay@kodewerx.org> | |||
Felix Nagel <info@felixnagel.com> | |||
Alexander Polomoshnov <alex.polomoshnov@gmail.com> | |||
David Leal <dgleal@gmail.com> | |||
Igor Milla <igor.fsp.milla@gmail.com> | |||
Dave Methvin <dave.methvin@gmail.com> | |||
Florian Gutmann <f.gutmann@chronimo.com> | |||
Marwan Al Jubeh <marwan.aljubeh@gmail.com> | |||
Milan Broum <midlis@googlemail.com> | |||
Sebastian Sauer <info@dynpages.de> | |||
Gaëtan Muller <m.gaetan89@gmail.com> | |||
Michel Weimerskirch <michel@weimerskirch.net> | |||
William Griffiths <william@ycymro.com> | |||
Stojce Slavkovski <stojce@gmail.com> | |||
David Soms <david.soms@gmail.com> | |||
David De Sloovere <david.desloovere@outlook.com> | |||
Michael P. Jung <michael.jung@terreon.de> | |||
Shannon Pekary <spekary@gmail.com> | |||
Dan Wellman <danwellman@hotmail.com> | |||
Matthew Edward Hutton <meh@corefiling.co.uk> | |||
James Khoury <james@jameskhoury.com> | |||
Rob Loach <robloach@gmail.com> | |||
Alberto Monteiro <betimbrasil@gmail.com> | |||
Alex Rhea <alex.rhea@gmail.com> | |||
Krzysztof Rosiński <rozwell69@gmail.com> | |||
Ryan Olton <oltonr@gmail.com> | |||
Genie <386@mail.com> | |||
Rick Waldron <waldron.rick@gmail.com> | |||
Ian Simpson <spoonlikesham@gmail.com> | |||
Lev Kitsis <spam4lev@gmail.com> | |||
TJ VanToll <tj.vantoll@gmail.com> | |||
Justin Domnitz <jdomnitz@gmail.com> | |||
Douglas Cerna <douglascerna@yahoo.com> | |||
Bert ter Heide <bertjh@hotmail.com> | |||
Jasvir Nagra <jasvir@gmail.com> | |||
Yuriy Khabarov <13real008@gmail.com> | |||
Harri Kilpiö <harri.kilpio@gmail.com> | |||
Lado Lomidze <lado.lomidze@gmail.com> | |||
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il> | |||
Simon Sattes <simon.sattes@gmail.com> | |||
Jo Liss <joliss42@gmail.com> | |||
Guntupalli Karunakar <karunakarg@yahoo.com> | |||
Shahyar Ghobadpour <shahyar@gmail.com> | |||
Lukasz Lipinski <uzza17@gmail.com> | |||
Timo Tijhof <krinklemail@gmail.com> | |||
Jason Moon <jmoon@socialcast.com> | |||
Martin Frost <martinf55@hotmail.com> | |||
Eneko Illarramendi <eneko@illarra.com> | |||
EungJun Yi <semtlenori@gmail.com> | |||
Courtland Allen <courtlandallen@gmail.com> | |||
Viktar Varvanovich <non4eg@gmail.com> | |||
Danny Trunk <dtrunk90@gmail.com> | |||
Pavel Stetina <pavel.stetina@nangu.tv> | |||
Michael Stay <metaweta@gmail.com> | |||
Steven Roussey <sroussey@gmail.com> | |||
Michael Hollis <hollis21@gmail.com> | |||
Lee Rowlands <lee.rowlands@previousnext.com.au> | |||
Timmy Willison <timmywillisn@gmail.com> | |||
Karl Swedberg <kswedberg@gmail.com> | |||
Baoju Yuan <the_guy_1987@hotmail.com> | |||
Maciej Mroziński <maciej.k.mrozinski@gmail.com> | |||
Luis Dalmolin <luis.nh@gmail.com> | |||
Mark Aaron Shirley <maspwr@gmail.com> | |||
Martin Hoch <martin@fidion.de> | |||
Jiayi Yang <tr870829@gmail.com> | |||
Philipp Benjamin Köppchen <xgxtpbk@gws.ms> | |||
Sindre Sorhus <sindresorhus@gmail.com> | |||
Bernhard Sirlinger <bernhard.sirlinger@tele2.de> | |||
Jared A. Scheel <jared@jaredscheel.com> | |||
Rafael Xavier de Souza <rxaviers@gmail.com> | |||
John Chen <zhang.z.chen@intel.com> | |||
Robert Beuligmann <robertbeuligmann@gmail.com> | |||
Dale Kocian <dale.kocian@gmail.com> | |||
Mike Sherov <mike.sherov@gmail.com> | |||
Andrew Couch <andy@couchand.com> | |||
Marc-Andre Lafortune <github@marc-andre.ca> | |||
Nate Eagle <nate.eagle@teamaol.com> | |||
David Souther <davidsouther@gmail.com> | |||
Mathias Stenbom <mathias@stenbom.com> | |||
Sergey Kartashov <ebishkek@yandex.ru> | |||
Avinash R <nashpapa@gmail.com> | |||
Ethan Romba <ethanromba@gmail.com> | |||
Cory Gackenheimer <cory.gack@gmail.com> | |||
Juan Pablo Kaniefsky <jpkaniefsky@gmail.com> | |||
Roman Salnikov <bardt.dz@gmail.com> | |||
Anika Henke <anika@selfthinker.org> | |||
Samuel Bovée <samycookie2000@yahoo.fr> | |||
Fabrício Matté <ult_combo@hotmail.com> | |||
Viktor Kojouharov <vkojouharov@gmail.com> | |||
Pawel Maruszczyk (http://hrabstwo.net) | |||
Pavel Selitskas <p.selitskas@gmail.com> | |||
Bjørn Johansen <post@bjornjohansen.no> | |||
Matthieu Penant <thieum22@hotmail.com> | |||
Dominic Barnes <dominic@dbarnes.info> | |||
David Sullivan <david.sullivan@gmail.com> | |||
Thomas Jaggi <thomas@responsive.ch> | |||
Vahid Sohrabloo <vahid4134@gmail.com> | |||
Travis Carden <travis.carden@gmail.com> | |||
Bruno M. Custódio <bruno@brunomcustodio.com> | |||
Nathanael Silverman <nathanael.silverman@gmail.com> | |||
Christian Wenz <christian@wenz.org> | |||
Steve Urmston <steve@urm.st> | |||
Zaven Muradyan <megalivoithos@gmail.com> | |||
Woody Gilk <shadowhand@deviantart.com> | |||
Zbigniew Motyka <zbigniew.motyka@gmail.com> | |||
Suhail Alkowaileet <xsoh.k7@gmail.com> | |||
Toshi MARUYAMA <marutosijp2@yahoo.co.jp> | |||
David Hansen <hansede@gmail.com> | |||
Brian Grinstead <briangrinstead@gmail.com> | |||
Christian Klammer <christian314159@gmail.com> | |||
Steven Luscher <jquerycla@steveluscher.com> | |||
Gan Eng Chin <engchin.gan@gmail.com> | |||
Gabriel Schulhof <gabriel.schulhof@intel.com> | |||
Alexander Schmitz <arschmitz@gmail.com> | |||
Vilhjálmur Skúlason <vis@dmm.is> | |||
Siebrand Mazeland <siebrand@kitano.nl> | |||
Mohsen Ekhtiari <mohsenekhtiari@yahoo.com> | |||
Pere Orga <gotrunks@gmail.com> | |||
Jasper de Groot <mail@ugomobi.com> | |||
Stephane Deschamps <stephane.deschamps@gmail.com> | |||
Jyoti Deka <dekajp@gmail.com> | |||
Andrei Picus <office.nightcrawler@gmail.com> | |||
Ondrej Novy <novy@ondrej.org> | |||
Jacob McCutcheon <jacob.mccutcheon@gmail.com> | |||
Monika Piotrowicz <monika.piotrowicz@gmail.com> | |||
Imants Horsts <imants.horsts@inbox.lv> | |||
Eric Dahl <eric.c.dahl@gmail.com> | |||
Dave Stein <dave@behance.com> | |||
Dylan Barrell <dylan@barrell.com> | |||
Daniel DeGroff <djdegroff@gmail.com> | |||
Michael Wiencek <mwtuea@gmail.com> | |||
Thomas Meyer <meyertee@gmail.com> | |||
Ruslan Yakhyaev <ruslan@ruslan.io> | |||
Brian J. Dowling <bjd-dev@simplicity.net> | |||
Ben Higgins <ben@extrahop.com> | |||
Yermo Lamers <yml@yml.com> | |||
Patrick Stapleton <github@gdi2290.com> | |||
Trisha Crowley <trisha.crowley@gmail.com> | |||
Usman Akeju <akeju00+github@gmail.com> | |||
Rodrigo Menezes <rod333@gmail.com> | |||
Jacques Perrault <jacques_perrault@us.ibm.com> | |||
Frederik Elvhage <frederik.elvhage@googlemail.com> | |||
Will Holley <willholley@gmail.com> | |||
Uri Gilad <antishok@gmail.com> | |||
Richard Gibson <richard.gibson@gmail.com> | |||
Simen Bekkhus <sbekkhus91@gmail.com> | |||
Chen Eshchar <eshcharc@gmail.com> | |||
Bruno Pérel <brunoperel@gmail.com> | |||
Mohammed Alshehri <m@dralshehri.com> | |||
Lisa Seacat DeLuca <ldeluca@us.ibm.com> | |||
Anne-Gaelle Colom <coloma@westminster.ac.uk> | |||
Adam Foster <slimfoster@gmail.com> | |||
Luke Page <luke.a.page@gmail.com> | |||
Daniel Owens <daniel@matchstickmixup.com> | |||
Michael Orchard <morchard@scottlogic.co.uk> | |||
Marcus Warren <marcus@envoke.com> | |||
Nils Heuermann <nils@world-of-scripts.de> | |||
Marco Ziech <marco@ziech.net> | |||
Patricia Juarez <patrixd@gmail.com> | |||
Ben Mosher <me@benmosher.com> | |||
Ablay Keldibek <atomio.ak@gmail.com> | |||
Thomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr> | |||
Jiabao Wu <jiabao.foss@gmail.com> | |||
Eric Lee Carraway <github@ericcarraway.com> | |||
Victor Homyakov <vkhomyackov@gmail.com> | |||
Myeongjin Lee <aranet100@gmail.com> | |||
Liran Sharir <lsharir@gmail.com> | |||
Weston Ruter <weston@xwp.co> | |||
Mani Mishra <manimishra902@gmail.com> | |||
Hannah Methvin <hannahmethvin@gmail.com> | |||
Leonardo Balter <leonardo.balter@gmail.com> | |||
Benjamin Albert <benjamin_a5@yahoo.com> | |||
Michał Gołębiowski <m.goleb@gmail.com> | |||
Alyosha Pushak <alyosha.pushak@gmail.com> | |||
Fahad Ahmad <fahadahmad41@hotmail.com> | |||
Matt Brundage <github@mattbrundage.com> | |||
Francesc Baeta <francesc.baeta@gmail.com> | |||
Piotr Baran <piotros@wp.pl> | |||
Mukul Hase <mukulhase@gmail.com> | |||
Konstantin Dinev <kdinev@mail.bw.edu> | |||
Rand Scullard <rand@randscullard.com> | |||
Dan Strohl <dan@wjcg.net> | |||
Maksim Ryzhikov <rv.maksim@gmail.com> | |||
Amine HADDAD <haddad@allegorie.tv> | |||
Amanpreet Singh <apsdehal@gmail.com> | |||
Alexey Balchunas <bleshik@gmail.com> | |||
Peter Kehl <peter.kehl@gmail.com> | |||
Peter Dave Hello <hsu@peterdavehello.org> | |||
Johannes Schäfer <johnschaefer@gmx.de> | |||
Ville Skyttä <ville.skytta@iki.fi> | |||
Ryan Oriecuia <ryan.oriecuia@visioncritical.com> |
@ -1,43 +0,0 @@ | |||
Copyright jQuery Foundation and other contributors, https://jquery.org/ | |||
This software consists of voluntary contributions made by many | |||
individuals. For exact contribution history, see the revision history | |||
available at https://github.com/jquery/jquery-ui | |||
The following license applies to all parts of this software except as | |||
documented below: | |||
==== | |||
Permission is hereby granted, free of charge, to any person obtaining | |||
a copy of this software and associated documentation files (the | |||
"Software"), to deal in the Software without restriction, including | |||
without limitation the rights to use, copy, modify, merge, publish, | |||
distribute, sublicense, and/or sell copies of the Software, and to | |||
permit persons to whom the Software is furnished to do so, subject to | |||
the following conditions: | |||
The above copyright notice and this permission notice shall be | |||
included in all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
==== | |||
Copyright and related rights for sample code are waived via CC0. Sample | |||
code is defined as all source code contained within the demos directory. | |||
CC0: http://creativecommons.org/publicdomain/zero/1.0/ | |||
==== | |||
All files located in the node_modules and external directories are | |||
externally maintained libraries used by this software which have their | |||
own licenses; we recommend you read them, as their terms may differ from | |||
the terms above. |