Marked as 0.2.8
This commit is contained in:
parent
2d36d7ce84
commit
4e64583a0b
96 changed files with 3281 additions and 22102 deletions
19
README.md
19
README.md
|
@ -1,12 +1,25 @@
|
||||||
HackMD 0.2.7
|
HackMD 0.2.8
|
||||||
===
|
===
|
||||||
|
|
||||||
This is a realtime collaborative markdown notes on all platforms.
|
This is a realtime collaborative markdown notes on all platforms.
|
||||||
But still in early stage, feel free to fork or contribute to it.
|
But still in early stage, feel free to fork or contribute to it.
|
||||||
|
|
||||||
Thanks for your using.
|
Thanks for your using!
|
||||||
|
|
||||||
|
There are some config you need to change in below files
|
||||||
|
```
|
||||||
|
./run.sh
|
||||||
|
./config.js
|
||||||
|
./public/js/common.js
|
||||||
|
```
|
||||||
|
|
||||||
|
You can use SSL to encrypt your site by passing certificate path in the `config.js` and set `usessl=true`.
|
||||||
|
|
||||||
|
And there is a script called `run.sh`, it's for someone like me to run the server via npm package `forever`, and can passing environment variable to the server, like heroku does.
|
||||||
|
|
||||||
|
To install `forever`, just type `npm install forever -g`
|
||||||
|
|
||||||
The notes are store in PostgreSQL, and I provided the schema in the `hackmd_schema.sql`.
|
The notes are store in PostgreSQL, and I provided the schema in the `hackmd_schema.sql`.
|
||||||
The users and sessions are store in mongoDB, which don't need schema, so just connect it directly.
|
The users and sessions are store in mongoDB, which don't need schema, so just connect it directly.
|
||||||
|
|
||||||
License under MIT.
|
**License under MIT.**
|
126
app.js
126
app.js
|
@ -1,6 +1,5 @@
|
||||||
//app
|
//app
|
||||||
//external modules
|
//external modules
|
||||||
var connect = require('connect');
|
|
||||||
var express = require('express');
|
var express = require('express');
|
||||||
var toobusy = require('toobusy-js');
|
var toobusy = require('toobusy-js');
|
||||||
var ejs = require('ejs');
|
var ejs = require('ejs');
|
||||||
|
@ -11,24 +10,45 @@ var mongoose = require('mongoose');
|
||||||
var compression = require('compression')
|
var compression = require('compression')
|
||||||
var session = require('express-session');
|
var session = require('express-session');
|
||||||
var MongoStore = require('connect-mongo')(session);
|
var MongoStore = require('connect-mongo')(session);
|
||||||
|
var fs = require('fs');
|
||||||
|
var shortid = require('shortid');
|
||||||
|
var imgur = require('imgur');
|
||||||
|
var formidable = require('formidable');
|
||||||
|
|
||||||
//core
|
//core
|
||||||
var config = require("./config.js");
|
var config = require("./config.js");
|
||||||
var User = require("./lib/user.js");
|
var User = require("./lib/user.js");
|
||||||
|
var Temp = require("./lib/temp.js");
|
||||||
var auth = require("./lib/auth.js");
|
var auth = require("./lib/auth.js");
|
||||||
var response = require("./lib/response.js");
|
var response = require("./lib/response.js");
|
||||||
|
|
||||||
//server setup
|
//server setup
|
||||||
var app = express();
|
if (config.usessl) {
|
||||||
var server = require('http').createServer(app);
|
var ca = (function () {
|
||||||
|
var i, len, results;
|
||||||
|
results = [];
|
||||||
|
for (i = 0, len = config.sslcapath.length; i < len; i++) {
|
||||||
|
results.push(fs.readFileSync(config.sslcapath[i], 'utf8'));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
})();
|
||||||
|
var options = {
|
||||||
|
key: fs.readFileSync(config.sslkeypath, 'utf8'),
|
||||||
|
cert: fs.readFileSync(config.sslcertpath, 'utf8'),
|
||||||
|
ca: ca,
|
||||||
|
requestCert: false,
|
||||||
|
rejectUnauthorized: false
|
||||||
|
};
|
||||||
|
var app = express();
|
||||||
|
var server = require('https').createServer(options, app);
|
||||||
|
} else {
|
||||||
|
var app = express();
|
||||||
|
var server = require('http').createServer(app);
|
||||||
|
}
|
||||||
var io = require('socket.io').listen(server);
|
var io = require('socket.io').listen(server);
|
||||||
var port = process.env.PORT || config.testport;
|
|
||||||
|
|
||||||
// connect to the mongodb
|
// connect to the mongodb
|
||||||
if (config.debug)
|
mongoose.connect(process.env.MONGOLAB_URI || config.mongodbstring);
|
||||||
mongoose.connect(config.mongodbstring);
|
|
||||||
else
|
|
||||||
mongoose.connect(process.env.MONGOLAB_URI);
|
|
||||||
|
|
||||||
//others
|
//others
|
||||||
var db = require("./lib/db.js");
|
var db = require("./lib/db.js");
|
||||||
|
@ -53,7 +73,7 @@ app.use(session({
|
||||||
name: config.sessionname,
|
name: config.sessionname,
|
||||||
secret: config.sessionsecret,
|
secret: config.sessionsecret,
|
||||||
resave: false, //don't save session if unmodified
|
resave: false, //don't save session if unmodified
|
||||||
saveUninitialized: true, //don't create session until something stored
|
saveUninitialized: false, //don't create session until something stored
|
||||||
cookie: {
|
cookie: {
|
||||||
maxAge: new Date(Date.now() + config.sessionlife),
|
maxAge: new Date(Date.now() + config.sessionlife),
|
||||||
expires: new Date(Date.now() + config.sessionlife),
|
expires: new Date(Date.now() + config.sessionlife),
|
||||||
|
@ -111,6 +131,59 @@ app.get("/status", function (req, res, next) {
|
||||||
res.end(JSON.stringify(data));
|
res.end(JSON.stringify(data));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
//get status
|
||||||
|
app.get("/temp", function (req, res) {
|
||||||
|
var host = req.get('host');
|
||||||
|
if (config.alloworigin.indexOf(host) == -1)
|
||||||
|
response.errorForbidden(res);
|
||||||
|
else {
|
||||||
|
var tempid = req.query.tempid;
|
||||||
|
if (!tempid)
|
||||||
|
response.errorForbidden(res);
|
||||||
|
else {
|
||||||
|
Temp.findTemp(tempid, function (err, temp) {
|
||||||
|
if (err || !temp)
|
||||||
|
response.errorForbidden(res);
|
||||||
|
else {
|
||||||
|
res.header("Access-Control-Allow-Origin", "*");
|
||||||
|
res.send({
|
||||||
|
temp: temp.data
|
||||||
|
});
|
||||||
|
temp.remove(function (err) {
|
||||||
|
if (err)
|
||||||
|
console.log('remove temp failed: ' + err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//post status
|
||||||
|
app.post("/temp", urlencodedParser, function (req, res) {
|
||||||
|
var host = req.get('host');
|
||||||
|
if (config.alloworigin.indexOf(host) == -1)
|
||||||
|
response.errorForbidden(res);
|
||||||
|
else {
|
||||||
|
var id = shortid.generate();
|
||||||
|
var data = req.body.data;
|
||||||
|
if (!id || !data)
|
||||||
|
response.errorForbidden(res);
|
||||||
|
else {
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER received temp from [' + host + ']: ' + req.body.data);
|
||||||
|
Temp.newTemp(id, data, function (err, temp) {
|
||||||
|
if (!err && temp) {
|
||||||
|
res.header("Access-Control-Allow-Origin", "*");
|
||||||
|
res.send({
|
||||||
|
status: 'ok',
|
||||||
|
id: temp.id
|
||||||
|
});
|
||||||
|
} else
|
||||||
|
response.errorInternalError(res);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
//facebook auth
|
//facebook auth
|
||||||
app.get('/auth/facebook',
|
app.get('/auth/facebook',
|
||||||
passport.authenticate('facebook'),
|
passport.authenticate('facebook'),
|
||||||
|
@ -230,6 +303,29 @@ app.get('/me', function (req, res) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
//upload to imgur
|
||||||
|
app.post('/uploadimage', function (req, res) {
|
||||||
|
var form = new formidable.IncomingForm();
|
||||||
|
form.parse(req, function (err, fields, files) {
|
||||||
|
if (err || !files.image || !files.image.path) {
|
||||||
|
response.errorForbidden(res);
|
||||||
|
} else {
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER received uploadimage: ' + JSON.stringify(files.image));
|
||||||
|
imgur.setClientId(config.imgur.clientID);
|
||||||
|
imgur.uploadFile(files.image.path)
|
||||||
|
.then(function (json) {
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER uploadimage success: ' + JSON.stringify(json));
|
||||||
|
res.send({link:json.data.link});
|
||||||
|
})
|
||||||
|
.catch(function (err) {
|
||||||
|
console.error(err);
|
||||||
|
res.send(err.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
//get new note
|
//get new note
|
||||||
app.get("/new", response.newNote);
|
app.get("/new", response.newNote);
|
||||||
//get features
|
//get features
|
||||||
|
@ -248,6 +344,12 @@ io.set('heartbeat timeout', config.heartbeattimeout);
|
||||||
io.sockets.on('connection', realtime.connection);
|
io.sockets.on('connection', realtime.connection);
|
||||||
|
|
||||||
//listen
|
//listen
|
||||||
server.listen(port, function () {
|
if (config.usessl) {
|
||||||
console.log('Server listening at port %d', port);
|
server.listen(config.sslport, function () {
|
||||||
});
|
console.log('HTTPS Server listening at sslport %d', config.sslport);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
server.listen(config.port, function () {
|
||||||
|
console.log('HTTP Server listening at port %d', config.port);
|
||||||
|
});
|
||||||
|
}
|
55
config.js
55
config.js
|
@ -1,11 +1,33 @@
|
||||||
//config
|
//config
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
|
|
||||||
|
var domain = process.env.DOMAIN;
|
||||||
|
var testport = '3000';
|
||||||
|
var testsslport = '3001';
|
||||||
|
var port = process.env.PORT || testport;
|
||||||
|
var sslport = process.env.SSLPORT || testsslport;
|
||||||
|
var usessl = false;
|
||||||
|
var urladdport = true; //add port on getserverurl
|
||||||
|
|
||||||
var config = {
|
var config = {
|
||||||
debug: true,
|
debug: true,
|
||||||
version: '0.2.7',
|
version: '0.2.8',
|
||||||
domain: 'http://localhost:3000',
|
domain: domain,
|
||||||
testport: '3000',
|
alloworigin: ['add here to allow origin to cross'],
|
||||||
|
testport: testport,
|
||||||
|
testsslport: testsslport,
|
||||||
|
port: port,
|
||||||
|
sslport: sslport,
|
||||||
|
sslkeypath: 'change this',
|
||||||
|
sslcertpath: 'change this',
|
||||||
|
sslcapath: ['change this'],
|
||||||
|
usessl: usessl,
|
||||||
|
getserverurl: function() {
|
||||||
|
if(usessl)
|
||||||
|
return 'https://' + domain + (sslport == 443 || !urladdport ? '' : ':' + sslport);
|
||||||
|
else
|
||||||
|
return 'http://' + domain + (port == 80 || !urladdport ? '' : ':' + port);
|
||||||
|
},
|
||||||
//path
|
//path
|
||||||
tmppath: "./tmp/",
|
tmppath: "./tmp/",
|
||||||
defaultnotepath: path.join(__dirname, '/public', "default.md"),
|
defaultnotepath: path.join(__dirname, '/public', "default.md"),
|
||||||
|
@ -14,36 +36,39 @@ var config = {
|
||||||
errorpath: path.join(__dirname, '/public/views', "error.ejs"),
|
errorpath: path.join(__dirname, '/public/views', "error.ejs"),
|
||||||
prettypath: path.join(__dirname, '/public/views', 'pretty.ejs'),
|
prettypath: path.join(__dirname, '/public/views', 'pretty.ejs'),
|
||||||
//db string
|
//db string
|
||||||
postgresqlstring: "postgresql://localhost:5432/hackmd",
|
postgresqlstring: "change this",
|
||||||
mongodbstring: "mongodb://localhost/hackmd",
|
mongodbstring: "change this",
|
||||||
//constants
|
//constants
|
||||||
featuresnotename: "features",
|
featuresnotename: "features",
|
||||||
sessionname: 'please set this',
|
sessionname: 'change this',
|
||||||
sessionsecret: 'please set this',
|
sessionsecret: 'change this',
|
||||||
sessionlife: 14 * 24 * 60 * 60 * 1000, //14 days
|
sessionlife: 14 * 24 * 60 * 60 * 1000, //14 days
|
||||||
sessiontouch: 1 * 3600, //1 hour
|
sessiontouch: 1 * 3600, //1 hour
|
||||||
heartbeatinterval: 5000,
|
heartbeatinterval: 5000,
|
||||||
heartbeattimeout: 10000,
|
heartbeattimeout: 10000,
|
||||||
//auth
|
//auth
|
||||||
facebook: {
|
facebook: {
|
||||||
clientID: 'get yourself one',
|
clientID: 'change this',
|
||||||
clientSecret: 'get yourself one',
|
clientSecret: 'change this',
|
||||||
callbackPath: '/auth/facebook/callback'
|
callbackPath: '/auth/facebook/callback'
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
consumerKey: 'get yourself one',
|
consumerKey: 'change this',
|
||||||
consumerSecret: 'get yourself one',
|
consumerSecret: 'change this',
|
||||||
callbackPath: '/auth/twitter/callback'
|
callbackPath: '/auth/twitter/callback'
|
||||||
},
|
},
|
||||||
github: {
|
github: {
|
||||||
clientID: 'get yourself one',
|
clientID: 'change this',
|
||||||
clientSecret: 'get yourself one',
|
clientSecret: 'change this',
|
||||||
callbackPath: '/auth/github/callback'
|
callbackPath: '/auth/github/callback'
|
||||||
},
|
},
|
||||||
dropbox: {
|
dropbox: {
|
||||||
clientID: 'get yourself one',
|
clientID: 'change this',
|
||||||
clientSecret: 'get yourself one',
|
clientSecret: 'change this',
|
||||||
callbackPath: '/auth/dropbox/callback'
|
callbackPath: '/auth/dropbox/callback'
|
||||||
|
},
|
||||||
|
imgur: {
|
||||||
|
clientID: 'change this'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,23 +27,23 @@ function callback(accessToken, refreshToken, profile, done) {
|
||||||
module.exports = passport.use(new FacebookStrategy({
|
module.exports = passport.use(new FacebookStrategy({
|
||||||
clientID: config.facebook.clientID,
|
clientID: config.facebook.clientID,
|
||||||
clientSecret: config.facebook.clientSecret,
|
clientSecret: config.facebook.clientSecret,
|
||||||
callbackURL: config.domain + config.facebook.callbackPath
|
callbackURL: config.getserverurl() + config.facebook.callbackPath
|
||||||
}, callback));
|
}, callback));
|
||||||
//twitter
|
//twitter
|
||||||
passport.use(new TwitterStrategy({
|
passport.use(new TwitterStrategy({
|
||||||
consumerKey: config.twitter.consumerKey,
|
consumerKey: config.twitter.consumerKey,
|
||||||
consumerSecret: config.twitter.consumerSecret,
|
consumerSecret: config.twitter.consumerSecret,
|
||||||
callbackURL: config.domain + config.twitter.callbackPath
|
callbackURL: config.getserverurl() + config.twitter.callbackPath
|
||||||
}, callback));
|
}, callback));
|
||||||
//github
|
//github
|
||||||
passport.use(new GithubStrategy({
|
passport.use(new GithubStrategy({
|
||||||
clientID: config.github.clientID,
|
clientID: config.github.clientID,
|
||||||
clientSecret: config.github.clientSecret,
|
clientSecret: config.github.clientSecret,
|
||||||
callbackURL: config.domain + config.github.callbackPath
|
callbackURL: config.getserverurl() + config.github.callbackPath
|
||||||
}, callback));
|
}, callback));
|
||||||
//dropbox
|
//dropbox
|
||||||
passport.use(new DropboxStrategy({
|
passport.use(new DropboxStrategy({
|
||||||
clientID: config.dropbox.clientID,
|
clientID: config.dropbox.clientID,
|
||||||
clientSecret: config.dropbox.clientSecret,
|
clientSecret: config.dropbox.clientSecret,
|
||||||
callbackURL: config.domain + config.dropbox.callbackPath
|
callbackURL: config.getserverurl() + config.dropbox.callbackPath
|
||||||
}, callback));
|
}, callback));
|
25
lib/db.js
25
lib/db.js
|
@ -18,10 +18,7 @@ var db = {
|
||||||
};
|
};
|
||||||
|
|
||||||
function getDBClient() {
|
function getDBClient() {
|
||||||
if (config.debug)
|
return new pg.Client(process.env.DATABASE_URL || config.postgresqlstring);
|
||||||
return new pg.Client(config.postgresqlstring);
|
|
||||||
else
|
|
||||||
return new pg.Client(process.env.DATABASE_URL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function readFromFile(callback) {
|
function readFromFile(callback) {
|
||||||
|
@ -49,12 +46,14 @@ function newToDB(id, owner, body, callback) {
|
||||||
var client = getDBClient();
|
var client = getDBClient();
|
||||||
client.connect(function (err) {
|
client.connect(function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
client.end();
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error('could not connect to postgres', err);
|
return console.error('could not connect to postgres', err);
|
||||||
}
|
}
|
||||||
var newnotequery = util.format(insertquery, id, owner, body);
|
var newnotequery = util.format(insertquery, id, owner, body);
|
||||||
//console.log(newnotequery);
|
//console.log(newnotequery);
|
||||||
client.query(newnotequery, function (err, result) {
|
client.query(newnotequery, function (err, result) {
|
||||||
|
client.end();
|
||||||
if (err) {
|
if (err) {
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error("new note to db failed: " + err);
|
return console.error("new note to db failed: " + err);
|
||||||
|
@ -62,7 +61,6 @@ function newToDB(id, owner, body, callback) {
|
||||||
if (config.debug)
|
if (config.debug)
|
||||||
console.log("new note to db success");
|
console.log("new note to db success");
|
||||||
callback(null, result);
|
callback(null, result);
|
||||||
client.end();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -72,23 +70,25 @@ function readFromDB(id, callback) {
|
||||||
var client = getDBClient();
|
var client = getDBClient();
|
||||||
client.connect(function (err) {
|
client.connect(function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
client.end();
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error('could not connect to postgres', err);
|
return console.error('could not connect to postgres', err);
|
||||||
}
|
}
|
||||||
var readquery = util.format(selectquery, id);
|
var readquery = util.format(selectquery, id);
|
||||||
//console.log(readquery);
|
//console.log(readquery);
|
||||||
client.query(readquery, function (err, result) {
|
client.query(readquery, function (err, result) {
|
||||||
|
client.end();
|
||||||
if (err) {
|
if (err) {
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error("read from db failed: " + err);
|
return console.error("read from db failed: " + err);
|
||||||
} else {
|
} else {
|
||||||
//console.log(result.rows);
|
//console.log(result.rows);
|
||||||
if (result.rows.length <= 0) {
|
if (result.rows.length <= 0) {
|
||||||
callback("not found note in db", null);
|
callback("not found note in db: " + id, null);
|
||||||
} else {
|
} else {
|
||||||
console.log("read from db success");
|
if(config.debug)
|
||||||
|
console.log("read from db success");
|
||||||
callback(null, result);
|
callback(null, result);
|
||||||
client.end();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -99,12 +99,14 @@ function saveToDB(id, title, data, callback) {
|
||||||
var client = getDBClient();
|
var client = getDBClient();
|
||||||
client.connect(function (err) {
|
client.connect(function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
client.end();
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error('could not connect to postgres', err);
|
return console.error('could not connect to postgres', err);
|
||||||
}
|
}
|
||||||
var savequery = util.format(updatequery, title, data, id);
|
var savequery = util.format(updatequery, title, data, id);
|
||||||
//console.log(savequery);
|
//console.log(savequery);
|
||||||
client.query(savequery, function (err, result) {
|
client.query(savequery, function (err, result) {
|
||||||
|
client.end();
|
||||||
if (err) {
|
if (err) {
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error("save to db failed: " + err);
|
return console.error("save to db failed: " + err);
|
||||||
|
@ -112,7 +114,6 @@ function saveToDB(id, title, data, callback) {
|
||||||
if (config.debug)
|
if (config.debug)
|
||||||
console.log("save to db success");
|
console.log("save to db success");
|
||||||
callback(null, result);
|
callback(null, result);
|
||||||
client.end();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -122,10 +123,12 @@ function countFromDB(callback) {
|
||||||
var client = getDBClient();
|
var client = getDBClient();
|
||||||
client.connect(function (err) {
|
client.connect(function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
client.end();
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error('could not connect to postgres', err);
|
return console.error('could not connect to postgres', err);
|
||||||
}
|
}
|
||||||
client.query(countquery, function (err, result) {
|
client.query(countquery, function (err, result) {
|
||||||
|
client.end();
|
||||||
if (err) {
|
if (err) {
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
return console.error("count from db failed: " + err);
|
return console.error("count from db failed: " + err);
|
||||||
|
@ -134,9 +137,9 @@ function countFromDB(callback) {
|
||||||
if (result.rows.length <= 0) {
|
if (result.rows.length <= 0) {
|
||||||
callback("not found note in db", null);
|
callback("not found note in db", null);
|
||||||
} else {
|
} else {
|
||||||
console.log("count from db success");
|
if(config.debug)
|
||||||
|
console.log("count from db success");
|
||||||
callback(null, result);
|
callback(null, result);
|
||||||
client.end();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -81,10 +81,11 @@ function getStatus(callback) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found) {
|
||||||
distinctaddresses.push(value.address);
|
distinctaddresses.push(value.address);
|
||||||
if(!found && value.login)
|
if(value.login)
|
||||||
distinctregusers++;
|
distinctregusers++;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
User.getUserCount(function (err, regcount) {
|
User.getUserCount(function (err, regcount) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -372,11 +373,19 @@ function connection(socket) {
|
||||||
switch (op.origin) {
|
switch (op.origin) {
|
||||||
case '+input':
|
case '+input':
|
||||||
case '+delete':
|
case '+delete':
|
||||||
|
case '+transpose':
|
||||||
case 'paste':
|
case 'paste':
|
||||||
case 'cut':
|
case 'cut':
|
||||||
case 'undo':
|
case 'undo':
|
||||||
case 'redo':
|
case 'redo':
|
||||||
case 'drag':
|
case 'drag':
|
||||||
|
case '*compose':
|
||||||
|
case 'case':
|
||||||
|
case '+insertLine':
|
||||||
|
case '+swapLine':
|
||||||
|
case '+joinLines':
|
||||||
|
case '+duplicateLine':
|
||||||
|
case '+sortLines':
|
||||||
notes[notename].socks.forEach(function (sock) {
|
notes[notename].socks.forEach(function (sock) {
|
||||||
if (sock != socket) {
|
if (sock != socket) {
|
||||||
if (config.debug)
|
if (config.debug)
|
||||||
|
|
|
@ -17,16 +17,16 @@ var Note = require("./note.js");
|
||||||
//public
|
//public
|
||||||
var response = {
|
var response = {
|
||||||
errorForbidden: function (res) {
|
errorForbidden: function (res) {
|
||||||
res.status(403).send("Forbidden, oh no.")
|
res.status(403).send("Forbidden, oh no.");
|
||||||
},
|
},
|
||||||
errorNotFound: function (res) {
|
errorNotFound: function (res) {
|
||||||
responseError(res, "404", "Not Found", "oops.")
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
},
|
},
|
||||||
errorInternalError: function (res) {
|
errorInternalError: function (res) {
|
||||||
responseError(res, "500", "Internal Error", "wtf.")
|
responseError(res, "500", "Internal Error", "wtf.");
|
||||||
},
|
},
|
||||||
errorServiceUnavailable: function (res) {
|
errorServiceUnavailable: function (res) {
|
||||||
res.status(503).send("I'm busy right now, try again later.")
|
res.status(503).send("I'm busy right now, try again later.");
|
||||||
},
|
},
|
||||||
newNote: newNote,
|
newNote: newNote,
|
||||||
showFeatures: showFeatures,
|
showFeatures: showFeatures,
|
||||||
|
|
83
lib/temp.js
Normal file
83
lib/temp.js
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
//temp
|
||||||
|
//external modules
|
||||||
|
var mongoose = require('mongoose');
|
||||||
|
|
||||||
|
//core
|
||||||
|
var config = require("../config.js");
|
||||||
|
|
||||||
|
// create a temp model
|
||||||
|
var model = mongoose.model('temp', {
|
||||||
|
id: String,
|
||||||
|
data: String,
|
||||||
|
created: Date
|
||||||
|
});
|
||||||
|
|
||||||
|
//public
|
||||||
|
var temp = {
|
||||||
|
model: model,
|
||||||
|
findTemp: findTemp,
|
||||||
|
newTemp: newTemp,
|
||||||
|
removeTemp: removeTemp,
|
||||||
|
getTempCount: getTempCount
|
||||||
|
};
|
||||||
|
|
||||||
|
function getTempCount(callback) {
|
||||||
|
model.count(function(err, count){
|
||||||
|
if(err) callback(err, null);
|
||||||
|
else callback(null, count);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function findTemp(id, callback) {
|
||||||
|
model.findOne({
|
||||||
|
id: id
|
||||||
|
}, function (err, temp) {
|
||||||
|
if (err) {
|
||||||
|
console.log('find temp failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
}
|
||||||
|
if (!err && temp) {
|
||||||
|
callback(null, temp);
|
||||||
|
} else {
|
||||||
|
console.log('find temp failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function newTemp(id, data, callback) {
|
||||||
|
var temp = new model({
|
||||||
|
id: id,
|
||||||
|
data: data,
|
||||||
|
created: Date.now()
|
||||||
|
});
|
||||||
|
temp.save(function (err) {
|
||||||
|
if (err) {
|
||||||
|
console.log('new temp failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
} else {
|
||||||
|
console.log("new temp success: " + temp.id);
|
||||||
|
callback(null, temp);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeTemp(id, callback) {
|
||||||
|
findTemp(id, function(err, temp) {
|
||||||
|
if(!err && temp) {
|
||||||
|
temp.remove(function(err) {
|
||||||
|
if(err) {
|
||||||
|
console.log('remove temp failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
} else {
|
||||||
|
callback(null, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log('remove temp failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = temp;
|
|
@ -37,7 +37,7 @@ function findUser(id, callback) {
|
||||||
console.log('find user failed: ' + err);
|
console.log('find user failed: ' + err);
|
||||||
callback(err, null);
|
callback(err, null);
|
||||||
}
|
}
|
||||||
if (!err && user != null) {
|
if (!err && user) {
|
||||||
callback(null, user);
|
callback(null, user);
|
||||||
} else {
|
} else {
|
||||||
console.log('find user failed: ' + err);
|
console.log('find user failed: ' + err);
|
||||||
|
@ -65,7 +65,7 @@ function newUser(id, profile, callback) {
|
||||||
|
|
||||||
function findOrNewUser(id, profile, callback) {
|
function findOrNewUser(id, profile, callback) {
|
||||||
findUser(id, function(err, user) {
|
findUser(id, function(err, user) {
|
||||||
if(err || user == null) {
|
if(err || !user) {
|
||||||
newUser(id, profile, function(err, user) {
|
newUser(id, profile, function(err, user) {
|
||||||
if(err) {
|
if(err) {
|
||||||
console.log('find or new user failed: ' + err);
|
console.log('find or new user failed: ' + err);
|
||||||
|
|
10
package.json
10
package.json
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"name": "hackmd",
|
"name": "hackmd",
|
||||||
"version": "0.2.7",
|
"version": "0.2.8",
|
||||||
"description": "Realtime collaborative markdown notes on all platforms.",
|
"description": "Realtime collaborative markdown notes on all platforms.",
|
||||||
"main": "server.js",
|
"main": "app.js",
|
||||||
"author": "jackymaxj",
|
"author": "jackycute",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -11,7 +11,6 @@
|
||||||
"body-parser": "^1.12.3",
|
"body-parser": "^1.12.3",
|
||||||
"cheerio": "^0.19.0",
|
"cheerio": "^0.19.0",
|
||||||
"compression": "^1.4.3",
|
"compression": "^1.4.3",
|
||||||
"connect": "3.x",
|
|
||||||
"connect-mongo": "^0.8.1",
|
"connect-mongo": "^0.8.1",
|
||||||
"cookie": "0.1.2",
|
"cookie": "0.1.2",
|
||||||
"cookie-parser": "1.3.3",
|
"cookie-parser": "1.3.3",
|
||||||
|
@ -19,8 +18,9 @@
|
||||||
"emojify.js": "^1.0.1",
|
"emojify.js": "^1.0.1",
|
||||||
"express": "4.x",
|
"express": "4.x",
|
||||||
"express-session": "^1.11.1",
|
"express-session": "^1.11.1",
|
||||||
|
"formidable": "^1.0.17",
|
||||||
"highlight.js": "^8.4.0",
|
"highlight.js": "^8.4.0",
|
||||||
"html": "0.0.7",
|
"imgur": "^0.1.5",
|
||||||
"jsdom-nogyp": "^0.8.3",
|
"jsdom-nogyp": "^0.8.3",
|
||||||
"lz-string": "1.3.6",
|
"lz-string": "1.3.6",
|
||||||
"markdown-pdf": "^5.2.0",
|
"markdown-pdf": "^5.2.0",
|
||||||
|
|
|
@ -23,13 +23,15 @@ a:hover {
|
||||||
/*
|
/*
|
||||||
* Base structure
|
* Base structure
|
||||||
*/
|
*/
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
height: 100%;
|
|
||||||
background-color: #333;
|
background-color: #333;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
|
min-height: 100%;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
text-shadow: 0 1px 3px rgba(0, 0, 0, .5);
|
text-shadow: 0 1px 3px rgba(0, 0, 0, .5);
|
||||||
|
@ -40,7 +42,7 @@ body {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100vh;
|
||||||
/* For at least Firefox */
|
/* For at least Firefox */
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
-webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, .5);
|
-webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, .5);
|
||||||
|
@ -156,7 +158,7 @@ body {
|
||||||
.masthead,
|
.masthead,
|
||||||
.mastfoot,
|
.mastfoot,
|
||||||
.cover-container {
|
.cover-container {
|
||||||
width: 700px;
|
width: 1000px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.section ul {
|
.section ul {
|
||||||
|
@ -168,41 +170,14 @@ html,
|
||||||
body {
|
body {
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
.select2-selection,
|
|
||||||
.select2-search__field {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
.select2-search__field:hover {
|
|
||||||
border: 1px solid #b9b9b9 !important;
|
|
||||||
border-top-color: #a0a0a0 !important;
|
|
||||||
}
|
|
||||||
.select2-search__field:focus {
|
|
||||||
border: 1px solid #4d90fe !important;
|
|
||||||
}
|
|
||||||
input {
|
input {
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
.mastfoot {
|
.mastfoot {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
.select2 {
|
.select2-container {
|
||||||
width: 100% !important;
|
margin: 0 auto !important;
|
||||||
max-width: 400px;
|
|
||||||
}
|
|
||||||
.select2-selection {
|
|
||||||
height: 32px !important;
|
|
||||||
}
|
|
||||||
.select2-selection__rendered {
|
|
||||||
line-height: 32px !important;
|
|
||||||
}
|
|
||||||
.select2-selection__arrow {
|
|
||||||
height: 30px !important;
|
|
||||||
}
|
|
||||||
.select2-selection__rendered,
|
|
||||||
.select2-selection__placeholder,
|
|
||||||
.select2-results__option {
|
|
||||||
color: #000;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
}
|
||||||
.list {
|
.list {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -276,3 +251,23 @@ input {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn-file {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.btn-file input[type=file] {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
font-size: 100px;
|
||||||
|
text-align: right;
|
||||||
|
filter: alpha(opacity=0);
|
||||||
|
opacity: 0;
|
||||||
|
outline: none;
|
||||||
|
background: white;
|
||||||
|
cursor: inherit;
|
||||||
|
display: block;
|
||||||
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
.markdown-body {
|
.markdown-body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
|
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
|
@ -339,7 +338,7 @@
|
||||||
}
|
}
|
||||||
.task-list-item-checkbox {
|
.task-list-item-checkbox {
|
||||||
float: left;
|
float: left;
|
||||||
margin: 0.4em 0 0.2em -1.3em !important;
|
margin: 0.31em 0 0.2em -1.3em !important;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
cursor: default !important;
|
cursor: default !important;
|
||||||
}
|
}
|
|
@ -20,7 +20,7 @@ form,
|
||||||
font-family: 'Source Code Pro', Consolas, monaco, monospace;
|
font-family: 'Source Code Pro', Consolas, monaco, monospace;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
height: auto;
|
/*height: auto;*/
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
overflow-y: hidden !important;
|
overflow-y: hidden !important;
|
||||||
-webkit-overflow-scrolling: touch;
|
-webkit-overflow-scrolling: touch;
|
||||||
|
@ -30,7 +30,7 @@ form,
|
||||||
overflow-y: auto !important;
|
overflow-y: auto !important;
|
||||||
}
|
}
|
||||||
.CodeMirror-code {
|
.CodeMirror-code {
|
||||||
padding-bottom: 100px;
|
/*padding-bottom: 72px;*/
|
||||||
}
|
}
|
||||||
.CodeMirror-linenumber {
|
.CodeMirror-linenumber {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
|
@ -43,7 +43,7 @@ form,
|
||||||
.CodeMirror-foldmarker {
|
.CodeMirror-foldmarker {
|
||||||
color: #d0d0d0;
|
color: #d0d0d0;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
font-family: arial;
|
font-family: Arial;
|
||||||
line-height: .3;
|
line-height: .3;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
|
|
|
@ -6,6 +6,7 @@ body {
|
||||||
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004);
|
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004);
|
||||||
/*text-rendering: optimizeLegibility;*/
|
/*text-rendering: optimizeLegibility;*/
|
||||||
-webkit-overflow-scrolling: touch;
|
-webkit-overflow-scrolling: touch;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, "Microsoft JhengHei", sans-serif !important;
|
||||||
}
|
}
|
||||||
:focus {
|
:focus {
|
||||||
outline: none !important;
|
outline: none !important;
|
||||||
|
|
|
@ -10,13 +10,6 @@
|
||||||
<meta name="mobile-web-app-capable" content="yes">
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
<meta name="description" content="Realtime collaborative markdown notes on all platforms.">
|
<meta name="description" content="Realtime collaborative markdown notes on all platforms.">
|
||||||
<meta name="author" content="jackycute">
|
<meta name="author" content="jackycute">
|
||||||
<!-- Open Graph data -->
|
|
||||||
<meta property="og:title" content="HackMD - Collaborative notes">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:url" content="https://hackmd.herokuapp.com/">
|
|
||||||
<meta property="og:description" content="Realtime collaborative markdown notes on all platforms.">
|
|
||||||
<meta property="og:site_name" content="HackMD">
|
|
||||||
<meta property="fb:admins" content="1463801565">
|
|
||||||
<title>HackMD - Collaborative notes</title>
|
<title>HackMD - Collaborative notes</title>
|
||||||
<link rel="icon" type="image/png" href="/favicon.png">
|
<link rel="icon" type="image/png" href="/favicon.png">
|
||||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||||
|
@ -24,7 +17,8 @@
|
||||||
<!-- Bootstrap core CSS -->
|
<!-- Bootstrap core CSS -->
|
||||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
|
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
|
||||||
<link rel="stylesheet" href="/vendor/select2/css/select2.min.css">
|
<link rel="stylesheet" href="/vendor/select2/select2.css">
|
||||||
|
<link rel="stylesheet" href="/vendor/select2/select2-bootstrap.css">
|
||||||
<!-- Custom styles for this template -->
|
<!-- Custom styles for this template -->
|
||||||
<link rel="stylesheet" href="/css/cover.css">
|
<link rel="stylesheet" href="/css/cover.css">
|
||||||
<link rel="stylesheet" href="/css/bootstrap-social.css">
|
<link rel="stylesheet" href="/css/bootstrap-social.css">
|
||||||
|
@ -56,9 +50,7 @@
|
||||||
<div class="inner cover">
|
<div class="inner cover">
|
||||||
<h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1>
|
<h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1>
|
||||||
<p class="lead">
|
<p class="lead">
|
||||||
Realtime collaborate notes.
|
Realtime collaborative markdown notes on all platforms.
|
||||||
<br> Using markdown syntax.
|
|
||||||
<br> On all platforms.
|
|
||||||
</p>
|
</p>
|
||||||
<a type="button" class="btn btn-lg btn-success ui-signin" data-toggle="modal" data-target=".bs-example-modal-sm" style="display:none;">Sign In</a>
|
<a type="button" class="btn btn-lg btn-success ui-signin" data-toggle="modal" data-target=".bs-example-modal-sm" style="display:none;">Sign In</a>
|
||||||
<div class="ui-or" style="display:none;">Or</div>
|
<div class="ui-or" style="display:none;">Or</div>
|
||||||
|
@ -76,12 +68,12 @@
|
||||||
<h4>
|
<h4>
|
||||||
<a type="button" class="btn btn-success" data-toggle="modal" data-target=".bs-example-modal-sm">Sign In</a> to get own history!
|
<a type="button" class="btn btn-success" data-toggle="modal" data-target=".bs-example-modal-sm">Sign In</a> to get own history!
|
||||||
</h4>
|
</h4>
|
||||||
<p>Below are history from cookie</p>
|
<p>Below are history from browser</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui-signout" style="display:none;">
|
<div class="ui-signout" style="display:none;">
|
||||||
<h4 class="ui-welcome">Welcome! <span class="ui-name"></span></h4>
|
<h4 class="ui-welcome">Welcome! <span class="ui-name"></span></h4>
|
||||||
<a href="/new" class="btn btn-default">Start new note</a> Or
|
<a href="/new" class="btn btn-default">Start new note</a> Or
|
||||||
<a href="/logout" class="btn btn-danger">Sign Out</a>
|
<a href="#" class="btn btn-danger ui-logout">Sign Out</a>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<a href="/features">See all features here <i class="fa fa-info-circle"></i></a>
|
<a href="/features">See all features here <i class="fa fa-info-circle"></i></a>
|
||||||
|
@ -89,24 +81,34 @@
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<form class="form-inline">
|
<form class="form-inline">
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control ui-use-tags" style="width:172px;" />
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input class="search form-control" placeholder="Search anything..." />
|
<input class="search form-control" placeholder="Search anything..." />
|
||||||
</div>
|
</div>
|
||||||
<a href="#" class="sort btn btn-default" data-sort="text">
|
<a href="#" class="sort btn btn-default" data-sort="text" title="Sort by title">
|
||||||
Sort by title
|
Title
|
||||||
</a>
|
</a>
|
||||||
<a href="#" class="sort btn btn-default" data-sort="timestamp">
|
<a href="#" class="sort btn btn-default" data-sort="timestamp" title="Sort by time">
|
||||||
Sort by time
|
Time
|
||||||
</a>
|
</a>
|
||||||
|
<span class="hidden-xs hidden-sm">
|
||||||
|
<a href="#" class="btn btn-default ui-save-history" title="Export history"><i class="fa fa-save"></i></a>
|
||||||
|
<span class="btn btn-default btn-file ui-open-history" title="Import history">
|
||||||
|
<i class="fa fa-folder-open-o"></i><input type="file" />
|
||||||
|
</span>
|
||||||
|
<a href="#" class="btn btn-default ui-clear-history" title="Clear history"><i class="fa fa-trash-o"></i></a>
|
||||||
|
</span>
|
||||||
|
<a href="#" class="btn btn-default ui-refresh-history" title="Refresh history"><i class="fa fa-refresh"></i></a>
|
||||||
</form>
|
</form>
|
||||||
<h4 class="ui-nohistory">
|
<h4 class="ui-nohistory" style="display:none;">
|
||||||
No history
|
No history
|
||||||
</h4>
|
</h4>
|
||||||
<a href="#" class="btn btn-primary ui-import-from-cookie" style="display:none;">Import from cookie</a>
|
<a href="#" class="btn btn-primary ui-import-from-browser" style="display:none;">Import from browser</a>
|
||||||
<ul id="history-list" class="list">
|
<ul id="history-list" class="list">
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="releasenotes" class="section" style="display:none;">
|
<div id="releasenotes" class="section" style="display:none;">
|
||||||
<div id="template" style="display:none;">
|
<div id="template" style="display:none;">
|
||||||
{{#each release}}
|
{{#each release}}
|
||||||
|
@ -140,6 +142,11 @@
|
||||||
|
|
||||||
<div class="mastfoot">
|
<div class="mastfoot">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
|
<h6>
|
||||||
|
<div class="fb-like" data-href="https://www.facebook.com/TakeHackMD" data-width="80" data-layout="button_count" data-action="like" data-show-faces="true" data-share="false" style="vertical-align:middle;"></div>
|
||||||
|
|
||||||
|
<iframe src="//ghbtns.com/github-btn.html?user=jackycute&repo=hackmd&type=star&count=true" frameborder="0" scrolling="0" width="80px" height="20px" style="vertical-align:middle;"></iframe>
|
||||||
|
</h6>
|
||||||
<p>© 2015 <a href="https://www.facebook.com/TakeHackMD" target="_blank"><i class="fa fa-facebook-square"></i> HackMD</a> by <a href="https://github.com/jackycute" target="_blank"><i class="fa fa-github-square"></i> jackycute</a>
|
<p>© 2015 <a href="https://www.facebook.com/TakeHackMD" target="_blank"><i class="fa fa-facebook-square"></i> HackMD</a> by <a href="https://github.com/jackycute" target="_blank"><i class="fa fa-github-square"></i> jackycute</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -174,21 +181,25 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="fb-root"></div>
|
||||||
|
|
||||||
<!-- Bootstrap core JavaScript
|
<!-- Bootstrap core JavaScript
|
||||||
================================================== -->
|
================================================== -->
|
||||||
<!-- Placed at the end of the document so the pages load faster -->
|
<!-- Placed at the end of the document so the pages load faster -->
|
||||||
<!--<script src="/js/ga.js"></script>-->
|
<script src="/js/fb.js" async defer></script>
|
||||||
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
|
<script src="//code.jquery.com/jquery-1.11.3.min.js" defer></script>
|
||||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" defer></script>
|
||||||
<script src="/vendor/select2/js/select2.min.js"></script>
|
<script src="/vendor/select2/select2.min.js" defer></script>
|
||||||
<script src="/vendor/select2/js/i18n/en.js"></script>
|
<script src="/vendor/js.cookie.js" defer></script>
|
||||||
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script>
|
<script src="/vendor/moment-with-locales.js" defer></script>
|
||||||
<script src="/vendor/moment-with-locales.js"></script>
|
<script src="/vendor/handlebars-v3.0.0.js" defer></script>
|
||||||
<script src="/vendor/handlebars-v3.0.0.js"></script>
|
<script src="/vendor/list.min.js" defer></script>
|
||||||
<script src="/vendor/list.min.js"></script>
|
<script src="/vendor/FileSaver.min.js" defer></script>
|
||||||
<script src="/js/history.js"></script>
|
<script src="/vendor/store.min.js" defer></script>
|
||||||
<script src="/js/cover.js"></script>
|
<script src="/vendor/url.min.js" defer></script>
|
||||||
|
<script src="/js/common.js" defer></script>
|
||||||
|
<script src="/js/history.js" defer></script>
|
||||||
|
<script src="/js/cover.js" defer></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
53
public/js/common.js
Normal file
53
public/js/common.js
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
//common
|
||||||
|
var domain = 'change this';
|
||||||
|
var checkAuth = false;
|
||||||
|
var profile = null;
|
||||||
|
var lastLoginState = getLoginState();
|
||||||
|
var loginStateChangeEvent = null;
|
||||||
|
|
||||||
|
function resetCheckAuth() {
|
||||||
|
checkAuth = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setLoginState(bool) {
|
||||||
|
Cookies.set('loginstate', bool, {
|
||||||
|
expires: 14
|
||||||
|
});
|
||||||
|
if (loginStateChangeEvent && bool != lastLoginState)
|
||||||
|
loginStateChangeEvent();
|
||||||
|
lastLoginState = bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLoginState() {
|
||||||
|
return Cookies.get('loginstate') === "true";
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearLoginState() {
|
||||||
|
Cookies.remove('loginstate');
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkIfAuth(yesCallback, noCallback) {
|
||||||
|
var cookieLoginState = getLoginState();
|
||||||
|
if (!checkAuth || typeof cookieLoginState == 'undefined') {
|
||||||
|
$.get('/me')
|
||||||
|
.done(function (data) {
|
||||||
|
if (data && data.status == 'ok') {
|
||||||
|
profile = data;
|
||||||
|
yesCallback(profile);
|
||||||
|
setLoginState(true);
|
||||||
|
} else {
|
||||||
|
noCallback();
|
||||||
|
setLoginState(false);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function () {
|
||||||
|
noCallback();
|
||||||
|
setLoginState(false);
|
||||||
|
});
|
||||||
|
checkAuth = true;
|
||||||
|
} else if (cookieLoginState) {
|
||||||
|
yesCallback(profile);
|
||||||
|
} else {
|
||||||
|
noCallback();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,47 @@
|
||||||
|
var options = {
|
||||||
|
valueNames: ['id', 'text', 'timestamp', 'fromNow', 'time', 'tags'],
|
||||||
|
item: '<li class="col-xs-12 col-sm-6 col-md-6 col-lg-4">\
|
||||||
|
<span class="id" style="display:none;"></span>\
|
||||||
|
<a href="#">\
|
||||||
|
<div class="item">\
|
||||||
|
<div class="ui-history-close fa fa-close fa-fw"></div>\
|
||||||
|
<h4 class="text"></h4>\
|
||||||
|
<p><i class="fromNow"><i class="fa fa-clock-o"></i></i>\
|
||||||
|
<br>\
|
||||||
|
<i class="timestamp" style="display:none;"></i><i class="time"></i></p>\
|
||||||
|
<p class="tags"></p>\
|
||||||
|
</div>\
|
||||||
|
</a>\
|
||||||
|
</li>'
|
||||||
|
};
|
||||||
|
var historyList = new List('history', options);
|
||||||
|
|
||||||
|
migrateHistoryFromTempCallback = pageInit;
|
||||||
|
loginStateChangeEvent = pageInit;
|
||||||
|
pageInit();
|
||||||
|
|
||||||
|
function pageInit() {
|
||||||
|
checkIfAuth(
|
||||||
|
function (data) {
|
||||||
|
$('.ui-signin').hide();
|
||||||
|
$('.ui-or').hide();
|
||||||
|
$('.ui-welcome').show();
|
||||||
|
$('.ui-name').html(data.name);
|
||||||
|
$('.ui-signout').show();
|
||||||
|
$(".ui-history").click();
|
||||||
|
parseServerToHistory(historyList, parseHistoryCallback);
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
$('.ui-signin').slideDown();
|
||||||
|
$('.ui-or').slideDown();
|
||||||
|
$('.ui-welcome').hide();
|
||||||
|
$('.ui-name').html('');
|
||||||
|
$('.ui-signout').hide();
|
||||||
|
parseStorageToHistory(historyList, parseHistoryCallback);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$(".masthead-nav li").click(function () {
|
$(".masthead-nav li").click(function () {
|
||||||
$(this).siblings().removeClass("active");
|
$(this).siblings().removeClass("active");
|
||||||
$(this).addClass("active");
|
$(this).addClass("active");
|
||||||
|
@ -19,63 +63,202 @@ $(".ui-releasenotes").click(function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
function checkHistoryList() {
|
function checkHistoryList() {
|
||||||
if ($("#history-list").children().length > 0)
|
if ($("#history-list").children().length > 0) {
|
||||||
$(".ui-nohistory").hide();
|
$(".ui-nohistory").hide();
|
||||||
else if ($("#history-list").children().length == 0) {
|
$(".ui-import-from-browser").hide();
|
||||||
|
} else if ($("#history-list").children().length == 0) {
|
||||||
$(".ui-nohistory").slideDown();
|
$(".ui-nohistory").slideDown();
|
||||||
var cookienotehistory = JSON.parse($.cookie('notehistory'));
|
getStorageHistory(function (data) {
|
||||||
if (login && cookienotehistory && cookienotehistory.length > 0) {
|
if (data && data.length > 0 && getLoginState() && historyList.items.length == 0) {
|
||||||
$(".ui-import-from-cookie").slideDown();
|
$(".ui-import-from-browser").slideDown();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseHistoryCallback() {
|
function parseHistoryCallback(list, notehistory) {
|
||||||
checkHistoryList();
|
checkHistoryList();
|
||||||
|
list.sort('timestamp', {
|
||||||
|
order: "desc"
|
||||||
|
});
|
||||||
|
var filtertags = [];
|
||||||
|
$(".item").each(function (key, value) {
|
||||||
|
var a = $(this).closest("a");
|
||||||
|
var id = a.siblings("span").html();
|
||||||
|
var tagsEl = $(this).find(".tags");
|
||||||
|
var item = historyList.get('id', id);
|
||||||
|
if (item.length > 0 && item[0]) {
|
||||||
|
var values = item[0].values();
|
||||||
|
//parse link to element a
|
||||||
|
a.attr('href', '/' + values.id);
|
||||||
|
//parse tags
|
||||||
|
if (values.tags) {
|
||||||
|
var tags = values.tags;
|
||||||
|
if (tags.length > 0) {
|
||||||
|
var labels = [];
|
||||||
|
for (var j = 0; j < tags.length; j++) {
|
||||||
|
//push info filtertags if not found
|
||||||
|
var found = false;
|
||||||
|
if (filtertags.indexOf(tags[j]) != -1)
|
||||||
|
found = true;
|
||||||
|
if (!found)
|
||||||
|
filtertags.push(tags[j]);
|
||||||
|
//push into the item label
|
||||||
|
labels.push("<span class='label label-default'>" + tags[j] + "</span>");
|
||||||
|
}
|
||||||
|
tagsEl.html(labels.join(' '));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
$(".ui-history-close").click(function (e) {
|
$(".ui-history-close").click(function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var id = $(this).closest("a").attr("href").split('/')[1];
|
var id = $(this).closest("a").siblings("span").html();
|
||||||
getHistory(function (notehistory) {
|
getHistory(function (notehistory) {
|
||||||
var newnotehistory = removeHistory(id, notehistory);
|
var newnotehistory = removeHistory(id, notehistory);
|
||||||
saveHistory(newnotehistory);
|
saveHistory(newnotehistory);
|
||||||
});
|
});
|
||||||
$(this).closest("li").remove();
|
list.remove('id', id);
|
||||||
checkHistoryList();
|
checkHistoryList();
|
||||||
});
|
});
|
||||||
|
buildTagsFilter(filtertags);
|
||||||
}
|
}
|
||||||
|
|
||||||
var login = false;
|
$(".ui-import-from-browser").click(function () {
|
||||||
|
saveStorageHistoryToServer(function () {
|
||||||
checkIfAuth(
|
parseStorageToHistory(historyList, parseHistoryCallback);
|
||||||
function (data) {
|
|
||||||
$('.ui-signin').hide();
|
|
||||||
$('.ui-or').hide();
|
|
||||||
$('.ui-welcome').show();
|
|
||||||
$('.ui-name').html(data.name);
|
|
||||||
$('.ui-signout').show();
|
|
||||||
$(".ui-history").click();
|
|
||||||
login = true;
|
|
||||||
},
|
|
||||||
function () {
|
|
||||||
$('.ui-signin').slideDown();
|
|
||||||
$('.ui-or').slideDown();
|
|
||||||
login = false;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
parseHistory(parseHistoryCallback);
|
|
||||||
|
|
||||||
$(".ui-import-from-cookie").click(function () {
|
|
||||||
saveCookieHistoryToServer(function() {
|
|
||||||
parseCookieToHistory(parseHistoryCallback);
|
|
||||||
$(".ui-import-from-cookie").hide();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(".ui-save-history").click(function () {
|
||||||
|
getHistory(function (data) {
|
||||||
|
var history = JSON.stringify(data);
|
||||||
|
var blob = new Blob([history], {
|
||||||
|
type: "application/json;charset=utf-8"
|
||||||
|
});
|
||||||
|
saveAs(blob, 'hackmd_history_' + moment().format('YYYYMMDDHHmmss'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-open-history").bind("change", function (e) {
|
||||||
|
var files = e.target.files || e.dataTransfer.files;
|
||||||
|
var file = files[0];
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.onload = function () {
|
||||||
|
var notehistory = JSON.parse(reader.result);
|
||||||
|
//console.log(notehistory);
|
||||||
|
if (!reader.result) return;
|
||||||
|
getHistory(function (data) {
|
||||||
|
var mergedata = data.concat(notehistory);
|
||||||
|
mergedata = clearDuplicatedHistory(mergedata);
|
||||||
|
saveHistory(mergedata);
|
||||||
|
parseHistory(historyList, parseHistoryCallback);
|
||||||
|
});
|
||||||
|
$(".ui-open-history").replaceWith($(".ui-open-history").val('').clone(true));
|
||||||
|
};
|
||||||
|
reader.readAsText(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-clear-history").click(function () {
|
||||||
|
saveHistory([]);
|
||||||
|
historyList.clear();
|
||||||
|
checkHistoryList();
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-refresh-history").click(function () {
|
||||||
|
resetCheckAuth();
|
||||||
|
historyList.clear();
|
||||||
|
parseHistory(historyList, parseHistoryCallback);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-logout").click(function () {
|
||||||
|
clearLoginState();
|
||||||
|
location.href = '/logout';
|
||||||
|
});
|
||||||
|
|
||||||
|
var filtertags = [];
|
||||||
|
$(".ui-use-tags").select2({
|
||||||
|
placeholder: 'Use tags...',
|
||||||
|
multiple: true,
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
results: filtertags
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.select2-input').css('width', 'inherit');
|
||||||
|
buildTagsFilter([]);
|
||||||
|
|
||||||
|
function buildTagsFilter(tags) {
|
||||||
|
for (var i = 0; i < tags.length; i++)
|
||||||
|
tags[i] = {
|
||||||
|
id: i,
|
||||||
|
text: tags[i]
|
||||||
|
};
|
||||||
|
filtertags = tags;
|
||||||
|
}
|
||||||
|
$(".ui-use-tags").on('change', function () {
|
||||||
|
var tags = [];
|
||||||
|
var data = $(this).select2('data');
|
||||||
|
for (var i = 0; i < data.length; i++)
|
||||||
|
tags.push(data[i].text);
|
||||||
|
if (tags.length > 0) {
|
||||||
|
historyList.filter(function (item) {
|
||||||
|
var values = item.values();
|
||||||
|
if (!values.tags) return false;
|
||||||
|
var found = false;
|
||||||
|
for (var i = 0; i < tags.length; i++) {
|
||||||
|
if (values.tags.indexOf(tags[i]) != -1) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
historyList.filter();
|
||||||
|
}
|
||||||
|
checkHistoryList();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.search').keyup(function () {
|
||||||
|
checkHistoryList();
|
||||||
|
});
|
||||||
|
|
||||||
var source = $("#template").html();
|
var source = $("#template").html();
|
||||||
var template = Handlebars.compile(source);
|
var template = Handlebars.compile(source);
|
||||||
var context = {
|
var context = {
|
||||||
release: [
|
release: [
|
||||||
|
{
|
||||||
|
version: "0.2.8",
|
||||||
|
tag: "flame",
|
||||||
|
date: moment("201505151200", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support drag-n-drop(exclude firefox) and paste image inline",
|
||||||
|
"+ Support tags filter in history",
|
||||||
|
"+ Support sublime-like shortcut keys"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"* Adjust index description",
|
||||||
|
"* Adjust toolbar ui and view font",
|
||||||
|
"* Remove scroll sync delay and gain accuracy"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Partial update in the front and the end might not render properly",
|
||||||
|
"* Server not handle some editor events"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
version: "0.2.7",
|
version: "0.2.7",
|
||||||
tag: "fuel",
|
tag: "fuel",
|
||||||
|
|
|
@ -28,6 +28,8 @@ function renderFilename(view) {
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var viewAjaxCallback = null;
|
||||||
|
|
||||||
//dynamic event or object binding here
|
//dynamic event or object binding here
|
||||||
function finishView(view) {
|
function finishView(view) {
|
||||||
//youtube
|
//youtube
|
||||||
|
@ -42,7 +44,7 @@ function finishView(view) {
|
||||||
.each(function (key, value) {
|
.each(function (key, value) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: 'http://vimeo.com/api/v2/video/' + $(value).attr('videoid') + '.json',
|
url: '//vimeo.com/api/v2/video/' + $(value).attr('videoid') + '.json',
|
||||||
jsonp: 'callback',
|
jsonp: 'callback',
|
||||||
dataType: 'jsonp',
|
dataType: 'jsonp',
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
|
@ -54,7 +56,7 @@ function finishView(view) {
|
||||||
//gist
|
//gist
|
||||||
view.find("code[data-gist-id]").each(function(key, value) {
|
view.find("code[data-gist-id]").each(function(key, value) {
|
||||||
if($(value).children().length == 0)
|
if($(value).children().length == 0)
|
||||||
$(value).gist();
|
$(value).gist(viewAjaxCallback);
|
||||||
});
|
});
|
||||||
//emojify
|
//emojify
|
||||||
emojify.run(view[0]);
|
emojify.run(view[0]);
|
||||||
|
|
8
public/js/fb.js
Normal file
8
public/js/fb.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
(function (d, s, id) {
|
||||||
|
var js, fjs = d.getElementsByTagName(s)[0];
|
||||||
|
if (d.getElementById(id)) return;
|
||||||
|
js = d.createElement(s);
|
||||||
|
js.id = id;
|
||||||
|
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3&appId=1436904003272070";
|
||||||
|
fjs.parentNode.insertBefore(js, fjs);
|
||||||
|
}(document, 'script', 'facebook-jssdk'));
|
|
@ -1,14 +0,0 @@
|
||||||
(function (i, s, o, g, r, a, m) {
|
|
||||||
i['GoogleAnalyticsObject'] = r;
|
|
||||||
i[r] = i[r] || function () {
|
|
||||||
(i[r].q = i[r].q || []).push(arguments)
|
|
||||||
}, i[r].l = 1 * new Date();
|
|
||||||
a = s.createElement(o),
|
|
||||||
m = s.getElementsByTagName(o)[0];
|
|
||||||
a.async = 1;
|
|
||||||
a.src = g;
|
|
||||||
m.parentNode.insertBefore(a, m)
|
|
||||||
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
|
|
||||||
|
|
||||||
ga('create', 'get your self one', 'auto');
|
|
||||||
ga('send', 'pageview');
|
|
|
@ -1,16 +1,35 @@
|
||||||
//common
|
var migrateHistoryFromTempCallback = null;
|
||||||
function checkIfAuth(yesCallback, noCallback) {
|
|
||||||
$.get('/me')
|
migrateHistoryFromTemp();
|
||||||
.done(function (data) {
|
|
||||||
if (data && data.status == 'ok') {
|
function migrateHistoryFromTemp() {
|
||||||
yesCallback(data);
|
if (url('#tempid')) {
|
||||||
} else {
|
$.get('/temp', {
|
||||||
noCallback();
|
tempid: url('#tempid')
|
||||||
}
|
})
|
||||||
})
|
.done(function (data) {
|
||||||
.fail(function () {
|
if (data && data.temp) {
|
||||||
noCallback();
|
getStorageHistory(function (olddata) {
|
||||||
});
|
if (!olddata || olddata.length == 0) {
|
||||||
|
saveHistoryToStorage(JSON.parse(data.temp));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.always(function () {
|
||||||
|
var hash = location.hash.split('#')[1];
|
||||||
|
hash = hash.split('&');
|
||||||
|
for (var i = 0; i < hash.length; i++)
|
||||||
|
if (hash[i].indexOf('tempid') == 0) {
|
||||||
|
hash.splice(i, 1);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
hash = hash.join('&');
|
||||||
|
location.hash = hash;
|
||||||
|
if (migrateHistoryFromTempCallback)
|
||||||
|
migrateHistoryFromTempCallback();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveHistory(notehistory) {
|
function saveHistory(notehistory) {
|
||||||
|
@ -19,13 +38,20 @@ function saveHistory(notehistory) {
|
||||||
saveHistoryToServer(notehistory);
|
saveHistoryToServer(notehistory);
|
||||||
},
|
},
|
||||||
function () {
|
function () {
|
||||||
saveHistoryToCookie(notehistory);
|
saveHistoryToStorage(notehistory);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function saveHistoryToStorage(notehistory) {
|
||||||
|
if (store.enabled)
|
||||||
|
store.set('notehistory', JSON.stringify(notehistory));
|
||||||
|
else
|
||||||
|
saveHistoryToCookie(notehistory);
|
||||||
|
}
|
||||||
|
|
||||||
function saveHistoryToCookie(notehistory) {
|
function saveHistoryToCookie(notehistory) {
|
||||||
$.cookie('notehistory', JSON.stringify(notehistory), {
|
Cookies.set('notehistory', notehistory, {
|
||||||
expires: 365
|
expires: 365
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -36,12 +62,29 @@ function saveHistoryToServer(notehistory) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function saveCookieHistoryToStorage(callback) {
|
||||||
|
store.set('notehistory', Cookies.get('notehistory'));
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveStorageHistoryToServer(callback) {
|
||||||
|
var data = store.get('notehistory');
|
||||||
|
if (data) {
|
||||||
|
$.post('/history', {
|
||||||
|
history: data
|
||||||
|
})
|
||||||
|
.done(function (data) {
|
||||||
|
callback(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function saveCookieHistoryToServer(callback) {
|
function saveCookieHistoryToServer(callback) {
|
||||||
$.post('/history', {
|
$.post('/history', {
|
||||||
history: $.cookie('notehistory')
|
history: Cookies.get('notehistory')
|
||||||
})
|
})
|
||||||
.done(function (data) {
|
.done(function (data) {
|
||||||
callback();
|
callback(data);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +101,7 @@ function clearDuplicatedHistory(notehistory) {
|
||||||
if (!found)
|
if (!found)
|
||||||
newnotehistory.push(notehistory[i]);
|
newnotehistory.push(notehistory[i]);
|
||||||
}
|
}
|
||||||
return notehistory;
|
return newnotehistory;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addHistory(id, text, time, tags, notehistory) {
|
function addHistory(id, text, time, tags, notehistory) {
|
||||||
|
@ -86,7 +129,7 @@ function writeHistory(view) {
|
||||||
writeHistoryToServer(view);
|
writeHistoryToServer(view);
|
||||||
},
|
},
|
||||||
function () {
|
function () {
|
||||||
writeHistoryToCookie(view);
|
writeHistoryToStorage(view);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -113,7 +156,7 @@ function writeHistoryToServer(view) {
|
||||||
|
|
||||||
function writeHistoryToCookie(view) {
|
function writeHistoryToCookie(view) {
|
||||||
try {
|
try {
|
||||||
var notehistory = JSON.parse($.cookie('notehistory'));
|
var notehistory = Cookies.getJSON('notehistory');
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
var notehistory = [];
|
var notehistory = [];
|
||||||
}
|
}
|
||||||
|
@ -122,6 +165,22 @@ function writeHistoryToCookie(view) {
|
||||||
saveHistoryToCookie(newnotehistory);
|
saveHistoryToCookie(newnotehistory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function writeHistoryToStorage(view) {
|
||||||
|
if (store.enabled) {
|
||||||
|
var data = store.get('notehistory');
|
||||||
|
if (data) {
|
||||||
|
if (typeof data == "string")
|
||||||
|
data = JSON.parse(data);
|
||||||
|
var notehistory = data;
|
||||||
|
} else
|
||||||
|
var notehistory = [];
|
||||||
|
var newnotehistory = generateHistory(view, notehistory);
|
||||||
|
saveHistoryToStorage(newnotehistory);
|
||||||
|
} else {
|
||||||
|
writeHistoryToCookie(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function renderHistory(view) {
|
function renderHistory(view) {
|
||||||
var title = renderFilename(view);
|
var title = renderFilename(view);
|
||||||
|
|
||||||
|
@ -169,7 +228,7 @@ function getHistory(callback) {
|
||||||
getServerHistory(callback);
|
getServerHistory(callback);
|
||||||
},
|
},
|
||||||
function () {
|
function () {
|
||||||
getCookieHistory(callback);
|
getStorageHistory(callback);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -187,70 +246,76 @@ function getServerHistory(callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCookieHistory(callback) {
|
function getCookieHistory(callback) {
|
||||||
callback(JSON.parse($.cookie('notehistory')));
|
callback(Cookies.getJSON('notehistory'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseHistory(callback) {
|
function getStorageHistory(callback) {
|
||||||
|
if (store.enabled) {
|
||||||
|
var data = store.get('notehistory');
|
||||||
|
if (data) {
|
||||||
|
if (typeof data == "string")
|
||||||
|
data = JSON.parse(data);
|
||||||
|
callback(data);
|
||||||
|
} else
|
||||||
|
getCookieHistory(callback);
|
||||||
|
} else {
|
||||||
|
getCookieHistory(callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseHistory(list, callback) {
|
||||||
checkIfAuth(
|
checkIfAuth(
|
||||||
function () {
|
function () {
|
||||||
parseServerToHistory(callback);
|
parseServerToHistory(list, callback);
|
||||||
},
|
},
|
||||||
function () {
|
function () {
|
||||||
parseCookieToHistory(callback);
|
parseStorageToHistory(list, callback);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseServerToHistory(callback) {
|
function parseServerToHistory(list, callback) {
|
||||||
$.get('/history')
|
$.get('/history')
|
||||||
.done(function (data) {
|
.done(function (data) {
|
||||||
if (data.history) {
|
if (data.history) {
|
||||||
//console.log(data.history);
|
parseToHistory(list, data.history, callback);
|
||||||
parseToHistory(data.history, callback);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.fail(function () {
|
.fail(function () {
|
||||||
parseCookieToHistory(callback);
|
parseCookieToHistory(list, callback);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseCookieToHistory(callback) {
|
function parseCookieToHistory(list, callback) {
|
||||||
var notehistory = JSON.parse($.cookie('notehistory'));
|
var notehistory = Cookies.getJSON('notehistory');
|
||||||
parseToHistory(notehistory, callback);
|
parseToHistory(list, notehistory, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseToHistory(notehistory, callback) {
|
function parseStorageToHistory(list, callback) {
|
||||||
if (notehistory && notehistory.length > 0) {
|
if (store.enabled) {
|
||||||
//console.log(notehistory);
|
var data = store.get('notehistory');
|
||||||
|
if (data) {
|
||||||
|
if (typeof data == "string")
|
||||||
|
data = JSON.parse(data);
|
||||||
|
parseToHistory(list, data, callback);
|
||||||
|
} else
|
||||||
|
parseCookieToHistory(list, callback);
|
||||||
|
} else {
|
||||||
|
parseCookieToHistory(list, callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseToHistory(list, notehistory, callback) {
|
||||||
|
if (!callback) return;
|
||||||
|
else if (!list || !notehistory) callback(list, notehistory);
|
||||||
|
else if (notehistory && notehistory.length > 0) {
|
||||||
for (var i = 0; i < notehistory.length; i++) {
|
for (var i = 0; i < notehistory.length; i++) {
|
||||||
|
//parse time to timestamp and fromNow
|
||||||
notehistory[i].timestamp = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').unix();
|
notehistory[i].timestamp = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').unix();
|
||||||
notehistory[i].fromNow = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').fromNow();
|
notehistory[i].fromNow = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').fromNow();
|
||||||
|
if (list.get('id', notehistory[i].id).length == 0)
|
||||||
|
list.add(notehistory[i]);
|
||||||
}
|
}
|
||||||
$(notehistory).each(function (key, value) {
|
|
||||||
var close = "<div class='ui-history-close fa fa-close fa-fw'></div>";
|
|
||||||
var text = "<h4 class='text'>" + value.text + "</h2>";
|
|
||||||
var timestamp = "<i class='timestamp' style='display:none;'>" + value.timestamp + "</i>";
|
|
||||||
var fromNow = "<i class='fromNow'><i class='fa fa-clock-o'></i> " + value.fromNow + "</i>";
|
|
||||||
var time = "<i class='time'>" + value.time + "</i>";
|
|
||||||
var tags = "";
|
|
||||||
if (value.tags) {
|
|
||||||
var labels = [];
|
|
||||||
for (var j = 0; j < value.tags.length; j++)
|
|
||||||
labels.push("<span class='label label-default'>" + value.tags[j] + "</span>");
|
|
||||||
tags = "<p class='tags'>" + labels.join(" ") + "</p>";
|
|
||||||
}
|
|
||||||
var li = "<li class='col-xs-12 col-sm-6 col-md-6 col-lg-6'><a href='" + "./" + value.id + "'><div class='item'>" + close + text + '<p>' + fromNow + '<br>' + timestamp + time + '</p>' + tags + "</div></a></li>"
|
|
||||||
//console.debug(li);
|
|
||||||
$("#history-list").append(li);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
callback(list, notehistory);
|
||||||
var options = {
|
|
||||||
valueNames: ['text', 'timestamp', 'fromNow', 'time', 'tags']
|
|
||||||
};
|
|
||||||
var historyList = new List('history', options);
|
|
||||||
historyList.sort('timestamp', {
|
|
||||||
order: "desc"
|
|
||||||
});
|
|
||||||
callback();
|
|
||||||
}
|
}
|
|
@ -1,12 +1,10 @@
|
||||||
//constant vars
|
//constant vars
|
||||||
//settings
|
//settings
|
||||||
var debug = false;
|
var debug = true;
|
||||||
var version = '0.2.7';
|
var version = '0.2.8';
|
||||||
var doneTypingDelay = 400;
|
var doneTypingDelay = 400;
|
||||||
var finishChangeDelay = 400;
|
var finishChangeDelay = 400;
|
||||||
var cursorActivityDelay = 50;
|
var cursorActivityDelay = 50;
|
||||||
var syncScrollDelay = 50;
|
|
||||||
var scrollAnimatePeriod = 100;
|
|
||||||
var cursorAnimatePeriod = 100;
|
var cursorAnimatePeriod = 100;
|
||||||
var modeType = {
|
var modeType = {
|
||||||
edit: {},
|
edit: {},
|
||||||
|
@ -67,15 +65,20 @@ var lastInfo = {
|
||||||
};
|
};
|
||||||
|
|
||||||
//editor settings
|
//editor settings
|
||||||
var editor = CodeMirror.fromTextArea(document.getElementById("textit"), {
|
var textit = document.getElementById("textit");
|
||||||
|
if (!textit) throw new Error("There was no textit area!");
|
||||||
|
var editor = CodeMirror.fromTextArea(textit, {
|
||||||
mode: 'gfm',
|
mode: 'gfm',
|
||||||
|
keyMap: "sublime",
|
||||||
viewportMargin: 20,
|
viewportMargin: 20,
|
||||||
styleActiveLine: true,
|
styleActiveLine: true,
|
||||||
lineNumbers: true,
|
lineNumbers: true,
|
||||||
lineWrapping: true,
|
lineWrapping: true,
|
||||||
|
showCursorWhenSelecting: true,
|
||||||
theme: "monokai",
|
theme: "monokai",
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
inputStyle: "textarea",
|
inputStyle: "textarea",
|
||||||
|
scrollbarStyle: "overlay",
|
||||||
matchBrackets: true,
|
matchBrackets: true,
|
||||||
autoCloseBrackets: true,
|
autoCloseBrackets: true,
|
||||||
matchTags: {
|
matchTags: {
|
||||||
|
@ -89,6 +92,7 @@ var editor = CodeMirror.fromTextArea(document.getElementById("textit"), {
|
||||||
},
|
},
|
||||||
readOnly: true
|
readOnly: true
|
||||||
});
|
});
|
||||||
|
inlineAttachment.editors.codemirror4.attach(editor);
|
||||||
|
|
||||||
//ui vars
|
//ui vars
|
||||||
var ui = {
|
var ui = {
|
||||||
|
@ -153,18 +157,28 @@ $(document).ready(function () {
|
||||||
|
|
||||||
/* bind events */
|
/* bind events */
|
||||||
$(document)
|
$(document)
|
||||||
.on('focus', 'textarea, input', function() {
|
.on('focus', 'textarea, input', function () {
|
||||||
$body.addClass('fixfixed');
|
$body.addClass('fixfixed');
|
||||||
})
|
})
|
||||||
.on('blur', 'textarea, input', function() {
|
.on('blur', 'textarea, input', function () {
|
||||||
$body.removeClass('fixfixed');
|
$body.removeClass('fixfixed');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//when page resize
|
//when page resize
|
||||||
|
var windowResizeDelay = 200;
|
||||||
|
var windowResizeTimer = null;
|
||||||
$(window).resize(function () {
|
$(window).resize(function () {
|
||||||
checkResponsive();
|
clearTimeout(windowResizeTimer);
|
||||||
|
windowResizeTimer = setTimeout(function () {
|
||||||
|
windowResize();
|
||||||
|
}, windowResizeDelay);
|
||||||
});
|
});
|
||||||
|
function windowResize() {
|
||||||
|
checkResponsive();
|
||||||
|
clearMap();
|
||||||
|
syncScrollToView();
|
||||||
|
}
|
||||||
//768-792px have a gap
|
//768-792px have a gap
|
||||||
function checkResponsive() {
|
function checkResponsive() {
|
||||||
visibleXS = $(".visible-xs").is(":visible");
|
visibleXS = $(".visible-xs").is(":visible");
|
||||||
|
@ -176,6 +190,10 @@ function checkResponsive() {
|
||||||
changeMode(modeType.edit);
|
changeMode(modeType.edit);
|
||||||
else
|
else
|
||||||
changeMode(modeType.view);
|
changeMode(modeType.view);
|
||||||
|
if (visibleXS)
|
||||||
|
$('.CodeMirror').css('height', 'auto');
|
||||||
|
else
|
||||||
|
$('.CodeMirror').css('height', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
function showStatus(type, num) {
|
function showStatus(type, num) {
|
||||||
|
@ -220,7 +238,7 @@ function showStatus(type, num) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleMode() {
|
function toggleMode() {
|
||||||
switch(currentMode) {
|
switch (currentMode) {
|
||||||
case modeType.edit:
|
case modeType.edit:
|
||||||
changeMode(modeType.view);
|
changeMode(modeType.view);
|
||||||
break;
|
break;
|
||||||
|
@ -297,26 +315,31 @@ var url = window.location.origin + '/' + noteId;
|
||||||
ui.toolbar.pretty.attr("href", url + "/pretty");
|
ui.toolbar.pretty.attr("href", url + "/pretty");
|
||||||
//download
|
//download
|
||||||
//markdown
|
//markdown
|
||||||
ui.toolbar.download.markdown.click(function() {
|
ui.toolbar.download.markdown.click(function () {
|
||||||
var filename = renderFilename(ui.area.markdown) + '.md';
|
var filename = renderFilename(ui.area.markdown) + '.md';
|
||||||
var markdown = editor.getValue();
|
var markdown = editor.getValue();
|
||||||
var blob = new Blob([markdown], {type: "text/markdown;charset=utf-8"});
|
var blob = new Blob([markdown], {
|
||||||
|
type: "text/markdown;charset=utf-8"
|
||||||
|
});
|
||||||
saveAs(blob, filename);
|
saveAs(blob, filename);
|
||||||
});
|
});
|
||||||
//save to dropbox
|
//save to dropbox
|
||||||
ui.toolbar.save.dropbox.click(function() {
|
ui.toolbar.save.dropbox.click(function () {
|
||||||
var filename = renderFilename(ui.area.markdown) + '.md';
|
var filename = renderFilename(ui.area.markdown) + '.md';
|
||||||
var options = {
|
var options = {
|
||||||
files: [
|
files: [
|
||||||
{'url': url + "/download", 'filename': filename}
|
{
|
||||||
|
'url': url + "/download",
|
||||||
|
'filename': filename
|
||||||
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
Dropbox.save(options);
|
Dropbox.save(options);
|
||||||
});
|
});
|
||||||
//import from dropbox
|
//import from dropbox
|
||||||
ui.toolbar.import.dropbox.click(function() {
|
ui.toolbar.import.dropbox.click(function () {
|
||||||
var options = {
|
var options = {
|
||||||
success: function(files) {
|
success: function (files) {
|
||||||
ui.spinner.show();
|
ui.spinner.show();
|
||||||
var url = files[0].link;
|
var url = files[0].link;
|
||||||
importFromUrl(url);
|
importFromUrl(url);
|
||||||
|
@ -328,64 +351,73 @@ ui.toolbar.import.dropbox.click(function() {
|
||||||
Dropbox.choose(options);
|
Dropbox.choose(options);
|
||||||
});
|
});
|
||||||
//import from clipboard
|
//import from clipboard
|
||||||
ui.toolbar.import.clipboard.click(function() {
|
ui.toolbar.import.clipboard.click(function () {
|
||||||
//na
|
//na
|
||||||
});
|
});
|
||||||
//fix for wrong autofocus
|
//fix for wrong autofocus
|
||||||
$('#clipboardModal').on('shown.bs.modal', function() {
|
$('#clipboardModal').on('shown.bs.modal', function () {
|
||||||
$('#clipboardModal').blur();
|
$('#clipboardModal').blur();
|
||||||
});
|
});
|
||||||
$("#clipboardModalClear").click(function() {
|
$("#clipboardModalClear").click(function () {
|
||||||
$("#clipboardModalContent").html('');
|
$("#clipboardModalContent").html('');
|
||||||
});
|
});
|
||||||
$("#clipboardModalConfirm").click(function() {
|
$("#clipboardModalConfirm").click(function () {
|
||||||
var data = $("#clipboardModalContent").html();
|
var data = $("#clipboardModalContent").html();
|
||||||
if(data) {
|
if (data) {
|
||||||
parseToEditor(data);
|
parseToEditor(data);
|
||||||
$('#clipboardModal').modal('hide');
|
$('#clipboardModal').modal('hide');
|
||||||
$("#clipboardModalContent").html('');
|
$("#clipboardModalContent").html('');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function parseToEditor(data) {
|
function parseToEditor(data) {
|
||||||
var parsed = toMarkdown(data);
|
var parsed = toMarkdown(data);
|
||||||
if(parsed)
|
if (parsed)
|
||||||
editor.replaceRange(parsed, {line:0, ch:0}, {line:editor.lastLine(), ch:editor.lastLine().length}, '+input');
|
editor.replaceRange(parsed, {
|
||||||
|
line: 0,
|
||||||
|
ch: 0
|
||||||
|
}, {
|
||||||
|
line: editor.lastLine(),
|
||||||
|
ch: editor.lastLine().length
|
||||||
|
}, '+input');
|
||||||
}
|
}
|
||||||
|
|
||||||
function importFromUrl(url) {
|
function importFromUrl(url) {
|
||||||
//console.log(url);
|
//console.log(url);
|
||||||
if(url == null) return;
|
if (url == null) return;
|
||||||
if(!isValidURL(url)) {
|
if (!isValidURL(url)) {
|
||||||
alert('Not valid URL :(');
|
alert('Not valid URL :(');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$.ajax({
|
$.ajax({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: url,
|
url: url,
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
parseToEditor(data);
|
parseToEditor(data);
|
||||||
},
|
},
|
||||||
error: function() {
|
error: function () {
|
||||||
alert('Import failed :(');
|
alert('Import failed :(');
|
||||||
},
|
},
|
||||||
complete: function() {
|
complete: function () {
|
||||||
ui.spinner.hide();
|
ui.spinner.hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function isValidURL(str) {
|
function isValidURL(str) {
|
||||||
var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
|
var pattern = new RegExp('^(https?:\\/\\/)?' + // protocol
|
||||||
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
|
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
|
||||||
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
|
'((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
|
||||||
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
|
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
|
||||||
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
|
'(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
|
||||||
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
|
'(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator
|
||||||
if(!pattern.test(str)) {
|
if (!pattern.test(str)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
//mode
|
||||||
//mode
|
|
||||||
ui.toolbar.mode.click(function () {
|
ui.toolbar.mode.click(function () {
|
||||||
toggleMode();
|
toggleMode();
|
||||||
});
|
});
|
||||||
|
@ -470,51 +502,65 @@ socket.on('online users', function (data) {
|
||||||
if (debug)
|
if (debug)
|
||||||
console.debug(data);
|
console.debug(data);
|
||||||
showStatus(statusType.online, data.count);
|
showStatus(statusType.online, data.count);
|
||||||
$('.other-cursors').html('');
|
$('.other-cursors').children().each(function (key, value) {
|
||||||
for(var i = 0; i < data.users.length; i++) {
|
var found = false;
|
||||||
|
for (var i = 0; i < data.users.length; i++) {
|
||||||
|
var user = data.users[i];
|
||||||
|
if ($(this).attr('id') == user.id)
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
for (var i = 0; i < data.users.length; i++) {
|
||||||
var user = data.users[i];
|
var user = data.users[i];
|
||||||
if(user.id != socket.id)
|
if (user.id != socket.id)
|
||||||
buildCursor(user.id, user.color, user.cursor);
|
buildCursor(user.id, user.color, user.cursor);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
socket.on('cursor focus', function (data) {
|
socket.on('cursor focus', function (data) {
|
||||||
if(debug)
|
if (debug)
|
||||||
console.debug(data);
|
console.debug(data);
|
||||||
var cursor = $('#' + data.id);
|
var cursor = $('#' + data.id);
|
||||||
if(cursor.length > 0) {
|
if (cursor.length > 0) {
|
||||||
cursor.fadeIn();
|
cursor.fadeIn();
|
||||||
} else {
|
} else {
|
||||||
if(data.id != socket.id)
|
if (data.id != socket.id)
|
||||||
buildCursor(data.id, data.color, data.cursor);
|
buildCursor(data.id, data.color, data.cursor);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
socket.on('cursor activity', function (data) {
|
socket.on('cursor activity', function (data) {
|
||||||
if(debug)
|
if (debug)
|
||||||
console.debug(data);
|
console.debug(data);
|
||||||
if(data.id != socket.id)
|
if (data.id != socket.id)
|
||||||
buildCursor(data.id, data.color, data.cursor);
|
buildCursor(data.id, data.color, data.cursor);
|
||||||
});
|
});
|
||||||
socket.on('cursor blur', function (data) {
|
socket.on('cursor blur', function (data) {
|
||||||
if(debug)
|
if (debug)
|
||||||
console.debug(data);
|
console.debug(data);
|
||||||
var cursor = $('#' + data.id);
|
var cursor = $('#' + data.id);
|
||||||
if(cursor.length > 0) {
|
if (cursor.length > 0) {
|
||||||
cursor.fadeOut();
|
cursor.fadeOut();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function emitUserStatus() {
|
function emitUserStatus() {
|
||||||
checkIfAuth(
|
checkIfAuth(
|
||||||
function (data) {
|
function (data) {
|
||||||
socket.emit('user status', {login:true});
|
socket.emit('user status', {
|
||||||
|
login: true
|
||||||
|
});
|
||||||
},
|
},
|
||||||
function () {
|
function () {
|
||||||
socket.emit('user status', {login:false});
|
socket.emit('user status', {
|
||||||
|
login: false
|
||||||
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildCursor(id, color, pos) {
|
function buildCursor(id, color, pos) {
|
||||||
if(!pos) return;
|
if (!pos) return;
|
||||||
if ($('.other-cursors').length <= 0) {
|
if ($('.other-cursors').length <= 0) {
|
||||||
$("<div class='other-cursors'>").insertAfter('.CodeMirror-cursors');
|
$("<div class='other-cursors'>").insertAfter('.CodeMirror-cursors');
|
||||||
}
|
}
|
||||||
|
@ -535,7 +581,10 @@ function buildCursor(id, color, pos) {
|
||||||
cursor.attr('data-line', pos.line);
|
cursor.attr('data-line', pos.line);
|
||||||
cursor.attr('data-ch', pos.ch);
|
cursor.attr('data-ch', pos.ch);
|
||||||
var coord = editor.charCoords(pos, 'windows');
|
var coord = editor.charCoords(pos, 'windows');
|
||||||
cursor.stop(true).css('opacity', 1).animate({"left":coord.left, "top":coord.top}, cursorAnimatePeriod);
|
cursor.stop(true).css('opacity', 1).animate({
|
||||||
|
"left": coord.left,
|
||||||
|
"top": coord.top
|
||||||
|
}, cursorAnimatePeriod);
|
||||||
//cursor[0].style.left = coord.left + 'px';
|
//cursor[0].style.left = coord.left + 'px';
|
||||||
//cursor[0].style.top = coord.top + 'px';
|
//cursor[0].style.top = coord.top + 'px';
|
||||||
cursor[0].style.height = '18px';
|
cursor[0].style.height = '18px';
|
||||||
|
@ -566,6 +615,7 @@ editor.on('cursorActivity', function (cm) {
|
||||||
clearTimeout(cursorActivityTimer);
|
clearTimeout(cursorActivityTimer);
|
||||||
cursorActivityTimer = setTimeout(cursorActivity, cursorActivityDelay);
|
cursorActivityTimer = setTimeout(cursorActivity, cursorActivityDelay);
|
||||||
});
|
});
|
||||||
|
|
||||||
function cursorActivity() {
|
function cursorActivity() {
|
||||||
socket.emit('cursor activity', editor.getCursor());
|
socket.emit('cursor activity', editor.getCursor());
|
||||||
}
|
}
|
||||||
|
@ -578,8 +628,9 @@ function saveInfo() {
|
||||||
var top = $(document.body).scrollTop();
|
var top = $(document.body).scrollTop();
|
||||||
switch (currentMode) {
|
switch (currentMode) {
|
||||||
case modeType.edit:
|
case modeType.edit:
|
||||||
lastInfo.edit.scroll.left = left;
|
//lastInfo.edit.scroll.left = left;
|
||||||
lastInfo.edit.scroll.top = top;
|
//lastInfo.edit.scroll.top = top;
|
||||||
|
lastInfo.edit.scroll = editor.getScrollInfo();
|
||||||
break;
|
break;
|
||||||
case modeType.view:
|
case modeType.view:
|
||||||
lastInfo.view.scroll.left = left;
|
lastInfo.view.scroll.left = left;
|
||||||
|
@ -603,8 +654,12 @@ function restoreInfo() {
|
||||||
|
|
||||||
switch (currentMode) {
|
switch (currentMode) {
|
||||||
case modeType.edit:
|
case modeType.edit:
|
||||||
$(document.body).scrollLeft(lastInfo.edit.scroll.left);
|
//$(document.body).scrollLeft(lastInfo.edit.scroll.left);
|
||||||
$(document.body).scrollTop(lastInfo.edit.scroll.top);
|
//$(document.body).scrollTop(lastInfo.edit.scroll.top);
|
||||||
|
var left = lastInfo.edit.scroll.left;
|
||||||
|
var top = lastInfo.edit.scroll.top;
|
||||||
|
editor.scrollIntoView();
|
||||||
|
editor.scrollTo(left, top);
|
||||||
break;
|
break;
|
||||||
case modeType.view:
|
case modeType.view:
|
||||||
$(document.body).scrollLeft(lastInfo.view.scroll.left);
|
$(document.body).scrollLeft(lastInfo.view.scroll.left);
|
||||||
|
@ -652,9 +707,8 @@ function updateView() {
|
||||||
finishView(ui.area.view);
|
finishView(ui.area.view);
|
||||||
writeHistory(ui.area.markdown);
|
writeHistory(ui.area.markdown);
|
||||||
isDirty = false;
|
isDirty = false;
|
||||||
// reset lines mapping cache on content update
|
|
||||||
scrollMap = null;
|
|
||||||
emitUserStatus();
|
emitUserStatus();
|
||||||
|
clearMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
function partialUpdate(src, tar, des) {
|
function partialUpdate(src, tar, des) {
|
||||||
|
@ -702,7 +756,7 @@ function partialUpdate(src, tar, des) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//tar end
|
//tar end
|
||||||
for (var i = 1; i <= tar.length; i++) {
|
for (var i = 1; i <= tar.length + 1; i++) {
|
||||||
var srcLength = src.length;
|
var srcLength = src.length;
|
||||||
var tarLength = tar.length;
|
var tarLength = tar.length;
|
||||||
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
||||||
|
@ -715,7 +769,7 @@ function partialUpdate(src, tar, des) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//src end
|
//src end
|
||||||
for (var i = 1; i <= src.length; i++) {
|
for (var i = 1; i <= src.length + 1; i++) {
|
||||||
var srcLength = src.length;
|
var srcLength = src.length;
|
||||||
var tarLength = tar.length;
|
var tarLength = tar.length;
|
||||||
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
||||||
|
@ -730,56 +784,75 @@ function partialUpdate(src, tar, des) {
|
||||||
//check if tar end overlap tar start
|
//check if tar end overlap tar start
|
||||||
var overlap = 0;
|
var overlap = 0;
|
||||||
for (var i = start; i >= 0; i--) {
|
for (var i = start; i >= 0; i--) {
|
||||||
var rawTarStart = cloneAndRemoveDataAttr(tar[i-1]);
|
var rawTarStart = cloneAndRemoveDataAttr(tar[i - 1]);
|
||||||
var rawTarEnd = cloneAndRemoveDataAttr(tar[tarEnd+1+start-i]);
|
var rawTarEnd = cloneAndRemoveDataAttr(tar[tarEnd + 1 + start - i]);
|
||||||
if(rawTarStart && rawTarEnd && rawTarStart.outerHTML == rawTarEnd.outerHTML)
|
if (rawTarStart && rawTarEnd && rawTarStart.outerHTML == rawTarEnd.outerHTML)
|
||||||
overlap++;
|
overlap++;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(debug)
|
if (debug)
|
||||||
console.log('overlap:' + overlap);
|
console.log('overlap:' + overlap);
|
||||||
//show diff content
|
//show diff content
|
||||||
if(debug) {
|
if (debug) {
|
||||||
console.log('start:' + start);
|
console.log('start:' + start);
|
||||||
console.log('tarEnd:' + tarEnd);
|
console.log('tarEnd:' + tarEnd);
|
||||||
console.log('srcEnd:' + srcEnd);
|
console.log('srcEnd:' + srcEnd);
|
||||||
console.log('des[start]:' + des[start]);
|
|
||||||
}
|
}
|
||||||
tarEnd += overlap;
|
tarEnd += overlap;
|
||||||
srcEnd += overlap;
|
srcEnd += overlap;
|
||||||
//add new element
|
var repeatAdd = (start - srcEnd) < (start - tarEnd);
|
||||||
var newElements = "";
|
var repeatDiff = Math.abs(srcEnd - tarEnd) - 1;
|
||||||
for (var j = start; j <= srcEnd; j++) {
|
//push new elements
|
||||||
if(debug)
|
var newElements = [];
|
||||||
srcChanged += src[j].outerHTML;
|
if(srcEnd >= start) {
|
||||||
newElements += src[j].outerHTML;
|
for (var j = start; j <= srcEnd; j++) {
|
||||||
|
if (!src[j]) continue;
|
||||||
|
newElements.push(src[j].outerHTML);
|
||||||
|
}
|
||||||
|
} else if(repeatAdd) {
|
||||||
|
for (var j = srcEnd - repeatDiff; j <= srcEnd; j++) {
|
||||||
|
if (!des[j]) continue;
|
||||||
|
newElements.push(des[j].outerHTML);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(newElements && des[start]) {
|
//push remove elements
|
||||||
$(newElements).insertBefore(des[start]);
|
var removeElements = [];
|
||||||
} else {
|
if(tarEnd >= start) {
|
||||||
$(newElements).insertAfter(des[des.length-1]);
|
for (var j = start; j <= tarEnd; j++) {
|
||||||
|
if (!des[j]) continue;
|
||||||
|
removeElements.push(des[j]);
|
||||||
|
}
|
||||||
|
} else if(!repeatAdd) {
|
||||||
|
for (var j = start; j <= start + repeatDiff; j++) {
|
||||||
|
if (!des[j]) continue;
|
||||||
|
removeElements.push(des[j]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(debug)
|
//add elements
|
||||||
console.log(srcChanged);
|
if (debug) {
|
||||||
//remove old element
|
console.log('ADD ELEMENTS');
|
||||||
if(debug)
|
console.log(newElements.join('\n'));
|
||||||
var tarChanged = "";
|
|
||||||
for (var j = start; j <= tarEnd; j++) {
|
|
||||||
if(debug)
|
|
||||||
tarChanged += tar[j].outerHTML;
|
|
||||||
if(des[j])
|
|
||||||
des[j].remove();
|
|
||||||
}
|
}
|
||||||
if(debug) {
|
if (des[start])
|
||||||
console.log(tarChanged);
|
$(newElements.join('')).insertBefore(des[start]);
|
||||||
var srcChanged = "";
|
else
|
||||||
|
$(newElements.join('')).insertAfter(des[start - 1]);
|
||||||
|
//remove elements
|
||||||
|
if (debug)
|
||||||
|
console.log('REMOVE ELEMENTS');
|
||||||
|
for (var j = 0; j < removeElements.length; j++) {
|
||||||
|
if (debug) {
|
||||||
|
console.log(removeElements[j].outerHTML);
|
||||||
|
}
|
||||||
|
if (removeElements[j])
|
||||||
|
removeElements[j].remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function cloneAndRemoveDataAttr(el) {
|
function cloneAndRemoveDataAttr(el) {
|
||||||
if(!el) return;
|
if (!el) return;
|
||||||
var rawEl = $(el).clone(true)[0];
|
var rawEl = $(el).clone(true)[0];
|
||||||
rawEl.removeAttribute('data-startline');
|
rawEl.removeAttribute('data-startline');
|
||||||
rawEl.removeAttribute('data-endline');
|
rawEl.removeAttribute('data-endline');
|
||||||
|
@ -790,151 +863,3 @@ function copyAttribute(src, des, attr) {
|
||||||
if (src && src.getAttribute(attr) && des)
|
if (src && src.getAttribute(attr) && des)
|
||||||
des.setAttribute(attr, src.getAttribute(attr));
|
des.setAttribute(attr, src.getAttribute(attr));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Inject line numbers for sync scroll. Notes:
|
|
||||||
//
|
|
||||||
// - We track only headings and paragraphs on first level. That's enougth.
|
|
||||||
// - Footnotes content causes jumps. Level limit filter it automatically.
|
|
||||||
//
|
|
||||||
md.renderer.rules.paragraph_open = function (tokens, idx) {
|
|
||||||
var line;
|
|
||||||
if (tokens[idx].lines && tokens[idx].level === 0) {
|
|
||||||
var startline = tokens[idx].lines[0] + 1;
|
|
||||||
var endline = tokens[idx].lines[1];
|
|
||||||
return '<p class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
};
|
|
||||||
|
|
||||||
md.renderer.rules.heading_open = function (tokens, idx) {
|
|
||||||
var line;
|
|
||||||
if (tokens[idx].lines && tokens[idx].level === 0) {
|
|
||||||
var startline = tokens[idx].lines[0] + 1;
|
|
||||||
var endline = tokens[idx].lines[1];
|
|
||||||
return '<h' + tokens[idx].hLevel + ' class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
|
|
||||||
}
|
|
||||||
return '<h' + tokens[idx].hLevel + '>';
|
|
||||||
};
|
|
||||||
|
|
||||||
editor.on('scroll', _.debounce(syncScrollToView, syncScrollDelay));
|
|
||||||
//ui.area.view.on('scroll', _.debounce(syncScrollToEdit, 50));
|
|
||||||
var scrollMap;
|
|
||||||
// Build offsets for each line (lines can be wrapped)
|
|
||||||
// That's a bit dirty to process each line everytime, but ok for demo.
|
|
||||||
// Optimizations are required only for big texts.
|
|
||||||
function buildScrollMap() {
|
|
||||||
var i, offset, nonEmptyList, pos, a, b, lineHeightMap, linesCount,
|
|
||||||
acc, sourceLikeDiv, textarea = ui.area.codemirror,
|
|
||||||
_scrollMap;
|
|
||||||
|
|
||||||
sourceLikeDiv = $('<div />').css({
|
|
||||||
position: 'absolute',
|
|
||||||
visibility: 'hidden',
|
|
||||||
height: 'auto',
|
|
||||||
width: editor.getScrollInfo().clientWidth,
|
|
||||||
'font-size': textarea.css('font-size'),
|
|
||||||
'font-family': textarea.css('font-family'),
|
|
||||||
'line-height': textarea.css('line-height'),
|
|
||||||
'white-space': textarea.css('white-space')
|
|
||||||
}).appendTo('body');
|
|
||||||
|
|
||||||
offset = ui.area.view.scrollTop() - ui.area.view.offset().top;
|
|
||||||
_scrollMap = [];
|
|
||||||
nonEmptyList = [];
|
|
||||||
lineHeightMap = [];
|
|
||||||
|
|
||||||
acc = 0;
|
|
||||||
editor.getValue().split('\n').forEach(function (str) {
|
|
||||||
var h, lh;
|
|
||||||
|
|
||||||
lineHeightMap.push(acc);
|
|
||||||
|
|
||||||
if (str.length === 0) {
|
|
||||||
acc++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceLikeDiv.text(str);
|
|
||||||
h = parseFloat(sourceLikeDiv.css('height'));
|
|
||||||
lh = parseFloat(sourceLikeDiv.css('line-height'));
|
|
||||||
acc += Math.round(h / lh);
|
|
||||||
});
|
|
||||||
sourceLikeDiv.remove();
|
|
||||||
lineHeightMap.push(acc);
|
|
||||||
linesCount = acc;
|
|
||||||
|
|
||||||
for (i = 0; i < linesCount; i++) {
|
|
||||||
_scrollMap.push(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
nonEmptyList.push(0);
|
|
||||||
_scrollMap[0] = 0;
|
|
||||||
|
|
||||||
ui.area.markdown.find('.part').each(function (n, el) {
|
|
||||||
var $el = $(el),
|
|
||||||
t = $el.data('startline');
|
|
||||||
if (t === '') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
t = lineHeightMap[t];
|
|
||||||
if (t !== 0) {
|
|
||||||
nonEmptyList.push(t);
|
|
||||||
}
|
|
||||||
_scrollMap[t] = Math.round($el.offset().top + offset);
|
|
||||||
});
|
|
||||||
|
|
||||||
nonEmptyList.push(linesCount);
|
|
||||||
_scrollMap[linesCount] = ui.area.view[0].scrollHeight;
|
|
||||||
|
|
||||||
pos = 0;
|
|
||||||
for (i = 1; i < linesCount; i++) {
|
|
||||||
if (_scrollMap[i] !== -1) {
|
|
||||||
pos++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
a = nonEmptyList[pos];
|
|
||||||
b = nonEmptyList[pos + 1];
|
|
||||||
_scrollMap[i] = Math.round((_scrollMap[b] * (i - a) + _scrollMap[a] * (b - i)) / (b - a));
|
|
||||||
}
|
|
||||||
|
|
||||||
return _scrollMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
function syncScrollToView() {
|
|
||||||
var lineNo, posTo;
|
|
||||||
var scrollInfo = editor.getScrollInfo();
|
|
||||||
if (!scrollMap) {
|
|
||||||
scrollMap = buildScrollMap();
|
|
||||||
}
|
|
||||||
lineNo = Math.floor(scrollInfo.top / editor.defaultTextHeight());
|
|
||||||
posTo = scrollMap[lineNo];
|
|
||||||
ui.area.view.stop(true).animate({scrollTop: posTo}, scrollAnimatePeriod);
|
|
||||||
}
|
|
||||||
|
|
||||||
function syncScrollToEdit() {
|
|
||||||
var lineNo, posTo;
|
|
||||||
if (!scrollMap) {
|
|
||||||
scrollMap = buildScrollMap();
|
|
||||||
}
|
|
||||||
var top = ui.area.view.scrollTop();
|
|
||||||
lineNo = closestIndex(top, scrollMap);
|
|
||||||
posTo = lineNo * editor.defaultTextHeight();
|
|
||||||
editor.scrollTo(0, posTo);
|
|
||||||
}
|
|
||||||
|
|
||||||
function closestIndex(num, arr) {
|
|
||||||
var curr = arr[0];
|
|
||||||
var index = 0;
|
|
||||||
var diff = Math.abs(num - curr);
|
|
||||||
for (var val = 0; val < arr.length; val++) {
|
|
||||||
var newdiff = Math.abs(num - arr[val]);
|
|
||||||
if (newdiff < diff) {
|
|
||||||
diff = newdiff;
|
|
||||||
curr = arr[val];
|
|
||||||
index = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
9
public/js/pretty.js
Normal file
9
public/js/pretty.js
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
var raw = $(".markdown-body").text();
|
||||||
|
var markdown = LZString.decompressFromBase64(raw);
|
||||||
|
var result = postProcess(md.render(markdown));
|
||||||
|
var markdown = $(".markdown-body");
|
||||||
|
markdown.html(result);
|
||||||
|
markdown.show();
|
||||||
|
finishView(markdown);
|
||||||
|
autoLinkify(markdown);
|
||||||
|
scrollToHash();
|
327
public/js/syncscroll.js
Normal file
327
public/js/syncscroll.js
Normal file
|
@ -0,0 +1,327 @@
|
||||||
|
//
|
||||||
|
// Inject line numbers for sync scroll. Notes:
|
||||||
|
//
|
||||||
|
// - We track only headings and paragraphs on first level. That's enougth.
|
||||||
|
// - Footnotes content causes jumps. Level limit filter it automatically.
|
||||||
|
//
|
||||||
|
md.renderer.rules.blockquote_open = function (tokens, idx /*, options, env */ ) {
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<blockquote class="part" data-startline="' + startline + '" data-endline="' + endline + '">\n';
|
||||||
|
}
|
||||||
|
return '<blockquote>\n';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.table_open = function (tokens, idx /*, options, env */ ) {
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<table class="part" data-startline="' + startline + '" data-endline="' + endline + '">\n';
|
||||||
|
}
|
||||||
|
return '<table>\n';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.bullet_list_open = function (tokens, idx /*, options, env */ ) {
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<ul class="part" data-startline="' + startline + '" data-endline="' + endline + '">\n';
|
||||||
|
}
|
||||||
|
return '<ul>\n';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.ordered_list_open = function (tokens, idx /*, options, env */ ) {
|
||||||
|
var token = tokens[idx];
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<ol class="part" data-startline="' + startline + '" data-endline="' + endline + '"' + (token.order > 1 ? ' start="' + token.order + '"' : '') + '>\n';
|
||||||
|
}
|
||||||
|
return '<ol' + (token.order > 1 ? ' start="' + token.order + '"' : '') + '>\n';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.link_open = function (tokens, idx /*, options, env */ ) {
|
||||||
|
var title = tokens[idx].title ? (' title="' + Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(tokens[idx].title)) + '"') : '';
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<a class="part" data-startline="' + startline + '" data-endline="' + endline + '" href="' + Remarkable.utils.escapeHtml(tokens[idx].href) + '"' + title + '>';
|
||||||
|
}
|
||||||
|
return '<a href="' + Remarkable.utils.escapeHtml(tokens[idx].href) + '"' + title + '>';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.paragraph_open = function (tokens, idx) {
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<p class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.heading_open = function (tokens, idx) {
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<h' + tokens[idx].hLevel + ' class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
|
||||||
|
}
|
||||||
|
return '<h' + tokens[idx].hLevel + '>';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.image = function (tokens, idx, options /*, env */ ) {
|
||||||
|
var src = ' src="' + Remarkable.utils.escapeHtml(tokens[idx].src) + '"';
|
||||||
|
var title = tokens[idx].title ? (' title="' + Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(tokens[idx].title)) + '"') : '';
|
||||||
|
var alt = ' alt="' + (tokens[idx].alt ? Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(tokens[idx].alt)) : '') + '"';
|
||||||
|
var suffix = options.xhtmlOut ? ' /' : '';
|
||||||
|
var image = $('<img' + src + alt + title + suffix + '>');
|
||||||
|
image[0].onload = function (e) {
|
||||||
|
if (viewAjaxCallback)
|
||||||
|
viewAjaxCallback();
|
||||||
|
};
|
||||||
|
return image[0].outerHTML;
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.fence = function (tokens, idx, options, env, self) {
|
||||||
|
var token = tokens[idx];
|
||||||
|
var langClass = '';
|
||||||
|
var langPrefix = options.langPrefix;
|
||||||
|
var langName = '',
|
||||||
|
fenceName;
|
||||||
|
var highlighted;
|
||||||
|
|
||||||
|
if (token.params) {
|
||||||
|
|
||||||
|
//
|
||||||
|
// ```foo bar
|
||||||
|
//
|
||||||
|
// Try custom renderer "foo" first. That will simplify overwrite
|
||||||
|
// for diagrams, latex, and any other fenced block with custom look
|
||||||
|
//
|
||||||
|
|
||||||
|
fenceName = token.params.split(/\s+/g)[0];
|
||||||
|
|
||||||
|
if (Remarkable.utils.has(self.rules.fence_custom, fenceName)) {
|
||||||
|
return self.rules.fence_custom[fenceName](tokens, idx, options, env, self);
|
||||||
|
}
|
||||||
|
|
||||||
|
langName = Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(Remarkable.utils.unescapeMd(fenceName)));
|
||||||
|
langClass = ' class="' + langPrefix + langName + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.highlight) {
|
||||||
|
highlighted = options.highlight(token.content, langName) || Remarkable.utils.escapeHtml(token.content);
|
||||||
|
} else {
|
||||||
|
highlighted = Remarkable.utils.escapeHtml(token.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<pre class="part" data-startline="' + startline + '" data-endline="' + endline + '"><code' + langClass + '>' + highlighted + '</code></pre>' + md.renderer.getBreak(tokens, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<pre><code' + langClass + '>' + highlighted + '</code></pre>' + md.renderer.getBreak(tokens, idx);
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.code = function (tokens, idx /*, options, env */ ) {
|
||||||
|
if (tokens[idx].block) {
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<pre class="part" data-startline="' + startline + '" data-endline="' + endline + '"><code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code></pre>' + md.renderer.getBreak(tokens, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<pre><code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code></pre>' + md.renderer.getBreak(tokens, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<code class="part" data-startline="' + startline + '" data-endline="' + endline + '">' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code>';
|
||||||
|
};
|
||||||
|
|
||||||
|
var viewScrolling = false;
|
||||||
|
var viewScrollingDelay = 200;
|
||||||
|
var viewScrollingTimer = null;
|
||||||
|
|
||||||
|
editor.on('scroll', syncScrollToView);
|
||||||
|
ui.area.view.on('scroll', function () {
|
||||||
|
viewScrolling = true;
|
||||||
|
clearTimeout(viewScrollingTimer);
|
||||||
|
viewScrollingTimer = setTimeout(function () {
|
||||||
|
viewScrolling = false;
|
||||||
|
}, viewScrollingDelay);
|
||||||
|
});
|
||||||
|
//editor.on('scroll', _.debounce(syncScrollToView, syncScrollDelay));
|
||||||
|
//ui.area.view.on('scroll', _.debounce(syncScrollToEdit, 50));
|
||||||
|
|
||||||
|
var scrollMap, lineHeightMap;
|
||||||
|
|
||||||
|
viewAjaxCallback = clearMap;
|
||||||
|
|
||||||
|
function clearMap() {
|
||||||
|
scrollMap = null;
|
||||||
|
lineHeightMap = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build offsets for each line (lines can be wrapped)
|
||||||
|
// That's a bit dirty to process each line everytime, but ok for demo.
|
||||||
|
// Optimizations are required only for big texts.
|
||||||
|
function buildMap() {
|
||||||
|
var i, offset, nonEmptyList, pos, a, b, _lineHeightMap, linesCount,
|
||||||
|
acc, sourceLikeDiv, textarea = ui.area.codemirror,
|
||||||
|
wrap = $('.CodeMirror-wrap pre'),
|
||||||
|
_scrollMap;
|
||||||
|
|
||||||
|
sourceLikeDiv = $('<div />').css({
|
||||||
|
position: 'absolute',
|
||||||
|
visibility: 'hidden',
|
||||||
|
height: 'auto',
|
||||||
|
width: wrap.width(),
|
||||||
|
padding: wrap.css('padding'),
|
||||||
|
margin: wrap.css('margin'),
|
||||||
|
'font-size': textarea.css('font-size'),
|
||||||
|
'font-family': textarea.css('font-family'),
|
||||||
|
'line-height': textarea.css('line-height'),
|
||||||
|
'word-wrap': wrap.css('word-wrap'),
|
||||||
|
'white-space': wrap.css('white-space'),
|
||||||
|
'word-break': wrap.css('word-break')
|
||||||
|
}).appendTo('body');
|
||||||
|
|
||||||
|
offset = ui.area.view.scrollTop() - ui.area.view.offset().top;
|
||||||
|
_scrollMap = [];
|
||||||
|
nonEmptyList = [];
|
||||||
|
_lineHeightMap = [];
|
||||||
|
|
||||||
|
acc = 0;
|
||||||
|
editor.getValue().split('\n').forEach(function (str) {
|
||||||
|
var h, lh;
|
||||||
|
|
||||||
|
_lineHeightMap.push(acc);
|
||||||
|
|
||||||
|
if (str.length === 0) {
|
||||||
|
acc++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceLikeDiv.text(str);
|
||||||
|
h = parseFloat(sourceLikeDiv.css('height'));
|
||||||
|
lh = parseFloat(sourceLikeDiv.css('line-height'));
|
||||||
|
acc += Math.round(h / lh);
|
||||||
|
});
|
||||||
|
sourceLikeDiv.remove();
|
||||||
|
_lineHeightMap.push(acc);
|
||||||
|
linesCount = acc;
|
||||||
|
|
||||||
|
for (i = 0; i < linesCount; i++) {
|
||||||
|
_scrollMap.push(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
nonEmptyList.push(0);
|
||||||
|
_scrollMap[0] = 0;
|
||||||
|
|
||||||
|
ui.area.markdown.find('.part').each(function (n, el) {
|
||||||
|
var $el = $(el),
|
||||||
|
t = $el.data('startline') - 1;
|
||||||
|
if (t === '') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
t = _lineHeightMap[t];
|
||||||
|
if (t !== 0) {
|
||||||
|
nonEmptyList.push(t);
|
||||||
|
}
|
||||||
|
_scrollMap[t] = Math.round($el.offset().top + offset);
|
||||||
|
});
|
||||||
|
|
||||||
|
nonEmptyList.push(linesCount);
|
||||||
|
_scrollMap[linesCount] = ui.area.view[0].scrollHeight;
|
||||||
|
|
||||||
|
pos = 0;
|
||||||
|
for (i = 1; i < linesCount; i++) {
|
||||||
|
if (_scrollMap[i] !== -1) {
|
||||||
|
pos++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = nonEmptyList[pos];
|
||||||
|
b = nonEmptyList[pos + 1];
|
||||||
|
_scrollMap[i] = Math.round((_scrollMap[b] * (i - a) + _scrollMap[a] * (b - i)) / (b - a));
|
||||||
|
}
|
||||||
|
|
||||||
|
_scrollMap[0] = 0;
|
||||||
|
|
||||||
|
scrollMap = _scrollMap;
|
||||||
|
lineHeightMap = _lineHeightMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPartByEditorLineNo(lineNo) {
|
||||||
|
var part = null;
|
||||||
|
ui.area.markdown.find('.part').each(function (n, el) {
|
||||||
|
if (part) return;
|
||||||
|
var $el = $(el),
|
||||||
|
t = $el.data('startline') - 1,
|
||||||
|
f = $el.data('endline') - 1;
|
||||||
|
if (t === '' || f === '') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (lineNo >= t && lineNo <= f) {
|
||||||
|
part = $el;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (part)
|
||||||
|
return {
|
||||||
|
startline: part.data('startline') - 1,
|
||||||
|
endline: part.data('endline') - 1,
|
||||||
|
linediff: Math.abs(part.data('endline') - part.data('startline')) + 1,
|
||||||
|
element: part
|
||||||
|
};
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEditorLineNoByTop(top) {
|
||||||
|
for (var i = 0; i < lineHeightMap.length; i++)
|
||||||
|
if (lineHeightMap[i] * editor.defaultTextHeight() > top)
|
||||||
|
return i;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncScrollToView(_lineNo) {
|
||||||
|
var lineNo, posTo;
|
||||||
|
var scrollInfo = editor.getScrollInfo();
|
||||||
|
if (!scrollMap || !lineHeightMap) {
|
||||||
|
buildMap();
|
||||||
|
}
|
||||||
|
if (typeof _lineNo != "number") {
|
||||||
|
var topDiffPercent, posToNextDiff;
|
||||||
|
var textHeight = editor.defaultTextHeight();
|
||||||
|
lineNo = Math.floor(scrollInfo.top / textHeight);
|
||||||
|
var lineCount = editor.lineCount();
|
||||||
|
var lastLineHeight = editor.getLineHandle(lineCount - 1).height;
|
||||||
|
//if reach last line, then scroll to end
|
||||||
|
if (scrollInfo.top + scrollInfo.clientHeight >= scrollInfo.height - lastLineHeight) {
|
||||||
|
posTo = ui.area.view[0].scrollHeight - ui.area.view.height();
|
||||||
|
} else {
|
||||||
|
topDiffPercent = (scrollInfo.top % textHeight) / textHeight;
|
||||||
|
posTo = scrollMap[lineNo];
|
||||||
|
posToNextDiff = (scrollMap[lineNo + 1] - posTo) * topDiffPercent;
|
||||||
|
posTo += Math.floor(posToNextDiff);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (viewScrolling) return;
|
||||||
|
posTo = scrollMap[lineHeightMap[_lineNo]];
|
||||||
|
}
|
||||||
|
var posDiff = Math.abs(ui.area.view.scrollTop() - posTo);
|
||||||
|
if (posDiff > scrollInfo.clientHeight / 5) {
|
||||||
|
var duration = posDiff / 50;
|
||||||
|
ui.area.view.stop(true).animate({
|
||||||
|
scrollTop: posTo
|
||||||
|
}, duration >= 50 ? duration : 100, "linear");
|
||||||
|
} else {
|
||||||
|
ui.area.view.stop(true).scrollTop(posTo);
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,10 @@
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog input::selection {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
.CodeMirror-dialog button {
|
.CodeMirror-dialog button {
|
||||||
font-size: 70%;
|
font-size: 70%;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
var height = Math.max(bottom - top, 3);
|
var height = Math.max(bottom - top, 3);
|
||||||
|
|
||||||
var elt = frag.appendChild(document.createElement("div"));
|
var elt = frag.appendChild(document.createElement("div"));
|
||||||
elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: "
|
elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth * 2, 2) + "px; top: "
|
||||||
+ (top + this.buttonHeight) + "px; height: " + height + "px";
|
+ (top + this.buttonHeight) + "px; height: " + height + "px";
|
||||||
elt.className = this.options.className;
|
elt.className = this.options.className;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,8 +38,9 @@
|
||||||
|
|
||||||
.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
|
.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background: #bcd;
|
background: #ccc;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
margin: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {
|
.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {
|
||||||
|
|
|
@ -75,14 +75,13 @@
|
||||||
this.screen = clientSize;
|
this.screen = clientSize;
|
||||||
this.total = scrollSize;
|
this.total = scrollSize;
|
||||||
this.size = barSize;
|
this.size = barSize;
|
||||||
|
|
||||||
var buttonSize = this.screen * (this.size / this.total);
|
var buttonSize = this.screen * (this.size / this.total);
|
||||||
if (buttonSize < minButtonSize) {
|
if (buttonSize < minButtonSize) {
|
||||||
this.size -= minButtonSize - buttonSize;
|
this.size -= minButtonSize - buttonSize;
|
||||||
buttonSize = minButtonSize;
|
buttonSize = minButtonSize;
|
||||||
}
|
}
|
||||||
this.inner.style[this.orientation == "horizontal" ? "width" : "height"] =
|
this.inner.style[this.orientation == "horizontal" ? "width" : "height"] =
|
||||||
buttonSize + "px";
|
(buttonSize - 4) + "px";
|
||||||
this.inner.style[this.orientation == "horizontal" ? "left" : "top"] =
|
this.inner.style[this.orientation == "horizontal" ? "left" : "top"] =
|
||||||
this.pos * (this.size / this.total) + "px";
|
this.pos * (this.size / this.total) + "px";
|
||||||
};
|
};
|
||||||
|
|
|
@ -118,7 +118,7 @@
|
||||||
var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
|
var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
|
||||||
function replace(cm, all) {
|
function replace(cm, all) {
|
||||||
if (cm.getOption("readOnly")) return;
|
if (cm.getOption("readOnly")) return;
|
||||||
var query = cm.getSelection() || getSearchState().lastQuery;
|
var query = cm.getSelection() || getSearchState(cm).lastQuery;
|
||||||
dialog(cm, replaceQueryDialog, "Replace:", query, function(query) {
|
dialog(cm, replaceQueryDialog, "Replace:", query, function(query) {
|
||||||
if (!query) return;
|
if (!query) return;
|
||||||
query = parseQuery(query);
|
query = parseQuery(query);
|
||||||
|
@ -128,8 +128,8 @@
|
||||||
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
|
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
|
||||||
if (typeof query != "string") {
|
if (typeof query != "string") {
|
||||||
var match = cm.getRange(cursor.from(), cursor.to()).match(query);
|
var match = cm.getRange(cursor.from(), cursor.to()).match(query);
|
||||||
cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
|
cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}), "+input");
|
||||||
} else cursor.replace(text);
|
} else cursor.replace(text, "+input");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,7 +149,7 @@
|
||||||
};
|
};
|
||||||
var doReplace = function(match) {
|
var doReplace = function(match) {
|
||||||
cursor.replace(typeof query == "string" ? text :
|
cursor.replace(typeof query == "string" ? text :
|
||||||
text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
|
text.replace(/\$(\d)/g, function(_, i) {return match[i];}), "+input");
|
||||||
advance();
|
advance();
|
||||||
};
|
};
|
||||||
advance();
|
advance();
|
||||||
|
|
18
public/vendor/codemirror/codemirror.min.js
vendored
18
public/vendor/codemirror/codemirror.min.js
vendored
File diff suppressed because one or more lines are too long
12
public/vendor/codemirror/compress.sh
vendored
12
public/vendor/codemirror/compress.sh
vendored
|
@ -2,12 +2,21 @@ uglifyjs --compress --mangle --output codemirror.min.js \
|
||||||
lib/codemirror.js \
|
lib/codemirror.js \
|
||||||
addon/mode/overlay.js \
|
addon/mode/overlay.js \
|
||||||
addon/selection/active-line.js \
|
addon/selection/active-line.js \
|
||||||
|
addon/search/searchcursor.js \
|
||||||
|
addon/search/search.js \
|
||||||
|
addon/search/matchesonscrollbar.js \
|
||||||
|
addon/scroll/simplescrollbars.js \
|
||||||
|
addon/scroll/annotatescrollbar.js \
|
||||||
|
addon/dialog/dialog.js \
|
||||||
addon/edit/matchbrackets.js \
|
addon/edit/matchbrackets.js \
|
||||||
addon/edit/closebrackets.js \
|
addon/edit/closebrackets.js \
|
||||||
addon/edit/matchtags.js \
|
addon/edit/matchtags.js \
|
||||||
addon/edit/closetag.js \
|
addon/edit/closetag.js \
|
||||||
addon/edit/continuelist.js \
|
addon/edit/continuelist.js \
|
||||||
|
addon/comment/comment.js \
|
||||||
|
addon/wrap/hardwrap.js \
|
||||||
addon/fold/foldcode.js \
|
addon/fold/foldcode.js \
|
||||||
|
addon/fold/brace-fold.js \
|
||||||
addon/fold/foldgutter.js \
|
addon/fold/foldgutter.js \
|
||||||
addon/fold/markdown-fold.js \
|
addon/fold/markdown-fold.js \
|
||||||
addon/fold/xml-fold.js \
|
addon/fold/xml-fold.js \
|
||||||
|
@ -19,4 +28,5 @@ mode/css/css.js \
|
||||||
mode/htmlmixed/htmlmixed.js \
|
mode/htmlmixed/htmlmixed.js \
|
||||||
mode/clike/clike.js \
|
mode/clike/clike.js \
|
||||||
mode/clojure/clojure.js \
|
mode/clojure/clojure.js \
|
||||||
mode/ruby/ruby.js
|
mode/ruby/ruby.js \
|
||||||
|
keymap/sublime.js
|
12
public/vendor/codemirror/keymap/sublime.js
vendored
12
public/vendor/codemirror/keymap/sublime.js
vendored
|
@ -258,7 +258,7 @@
|
||||||
var actual = line - offset;
|
var actual = line - offset;
|
||||||
if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);
|
if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);
|
||||||
if (actual < cm.lastLine()) {
|
if (actual < cm.lastLine()) {
|
||||||
cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length));
|
cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length), "+joinLines");
|
||||||
++offset;
|
++offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,9 +274,9 @@
|
||||||
for (var i = 0; i < rangeCount; i++) {
|
for (var i = 0; i < rangeCount; i++) {
|
||||||
var range = cm.listSelections()[i];
|
var range = cm.listSelections()[i];
|
||||||
if (range.empty())
|
if (range.empty())
|
||||||
cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));
|
cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0), null, "+duplicateLine");
|
||||||
else
|
else
|
||||||
cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());
|
cm.replaceRange(cm.getRange(range.from(), range.to()), range.from(), null, "+duplicateLine");
|
||||||
}
|
}
|
||||||
cm.scrollIntoView();
|
cm.scrollIntoView();
|
||||||
});
|
});
|
||||||
|
@ -311,7 +311,7 @@
|
||||||
if (au != bu) { a = au; b = bu; }
|
if (au != bu) { a = au; b = bu; }
|
||||||
return a < b ? -1 : a == b ? 0 : 1;
|
return a < b ? -1 : a == b ? 0 : 1;
|
||||||
});
|
});
|
||||||
cm.replaceRange(lines, start, end);
|
cm.replaceRange(lines, start, end, "+sortLines");
|
||||||
if (selected) ranges.push({anchor: start, head: end});
|
if (selected) ranges.push({anchor: start, head: end});
|
||||||
}
|
}
|
||||||
if (selected) cm.setSelections(ranges, 0);
|
if (selected) cm.setSelections(ranges, 0);
|
||||||
|
@ -402,7 +402,7 @@
|
||||||
if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;
|
if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;
|
||||||
var word = wordAt(cm, range.head);
|
var word = wordAt(cm, range.head);
|
||||||
at = word.from;
|
at = word.from;
|
||||||
cm.replaceRange(mod(word.word), word.from, word.to);
|
cm.replaceRange(mod(word.word), word.from, word.to, "case");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -452,7 +452,7 @@
|
||||||
var from = cm.getCursor(), to = found;
|
var from = cm.getCursor(), to = found;
|
||||||
if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }
|
if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }
|
||||||
cm.state.sublimeKilled = cm.getRange(from, to);
|
cm.state.sublimeKilled = cm.getRange(from, to);
|
||||||
cm.replaceRange("", from, to);
|
cm.replaceRange("", from, to, "+delete");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
cmds[map[cK + ctrl + "X"] = "swapWithSublimeMark"] = function(cm) {
|
cmds[map[cK + ctrl + "X"] = "swapWithSublimeMark"] = function(cm) {
|
||||||
|
|
6
public/vendor/gist-embed.js
vendored
6
public/vendor/gist-embed.js
vendored
|
@ -25,7 +25,7 @@
|
||||||
return lineNumbers;
|
return lineNumbers;
|
||||||
}
|
}
|
||||||
|
|
||||||
$.fn.gist = function() {
|
$.fn.gist = function(callback) {
|
||||||
return this.each(function() {
|
return this.each(function() {
|
||||||
var $elem = $(this),
|
var $elem = $(this),
|
||||||
id,
|
id,
|
||||||
|
@ -165,6 +165,10 @@
|
||||||
},
|
},
|
||||||
error: function(jqXHR, textStatus) {
|
error: function(jqXHR, textStatus) {
|
||||||
$elem.html('Failed loading gist ' + url + ': ' + textStatus);
|
$elem.html('Failed loading gist ' + url + ': ' + textStatus);
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
if(callback)
|
||||||
|
callback();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
95
public/vendor/inlineAttachment/codemirror.inline-attachment.js
vendored
Executable file
95
public/vendor/inlineAttachment/codemirror.inline-attachment.js
vendored
Executable file
|
@ -0,0 +1,95 @@
|
||||||
|
/*jslint newcap: true */
|
||||||
|
/*global inlineAttachment: false */
|
||||||
|
/**
|
||||||
|
* CodeMirror version for inlineAttachment
|
||||||
|
*
|
||||||
|
* Call inlineAttachment.attach(editor) to attach to a codemirror instance
|
||||||
|
*/
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var codeMirrorEditor = function(instance) {
|
||||||
|
|
||||||
|
if (!instance.getWrapperElement) {
|
||||||
|
throw "Invalid CodeMirror object given";
|
||||||
|
}
|
||||||
|
|
||||||
|
this.codeMirror = instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
codeMirrorEditor.prototype.getValue = function() {
|
||||||
|
return this.codeMirror.getValue();
|
||||||
|
};
|
||||||
|
|
||||||
|
codeMirrorEditor.prototype.insertValue = function(val) {
|
||||||
|
this.codeMirror.replaceSelection(val);
|
||||||
|
};
|
||||||
|
|
||||||
|
codeMirrorEditor.prototype.setValue = function(val) {
|
||||||
|
var cursor = this.codeMirror.getCursor();
|
||||||
|
this.codeMirror.setValue(val);
|
||||||
|
this.codeMirror.setCursor(cursor);
|
||||||
|
};
|
||||||
|
|
||||||
|
codeMirrorEditor.prototype.replaceRange = function(val) {
|
||||||
|
this.codeMirror.replaceRange(val.replacement, val.from, val.to, "+input");
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attach InlineAttachment to CodeMirror
|
||||||
|
*
|
||||||
|
* @param {CodeMirror} codeMirror
|
||||||
|
*/
|
||||||
|
codeMirrorEditor.attach = function(codeMirror, options) {
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
var editor = new codeMirrorEditor(codeMirror),
|
||||||
|
inlineattach = new inlineAttachment(options, editor),
|
||||||
|
el = codeMirror.getWrapperElement();
|
||||||
|
|
||||||
|
el.addEventListener('paste', function(e) {
|
||||||
|
inlineattach.onPaste(e);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
codeMirror.setOption('onDragEvent', function(data, e) {
|
||||||
|
if (e.type === "drop") {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
return inlineattach.onDrop(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
inlineAttachment.editors.codemirror3 = codeMirrorEditor;
|
||||||
|
|
||||||
|
var codeMirrorEditor4 = function(instance) {
|
||||||
|
codeMirrorEditor.call(this, instance);
|
||||||
|
};
|
||||||
|
|
||||||
|
codeMirrorEditor4.attach = function(codeMirror, options) {
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
var editor = new codeMirrorEditor(codeMirror),
|
||||||
|
inlineattach = new inlineAttachment(options, editor),
|
||||||
|
el = codeMirror.getWrapperElement();
|
||||||
|
|
||||||
|
el.addEventListener('paste', function(e) {
|
||||||
|
inlineattach.onPaste(e);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
codeMirror.on('drop', function(data, e) {
|
||||||
|
if (inlineattach.onDrop(e)) {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
inlineAttachment.editors.codemirror4 = codeMirrorEditor4;
|
||||||
|
|
||||||
|
})();
|
435
public/vendor/inlineAttachment/inline-attachment.js
vendored
Executable file
435
public/vendor/inlineAttachment/inline-attachment.js
vendored
Executable file
|
@ -0,0 +1,435 @@
|
||||||
|
/*jslint newcap: true */
|
||||||
|
/*global XMLHttpRequest: false, FormData: false */
|
||||||
|
/*
|
||||||
|
* Inline Text Attachment
|
||||||
|
*
|
||||||
|
* Author: Roy van Kaathoven
|
||||||
|
* Contact: ik@royvankaathoven.nl
|
||||||
|
*/
|
||||||
|
(function(document, window) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var inlineAttachment = function(options, instance) {
|
||||||
|
this.settings = inlineAttachment.util.merge(options, inlineAttachment.defaults);
|
||||||
|
this.editor = instance;
|
||||||
|
this.filenameTag = '{filename}';
|
||||||
|
this.lastValue = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will holds the available editors
|
||||||
|
*
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
inlineAttachment.editors = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility functions
|
||||||
|
*/
|
||||||
|
inlineAttachment.util = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple function to merge the given objects
|
||||||
|
*
|
||||||
|
* @param {Object[]} object Multiple object parameters
|
||||||
|
* @returns {Object}
|
||||||
|
*/
|
||||||
|
merge: function() {
|
||||||
|
var result = {};
|
||||||
|
for (var i = arguments.length - 1; i >= 0; i--) {
|
||||||
|
var obj = arguments[i];
|
||||||
|
for (var k in obj) {
|
||||||
|
if (obj.hasOwnProperty(k)) {
|
||||||
|
result[k] = obj[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append a line of text at the bottom, ensuring there aren't unnecessary newlines
|
||||||
|
*
|
||||||
|
* @param {String} appended Current content
|
||||||
|
* @param {String} previous Value which should be appended after the current content
|
||||||
|
*/
|
||||||
|
appendInItsOwnLine: function(previous, appended) {
|
||||||
|
return (previous + "\n\n[[D]]" + appended)
|
||||||
|
.replace(/(\n{2,})\[\[D\]\]/, "\n\n")
|
||||||
|
.replace(/^(\n*)/, "");
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts the given value at the current cursor position of the textarea element
|
||||||
|
*
|
||||||
|
* @param {HtmlElement} el
|
||||||
|
* @param {String} value Text which will be inserted at the cursor position
|
||||||
|
*/
|
||||||
|
insertTextAtCursor: function(el, text) {
|
||||||
|
var scrollPos = el.scrollTop,
|
||||||
|
strPos = 0,
|
||||||
|
browser = false,
|
||||||
|
range;
|
||||||
|
|
||||||
|
if ((el.selectionStart || el.selectionStart === '0')) {
|
||||||
|
browser = "ff";
|
||||||
|
} else if (document.selection) {
|
||||||
|
browser = "ie";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (browser === "ie") {
|
||||||
|
el.focus();
|
||||||
|
range = document.selection.createRange();
|
||||||
|
range.moveStart('character', -el.value.length);
|
||||||
|
strPos = range.text.length;
|
||||||
|
} else if (browser === "ff") {
|
||||||
|
strPos = el.selectionStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
var front = (el.value).substring(0, strPos);
|
||||||
|
var back = (el.value).substring(strPos, el.value.length);
|
||||||
|
el.value = front + text + back;
|
||||||
|
strPos = strPos + text.length;
|
||||||
|
if (browser === "ie") {
|
||||||
|
el.focus();
|
||||||
|
range = document.selection.createRange();
|
||||||
|
range.moveStart('character', -el.value.length);
|
||||||
|
range.moveStart('character', strPos);
|
||||||
|
range.moveEnd('character', 0);
|
||||||
|
range.select();
|
||||||
|
} else if (browser === "ff") {
|
||||||
|
el.selectionStart = strPos;
|
||||||
|
el.selectionEnd = strPos;
|
||||||
|
el.focus();
|
||||||
|
}
|
||||||
|
el.scrollTop = scrollPos;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default configuration options
|
||||||
|
*
|
||||||
|
* @type {Object}
|
||||||
|
*/
|
||||||
|
inlineAttachment.defaults = {
|
||||||
|
/**
|
||||||
|
* URL where the file will be send
|
||||||
|
*/
|
||||||
|
uploadUrl: 'uploadimage',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Which method will be used to send the file to the upload URL
|
||||||
|
*/
|
||||||
|
uploadMethod: 'POST',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name in which the file will be placed
|
||||||
|
*/
|
||||||
|
uploadFieldName: 'image',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension which will be used when a file extension could not
|
||||||
|
* be detected
|
||||||
|
*/
|
||||||
|
defualtExtension: 'png',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON field which refers to the uploaded file URL
|
||||||
|
*/
|
||||||
|
jsonFieldName: 'link',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allowed MIME types
|
||||||
|
*/
|
||||||
|
allowedTypes: [
|
||||||
|
'image/jpeg',
|
||||||
|
'image/png',
|
||||||
|
'image/jpg',
|
||||||
|
'image/gif'
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text which will be inserted when dropping or pasting a file.
|
||||||
|
* Acts as a placeholder which will be replaced when the file is done with uploading
|
||||||
|
*/
|
||||||
|
progressText: '![Uploading file...{filename}]()',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When a file has successfully been uploaded the progressText
|
||||||
|
* will be replaced by the urlText, the {filename} tag will be replaced
|
||||||
|
* by the filename that has been returned by the server
|
||||||
|
*/
|
||||||
|
urlText: "![]({filename})",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text which will be used when uploading has failed
|
||||||
|
*/
|
||||||
|
errorText: "Error uploading file",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra parameters which will be send when uploading a file
|
||||||
|
*/
|
||||||
|
extraParams: {},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra headers which will be send when uploading a file
|
||||||
|
*/
|
||||||
|
extraHeaders: {},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Before the file is send
|
||||||
|
*/
|
||||||
|
beforeFileUpload: function() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggers when a file is dropped or pasted
|
||||||
|
*/
|
||||||
|
onFileReceived: function() {},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom upload handler
|
||||||
|
*
|
||||||
|
* @return {Boolean} when false is returned it will prevent default upload behavior
|
||||||
|
*/
|
||||||
|
onFileUploadResponse: function() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom error handler. Runs after removing the placeholder text and before the alert().
|
||||||
|
* Return false from this function to prevent the alert dialog.
|
||||||
|
*
|
||||||
|
* @return {Boolean} when false is returned it will prevent default error behavior
|
||||||
|
*/
|
||||||
|
onFileUploadError: function() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When a file has succesfully been uploaded
|
||||||
|
*/
|
||||||
|
onFileUploaded: function() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads the blob
|
||||||
|
*
|
||||||
|
* @param {Blob} file blob data received from event.dataTransfer object
|
||||||
|
* @return {XMLHttpRequest} request object which sends the file
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.uploadFile = function(file, id) {
|
||||||
|
var me = this,
|
||||||
|
formData = new FormData(),
|
||||||
|
xhr = new XMLHttpRequest(),
|
||||||
|
id = id,
|
||||||
|
settings = this.settings,
|
||||||
|
extension = settings.defualtExtension;
|
||||||
|
|
||||||
|
if (typeof settings.setupFormData === 'function') {
|
||||||
|
settings.setupFormData(formData, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach the file. If coming from clipboard, add a default filename (only works in Chrome for now)
|
||||||
|
// http://stackoverflow.com/questions/6664967/how-to-give-a-blob-uploaded-as-formdata-a-file-name
|
||||||
|
if (file.name) {
|
||||||
|
var fileNameMatches = file.name.match(/\.(.+)$/);
|
||||||
|
if (fileNameMatches) {
|
||||||
|
extension = fileNameMatches[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var remoteFilename = "image-" + Date.now() + "." + extension;
|
||||||
|
if (typeof settings.remoteFilename === 'function') {
|
||||||
|
remoteFilename = settings.remoteFilename(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
formData.append(settings.uploadFieldName, file, remoteFilename);
|
||||||
|
|
||||||
|
// Append the extra parameters to the formdata
|
||||||
|
if (typeof settings.extraParams === "object") {
|
||||||
|
for (var key in settings.extraParams) {
|
||||||
|
if (settings.extraParams.hasOwnProperty(key)) {
|
||||||
|
formData.append(key, settings.extraParams[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xhr.open('POST', settings.uploadUrl);
|
||||||
|
|
||||||
|
// Add any available extra headers
|
||||||
|
if (typeof settings.extraHeaders === "object") {
|
||||||
|
for (var header in settings.extraHeaders) {
|
||||||
|
if (settings.extraHeaders.hasOwnProperty(header)) {
|
||||||
|
xhr.setRequestHeader(header, settings.extraHeaders[header]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xhr.onload = function() {
|
||||||
|
// If HTTP status is OK or Created
|
||||||
|
if (xhr.status === 200 || xhr.status === 201) {
|
||||||
|
me.onFileUploadResponse(xhr, id);
|
||||||
|
} else {
|
||||||
|
me.onFileUploadError(xhr, id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (settings.beforeFileUpload(xhr) !== false) {
|
||||||
|
xhr.send(formData);
|
||||||
|
}
|
||||||
|
return xhr;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if the given file is allowed to handle
|
||||||
|
*
|
||||||
|
* @param {File} clipboard data file
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.isFileAllowed = function(file) {
|
||||||
|
if (this.settings.allowedTypes.indexOf('*') === 0){
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return this.settings.allowedTypes.indexOf(file.type) >= 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles upload response
|
||||||
|
*
|
||||||
|
* @param {XMLHttpRequest} xhr
|
||||||
|
* @return {Void}
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.onFileUploadResponse = function(xhr, id) {
|
||||||
|
if (this.settings.onFileUploadResponse.call(this, xhr) !== false) {
|
||||||
|
var result = JSON.parse(xhr.responseText),
|
||||||
|
filename = result[this.settings.jsonFieldName];
|
||||||
|
|
||||||
|
if (result && filename) {
|
||||||
|
var replacements = [];
|
||||||
|
var string = this.settings.progressText.replace(this.filenameTag, id);
|
||||||
|
var lines = this.editor.getValue().split('\n');
|
||||||
|
var newValue = this.settings.urlText.replace(this.filenameTag, filename);
|
||||||
|
for(var i = 0; i < lines.length; i++) {
|
||||||
|
var ch = lines[i].indexOf(string);
|
||||||
|
if(ch != -1)
|
||||||
|
replacements.push({replacement:newValue, from:{line:i, ch:ch}, to:{line:i, ch:ch + string.length}});
|
||||||
|
}
|
||||||
|
for(var i = 0; i < replacements.length; i++)
|
||||||
|
this.editor.replaceRange(replacements[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a file has failed to upload
|
||||||
|
*
|
||||||
|
* @param {XMLHttpRequest} xhr
|
||||||
|
* @return {Void}
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.onFileUploadError = function(xhr, id) {
|
||||||
|
if (this.settings.onFileUploadError.call(this, xhr) !== false) {
|
||||||
|
var replacements = [];
|
||||||
|
var string = this.settings.progressText.replace(this.filenameTag, id);
|
||||||
|
var lines = this.editor.getValue().split('\n');
|
||||||
|
for(var i = 0; i < lines.length; i++) {
|
||||||
|
var ch = lines[i].indexOf(this.lastValue);
|
||||||
|
if(ch != -1)
|
||||||
|
replacements.push({replacement:"", from:{line:i, ch:ch}, to:{line:i, ch:ch + string.length}});
|
||||||
|
}
|
||||||
|
for(var i = 0; i < replacements.length; i++)
|
||||||
|
this.editor.replaceRange(replacements[i]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a file has been inserted, either by drop or paste
|
||||||
|
*
|
||||||
|
* @param {File} file
|
||||||
|
* @return {Void}
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.onFileInserted = function(file, id) {
|
||||||
|
if (this.settings.onFileReceived.call(this, file) !== false) {
|
||||||
|
this.lastValue = this.settings.progressText.replace(this.filenameTag, id);
|
||||||
|
this.editor.insertValue(this.lastValue);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a paste event occured
|
||||||
|
* @param {Event} e
|
||||||
|
* @return {Boolean} if the event was handled
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.onPaste = function(e) {
|
||||||
|
var result = false,
|
||||||
|
clipboardData = e.clipboardData,
|
||||||
|
items;
|
||||||
|
|
||||||
|
if (typeof clipboardData === "object") {
|
||||||
|
items = clipboardData.items || clipboardData.files || [];
|
||||||
|
|
||||||
|
for (var i = 0; i < items.length; i++) {
|
||||||
|
var item = items[i];
|
||||||
|
if (this.isFileAllowed(item)) {
|
||||||
|
result = true;
|
||||||
|
var id = ID();
|
||||||
|
this.onFileInserted(item.getAsFile(), id);
|
||||||
|
this.uploadFile(item.getAsFile(), id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result) { e.preventDefault(); }
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a drop event occures
|
||||||
|
* @param {Event} e
|
||||||
|
* @return {Boolean} if the event was handled
|
||||||
|
*/
|
||||||
|
inlineAttachment.prototype.onDrop = function(e) {
|
||||||
|
var result = false;
|
||||||
|
for (var i = 0; i < e.dataTransfer.files.length; i++) {
|
||||||
|
var file = e.dataTransfer.files[i];
|
||||||
|
if (this.isFileAllowed(file)) {
|
||||||
|
result = true;
|
||||||
|
var id = ID();
|
||||||
|
this.onFileInserted(file, id);
|
||||||
|
this.uploadFile(file, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.inlineAttachment = inlineAttachment;
|
||||||
|
|
||||||
|
})(document, window);
|
||||||
|
|
||||||
|
// Generate unique IDs for use as pseudo-private/protected names.
|
||||||
|
// Similar in concept to
|
||||||
|
// <http://wiki.ecmascript.org/doku.php?id=strawman:names>.
|
||||||
|
//
|
||||||
|
// The goals of this function are twofold:
|
||||||
|
//
|
||||||
|
// * Provide a way to generate a string guaranteed to be unique when compared
|
||||||
|
// to other strings generated by this function.
|
||||||
|
// * Make the string complex enough that it is highly unlikely to be
|
||||||
|
// accidentally duplicated by hand (this is key if you're using `ID`
|
||||||
|
// as a private/protected name on an object).
|
||||||
|
//
|
||||||
|
// Use:
|
||||||
|
//
|
||||||
|
// var privateName = ID();
|
||||||
|
// var o = { 'public': 'foo' };
|
||||||
|
// o[privateName] = 'bar';
|
||||||
|
var ID = function () {
|
||||||
|
// Math.random should be unique because of its seeding algorithm.
|
||||||
|
// Convert it to base 36 (numbers + letters), and grab the first 9 characters
|
||||||
|
// after the decimal.
|
||||||
|
return '_' + Math.random().toString(36).substr(2, 9);
|
||||||
|
};
|
2
public/vendor/jquery.cookie-1.4.1.min.js
vendored
2
public/vendor/jquery.cookie-1.4.1.min.js
vendored
|
@ -1,2 +0,0 @@
|
||||||
/*! jquery.cookie v1.4.1 | MIT */
|
|
||||||
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});
|
|
137
public/vendor/js.cookie.js
vendored
Executable file
137
public/vendor/js.cookie.js
vendored
Executable file
|
@ -0,0 +1,137 @@
|
||||||
|
/*!
|
||||||
|
* JavaScript Cookie v2.0.0-pre
|
||||||
|
* https://github.com/js-cookie/js-cookie
|
||||||
|
*
|
||||||
|
* Copyright 2006, 2015 Klaus Hartl
|
||||||
|
* Released under the MIT license
|
||||||
|
*/
|
||||||
|
(function (factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(factory);
|
||||||
|
} else if (typeof exports === 'object') {
|
||||||
|
module.exports = factory();
|
||||||
|
} else {
|
||||||
|
var _OldCookies = window.Cookies;
|
||||||
|
var api = window.Cookies = factory(window.jQuery);
|
||||||
|
api.noConflict = function () {
|
||||||
|
window.Cookies = _OldCookies;
|
||||||
|
return api;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}(function () {
|
||||||
|
function extend () {
|
||||||
|
var i = 0;
|
||||||
|
var result = {};
|
||||||
|
for (; i < arguments.length; i++) {
|
||||||
|
var attributes = arguments[ i ];
|
||||||
|
for (var key in attributes) {
|
||||||
|
result[key] = attributes[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function init (converter) {
|
||||||
|
function api (key, value, attributes) {
|
||||||
|
var result;
|
||||||
|
|
||||||
|
// Write
|
||||||
|
|
||||||
|
if (arguments.length > 1) {
|
||||||
|
attributes = extend({
|
||||||
|
path: '/'
|
||||||
|
}, api.defaults, attributes);
|
||||||
|
|
||||||
|
if (typeof attributes.expires === 'number') {
|
||||||
|
var expires = new Date();
|
||||||
|
expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
|
||||||
|
attributes.expires = expires;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
result = JSON.stringify(value);
|
||||||
|
if (/^[\{\[]/.test(result)) {
|
||||||
|
value = result;
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
value = encodeURIComponent(String(value));
|
||||||
|
value = value.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
|
||||||
|
|
||||||
|
key = encodeURIComponent(String(key));
|
||||||
|
key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
|
||||||
|
key = key.replace(/[\(\)]/g, escape);
|
||||||
|
|
||||||
|
return (document.cookie = [
|
||||||
|
key, '=', value,
|
||||||
|
attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE
|
||||||
|
attributes.path && '; path=' + attributes.path,
|
||||||
|
attributes.domain && '; domain=' + attributes.domain,
|
||||||
|
attributes.secure && '; secure'
|
||||||
|
].join(''));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read
|
||||||
|
|
||||||
|
if (!key) {
|
||||||
|
result = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// To prevent the for loop in the first place assign an empty array
|
||||||
|
// in case there are no cookies at all. Also prevents odd result when
|
||||||
|
// calling "get()"
|
||||||
|
var cookies = document.cookie ? document.cookie.split('; ') : [];
|
||||||
|
var rdecode = /(%[0-9A-Z]{2})+/g;
|
||||||
|
var i = 0;
|
||||||
|
|
||||||
|
for (; i < cookies.length; i++) {
|
||||||
|
var parts = cookies[i].split('=');
|
||||||
|
var name = parts[0].replace(rdecode, decodeURIComponent);
|
||||||
|
var cookie = parts.slice(1).join('=');
|
||||||
|
|
||||||
|
if (cookie.charAt(0) === '"') {
|
||||||
|
cookie = cookie.slice(1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
cookie = converter && converter(cookie, name) || cookie.replace(rdecode, decodeURIComponent);
|
||||||
|
|
||||||
|
if (this.json) {
|
||||||
|
try {
|
||||||
|
cookie = JSON.parse(cookie);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key === name) {
|
||||||
|
result = cookie;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!key) {
|
||||||
|
result[name] = cookie;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
api.get = api.set = api;
|
||||||
|
api.getJSON = function () {
|
||||||
|
return api.apply({
|
||||||
|
json: true
|
||||||
|
}, [].slice.call(arguments));
|
||||||
|
};
|
||||||
|
api.defaults = {};
|
||||||
|
|
||||||
|
api.remove = function (key, attributes) {
|
||||||
|
api(key, '', extend(attributes, {
|
||||||
|
expires: -1
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
api.withConverter = init;
|
||||||
|
|
||||||
|
return api;
|
||||||
|
}
|
||||||
|
|
||||||
|
return init();
|
||||||
|
}));
|
421
public/vendor/select2/css/select2.css
vendored
421
public/vendor/select2/css/select2.css
vendored
|
@ -1,421 +0,0 @@
|
||||||
.select2-container {
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: middle; }
|
|
||||||
.select2-container .select2-selection--single {
|
|
||||||
box-sizing: border-box;
|
|
||||||
cursor: pointer;
|
|
||||||
display: block;
|
|
||||||
height: 28px;
|
|
||||||
user-select: none;
|
|
||||||
-webkit-user-select: none; }
|
|
||||||
.select2-container .select2-selection--single .select2-selection__rendered {
|
|
||||||
display: block;
|
|
||||||
padding-left: 8px;
|
|
||||||
padding-right: 20px;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap; }
|
|
||||||
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
|
|
||||||
padding-right: 8px;
|
|
||||||
padding-left: 20px; }
|
|
||||||
.select2-container .select2-selection--multiple {
|
|
||||||
box-sizing: border-box;
|
|
||||||
cursor: pointer;
|
|
||||||
display: block;
|
|
||||||
min-height: 32px;
|
|
||||||
user-select: none;
|
|
||||||
-webkit-user-select: none; }
|
|
||||||
.select2-container .select2-selection--multiple .select2-selection__rendered {
|
|
||||||
display: inline-block;
|
|
||||||
overflow: hidden;
|
|
||||||
padding-left: 8px;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap; }
|
|
||||||
.select2-container .select2-search--inline {
|
|
||||||
float: left; }
|
|
||||||
.select2-container .select2-search--inline .select2-search__field {
|
|
||||||
box-sizing: border-box;
|
|
||||||
border: none;
|
|
||||||
font-size: 100%;
|
|
||||||
margin-top: 5px; }
|
|
||||||
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
|
|
||||||
-webkit-appearance: none; }
|
|
||||||
|
|
||||||
.select2-dropdown {
|
|
||||||
background-color: white;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
left: -100000px;
|
|
||||||
width: 100%;
|
|
||||||
z-index: 1051; }
|
|
||||||
|
|
||||||
.select2-results {
|
|
||||||
display: block; }
|
|
||||||
|
|
||||||
.select2-results__options {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0; }
|
|
||||||
|
|
||||||
.select2-results__option {
|
|
||||||
padding: 6px;
|
|
||||||
user-select: none;
|
|
||||||
-webkit-user-select: none; }
|
|
||||||
.select2-results__option[aria-selected] {
|
|
||||||
cursor: pointer; }
|
|
||||||
|
|
||||||
.select2-container--open .select2-dropdown {
|
|
||||||
left: 0; }
|
|
||||||
|
|
||||||
.select2-container--open .select2-dropdown--above {
|
|
||||||
border-bottom: none;
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
border-bottom-right-radius: 0; }
|
|
||||||
|
|
||||||
.select2-container--open .select2-dropdown--below {
|
|
||||||
border-top: none;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0; }
|
|
||||||
|
|
||||||
.select2-search--dropdown {
|
|
||||||
display: block;
|
|
||||||
padding: 4px; }
|
|
||||||
.select2-search--dropdown .select2-search__field {
|
|
||||||
padding: 4px;
|
|
||||||
width: 100%;
|
|
||||||
box-sizing: border-box; }
|
|
||||||
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
|
|
||||||
-webkit-appearance: none; }
|
|
||||||
.select2-search--dropdown.select2-search--hide {
|
|
||||||
display: none; }
|
|
||||||
|
|
||||||
.select2-close-mask {
|
|
||||||
border: 0;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
display: block;
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
min-height: 100%;
|
|
||||||
min-width: 100%;
|
|
||||||
height: auto;
|
|
||||||
width: auto;
|
|
||||||
opacity: 0;
|
|
||||||
z-index: 99;
|
|
||||||
background-color: #fff;
|
|
||||||
filter: alpha(opacity=0); }
|
|
||||||
|
|
||||||
.select2-container--default .select2-selection--single {
|
|
||||||
background-color: #fff;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px; }
|
|
||||||
.select2-container--default .select2-selection--single .select2-selection__rendered {
|
|
||||||
color: #444;
|
|
||||||
line-height: 28px; }
|
|
||||||
.select2-container--default .select2-selection--single .select2-selection__clear {
|
|
||||||
cursor: pointer;
|
|
||||||
float: right;
|
|
||||||
font-weight: bold; }
|
|
||||||
.select2-container--default .select2-selection--single .select2-selection__placeholder {
|
|
||||||
color: #999; }
|
|
||||||
.select2-container--default .select2-selection--single .select2-selection__arrow {
|
|
||||||
height: 26px;
|
|
||||||
position: absolute;
|
|
||||||
top: 1px;
|
|
||||||
right: 1px;
|
|
||||||
width: 20px; }
|
|
||||||
.select2-container--default .select2-selection--single .select2-selection__arrow b {
|
|
||||||
border-color: #888 transparent transparent transparent;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 5px 4px 0 4px;
|
|
||||||
height: 0;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -4px;
|
|
||||||
margin-top: -2px;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
width: 0; }
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
|
|
||||||
float: left; }
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
|
|
||||||
left: 1px;
|
|
||||||
right: auto; }
|
|
||||||
.select2-container--default.select2-container--disabled .select2-selection--single {
|
|
||||||
background-color: #eee;
|
|
||||||
cursor: default; }
|
|
||||||
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
|
|
||||||
display: none; }
|
|
||||||
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
|
||||||
border-color: transparent transparent #888 transparent;
|
|
||||||
border-width: 0 4px 5px 4px; }
|
|
||||||
.select2-container--default .select2-selection--multiple {
|
|
||||||
background-color: white;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: text; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__rendered {
|
|
||||||
box-sizing: border-box;
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 5px;
|
|
||||||
width: 100%; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
|
|
||||||
color: #999;
|
|
||||||
margin-top: 5px;
|
|
||||||
float: left; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__clear {
|
|
||||||
cursor: pointer;
|
|
||||||
float: right;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-right: 10px; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__choice {
|
|
||||||
background-color: #e4e4e4;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: default;
|
|
||||||
float: left;
|
|
||||||
margin-right: 5px;
|
|
||||||
margin-top: 5px;
|
|
||||||
padding: 0 5px; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
|
|
||||||
color: #999;
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-block;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-right: 2px; }
|
|
||||||
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
|
|
||||||
color: #333; }
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder {
|
|
||||||
float: right; }
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
|
||||||
margin-left: 5px;
|
|
||||||
margin-right: auto; }
|
|
||||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
|
|
||||||
margin-left: 2px;
|
|
||||||
margin-right: auto; }
|
|
||||||
.select2-container--default.select2-container--focus .select2-selection--multiple {
|
|
||||||
border: solid black 1px;
|
|
||||||
outline: 0; }
|
|
||||||
.select2-container--default.select2-container--disabled .select2-selection--multiple {
|
|
||||||
background-color: #eee;
|
|
||||||
cursor: default; }
|
|
||||||
.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
|
|
||||||
display: none; }
|
|
||||||
.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0; }
|
|
||||||
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
border-bottom-right-radius: 0; }
|
|
||||||
.select2-container--default .select2-search--dropdown .select2-search__field {
|
|
||||||
border: 1px solid #aaa; }
|
|
||||||
.select2-container--default .select2-search--inline .select2-search__field {
|
|
||||||
background: transparent;
|
|
||||||
border: none;
|
|
||||||
outline: 0; }
|
|
||||||
.select2-container--default .select2-results > .select2-results__options {
|
|
||||||
max-height: 200px;
|
|
||||||
overflow-y: auto; }
|
|
||||||
.select2-container--default .select2-results__option[role=group] {
|
|
||||||
padding: 0; }
|
|
||||||
.select2-container--default .select2-results__option[aria-disabled=true] {
|
|
||||||
color: #999; }
|
|
||||||
.select2-container--default .select2-results__option[aria-selected=true] {
|
|
||||||
background-color: #ddd; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option {
|
|
||||||
padding-left: 1em; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option .select2-results__group {
|
|
||||||
padding-left: 0; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option .select2-results__option {
|
|
||||||
margin-left: -1em;
|
|
||||||
padding-left: 2em; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
|
||||||
margin-left: -2em;
|
|
||||||
padding-left: 3em; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
|
||||||
margin-left: -3em;
|
|
||||||
padding-left: 4em; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
|
||||||
margin-left: -4em;
|
|
||||||
padding-left: 5em; }
|
|
||||||
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
|
||||||
margin-left: -5em;
|
|
||||||
padding-left: 6em; }
|
|
||||||
.select2-container--default .select2-results__option--highlighted[aria-selected] {
|
|
||||||
background-color: #5897fb;
|
|
||||||
color: white; }
|
|
||||||
.select2-container--default .select2-results__group {
|
|
||||||
cursor: default;
|
|
||||||
display: block;
|
|
||||||
padding: 6px; }
|
|
||||||
|
|
||||||
.select2-container--classic .select2-selection--single {
|
|
||||||
background-color: #f6f6f6;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px;
|
|
||||||
outline: 0;
|
|
||||||
background-image: -webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%);
|
|
||||||
background-image: -o-linear-gradient(top, #ffffff 50%, #eeeeee 100%);
|
|
||||||
background-image: linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); }
|
|
||||||
.select2-container--classic .select2-selection--single:focus {
|
|
||||||
border: 1px solid #5897fb; }
|
|
||||||
.select2-container--classic .select2-selection--single .select2-selection__rendered {
|
|
||||||
color: #444;
|
|
||||||
line-height: 28px; }
|
|
||||||
.select2-container--classic .select2-selection--single .select2-selection__clear {
|
|
||||||
cursor: pointer;
|
|
||||||
float: right;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-right: 10px; }
|
|
||||||
.select2-container--classic .select2-selection--single .select2-selection__placeholder {
|
|
||||||
color: #999; }
|
|
||||||
.select2-container--classic .select2-selection--single .select2-selection__arrow {
|
|
||||||
background-color: #ddd;
|
|
||||||
border: none;
|
|
||||||
border-left: 1px solid #aaa;
|
|
||||||
border-top-right-radius: 4px;
|
|
||||||
border-bottom-right-radius: 4px;
|
|
||||||
height: 26px;
|
|
||||||
position: absolute;
|
|
||||||
top: 1px;
|
|
||||||
right: 1px;
|
|
||||||
width: 20px;
|
|
||||||
background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
|
|
||||||
background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
|
|
||||||
background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0); }
|
|
||||||
.select2-container--classic .select2-selection--single .select2-selection__arrow b {
|
|
||||||
border-color: #888 transparent transparent transparent;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 5px 4px 0 4px;
|
|
||||||
height: 0;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -4px;
|
|
||||||
margin-top: -2px;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
width: 0; }
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
|
|
||||||
float: left; }
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
|
|
||||||
border: none;
|
|
||||||
border-right: 1px solid #aaa;
|
|
||||||
border-radius: 0;
|
|
||||||
border-top-left-radius: 4px;
|
|
||||||
border-bottom-left-radius: 4px;
|
|
||||||
left: 1px;
|
|
||||||
right: auto; }
|
|
||||||
.select2-container--classic.select2-container--open .select2-selection--single {
|
|
||||||
border: 1px solid #5897fb; }
|
|
||||||
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
|
|
||||||
background: transparent;
|
|
||||||
border: none; }
|
|
||||||
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
|
||||||
border-color: transparent transparent #888 transparent;
|
|
||||||
border-width: 0 4px 5px 4px; }
|
|
||||||
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
|
|
||||||
border-top: none;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
background-image: -webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%);
|
|
||||||
background-image: -o-linear-gradient(top, #ffffff 0%, #eeeeee 50%);
|
|
||||||
background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); }
|
|
||||||
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
|
|
||||||
border-bottom: none;
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
border-bottom-right-radius: 0;
|
|
||||||
background-image: -webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%);
|
|
||||||
background-image: -o-linear-gradient(top, #eeeeee 50%, #ffffff 100%);
|
|
||||||
background-image: linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%);
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); }
|
|
||||||
.select2-container--classic .select2-selection--multiple {
|
|
||||||
background-color: white;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: text;
|
|
||||||
outline: 0; }
|
|
||||||
.select2-container--classic .select2-selection--multiple:focus {
|
|
||||||
border: 1px solid #5897fb; }
|
|
||||||
.select2-container--classic .select2-selection--multiple .select2-selection__rendered {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 5px; }
|
|
||||||
.select2-container--classic .select2-selection--multiple .select2-selection__clear {
|
|
||||||
display: none; }
|
|
||||||
.select2-container--classic .select2-selection--multiple .select2-selection__choice {
|
|
||||||
background-color: #e4e4e4;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: default;
|
|
||||||
float: left;
|
|
||||||
margin-right: 5px;
|
|
||||||
margin-top: 5px;
|
|
||||||
padding: 0 5px; }
|
|
||||||
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
|
|
||||||
color: #888;
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-block;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-right: 2px; }
|
|
||||||
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
|
|
||||||
color: #555; }
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
|
||||||
float: right; }
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
|
||||||
margin-left: 5px;
|
|
||||||
margin-right: auto; }
|
|
||||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
|
|
||||||
margin-left: 2px;
|
|
||||||
margin-right: auto; }
|
|
||||||
.select2-container--classic.select2-container--open .select2-selection--multiple {
|
|
||||||
border: 1px solid #5897fb; }
|
|
||||||
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
|
|
||||||
border-top: none;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0; }
|
|
||||||
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
|
|
||||||
border-bottom: none;
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
border-bottom-right-radius: 0; }
|
|
||||||
.select2-container--classic .select2-search--dropdown .select2-search__field {
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
outline: 0; }
|
|
||||||
.select2-container--classic .select2-search--inline .select2-search__field {
|
|
||||||
outline: 0; }
|
|
||||||
.select2-container--classic .select2-dropdown {
|
|
||||||
background-color: white;
|
|
||||||
border: 1px solid transparent; }
|
|
||||||
.select2-container--classic .select2-dropdown--above {
|
|
||||||
border-bottom: none; }
|
|
||||||
.select2-container--classic .select2-dropdown--below {
|
|
||||||
border-top: none; }
|
|
||||||
.select2-container--classic .select2-results > .select2-results__options {
|
|
||||||
max-height: 200px;
|
|
||||||
overflow-y: auto; }
|
|
||||||
.select2-container--classic .select2-results__option[role=group] {
|
|
||||||
padding: 0; }
|
|
||||||
.select2-container--classic .select2-results__option[aria-disabled=true] {
|
|
||||||
color: grey; }
|
|
||||||
.select2-container--classic .select2-results__option--highlighted[aria-selected] {
|
|
||||||
background-color: #3875d7;
|
|
||||||
color: white; }
|
|
||||||
.select2-container--classic .select2-results__group {
|
|
||||||
cursor: default;
|
|
||||||
display: block;
|
|
||||||
padding: 6px; }
|
|
||||||
.select2-container--classic.select2-container--open .select2-dropdown {
|
|
||||||
border-color: #5897fb; }
|
|
1
public/vendor/select2/css/select2.min.css
vendored
1
public/vendor/select2/css/select2.min.css
vendored
File diff suppressed because one or more lines are too long
1
public/vendor/select2/js/i18n/az.js
vendored
1
public/vendor/select2/js/i18n/az.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/bg.js
vendored
1
public/vendor/select2/js/i18n/bg.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/ca.js
vendored
1
public/vendor/select2/js/i18n/ca.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelection:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/cs.js
vendored
1
public/vendor/select2/js/i18n/cs.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/da.js
vendored
1
public/vendor/select2/js/i18n/da.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/da",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/de.js
vendored
1
public/vendor/select2/js/i18n/de.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/en.js
vendored
1
public/vendor/select2/js/i18n/en.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/es.js
vendored
1
public/vendor/select2/js/i18n/es.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelection:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/et.js
vendored
1
public/vendor/select2/js/i18n/et.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/eu.js
vendored
1
public/vendor/select2/js/i18n/eu.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelection:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/fi.js
vendored
1
public/vendor/select2/js/i18n/fi.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelection:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/fr.js
vendored
1
public/vendor/select2/js/i18n/fr.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/fr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelection:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/gl.js
vendored
1
public/vendor/select2/js/i18n/gl.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelection:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/hi.js
vendored
1
public/vendor/select2/js/i18n/hi.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/hr.js
vendored
1
public/vendor/select2/js/i18n/hr.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelection:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/hu.js
vendored
1
public/vendor/select2/js/i18n/hu.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelection:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/id.js
vendored
1
public/vendor/select2/js/i18n/id.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/id",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelection:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/is.js
vendored
1
public/vendor/select2/js/i18n/is.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelection:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/it.js
vendored
1
public/vendor/select2/js/i18n/it.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/lt.js
vendored
1
public/vendor/select2/js/i18n/lt.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%100>9&&e%100<21||e%10===0?e%10>1?n:r:t}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"ių","ius","į"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"ių","ius","į"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelection:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ų","us","ą"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/lv.js
vendored
1
public/vendor/select2/js/i18n/lv.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelection:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/mk.js
vendored
1
public/vendor/select2/js/i18n/mk.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelection:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/nb.js
vendored
1
public/vendor/select2/js/i18n/nb.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/nb",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelection:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/nl.js
vendored
1
public/vendor/select2/js/i18n/nl.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t="Er kunnen maar "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t+=" worden geselecteerd",t},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/pl.js
vendored
1
public/vendor/select2/js/i18n/pl.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maxiumum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/pt-BR.js
vendored
1
public/vendor/select2/js/i18n/pt-BR.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/pt.js
vendored
1
public/vendor/select2/js/i18n/pt.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/ro.js
vendored
1
public/vendor/select2/js/i18n/ro.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/ro",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să introduceți mai puțin de "+t;return n+=" caracter",n!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți incă "+t;return n+=" caracter",n!==1&&(n+="e"),n},loadingMore:function(){return"Se încarcă…"},maximumSelection:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",t!==1&&(t+="e"),t},noResults:function(){return"Nu a fost găsit nimic"},searching:function(){return"Căutare…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/ru.js
vendored
1
public/vendor/select2/js/i18n/ru.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/sk.js
vendored
1
public/vendor/select2/js/i18n/sk.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/sr.js
vendored
1
public/vendor/select2/js/i18n/sr.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/sv.js
vendored
1
public/vendor/select2/js/i18n/sv.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/th.js
vendored
1
public/vendor/select2/js/i18n/th.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/tr.js
vendored
1
public/vendor/select2/js/i18n/tr.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/uk.js
vendored
1
public/vendor/select2/js/i18n/uk.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/vi.js
vendored
1
public/vendor/select2/js/i18n/vi.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/zh-CN.js
vendored
1
public/vendor/select2/js/i18n/zh-CN.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
1
public/vendor/select2/js/i18n/zh-TW.js
vendored
1
public/vendor/select2/js/i18n/zh-TW.js
vendored
|
@ -1 +0,0 @@
|
||||||
(function(){if(window.define)var e=window.define;if(window.require)var t=window.require;if(window.jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd.define,t=jQuery.fn.select2.amd.require;e("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),t("jquery.select2"),jQuery.fn.select2.amd={define:e,require:t}})();
|
|
5326
public/vendor/select2/js/select2.amd.full.js
vendored
5326
public/vendor/select2/js/select2.amd.full.js
vendored
File diff suppressed because it is too large
Load diff
4766
public/vendor/select2/js/select2.amd.js
vendored
4766
public/vendor/select2/js/select2.amd.js
vendored
File diff suppressed because it is too large
Load diff
5765
public/vendor/select2/js/select2.full.js
vendored
5765
public/vendor/select2/js/select2.full.js
vendored
File diff suppressed because it is too large
Load diff
3
public/vendor/select2/js/select2.full.min.js
vendored
3
public/vendor/select2/js/select2.full.min.js
vendored
File diff suppressed because one or more lines are too long
5205
public/vendor/select2/js/select2.js
vendored
5205
public/vendor/select2/js/select2.js
vendored
File diff suppressed because it is too large
Load diff
2
public/vendor/select2/js/select2.min.js
vendored
2
public/vendor/select2/js/select2.min.js
vendored
File diff suppressed because one or more lines are too long
495
public/vendor/select2/select2-bootstrap.css
vendored
Normal file
495
public/vendor/select2/select2-bootstrap.css
vendored
Normal file
|
@ -0,0 +1,495 @@
|
||||||
|
/*! Select2 Bootstrap 3 CSS v1.4.6 | MIT License | github.com/t0m/select2-bootstrap-css */
|
||||||
|
/**
|
||||||
|
* Reset Bootstrap 3 .form-control styles which - if applied to the
|
||||||
|
* original <select>-element the Select2-plugin may be run against -
|
||||||
|
* are copied to the .select2-container.
|
||||||
|
*
|
||||||
|
* 1. Overwrite .select2-container's original display:inline-block
|
||||||
|
* with Bootstrap 3's default for .form-control, display:block;
|
||||||
|
* courtesy of @juristr (@see https://github.com/fk/select2-bootstrap-css/pull/1)
|
||||||
|
*/
|
||||||
|
.select2-container.form-control {
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
border: none;
|
||||||
|
display: block;
|
||||||
|
/* 1 */
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust Select2 inputs to fit Bootstrap 3 default .form-control appearance.
|
||||||
|
*/
|
||||||
|
.select2-container .select2-choices .select2-search-field input,
|
||||||
|
.select2-container .select2-choice,
|
||||||
|
.select2-container .select2-choices {
|
||||||
|
background: none;
|
||||||
|
padding: 0;
|
||||||
|
border-color: #cccccc;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #555555;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
background-color: white;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-search input {
|
||||||
|
border-color: #cccccc;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #555555;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
background-color: white;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choices .select2-search-field input {
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust Select2 input heights to match the Bootstrap default.
|
||||||
|
*/
|
||||||
|
.select2-container .select2-choice {
|
||||||
|
height: 34px;
|
||||||
|
line-height: 1.42857;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Multi Select2's height which - depending on how many elements have been selected -
|
||||||
|
* may grown higher than their initial size.
|
||||||
|
*/
|
||||||
|
.select2-container.select2-container-multi.form-control {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Bootstrap 3 control sizing classes
|
||||||
|
* @see http://getbootstrap.com/css/#forms-control-sizes
|
||||||
|
*/
|
||||||
|
.select2-container.input-sm .select2-choice,
|
||||||
|
.input-group-sm .select2-container .select2-choice {
|
||||||
|
height: 30px;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.input-lg .select2-choice,
|
||||||
|
.input-group-lg .select2-container .select2-choice {
|
||||||
|
height: 46px;
|
||||||
|
line-height: 1.33333;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-field input {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.input-sm .select2-choices .select2-search-field input,
|
||||||
|
.input-group-sm .select2-container-multi .select2-choices .select2-search-field input {
|
||||||
|
height: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.input-lg .select2-choices .select2-search-field input,
|
||||||
|
.input-group-lg .select2-container-multi .select2-choices .select2-search-field input {
|
||||||
|
height: 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust height and line-height for .select2-search-field amd multi-select Select2 widgets.
|
||||||
|
*
|
||||||
|
* 1. Class repetition to address missing .select2-chosen in Select2 < 3.3.2.
|
||||||
|
*/
|
||||||
|
.select2-container-multi .select2-choices .select2-search-field input {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-chosen,
|
||||||
|
.select2-choice > span:first-child,
|
||||||
|
.select2-container .select2-choices .select2-search-field input {
|
||||||
|
padding: 6px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-sm .select2-chosen,
|
||||||
|
.input-group-sm .select2-chosen,
|
||||||
|
.input-sm .select2-choice > span:first-child,
|
||||||
|
.input-group-sm .select2-choice > span:first-child,
|
||||||
|
.input-sm .select2-choices .select2-search-field input,
|
||||||
|
.input-group-sm .select2-choices .select2-search-field input {
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-lg .select2-chosen,
|
||||||
|
.input-group-lg .select2-chosen,
|
||||||
|
.input-lg .select2-choice > span:first-child,
|
||||||
|
.input-group-lg .select2-choice > span:first-child,
|
||||||
|
.input-lg .select2-choices .select2-search-field input,
|
||||||
|
.input-group-lg .select2-choices .select2-search-field input {
|
||||||
|
padding: 10px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice {
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.input-sm .select2-choices .select2-search-choice,
|
||||||
|
.input-group-sm .select2-container-multi .select2-choices .select2-search-choice {
|
||||||
|
margin-top: 3px;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.input-lg .select2-choices .select2-search-choice,
|
||||||
|
.input-group-lg .select2-container-multi .select2-choices .select2-search-choice {
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust the single Select2's dropdown arrow button appearance.
|
||||||
|
*
|
||||||
|
* 1. For Select2 v.3.3.2.
|
||||||
|
*/
|
||||||
|
.select2-container .select2-choice .select2-arrow,
|
||||||
|
.select2-container .select2-choice div {
|
||||||
|
border-left: none;
|
||||||
|
background: none;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open .select2-choice .select2-arrow,
|
||||||
|
.select2-dropdown-open .select2-choice div {
|
||||||
|
border-left-color: transparent;
|
||||||
|
background: none;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust the dropdown arrow button icon position for the single-select Select2 elements
|
||||||
|
* to make it line up vertically now that we increased the height of .select2-container.
|
||||||
|
*
|
||||||
|
* 1. Class repetition to address missing .select2-chosen in Select2 v.3.3.2.
|
||||||
|
*/
|
||||||
|
.select2-container .select2-choice .select2-arrow b,
|
||||||
|
.select2-container .select2-choice div b {
|
||||||
|
background-position: 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open .select2-choice .select2-arrow b,
|
||||||
|
.select2-dropdown-open .select2-choice div b {
|
||||||
|
background-position: -18px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.input-sm .select2-choice .select2-arrow b,
|
||||||
|
.input-group-sm .select2-container .select2-choice .select2-arrow b,
|
||||||
|
.select2-container.input-sm .select2-choice div b,
|
||||||
|
.input-group-sm .select2-container .select2-choice div b {
|
||||||
|
background-position: 0 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open.input-sm .select2-choice .select2-arrow b,
|
||||||
|
.input-group-sm .select2-dropdown-open .select2-choice .select2-arrow b,
|
||||||
|
.select2-dropdown-open.input-sm .select2-choice div b,
|
||||||
|
.input-group-sm .select2-dropdown-open .select2-choice div b {
|
||||||
|
background-position: -18px 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.input-lg .select2-choice .select2-arrow b,
|
||||||
|
.input-group-lg .select2-container .select2-choice .select2-arrow b,
|
||||||
|
.select2-container.input-lg .select2-choice div b,
|
||||||
|
.input-group-lg .select2-container .select2-choice div b {
|
||||||
|
background-position: 0 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open.input-lg .select2-choice .select2-arrow b,
|
||||||
|
.input-group-lg .select2-dropdown-open .select2-choice .select2-arrow b,
|
||||||
|
.select2-dropdown-open.input-lg .select2-choice div b,
|
||||||
|
.input-group-lg .select2-dropdown-open .select2-choice div b {
|
||||||
|
background-position: -18px 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Bootstrap's validation states and change Select2's border colors and focus states.
|
||||||
|
* Apply .has-warning, .has-danger or .has-succes to #select2-drop to match Bootstraps' colors.
|
||||||
|
*/
|
||||||
|
.has-warning .select2-choice,
|
||||||
|
.has-warning .select2-choices {
|
||||||
|
border-color: #8a6d3b;
|
||||||
|
}
|
||||||
|
.has-warning .select2-container-active .select2-choice,
|
||||||
|
.has-warning .select2-container-multi.select2-container-active .select2-choices {
|
||||||
|
border-color: #66512c;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
|
||||||
|
}
|
||||||
|
.has-warning.select2-drop-active {
|
||||||
|
border-color: #66512c;
|
||||||
|
}
|
||||||
|
.has-warning.select2-drop-active.select2-drop.select2-drop-above {
|
||||||
|
border-top-color: #66512c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-error .select2-choice,
|
||||||
|
.has-error .select2-choices {
|
||||||
|
border-color: #a94442;
|
||||||
|
}
|
||||||
|
.has-error .select2-container-active .select2-choice,
|
||||||
|
.has-error .select2-container-multi.select2-container-active .select2-choices {
|
||||||
|
border-color: #843534;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
|
||||||
|
}
|
||||||
|
.has-error.select2-drop-active {
|
||||||
|
border-color: #843534;
|
||||||
|
}
|
||||||
|
.has-error.select2-drop-active.select2-drop.select2-drop-above {
|
||||||
|
border-top-color: #843534;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-success .select2-choice,
|
||||||
|
.has-success .select2-choices {
|
||||||
|
border-color: #3c763d;
|
||||||
|
}
|
||||||
|
.has-success .select2-container-active .select2-choice,
|
||||||
|
.has-success .select2-container-multi.select2-container-active .select2-choices {
|
||||||
|
border-color: #2b542c;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
|
||||||
|
}
|
||||||
|
.has-success.select2-drop-active {
|
||||||
|
border-color: #2b542c;
|
||||||
|
}
|
||||||
|
.has-success.select2-drop-active.select2-drop.select2-drop-above {
|
||||||
|
border-top-color: #2b542c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make Select2's active-styles - applied to .select2-container when the widget receives focus -
|
||||||
|
* fit Bootstrap 3's .form-element:focus appearance.
|
||||||
|
*/
|
||||||
|
.select2-container-active .select2-choice,
|
||||||
|
.select2-container-multi.select2-container-active .select2-choices {
|
||||||
|
border-color: #66afe9;
|
||||||
|
outline: none;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
|
||||||
|
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
||||||
|
-o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
||||||
|
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop-active {
|
||||||
|
border-color: #66afe9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop-auto-width,
|
||||||
|
.select2-drop.select2-drop-above.select2-drop-active {
|
||||||
|
border-top-color: #66afe9;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select2 widgets in Bootstrap Input Groups
|
||||||
|
*
|
||||||
|
* When Select2 widgets are combined with other elements using Bootstrap 3's
|
||||||
|
* "Input Group" component, we don't want specific edges of the Select2 container
|
||||||
|
* to have a border-radius.
|
||||||
|
*
|
||||||
|
* In Bootstrap 2, input groups required a markup where these style adjustments
|
||||||
|
* could be bound to a CSS-class identifying if the additional elements are appended,
|
||||||
|
* prepended or both.
|
||||||
|
*
|
||||||
|
* Bootstrap 3 doesn't rely on these classes anymore, so we have to use our own.
|
||||||
|
* Use .select2-bootstrap-prepend and .select2-bootstrap-append on a Bootstrap 3 .input-group
|
||||||
|
* to let the contained Select2 widget know which edges should not be rounded as they are
|
||||||
|
* directly followed by another element.
|
||||||
|
*
|
||||||
|
* @see http://getbootstrap.com/components/#input-groups
|
||||||
|
*/
|
||||||
|
.input-group.select2-bootstrap-prepend [class^="select2-choice"] {
|
||||||
|
border-bottom-left-radius: 0 !important;
|
||||||
|
border-top-left-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group.select2-bootstrap-append [class^="select2-choice"] {
|
||||||
|
border-bottom-right-radius: 0 !important;
|
||||||
|
border-top-right-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open [class^="select2-choice"] {
|
||||||
|
border-bottom-right-radius: 0 !important;
|
||||||
|
border-bottom-left-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-top-right-radius: 0 !important;
|
||||||
|
border-top-left-radius: 0 !important;
|
||||||
|
border-bottom-right-radius: 4px !important;
|
||||||
|
border-bottom-left-radius: 4px !important;
|
||||||
|
background: white;
|
||||||
|
filter: none;
|
||||||
|
}
|
||||||
|
.input-group.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-bottom-left-radius: 0 !important;
|
||||||
|
border-top-left-radius: 0 !important;
|
||||||
|
}
|
||||||
|
.input-group.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-bottom-right-radius: 0 !important;
|
||||||
|
border-top-right-radius: 0 !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-sm.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-bottom-right-radius: 3px !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-lg.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-bottom-right-radius: 6px !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-sm.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-bottom-left-radius: 3px !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-lg.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
|
||||||
|
border-bottom-left-radius: 6px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust Select2's choices hover and selected styles to match Bootstrap 3's default dropdown styles.
|
||||||
|
*/
|
||||||
|
.select2-results .select2-highlighted {
|
||||||
|
color: white;
|
||||||
|
background-color: #337ab7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust alignment of Bootstrap 3 buttons in Bootstrap 3 Input Groups to address
|
||||||
|
* Multi Select2's height which - depending on how many elements have been selected -
|
||||||
|
* may grown higher than their initial size.
|
||||||
|
*/
|
||||||
|
.select2-bootstrap-append .select2-container-multiple,
|
||||||
|
.select2-bootstrap-append .input-group-btn,
|
||||||
|
.select2-bootstrap-append .input-group-btn .btn,
|
||||||
|
.select2-bootstrap-prepend .select2-container-multiple,
|
||||||
|
.select2-bootstrap-prepend .input-group-btn,
|
||||||
|
.select2-bootstrap-prepend .input-group-btn .btn {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make Multi Select2's choices match Bootstrap 3's default button styles.
|
||||||
|
*/
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice {
|
||||||
|
color: #555555;
|
||||||
|
background: white;
|
||||||
|
border-color: #cccccc;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice-focus {
|
||||||
|
background: #ebebeb;
|
||||||
|
border-color: #adadad;
|
||||||
|
color: #333333;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Multi Select2's choice close-button vertical alignment.
|
||||||
|
*/
|
||||||
|
.select2-search-choice-close {
|
||||||
|
margin-top: -7px;
|
||||||
|
top: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust the single Select2's clear button position (used to reset the select box
|
||||||
|
* back to the placeholder value and visible once a selection is made
|
||||||
|
* activated by Select2's "allowClear" option).
|
||||||
|
*/
|
||||||
|
.select2-container .select2-choice abbr {
|
||||||
|
top: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjust "no results" and "selection limit" messages to make use
|
||||||
|
* of Bootstrap 3's default "Alert" style.
|
||||||
|
*
|
||||||
|
* @see http://getbootstrap.com/components/#alerts-default
|
||||||
|
*/
|
||||||
|
.select2-results .select2-no-results,
|
||||||
|
.select2-results .select2-searching,
|
||||||
|
.select2-results .select2-selection-limit {
|
||||||
|
background-color: #fcf8e3;
|
||||||
|
color: #8a6d3b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address disabled Select2 styles.
|
||||||
|
*
|
||||||
|
* 1. For Select2 v.3.3.2.
|
||||||
|
* 2. Revert border-left:0 inherited from Select2's CSS to prevent the arrow
|
||||||
|
* from jumping when switching from disabled to enabled state and vice versa.
|
||||||
|
*/
|
||||||
|
.select2-container.select2-container-disabled .select2-choice,
|
||||||
|
.select2-container.select2-container-disabled .select2-choices {
|
||||||
|
cursor: not-allowed;
|
||||||
|
background-color: #eeeeee;
|
||||||
|
border-color: #cccccc;
|
||||||
|
}
|
||||||
|
.select2-container.select2-container-disabled .select2-choice .select2-arrow,
|
||||||
|
.select2-container.select2-container-disabled .select2-choice div,
|
||||||
|
.select2-container.select2-container-disabled .select2-choices .select2-arrow,
|
||||||
|
.select2-container.select2-container-disabled .select2-choices div {
|
||||||
|
background-color: transparent;
|
||||||
|
border-left: 1px solid transparent;
|
||||||
|
/* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Select2's loading indicator position - which should not stick
|
||||||
|
* to the right edge of Select2's search input.
|
||||||
|
*
|
||||||
|
* 1. in .select2-search input
|
||||||
|
* 2. in Multi Select2's .select2-search-field input
|
||||||
|
* 3. in the status-message of infinite-scroll with remote data (@see http://ivaynberg.github.io/select2/#infinite)
|
||||||
|
*
|
||||||
|
* These styles alter Select2's default background-position of 100%
|
||||||
|
* and supply the new background-position syntax to browsers which support it:
|
||||||
|
*
|
||||||
|
* 1. Android, Safari < 6/Mobile, IE<9: change to a relative background-position of 99%
|
||||||
|
* 2. Chrome 25+, Firefox 13+, IE 9+, Opera 10.5+: use the new CSS3-background-position syntax
|
||||||
|
*
|
||||||
|
* @see http://www.w3.org/TR/css3-background/#background-position
|
||||||
|
*
|
||||||
|
* @todo Since both Select2 and Bootstrap 3 only support IE8 and above,
|
||||||
|
* we could use the :after-pseudo-element to display the loading indicator.
|
||||||
|
* Alternatively, we could supply an altered loading indicator image which already
|
||||||
|
* contains an offset to the right.
|
||||||
|
*/
|
||||||
|
.select2-search input.select2-active,
|
||||||
|
.select2-container-multi .select2-choices .select2-search-field input.select2-active,
|
||||||
|
.select2-more-results.select2-active {
|
||||||
|
background-position: 99%;
|
||||||
|
/* 4 */
|
||||||
|
background-position: right 4px center;
|
||||||
|
/* 5 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To support Select2 pre v3.4.2 in combination with Bootstrap v3.2.0,
|
||||||
|
* ensure that .select2-offscreen width, height and position can not be overwritten.
|
||||||
|
*
|
||||||
|
* This adresses changes in Bootstrap somewhere after the initial v3.0.0 which -
|
||||||
|
* in combination with Select2's pre-v3.4.2 CSS missing the "!important" after
|
||||||
|
* the following rules - allow Bootstrap to overwrite the latter, which results in
|
||||||
|
* the original <select> element Select2 is replacing not be properly being hidden
|
||||||
|
* when used in a "Bootstrap Input Group with Addon".
|
||||||
|
**/
|
||||||
|
.select2-offscreen,
|
||||||
|
.select2-offscreen:focus {
|
||||||
|
width: 1px !important;
|
||||||
|
height: 1px !important;
|
||||||
|
position: absolute !important;
|
||||||
|
}
|
BIN
public/vendor/select2/select2-spinner.gif
vendored
Executable file
BIN
public/vendor/select2/select2-spinner.gif
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
704
public/vendor/select2/select2.css
vendored
Executable file
704
public/vendor/select2/select2.css
vendored
Executable file
|
@ -0,0 +1,704 @@
|
||||||
|
/*
|
||||||
|
Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
|
||||||
|
*/
|
||||||
|
.select2-container {
|
||||||
|
margin: 0;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
/* inline-block for ie7 */
|
||||||
|
zoom: 1;
|
||||||
|
*display: inline;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container,
|
||||||
|
.select2-drop,
|
||||||
|
.select2-search,
|
||||||
|
.select2-search input {
|
||||||
|
/*
|
||||||
|
Force border-box so that % widths fit the parent
|
||||||
|
container without overlap because of margin/padding.
|
||||||
|
More Info : http://www.quirksmode.org/css/box.html
|
||||||
|
*/
|
||||||
|
-webkit-box-sizing: border-box; /* webkit */
|
||||||
|
-moz-box-sizing: border-box; /* firefox */
|
||||||
|
box-sizing: border-box; /* css3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choice {
|
||||||
|
display: block;
|
||||||
|
height: 26px;
|
||||||
|
padding: 0 0 0 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
white-space: nowrap;
|
||||||
|
line-height: 26px;
|
||||||
|
color: #444;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
background-clip: padding-box;
|
||||||
|
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
background-color: #fff;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
|
||||||
|
background-image: linear-gradient(to top, #eee 0%, #fff 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-container .select2-choice {
|
||||||
|
padding: 0 8px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.select2-drop-above .select2-choice {
|
||||||
|
border-bottom-color: #aaa;
|
||||||
|
|
||||||
|
border-radius: 0 0 4px 4px;
|
||||||
|
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
|
||||||
|
background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.select2-allowclear .select2-choice .select2-chosen {
|
||||||
|
margin-right: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choice > .select2-chosen {
|
||||||
|
margin-right: 26px;
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
float: none;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
|
||||||
|
margin-left: 26px;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choice abbr {
|
||||||
|
display: none;
|
||||||
|
width: 12px;
|
||||||
|
height: 12px;
|
||||||
|
position: absolute;
|
||||||
|
right: 24px;
|
||||||
|
top: 8px;
|
||||||
|
|
||||||
|
font-size: 1px;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
border: 0;
|
||||||
|
background: url('select2.png') right top no-repeat;
|
||||||
|
cursor: pointer;
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.select2-allowclear .select2-choice abbr {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choice abbr:hover {
|
||||||
|
background-position: right -11px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop-mask {
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
min-height: 100%;
|
||||||
|
min-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
width: auto;
|
||||||
|
opacity: 0;
|
||||||
|
z-index: 9998;
|
||||||
|
/* styles required for IE to work */
|
||||||
|
background-color: #fff;
|
||||||
|
filter: alpha(opacity=0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: -1px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 9999;
|
||||||
|
top: 100%;
|
||||||
|
|
||||||
|
background: #fff;
|
||||||
|
color: #000;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
border-top: 0;
|
||||||
|
|
||||||
|
border-radius: 0 0 4px 4px;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||||
|
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop.select2-drop-above {
|
||||||
|
margin-top: 1px;
|
||||||
|
border-top: 1px solid #aaa;
|
||||||
|
border-bottom: 0;
|
||||||
|
|
||||||
|
border-radius: 4px 4px 0 0;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||||
|
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop-active {
|
||||||
|
border: 1px solid #5897fb;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop.select2-drop-above.select2-drop-active {
|
||||||
|
border-top: 1px solid #5897fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop-auto-width {
|
||||||
|
border-top: 1px solid #aaa;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop-auto-width .select2-search {
|
||||||
|
padding-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choice .select2-arrow {
|
||||||
|
display: inline-block;
|
||||||
|
width: 18px;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
|
||||||
|
border-left: 1px solid #aaa;
|
||||||
|
border-radius: 0 4px 4px 0;
|
||||||
|
|
||||||
|
background-clip: padding-box;
|
||||||
|
|
||||||
|
background: #ccc;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
|
||||||
|
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
|
||||||
|
border-left: none;
|
||||||
|
border-right: 1px solid #aaa;
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container .select2-choice .select2-arrow b {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: url('select2.png') no-repeat 0 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
|
||||||
|
background-position: 2px 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-search {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 26px;
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 4px;
|
||||||
|
padding-right: 4px;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
z-index: 10000;
|
||||||
|
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-search input {
|
||||||
|
width: 100%;
|
||||||
|
height: auto !important;
|
||||||
|
min-height: 26px;
|
||||||
|
padding: 4px 20px 4px 5px;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
outline: 0;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
background: #fff url('select2.png') no-repeat 100% -22px;
|
||||||
|
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||||
|
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||||
|
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||||
|
background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-search input {
|
||||||
|
padding: 4px 5px 4px 20px;
|
||||||
|
|
||||||
|
background: #fff url('select2.png') no-repeat -37px -22px;
|
||||||
|
background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||||
|
background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||||
|
background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||||
|
background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-drop.select2-drop-above .select2-search input {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-search input.select2-active {
|
||||||
|
background: #fff url('select2-spinner.gif') no-repeat 100%;
|
||||||
|
background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||||
|
background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||||
|
background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||||
|
background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-active .select2-choice,
|
||||||
|
.select2-container-active .select2-choices {
|
||||||
|
border: 1px solid #5897fb;
|
||||||
|
outline: none;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||||
|
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open .select2-choice {
|
||||||
|
border-bottom-color: transparent;
|
||||||
|
-webkit-box-shadow: 0 1px 0 #fff inset;
|
||||||
|
box-shadow: 0 1px 0 #fff inset;
|
||||||
|
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
|
||||||
|
background-color: #eee;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
|
||||||
|
background-image: linear-gradient(to top, #fff 0%, #eee 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open.select2-drop-above .select2-choice,
|
||||||
|
.select2-dropdown-open.select2-drop-above .select2-choices {
|
||||||
|
border: 1px solid #5897fb;
|
||||||
|
border-top-color: transparent;
|
||||||
|
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
|
||||||
|
background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
|
||||||
|
background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
|
||||||
|
background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open .select2-choice .select2-arrow {
|
||||||
|
background: transparent;
|
||||||
|
border-left: none;
|
||||||
|
filter: none;
|
||||||
|
}
|
||||||
|
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-dropdown-open .select2-choice .select2-arrow b {
|
||||||
|
background-position: -18px 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
|
||||||
|
background-position: -16px 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-hidden-accessible {
|
||||||
|
border: 0;
|
||||||
|
clip: rect(0 0 0 0);
|
||||||
|
height: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* results */
|
||||||
|
.select2-results {
|
||||||
|
max-height: 200px;
|
||||||
|
padding: 0 0 0 4px;
|
||||||
|
margin: 4px 4px 4px 0;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-results {
|
||||||
|
padding: 0 4px 0 0;
|
||||||
|
margin: 4px 0 4px 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results ul.select2-result-sub {
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results li {
|
||||||
|
list-style: none;
|
||||||
|
display: list-item;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results li.select2-result-with-children > .select2-result-label {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results .select2-result-label {
|
||||||
|
padding: 3px 7px 4px;
|
||||||
|
margin: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
min-height: 1em;
|
||||||
|
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results-dept-1 .select2-result-label { padding-left: 20px }
|
||||||
|
.select2-results-dept-2 .select2-result-label { padding-left: 40px }
|
||||||
|
.select2-results-dept-3 .select2-result-label { padding-left: 60px }
|
||||||
|
.select2-results-dept-4 .select2-result-label { padding-left: 80px }
|
||||||
|
.select2-results-dept-5 .select2-result-label { padding-left: 100px }
|
||||||
|
.select2-results-dept-6 .select2-result-label { padding-left: 110px }
|
||||||
|
.select2-results-dept-7 .select2-result-label { padding-left: 120px }
|
||||||
|
|
||||||
|
.select2-results .select2-highlighted {
|
||||||
|
background: #3875d7;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results li em {
|
||||||
|
background: #feffde;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results .select2-highlighted em {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results .select2-highlighted ul {
|
||||||
|
background: #fff;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results .select2-no-results,
|
||||||
|
.select2-results .select2-searching,
|
||||||
|
.select2-results .select2-ajax-error,
|
||||||
|
.select2-results .select2-selection-limit {
|
||||||
|
background: #f4f4f4;
|
||||||
|
display: list-item;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
disabled look for disabled choices in the results dropdown
|
||||||
|
*/
|
||||||
|
.select2-results .select2-disabled.select2-highlighted {
|
||||||
|
color: #666;
|
||||||
|
background: #f4f4f4;
|
||||||
|
display: list-item;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.select2-results .select2-disabled {
|
||||||
|
background: #f4f4f4;
|
||||||
|
display: list-item;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results .select2-selected {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-more-results.select2-active {
|
||||||
|
background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-results .select2-ajax-error {
|
||||||
|
background: rgba(255, 50, 50, .2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-more-results {
|
||||||
|
background: #f4f4f4;
|
||||||
|
display: list-item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disabled styles */
|
||||||
|
|
||||||
|
.select2-container.select2-container-disabled .select2-choice {
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
background-image: none;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.select2-container-disabled .select2-choice .select2-arrow {
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
background-image: none;
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container.select2-container-disabled .select2-choice abbr {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* multiselect */
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices {
|
||||||
|
height: auto !important;
|
||||||
|
height: 1%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 5px 0 0;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
cursor: text;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
background-color: #fff;
|
||||||
|
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
|
||||||
|
background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
|
||||||
|
background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
|
||||||
|
background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-container-multi .select2-choices {
|
||||||
|
padding: 0 0 0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-locked {
|
||||||
|
padding: 3px 5px 3px 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices {
|
||||||
|
min-height: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.select2-container-active .select2-choices {
|
||||||
|
border: 1px solid #5897fb;
|
||||||
|
outline: none;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||||
|
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||||
|
}
|
||||||
|
.select2-container-multi .select2-choices li {
|
||||||
|
float: left;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
html[dir="rtl"] .select2-container-multi .select2-choices li
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.select2-container-multi .select2-choices .select2-search-field {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-field input {
|
||||||
|
padding: 5px;
|
||||||
|
margin: 1px 0;
|
||||||
|
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 100%;
|
||||||
|
color: #666;
|
||||||
|
outline: 0;
|
||||||
|
border: 0;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
|
||||||
|
background: #fff url('select2-spinner.gif') no-repeat 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-default {
|
||||||
|
color: #999 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice {
|
||||||
|
padding: 3px 5px 3px 18px;
|
||||||
|
margin: 3px 0 3px 5px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
line-height: 13px;
|
||||||
|
color: #333;
|
||||||
|
cursor: default;
|
||||||
|
border: 1px solid #aaaaaa;
|
||||||
|
|
||||||
|
border-radius: 3px;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
||||||
|
box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
||||||
|
|
||||||
|
background-clip: padding-box;
|
||||||
|
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
background-color: #e4e4e4;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
|
||||||
|
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
|
||||||
|
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||||
|
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||||
|
background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||||
|
}
|
||||||
|
html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
|
||||||
|
{
|
||||||
|
margin: 3px 5px 3px 0;
|
||||||
|
padding: 3px 18px 3px 5px;
|
||||||
|
}
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice-focus {
|
||||||
|
background: #d4d4d4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-search-choice-close {
|
||||||
|
display: block;
|
||||||
|
width: 12px;
|
||||||
|
height: 13px;
|
||||||
|
position: absolute;
|
||||||
|
right: 3px;
|
||||||
|
top: 4px;
|
||||||
|
|
||||||
|
font-size: 1px;
|
||||||
|
outline: none;
|
||||||
|
background: url('select2.png') right top no-repeat;
|
||||||
|
}
|
||||||
|
html[dir="rtl"] .select2-search-choice-close {
|
||||||
|
right: auto;
|
||||||
|
left: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-search-choice-close {
|
||||||
|
left: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
|
||||||
|
left: auto;
|
||||||
|
right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
|
||||||
|
background-position: right -11px;
|
||||||
|
}
|
||||||
|
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
|
||||||
|
background-position: right -11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disabled styles */
|
||||||
|
.select2-container-multi.select2-container-disabled .select2-choices {
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
background-image: none;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
|
||||||
|
padding: 3px 5px 3px 5px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
background-image: none;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
/* end multiselect */
|
||||||
|
|
||||||
|
|
||||||
|
.select2-result-selectable .select2-match,
|
||||||
|
.select2-result-unselectable .select2-match {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-offscreen, .select2-offscreen:focus {
|
||||||
|
clip: rect(0 0 0 0) !important;
|
||||||
|
width: 1px !important;
|
||||||
|
height: 1px !important;
|
||||||
|
border: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
position: absolute !important;
|
||||||
|
outline: 0 !important;
|
||||||
|
left: 0px !important;
|
||||||
|
top: 0px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-display-none {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-measure-scrollbar {
|
||||||
|
position: absolute;
|
||||||
|
top: -10000px;
|
||||||
|
left: -10000px;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Retina-ize icons */
|
||||||
|
|
||||||
|
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
|
||||||
|
.select2-search input,
|
||||||
|
.select2-search-choice-close,
|
||||||
|
.select2-container .select2-choice abbr,
|
||||||
|
.select2-container .select2-choice .select2-arrow b {
|
||||||
|
background-image: url('select2x2.png') !important;
|
||||||
|
background-repeat: no-repeat !important;
|
||||||
|
background-size: 60px 40px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2-search input {
|
||||||
|
background-position: 100% -21px !important;
|
||||||
|
}
|
||||||
|
}
|
23
public/vendor/select2/select2.min.js
vendored
Executable file
23
public/vendor/select2/select2.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
BIN
public/vendor/select2/select2.png
vendored
Executable file
BIN
public/vendor/select2/select2.png
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 613 B |
BIN
public/vendor/select2/select2x2.png
vendored
Executable file
BIN
public/vendor/select2/select2x2.png
vendored
Executable file
Binary file not shown.
After Width: | Height: | Size: 845 B |
2
public/vendor/store.min.js
vendored
Normal file
2
public/vendor/store.min.js
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/* Copyright (c) 2010-2013 Marcus Westin */
|
||||||
|
"use strict";(function(e,t){typeof define=="function"&&define.amd?define([],t):typeof exports=="object"?module.exports=t():e.store=t()})(this,function(){function o(){try{return r in t&&t[r]}catch(e){return!1}}var e={},t=window,n=t.document,r="localStorage",i="script",s;e.disabled=!1,e.version="1.3.17",e.set=function(e,t){},e.get=function(e,t){},e.has=function(t){return e.get(t)!==undefined},e.remove=function(e){},e.clear=function(){},e.transact=function(t,n,r){r==null&&(r=n,n=null),n==null&&(n={});var i=e.get(t,n);r(i),e.set(t,i)},e.getAll=function(){},e.forEach=function(){},e.serialize=function(e){return JSON.stringify(e)},e.deserialize=function(e){if(typeof e!="string")return undefined;try{return JSON.parse(e)}catch(t){return e||undefined}};if(o())s=t[r],e.set=function(t,n){return n===undefined?e.remove(t):(s.setItem(t,e.serialize(n)),n)},e.get=function(t,n){var r=e.deserialize(s.getItem(t));return r===undefined?n:r},e.remove=function(e){s.removeItem(e)},e.clear=function(){s.clear()},e.getAll=function(){var t={};return e.forEach(function(e,n){t[e]=n}),t},e.forEach=function(t){for(var n=0;n<s.length;n++){var r=s.key(n);t(r,e.get(r))}};else if(n.documentElement.addBehavior){var u,a;try{a=new ActiveXObject("htmlfile"),a.open(),a.write("<"+i+">document.w=window</"+i+'><iframe src="/favicon.ico"></iframe>'),a.close(),u=a.w.frames[0].document,s=u.createElement("div")}catch(f){s=n.createElement("div"),u=n.body}var l=function(t){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(s),u.appendChild(s),s.addBehavior("#default#userData"),s.load(r);var i=t.apply(e,n);return u.removeChild(s),i}},c=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g"),h=function(e){return e.replace(/^d/,"___$&").replace(c,"___")};e.set=l(function(t,n,i){return n=h(n),i===undefined?e.remove(n):(t.setAttribute(n,e.serialize(i)),t.save(r),i)}),e.get=l(function(t,n,r){n=h(n);var i=e.deserialize(t.getAttribute(n));return i===undefined?r:i}),e.remove=l(function(e,t){t=h(t),e.removeAttribute(t),e.save(r)}),e.clear=l(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(r);while(t.length)e.removeAttribute(t[0].name);e.save(r)}),e.getAll=function(t){var n={};return e.forEach(function(e,t){n[e]=t}),n},e.forEach=l(function(t,n){var r=t.XMLDocument.documentElement.attributes;for(var i=0,s;s=r[i];++i)n(s.name,e.deserialize(t.getAttribute(s.name)))})}try{var p="__storejs__";e.set(p,p),e.get(p)!=p&&(e.disabled=!0),e.remove(p)}catch(f){e.disabled=!0}return e.enabled=!e.disabled,e})
|
1
public/vendor/url.min.js
vendored
Executable file
1
public/vendor/url.min.js
vendored
Executable file
|
@ -0,0 +1 @@
|
||||||
|
/*! url - v1.8.6 - 2013-11-22 */window.url=function(){function a(a){return!isNaN(parseFloat(a))&&isFinite(a)}return function(b,c){var d=c||window.location.toString();if(!b)return d;b=b.toString(),"//"===d.substring(0,2)?d="http:"+d:1===d.split("://").length&&(d="http://"+d),c=d.split("/");var e={auth:""},f=c[2].split("@");1===f.length?f=f[0].split(":"):(e.auth=f[0],f=f[1].split(":")),e.protocol=c[0],e.hostname=f[0],e.port=f[1]||("https"===e.protocol.split(":")[0].toLowerCase()?"443":"80"),e.pathname=(c.length>3?"/":"")+c.slice(3,c.length).join("/").split("?")[0].split("#")[0];var g=e.pathname;"/"===g.charAt(g.length-1)&&(g=g.substring(0,g.length-1));var h=e.hostname,i=h.split("."),j=g.split("/");if("hostname"===b)return h;if("domain"===b)return/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(h)?h:i.slice(-2).join(".");if("sub"===b)return i.slice(0,i.length-2).join(".");if("port"===b)return e.port;if("protocol"===b)return e.protocol.split(":")[0];if("auth"===b)return e.auth;if("user"===b)return e.auth.split(":")[0];if("pass"===b)return e.auth.split(":")[1]||"";if("path"===b)return e.pathname;if("."===b.charAt(0)){if(b=b.substring(1),a(b))return b=parseInt(b,10),i[0>b?i.length+b:b-1]||""}else{if(a(b))return b=parseInt(b,10),j[0>b?j.length+b:b]||"";if("file"===b)return j.slice(-1)[0];if("filename"===b)return j.slice(-1)[0].split(".")[0];if("fileext"===b)return j.slice(-1)[0].split(".")[1]||"";if("?"===b.charAt(0)||"#"===b.charAt(0)){var k=d,l=null;if("?"===b.charAt(0)?k=(k.split("?")[1]||"").split("#")[0]:"#"===b.charAt(0)&&(k=k.split("#")[1]||""),!b.charAt(1))return k;b=b.substring(1),k=k.split("&");for(var m=0,n=k.length;n>m;m++)if(l=k[m].split("="),l[0]===b)return l[1]||"";return null}}return""}}(),"undefined"!=typeof jQuery&&jQuery.extend({url:function(a,b){return window.url(a,b)}});
|
|
@ -1,30 +1,35 @@
|
||||||
<!--<script src="/js/ga.js"></script>-->
|
<script src="/vendor/spin.min.js" defer></script>
|
||||||
<script src="//cdnjs.cloudflare.com/ajax/libs/spin.js/2.0.1/spin.min.js"></script>
|
<script src="/vendor/jquery-1.11.2.min.js" defer></script>
|
||||||
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
|
<script src="/vendor/bootstrap/js/bootstrap.min.js" defer></script>
|
||||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
|
||||||
<!--codemirror-->
|
<!--codemirror-->
|
||||||
<script src="/vendor/codemirror/codemirror.min.js"></script>
|
<script src="/vendor/codemirror/codemirror.min.js" defer></script>
|
||||||
|
<script src="/vendor/inlineAttachment/inline-attachment.js" defer></script>
|
||||||
|
<script src="/vendor/inlineAttachment/codemirror.inline-attachment.js" defer></script>
|
||||||
<!--others-->
|
<!--others-->
|
||||||
<script src="/vendor/socket.io-1.3.5.js"></script>
|
<script src="/vendor/socket.io-1.3.5.js" defer></script>
|
||||||
<script src="/vendor/remarkable.min.js"></script>
|
<script src="/vendor/remarkable.min.js" defer></script>
|
||||||
<script src="/vendor/remarkable-regex.js"></script>
|
<script src="/vendor/remarkable-regex.js" defer></script>
|
||||||
<script src="/vendor/gist-embed.js"></script>
|
<script src="/vendor/gist-embed.js" defer></script>
|
||||||
<script src="/vendor/lz-string.min.js"></script>
|
<script src="/vendor/lz-string.min.js" defer></script>
|
||||||
<script src="/vendor/highlight-js/highlight.min.js"></script>
|
<script src="/vendor/highlight-js/highlight.min.js" defer></script>
|
||||||
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script>
|
<script src="/vendor/js.cookie.js" defer></script>
|
||||||
<script src="/vendor/moment-with-locales.js"></script>
|
<script src="/vendor/moment-with-locales.js" defer></script>
|
||||||
<script src="/vendor/emojify/js/emojify.js"></script>
|
<script src="/vendor/emojify/js/emojify.js" defer></script>
|
||||||
<script src="/vendor/to-markdown.js"></script>
|
<script src="/vendor/to-markdown.js" defer></script>
|
||||||
<script src="/vendor/raphael-min.js"></script>
|
<script src="/vendor/raphael-min.js" defer></script>
|
||||||
<script src="/vendor/underscore-min.js"></script>
|
<script src="/vendor/underscore-min.js" defer></script>
|
||||||
<script src="/vendor/sequence-diagrams/sequence-diagram-min.js"></script>
|
<script src="/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
|
||||||
<script src="/vendor/flowchart/flowchart-1.4.0.min.js"></script>
|
<script src="/vendor/flowchart/flowchart-1.4.0.min.js" defer></script>
|
||||||
<script src="/vendor/FileSaver.min.js"></script>
|
<script src="/vendor/FileSaver.min.js" defer></script>
|
||||||
|
<script src="/vendor/store.min.js" defer></script>
|
||||||
|
<script src="/vendor/url.min.js" defer></script>
|
||||||
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="rdoizrlnkuha23r" async defer></script>
|
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="rdoizrlnkuha23r" async defer></script>
|
||||||
<script type="text/x-mathjax-config">
|
<script type="text/x-mathjax-config">
|
||||||
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
|
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
<script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
|
||||||
<script src="/js/extra.js"></script>
|
<script src="/js/common.js" defer></script>
|
||||||
<script src="/js/history.js"></script>
|
<script src="/js/extra.js" defer></script>
|
||||||
<script src="/js/index.js"></script>
|
<script src="/js/history.js" defer></script>
|
||||||
|
<script src="/js/index.js" defer></script>
|
||||||
|
<script src="/js/syncscroll.js" defer></script>
|
|
@ -6,25 +6,19 @@
|
||||||
<meta name="mobile-web-app-capable" content="yes">
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
<meta name="description" content="Realtime collaborative markdown notes on all platforms.">
|
<meta name="description" content="Realtime collaborative markdown notes on all platforms.">
|
||||||
<meta name="author" content="jackycute">
|
<meta name="author" content="jackycute">
|
||||||
<!-- Open Graph data -->
|
|
||||||
<meta property="og:title" content="HackMD - Collaborative notes">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:url" content="https://hackmd.herokuapp.com/">
|
|
||||||
<meta property="og:description" content="Realtime collaborative markdown notes on all platforms.">
|
|
||||||
<meta property="og:site_name" content="HackMD">
|
|
||||||
<meta property="fb:admins" content="1463801565">
|
|
||||||
<title>HackMD - Collaborative notes</title>
|
<title>HackMD - Collaborative notes</title>
|
||||||
<link rel="icon" type="image/png" href="/favicon.png">
|
<link rel="icon" type="image/png" href="/favicon.png">
|
||||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||||
<!--<link rel="stylesheet" href="/vendor/bootstrap-3.3.1/css/bootstrap.min.css">-->
|
<link rel="stylesheet" href="/vendor/bootstrap/css/bootstrap.min.css">
|
||||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/vendor/font-awesome/css/font-awesome.min.css">
|
||||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
|
|
||||||
<link rel="stylesheet" href="/vendor/codemirror/lib/codemirror.css">
|
<link rel="stylesheet" href="/vendor/codemirror/lib/codemirror.css">
|
||||||
<link rel="stylesheet" href="/vendor/codemirror/addon/fold/foldgutter.css">
|
<link rel="stylesheet" href="/vendor/codemirror/addon/fold/foldgutter.css">
|
||||||
|
<link rel="stylesheet" href="/vendor/codemirror/addon/dialog/dialog.css">
|
||||||
|
<link rel="stylesheet" href="/vendor/codemirror/addon/scroll/simplescrollbars.css">
|
||||||
|
<link rel="stylesheet" href="/vendor/codemirror/addon/search/matchesonscrollbar.css">
|
||||||
<link rel="stylesheet" href="/vendor/codemirror/theme/monokai.css">
|
<link rel="stylesheet" href="/vendor/codemirror/theme/monokai.css">
|
||||||
<link rel="stylesheet" href="/css/github-extract.css">
|
<link rel="stylesheet" href="/css/github-extract.css">
|
||||||
<link rel="stylesheet" href="/css/gist.css">
|
<link rel="stylesheet" href="/css/gist.css">
|
||||||
<!--<link rel="stylesheet" href="/css/github-code-cdn.css">-->
|
|
||||||
<link rel="stylesheet" href="/vendor/highlight-js/github.min.css">
|
<link rel="stylesheet" href="/vendor/highlight-js/github.min.css">
|
||||||
<link rel="stylesheet" href="/vendor/emojify/css/emojify.min.css" />
|
<link rel="stylesheet" href="/vendor/emojify/css/emojify.min.css" />
|
||||||
<link rel="stylesheet" href="/css/markdown.css">
|
<link rel="stylesheet" href="/css/markdown.css">
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
<ul class="dropdown-menu" role="menu" aria-labelledby="menu">
|
<ul class="dropdown-menu" role="menu" aria-labelledby="menu">
|
||||||
<li role="presentation"><a role="menuitem" class="ui-new" tabindex="-1" href="./new" target="_blank"><i class="fa fa-plus fa-fw"></i> New</a>
|
<li role="presentation"><a role="menuitem" class="ui-new" tabindex="-1" href="./new" target="_blank"><i class="fa fa-plus fa-fw"></i> New</a>
|
||||||
</li>
|
</li>
|
||||||
<li role="presentation"><a role="menuitem" class="ui-pretty" tabindex="-1" href="#" target="_blank"><i class="fa fa-print fa-fw"></i> Pretty</a>
|
<li role="presentation"><a role="menuitem" class="ui-pretty" tabindex="-1" href="#" target="_blank"><i class="fa fa-share-alt fa-fw"></i> Share</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li class="dropdown-header">Save</li>
|
<li class="dropdown-header">Save</li>
|
||||||
|
@ -75,7 +75,7 @@
|
||||||
<i class="fa fa-plus"></i> New
|
<i class="fa fa-plus"></i> New
|
||||||
</a>
|
</a>
|
||||||
<a href="#" target="_blank" class="btn btn-link ui-pretty">
|
<a href="#" target="_blank" class="btn btn-link ui-pretty">
|
||||||
<i class="fa fa-print"></i> Pretty
|
<i class="fa fa-share-alt"></i> Share
|
||||||
</a>
|
</a>
|
||||||
<span>
|
<span>
|
||||||
<a class="btn btn-link" data-target="#" data-toggle="dropdown">
|
<a class="btn btn-link" data-target="#" data-toggle="dropdown">
|
||||||
|
|
|
@ -27,32 +27,23 @@
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
<!--<script src="<%- url %>/js/ga.js"></script>-->
|
<!--<script src="<%- url %>/js/ga.js" async defer></script>-->
|
||||||
<script src="<%- url %>/vendor/jquery-1.11.2.min.js"></script>
|
<!--<script src="<%- url %>/js/newrelic.js" async defer></script>-->
|
||||||
<script src="<%- url %>/vendor/lz-string.min.js"></script>
|
<script src="<%- url %>/vendor/jquery-1.11.2.min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/remarkable.min.js"></script>
|
<script src="<%- url %>/vendor/lz-string.min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/remarkable-regex.js"></script>
|
<script src="<%- url %>/vendor/remarkable.min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/gist-embed.js"></script>
|
<script src="<%- url %>/vendor/remarkable-regex.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/string.min.js"></script>
|
<script src="<%- url %>/vendor/gist-embed.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/highlight-js/highlight.min.js"></script>
|
<script src="<%- url %>/vendor/string.min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/emojify/js/emojify.min.js"></script>
|
<script src="<%- url %>/vendor/highlight-js/highlight.min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/raphael-min.js"></script>
|
<script src="<%- url %>/vendor/emojify/js/emojify.min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/underscore-min.js"></script>
|
<script src="<%- url %>/vendor/raphael-min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js"></script>
|
<script src="<%- url %>/vendor/underscore-min.js" defer></script>
|
||||||
<script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js"></script>
|
<script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
|
||||||
|
<script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js" defer></script>
|
||||||
<script type="text/x-mathjax-config">
|
<script type="text/x-mathjax-config">
|
||||||
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
|
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
<script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
|
||||||
<script src="<%- url %>/js/extra.js"></script>
|
<script src="<%- url %>/js/extra.js" defer></script>
|
||||||
<script>
|
<script src="<%- url %>/js/pretty.js" defer></script>
|
||||||
var raw = $(".markdown-body").text();
|
|
||||||
var markdown = LZString.decompressFromBase64(raw);
|
|
||||||
var result = postProcess(md.render(markdown));
|
|
||||||
var markdown = $(".markdown-body");
|
|
||||||
markdown.html(result);
|
|
||||||
markdown.show();
|
|
||||||
finishView(markdown);
|
|
||||||
autoLinkify(markdown);
|
|
||||||
scrollToHash();
|
|
||||||
</script>
|
|
7
run.sh
Normal file
7
run.sh
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
forever stop hackmd
|
||||||
|
DATABASE_URL='change this' \
|
||||||
|
MONGOLAB_URI='change this' \
|
||||||
|
PORT='80' \
|
||||||
|
SSLPORT='443' \
|
||||||
|
DOMAIN='change this' \
|
||||||
|
forever -a --uid hackmd start app.js
|
Loading…
Reference in a new issue