mirror of https://github.com/status-im/codimd.git
Marked as 0.2.8
This commit is contained in:
parent
2d36d7ce84
commit
4e64583a0b
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.
|
||||
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 users and sessions are store in mongoDB, which don't need schema, so just connect it directly.
|
||||
|
||||
License under MIT.
|
||||
**License under MIT.**
|
120
app.js
120
app.js
|
@ -1,6 +1,5 @@
|
|||
//app
|
||||
//external modules
|
||||
var connect = require('connect');
|
||||
var express = require('express');
|
||||
var toobusy = require('toobusy-js');
|
||||
var ejs = require('ejs');
|
||||
|
@ -11,24 +10,45 @@ var mongoose = require('mongoose');
|
|||
var compression = require('compression')
|
||||
var session = require('express-session');
|
||||
var MongoStore = require('connect-mongo')(session);
|
||||
var fs = require('fs');
|
||||
var shortid = require('shortid');
|
||||
var imgur = require('imgur');
|
||||
var formidable = require('formidable');
|
||||
|
||||
//core
|
||||
var config = require("./config.js");
|
||||
var User = require("./lib/user.js");
|
||||
var Temp = require("./lib/temp.js");
|
||||
var auth = require("./lib/auth.js");
|
||||
var response = require("./lib/response.js");
|
||||
|
||||
//server setup
|
||||
if (config.usessl) {
|
||||
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 port = process.env.PORT || config.testport;
|
||||
|
||||
// connect to the mongodb
|
||||
if (config.debug)
|
||||
mongoose.connect(config.mongodbstring);
|
||||
else
|
||||
mongoose.connect(process.env.MONGOLAB_URI);
|
||||
mongoose.connect(process.env.MONGOLAB_URI || config.mongodbstring);
|
||||
|
||||
//others
|
||||
var db = require("./lib/db.js");
|
||||
|
@ -53,7 +73,7 @@ app.use(session({
|
|||
name: config.sessionname,
|
||||
secret: config.sessionsecret,
|
||||
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: {
|
||||
maxAge: 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));
|
||||
});
|
||||
});
|
||||
//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
|
||||
app.get('/auth/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
|
||||
app.get("/new", response.newNote);
|
||||
//get features
|
||||
|
@ -248,6 +344,12 @@ io.set('heartbeat timeout', config.heartbeattimeout);
|
|||
io.sockets.on('connection', realtime.connection);
|
||||
|
||||
//listen
|
||||
server.listen(port, function () {
|
||||
console.log('Server listening at port %d', port);
|
||||
if (config.usessl) {
|
||||
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
|
||||
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 = {
|
||||
debug: true,
|
||||
version: '0.2.7',
|
||||
domain: 'http://localhost:3000',
|
||||
testport: '3000',
|
||||
version: '0.2.8',
|
||||
domain: domain,
|
||||
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
|
||||
tmppath: "./tmp/",
|
||||
defaultnotepath: path.join(__dirname, '/public', "default.md"),
|
||||
|
@ -14,36 +36,39 @@ var config = {
|
|||
errorpath: path.join(__dirname, '/public/views', "error.ejs"),
|
||||
prettypath: path.join(__dirname, '/public/views', 'pretty.ejs'),
|
||||
//db string
|
||||
postgresqlstring: "postgresql://localhost:5432/hackmd",
|
||||
mongodbstring: "mongodb://localhost/hackmd",
|
||||
postgresqlstring: "change this",
|
||||
mongodbstring: "change this",
|
||||
//constants
|
||||
featuresnotename: "features",
|
||||
sessionname: 'please set this',
|
||||
sessionsecret: 'please set this',
|
||||
sessionname: 'change this',
|
||||
sessionsecret: 'change this',
|
||||
sessionlife: 14 * 24 * 60 * 60 * 1000, //14 days
|
||||
sessiontouch: 1 * 3600, //1 hour
|
||||
heartbeatinterval: 5000,
|
||||
heartbeattimeout: 10000,
|
||||
//auth
|
||||
facebook: {
|
||||
clientID: 'get yourself one',
|
||||
clientSecret: 'get yourself one',
|
||||
clientID: 'change this',
|
||||
clientSecret: 'change this',
|
||||
callbackPath: '/auth/facebook/callback'
|
||||
},
|
||||
twitter: {
|
||||
consumerKey: 'get yourself one',
|
||||
consumerSecret: 'get yourself one',
|
||||
consumerKey: 'change this',
|
||||
consumerSecret: 'change this',
|
||||
callbackPath: '/auth/twitter/callback'
|
||||
},
|
||||
github: {
|
||||
clientID: 'get yourself one',
|
||||
clientSecret: 'get yourself one',
|
||||
clientID: 'change this',
|
||||
clientSecret: 'change this',
|
||||
callbackPath: '/auth/github/callback'
|
||||
},
|
||||
dropbox: {
|
||||
clientID: 'get yourself one',
|
||||
clientSecret: 'get yourself one',
|
||||
clientID: 'change this',
|
||||
clientSecret: 'change this',
|
||||
callbackPath: '/auth/dropbox/callback'
|
||||
},
|
||||
imgur: {
|
||||
clientID: 'change this'
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -27,23 +27,23 @@ function callback(accessToken, refreshToken, profile, done) {
|
|||
module.exports = passport.use(new FacebookStrategy({
|
||||
clientID: config.facebook.clientID,
|
||||
clientSecret: config.facebook.clientSecret,
|
||||
callbackURL: config.domain + config.facebook.callbackPath
|
||||
callbackURL: config.getserverurl() + config.facebook.callbackPath
|
||||
}, callback));
|
||||
//twitter
|
||||
passport.use(new TwitterStrategy({
|
||||
consumerKey: config.twitter.consumerKey,
|
||||
consumerSecret: config.twitter.consumerSecret,
|
||||
callbackURL: config.domain + config.twitter.callbackPath
|
||||
callbackURL: config.getserverurl() + config.twitter.callbackPath
|
||||
}, callback));
|
||||
//github
|
||||
passport.use(new GithubStrategy({
|
||||
clientID: config.github.clientID,
|
||||
clientSecret: config.github.clientSecret,
|
||||
callbackURL: config.domain + config.github.callbackPath
|
||||
callbackURL: config.getserverurl() + config.github.callbackPath
|
||||
}, callback));
|
||||
//dropbox
|
||||
passport.use(new DropboxStrategy({
|
||||
clientID: config.dropbox.clientID,
|
||||
clientSecret: config.dropbox.clientSecret,
|
||||
callbackURL: config.domain + config.dropbox.callbackPath
|
||||
callbackURL: config.getserverurl() + config.dropbox.callbackPath
|
||||
}, callback));
|
21
lib/db.js
21
lib/db.js
|
@ -18,10 +18,7 @@ var db = {
|
|||
};
|
||||
|
||||
function getDBClient() {
|
||||
if (config.debug)
|
||||
return new pg.Client(config.postgresqlstring);
|
||||
else
|
||||
return new pg.Client(process.env.DATABASE_URL);
|
||||
return new pg.Client(process.env.DATABASE_URL || config.postgresqlstring);
|
||||
}
|
||||
|
||||
function readFromFile(callback) {
|
||||
|
@ -49,12 +46,14 @@ function newToDB(id, owner, body, callback) {
|
|||
var client = getDBClient();
|
||||
client.connect(function (err) {
|
||||
if (err) {
|
||||
client.end();
|
||||
callback(err, null);
|
||||
return console.error('could not connect to postgres', err);
|
||||
}
|
||||
var newnotequery = util.format(insertquery, id, owner, body);
|
||||
//console.log(newnotequery);
|
||||
client.query(newnotequery, function (err, result) {
|
||||
client.end();
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return console.error("new note to db failed: " + err);
|
||||
|
@ -62,7 +61,6 @@ function newToDB(id, owner, body, callback) {
|
|||
if (config.debug)
|
||||
console.log("new note to db success");
|
||||
callback(null, result);
|
||||
client.end();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -72,23 +70,25 @@ function readFromDB(id, callback) {
|
|||
var client = getDBClient();
|
||||
client.connect(function (err) {
|
||||
if (err) {
|
||||
client.end();
|
||||
callback(err, null);
|
||||
return console.error('could not connect to postgres', err);
|
||||
}
|
||||
var readquery = util.format(selectquery, id);
|
||||
//console.log(readquery);
|
||||
client.query(readquery, function (err, result) {
|
||||
client.end();
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return console.error("read from db failed: " + err);
|
||||
} else {
|
||||
//console.log(result.rows);
|
||||
if (result.rows.length <= 0) {
|
||||
callback("not found note in db", null);
|
||||
callback("not found note in db: " + id, null);
|
||||
} else {
|
||||
if(config.debug)
|
||||
console.log("read from db success");
|
||||
callback(null, result);
|
||||
client.end();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -99,12 +99,14 @@ function saveToDB(id, title, data, callback) {
|
|||
var client = getDBClient();
|
||||
client.connect(function (err) {
|
||||
if (err) {
|
||||
client.end();
|
||||
callback(err, null);
|
||||
return console.error('could not connect to postgres', err);
|
||||
}
|
||||
var savequery = util.format(updatequery, title, data, id);
|
||||
//console.log(savequery);
|
||||
client.query(savequery, function (err, result) {
|
||||
client.end();
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return console.error("save to db failed: " + err);
|
||||
|
@ -112,7 +114,6 @@ function saveToDB(id, title, data, callback) {
|
|||
if (config.debug)
|
||||
console.log("save to db success");
|
||||
callback(null, result);
|
||||
client.end();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -122,10 +123,12 @@ function countFromDB(callback) {
|
|||
var client = getDBClient();
|
||||
client.connect(function (err) {
|
||||
if (err) {
|
||||
client.end();
|
||||
callback(err, null);
|
||||
return console.error('could not connect to postgres', err);
|
||||
}
|
||||
client.query(countquery, function (err, result) {
|
||||
client.end();
|
||||
if (err) {
|
||||
callback(err, null);
|
||||
return console.error("count from db failed: " + err);
|
||||
|
@ -134,9 +137,9 @@ function countFromDB(callback) {
|
|||
if (result.rows.length <= 0) {
|
||||
callback("not found note in db", null);
|
||||
} else {
|
||||
if(config.debug)
|
||||
console.log("count from db success");
|
||||
callback(null, result);
|
||||
client.end();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -81,10 +81,11 @@ function getStatus(callback) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
if (!found) {
|
||||
distinctaddresses.push(value.address);
|
||||
if(!found && value.login)
|
||||
if(value.login)
|
||||
distinctregusers++;
|
||||
}
|
||||
});
|
||||
User.getUserCount(function (err, regcount) {
|
||||
if (err) {
|
||||
|
@ -372,11 +373,19 @@ function connection(socket) {
|
|||
switch (op.origin) {
|
||||
case '+input':
|
||||
case '+delete':
|
||||
case '+transpose':
|
||||
case 'paste':
|
||||
case 'cut':
|
||||
case 'undo':
|
||||
case 'redo':
|
||||
case 'drag':
|
||||
case '*compose':
|
||||
case 'case':
|
||||
case '+insertLine':
|
||||
case '+swapLine':
|
||||
case '+joinLines':
|
||||
case '+duplicateLine':
|
||||
case '+sortLines':
|
||||
notes[notename].socks.forEach(function (sock) {
|
||||
if (sock != socket) {
|
||||
if (config.debug)
|
||||
|
|
|
@ -17,16 +17,16 @@ var Note = require("./note.js");
|
|||
//public
|
||||
var response = {
|
||||
errorForbidden: function (res) {
|
||||
res.status(403).send("Forbidden, oh no.")
|
||||
res.status(403).send("Forbidden, oh no.");
|
||||
},
|
||||
errorNotFound: function (res) {
|
||||
responseError(res, "404", "Not Found", "oops.")
|
||||
responseError(res, "404", "Not Found", "oops.");
|
||||
},
|
||||
errorInternalError: function (res) {
|
||||
responseError(res, "500", "Internal Error", "wtf.")
|
||||
responseError(res, "500", "Internal Error", "wtf.");
|
||||
},
|
||||
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,
|
||||
showFeatures: showFeatures,
|
||||
|
|
|
@ -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);
|
||||
callback(err, null);
|
||||
}
|
||||
if (!err && user != null) {
|
||||
if (!err && user) {
|
||||
callback(null, user);
|
||||
} else {
|
||||
console.log('find user failed: ' + err);
|
||||
|
@ -65,7 +65,7 @@ function newUser(id, profile, callback) {
|
|||
|
||||
function findOrNewUser(id, profile, callback) {
|
||||
findUser(id, function(err, user) {
|
||||
if(err || user == null) {
|
||||
if(err || !user) {
|
||||
newUser(id, profile, function(err, user) {
|
||||
if(err) {
|
||||
console.log('find or new user failed: ' + err);
|
||||
|
|
10
package.json
10
package.json
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"name": "hackmd",
|
||||
"version": "0.2.7",
|
||||
"version": "0.2.8",
|
||||
"description": "Realtime collaborative markdown notes on all platforms.",
|
||||
"main": "server.js",
|
||||
"author": "jackymaxj",
|
||||
"main": "app.js",
|
||||
"author": "jackycute",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
@ -11,7 +11,6 @@
|
|||
"body-parser": "^1.12.3",
|
||||
"cheerio": "^0.19.0",
|
||||
"compression": "^1.4.3",
|
||||
"connect": "3.x",
|
||||
"connect-mongo": "^0.8.1",
|
||||
"cookie": "0.1.2",
|
||||
"cookie-parser": "1.3.3",
|
||||
|
@ -19,8 +18,9 @@
|
|||
"emojify.js": "^1.0.1",
|
||||
"express": "4.x",
|
||||
"express-session": "^1.11.1",
|
||||
"formidable": "^1.0.17",
|
||||
"highlight.js": "^8.4.0",
|
||||
"html": "0.0.7",
|
||||
"imgur": "^0.1.5",
|
||||
"jsdom-nogyp": "^0.8.3",
|
||||
"lz-string": "1.3.6",
|
||||
"markdown-pdf": "^5.2.0",
|
||||
|
|
|
@ -23,13 +23,15 @@ a:hover {
|
|||
/*
|
||||
* Base structure
|
||||
*/
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
background-color: #333;
|
||||
}
|
||||
body {
|
||||
min-height: 100%;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
text-shadow: 0 1px 3px rgba(0, 0, 0, .5);
|
||||
|
@ -40,7 +42,7 @@ body {
|
|||
padding: 10px;
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
height: 100vh;
|
||||
/* For at least Firefox */
|
||||
min-height: 100%;
|
||||
-webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, .5);
|
||||
|
@ -156,7 +158,7 @@ body {
|
|||
.masthead,
|
||||
.mastfoot,
|
||||
.cover-container {
|
||||
width: 700px;
|
||||
width: 1000px;
|
||||
}
|
||||
}
|
||||
.section ul {
|
||||
|
@ -168,41 +170,14 @@ html,
|
|||
body {
|
||||
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 {
|
||||
color: black;
|
||||
}
|
||||
.mastfoot {
|
||||
position: relative;
|
||||
}
|
||||
.select2 {
|
||||
width: 100% !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;
|
||||
.select2-container {
|
||||
margin: 0 auto !important;
|
||||
}
|
||||
.list {
|
||||
width: 100%;
|
||||
|
@ -276,3 +251,23 @@ input {
|
|||
text-align: left;
|
||||
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 {
|
||||
overflow: hidden;
|
||||
font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
word-wrap: break-word;
|
||||
|
@ -339,7 +338,7 @@
|
|||
}
|
||||
.task-list-item-checkbox {
|
||||
float: left;
|
||||
margin: 0.4em 0 0.2em -1.3em !important;
|
||||
margin: 0.31em 0 0.2em -1.3em !important;
|
||||
vertical-align: middle;
|
||||
cursor: default !important;
|
||||
}
|
|
@ -20,7 +20,7 @@ form,
|
|||
font-family: 'Source Code Pro', Consolas, monaco, monospace;
|
||||
line-height: 18px;
|
||||
font-size: 16px;
|
||||
height: auto;
|
||||
/*height: auto;*/
|
||||
min-height: 100%;
|
||||
overflow-y: hidden !important;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
|
@ -30,7 +30,7 @@ form,
|
|||
overflow-y: auto !important;
|
||||
}
|
||||
.CodeMirror-code {
|
||||
padding-bottom: 100px;
|
||||
/*padding-bottom: 72px;*/
|
||||
}
|
||||
.CodeMirror-linenumber {
|
||||
opacity: 0.5;
|
||||
|
@ -43,7 +43,7 @@ form,
|
|||
.CodeMirror-foldmarker {
|
||||
color: #d0d0d0;
|
||||
text-shadow: none;
|
||||
font-family: arial;
|
||||
font-family: Arial;
|
||||
line-height: .3;
|
||||
cursor: pointer;
|
||||
margin: 2px;
|
||||
|
|
|
@ -6,6 +6,7 @@ body {
|
|||
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004);
|
||||
/*text-rendering: optimizeLegibility;*/
|
||||
-webkit-overflow-scrolling: touch;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, "Microsoft JhengHei", sans-serif !important;
|
||||
}
|
||||
:focus {
|
||||
outline: none !important;
|
||||
|
|
|
@ -10,13 +10,6 @@
|
|||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="description" content="Realtime collaborative markdown notes on all platforms.">
|
||||
<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>
|
||||
<link rel="icon" type="image/png" href="/favicon.png">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||
|
@ -24,7 +17,8 @@
|
|||
<!-- 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/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 -->
|
||||
<link rel="stylesheet" href="/css/cover.css">
|
||||
<link rel="stylesheet" href="/css/bootstrap-social.css">
|
||||
|
@ -56,9 +50,7 @@
|
|||
<div class="inner cover">
|
||||
<h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1>
|
||||
<p class="lead">
|
||||
Realtime collaborate notes.
|
||||
<br> Using markdown syntax.
|
||||
<br> On all platforms.
|
||||
Realtime collaborative markdown notes on all platforms.
|
||||
</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>
|
||||
<div class="ui-or" style="display:none;">Or</div>
|
||||
|
@ -76,12 +68,12 @@
|
|||
<h4>
|
||||
<a type="button" class="btn btn-success" data-toggle="modal" data-target=".bs-example-modal-sm">Sign In</a> to get own history!
|
||||
</h4>
|
||||
<p>Below are history from cookie</p>
|
||||
<p>Below are history from browser</p>
|
||||
</div>
|
||||
<div class="ui-signout" style="display:none;">
|
||||
<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="/logout" class="btn btn-danger">Sign Out</a>
|
||||
<a href="#" class="btn btn-danger ui-logout">Sign Out</a>
|
||||
<br>
|
||||
<br>
|
||||
<a href="/features">See all features here <i class="fa fa-info-circle"></i></a>
|
||||
|
@ -89,24 +81,34 @@
|
|||
</div>
|
||||
<hr>
|
||||
<form class="form-inline">
|
||||
<div class="form-group">
|
||||
<input class="form-control ui-use-tags" style="width:172px;" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input class="search form-control" placeholder="Search anything..." />
|
||||
</div>
|
||||
<a href="#" class="sort btn btn-default" data-sort="text">
|
||||
Sort by title
|
||||
<a href="#" class="sort btn btn-default" data-sort="text" title="Sort by title">
|
||||
Title
|
||||
</a>
|
||||
<a href="#" class="sort btn btn-default" data-sort="timestamp">
|
||||
Sort by time
|
||||
<a href="#" class="sort btn btn-default" data-sort="timestamp" title="Sort by time">
|
||||
Time
|
||||
</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>
|
||||
<h4 class="ui-nohistory">
|
||||
<h4 class="ui-nohistory" style="display:none;">
|
||||
No history
|
||||
</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>
|
||||
</div>
|
||||
|
||||
<div id="releasenotes" class="section" style="display:none;">
|
||||
<div id="template" style="display:none;">
|
||||
{{#each release}}
|
||||
|
@ -140,6 +142,11 @@
|
|||
|
||||
<div class="mastfoot">
|
||||
<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>
|
||||
</div>
|
||||
|
@ -174,21 +181,25 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="fb-root"></div>
|
||||
|
||||
<!-- Bootstrap core JavaScript
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<!--<script src="/js/ga.js"></script>-->
|
||||
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
|
||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||
<script src="/vendor/select2/js/select2.min.js"></script>
|
||||
<script src="/vendor/select2/js/i18n/en.js"></script>
|
||||
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script>
|
||||
<script src="/vendor/moment-with-locales.js"></script>
|
||||
<script src="/vendor/handlebars-v3.0.0.js"></script>
|
||||
<script src="/vendor/list.min.js"></script>
|
||||
<script src="/js/history.js"></script>
|
||||
<script src="/js/cover.js"></script>
|
||||
<script src="/js/fb.js" async defer></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" defer></script>
|
||||
<script src="/vendor/select2/select2.min.js" defer></script>
|
||||
<script src="/vendor/js.cookie.js" defer></script>
|
||||
<script src="/vendor/moment-with-locales.js" defer></script>
|
||||
<script src="/vendor/handlebars-v3.0.0.js" defer></script>
|
||||
<script src="/vendor/list.min.js" defer></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 src="/js/common.js" defer></script>
|
||||
<script src="/js/history.js" defer></script>
|
||||
<script src="/js/cover.js" defer></script>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -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 () {
|
||||
$(this).siblings().removeClass("active");
|
||||
$(this).addClass("active");
|
||||
|
@ -19,63 +63,202 @@ $(".ui-releasenotes").click(function () {
|
|||
});
|
||||
|
||||
function checkHistoryList() {
|
||||
if ($("#history-list").children().length > 0)
|
||||
if ($("#history-list").children().length > 0) {
|
||||
$(".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();
|
||||
var cookienotehistory = JSON.parse($.cookie('notehistory'));
|
||||
if (login && cookienotehistory && cookienotehistory.length > 0) {
|
||||
$(".ui-import-from-cookie").slideDown();
|
||||
getStorageHistory(function (data) {
|
||||
if (data && data.length > 0 && getLoginState() && historyList.items.length == 0) {
|
||||
$(".ui-import-from-browser").slideDown();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function parseHistoryCallback() {
|
||||
function parseHistoryCallback(list, notehistory) {
|
||||
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) {
|
||||
e.preventDefault();
|
||||
var id = $(this).closest("a").attr("href").split('/')[1];
|
||||
var id = $(this).closest("a").siblings("span").html();
|
||||
getHistory(function (notehistory) {
|
||||
var newnotehistory = removeHistory(id, notehistory);
|
||||
saveHistory(newnotehistory);
|
||||
});
|
||||
$(this).closest("li").remove();
|
||||
list.remove('id', id);
|
||||
checkHistoryList();
|
||||
});
|
||||
buildTagsFilter(filtertags);
|
||||
}
|
||||
|
||||
var login = false;
|
||||
|
||||
checkIfAuth(
|
||||
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-import-from-browser").click(function () {
|
||||
saveStorageHistoryToServer(function () {
|
||||
parseStorageToHistory(historyList, parseHistoryCallback);
|
||||
});
|
||||
});
|
||||
|
||||
$(".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 template = Handlebars.compile(source);
|
||||
var context = {
|
||||
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",
|
||||
tag: "fuel",
|
||||
|
|
|
@ -28,6 +28,8 @@ function renderFilename(view) {
|
|||
return filename;
|
||||
}
|
||||
|
||||
var viewAjaxCallback = null;
|
||||
|
||||
//dynamic event or object binding here
|
||||
function finishView(view) {
|
||||
//youtube
|
||||
|
@ -42,7 +44,7 @@ function finishView(view) {
|
|||
.each(function (key, value) {
|
||||
$.ajax({
|
||||
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',
|
||||
dataType: 'jsonp',
|
||||
success: function (data) {
|
||||
|
@ -54,7 +56,7 @@ function finishView(view) {
|
|||
//gist
|
||||
view.find("code[data-gist-id]").each(function(key, value) {
|
||||
if($(value).children().length == 0)
|
||||
$(value).gist();
|
||||
$(value).gist(viewAjaxCallback);
|
||||
});
|
||||
//emojify
|
||||
emojify.run(view[0]);
|
||||
|
|
|
@ -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,17 +1,36 @@
|
|||
//common
|
||||
function checkIfAuth(yesCallback, noCallback) {
|
||||
$.get('/me')
|
||||
var migrateHistoryFromTempCallback = null;
|
||||
|
||||
migrateHistoryFromTemp();
|
||||
|
||||
function migrateHistoryFromTemp() {
|
||||
if (url('#tempid')) {
|
||||
$.get('/temp', {
|
||||
tempid: url('#tempid')
|
||||
})
|
||||
.done(function (data) {
|
||||
if (data && data.status == 'ok') {
|
||||
yesCallback(data);
|
||||
} else {
|
||||
noCallback();
|
||||
if (data && data.temp) {
|
||||
getStorageHistory(function (olddata) {
|
||||
if (!olddata || olddata.length == 0) {
|
||||
saveHistoryToStorage(JSON.parse(data.temp));
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
.fail(function () {
|
||||
noCallback();
|
||||
.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) {
|
||||
checkIfAuth(
|
||||
|
@ -19,13 +38,20 @@ function saveHistory(notehistory) {
|
|||
saveHistoryToServer(notehistory);
|
||||
},
|
||||
function () {
|
||||
saveHistoryToCookie(notehistory);
|
||||
saveHistoryToStorage(notehistory);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function saveHistoryToStorage(notehistory) {
|
||||
if (store.enabled)
|
||||
store.set('notehistory', JSON.stringify(notehistory));
|
||||
else
|
||||
saveHistoryToCookie(notehistory);
|
||||
}
|
||||
|
||||
function saveHistoryToCookie(notehistory) {
|
||||
$.cookie('notehistory', JSON.stringify(notehistory), {
|
||||
Cookies.set('notehistory', notehistory, {
|
||||
expires: 365
|
||||
});
|
||||
}
|
||||
|
@ -36,12 +62,29 @@ function saveHistoryToServer(notehistory) {
|
|||
});
|
||||
}
|
||||
|
||||
function saveCookieHistoryToServer(callback) {
|
||||
function saveCookieHistoryToStorage(callback) {
|
||||
store.set('notehistory', Cookies.get('notehistory'));
|
||||
callback();
|
||||
}
|
||||
|
||||
function saveStorageHistoryToServer(callback) {
|
||||
var data = store.get('notehistory');
|
||||
if (data) {
|
||||
$.post('/history', {
|
||||
history: $.cookie('notehistory')
|
||||
history: data
|
||||
})
|
||||
.done(function (data) {
|
||||
callback();
|
||||
callback(data);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function saveCookieHistoryToServer(callback) {
|
||||
$.post('/history', {
|
||||
history: Cookies.get('notehistory')
|
||||
})
|
||||
.done(function (data) {
|
||||
callback(data);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -58,7 +101,7 @@ function clearDuplicatedHistory(notehistory) {
|
|||
if (!found)
|
||||
newnotehistory.push(notehistory[i]);
|
||||
}
|
||||
return notehistory;
|
||||
return newnotehistory;
|
||||
}
|
||||
|
||||
function addHistory(id, text, time, tags, notehistory) {
|
||||
|
@ -86,7 +129,7 @@ function writeHistory(view) {
|
|||
writeHistoryToServer(view);
|
||||
},
|
||||
function () {
|
||||
writeHistoryToCookie(view);
|
||||
writeHistoryToStorage(view);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -113,7 +156,7 @@ function writeHistoryToServer(view) {
|
|||
|
||||
function writeHistoryToCookie(view) {
|
||||
try {
|
||||
var notehistory = JSON.parse($.cookie('notehistory'));
|
||||
var notehistory = Cookies.getJSON('notehistory');
|
||||
} catch (err) {
|
||||
var notehistory = [];
|
||||
}
|
||||
|
@ -122,6 +165,22 @@ function writeHistoryToCookie(view) {
|
|||
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) {
|
||||
var title = renderFilename(view);
|
||||
|
||||
|
@ -169,7 +228,7 @@ function getHistory(callback) {
|
|||
getServerHistory(callback);
|
||||
},
|
||||
function () {
|
||||
getCookieHistory(callback);
|
||||
getStorageHistory(callback);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -187,70 +246,76 @@ function getServerHistory(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(
|
||||
function () {
|
||||
parseServerToHistory(callback);
|
||||
parseServerToHistory(list, callback);
|
||||
},
|
||||
function () {
|
||||
parseCookieToHistory(callback);
|
||||
parseStorageToHistory(list, callback);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function parseServerToHistory(callback) {
|
||||
function parseServerToHistory(list, callback) {
|
||||
$.get('/history')
|
||||
.done(function (data) {
|
||||
if (data.history) {
|
||||
//console.log(data.history);
|
||||
parseToHistory(data.history, callback);
|
||||
parseToHistory(list, data.history, callback);
|
||||
}
|
||||
})
|
||||
.fail(function () {
|
||||
parseCookieToHistory(callback);
|
||||
parseCookieToHistory(list, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function parseCookieToHistory(callback) {
|
||||
var notehistory = JSON.parse($.cookie('notehistory'));
|
||||
parseToHistory(notehistory, callback);
|
||||
function parseCookieToHistory(list, callback) {
|
||||
var notehistory = Cookies.getJSON('notehistory');
|
||||
parseToHistory(list, notehistory, callback);
|
||||
}
|
||||
|
||||
function parseToHistory(notehistory, callback) {
|
||||
if (notehistory && notehistory.length > 0) {
|
||||
//console.log(notehistory);
|
||||
function parseStorageToHistory(list, callback) {
|
||||
if (store.enabled) {
|
||||
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++) {
|
||||
//parse time to timestamp and fromNow
|
||||
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();
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
||||
var options = {
|
||||
valueNames: ['text', 'timestamp', 'fromNow', 'time', 'tags']
|
||||
};
|
||||
var historyList = new List('history', options);
|
||||
historyList.sort('timestamp', {
|
||||
order: "desc"
|
||||
});
|
||||
callback();
|
||||
callback(list, notehistory);
|
||||
}
|
|
@ -1,12 +1,10 @@
|
|||
//constant vars
|
||||
//settings
|
||||
var debug = false;
|
||||
var version = '0.2.7';
|
||||
var debug = true;
|
||||
var version = '0.2.8';
|
||||
var doneTypingDelay = 400;
|
||||
var finishChangeDelay = 400;
|
||||
var cursorActivityDelay = 50;
|
||||
var syncScrollDelay = 50;
|
||||
var scrollAnimatePeriod = 100;
|
||||
var cursorAnimatePeriod = 100;
|
||||
var modeType = {
|
||||
edit: {},
|
||||
|
@ -67,15 +65,20 @@ var lastInfo = {
|
|||
};
|
||||
|
||||
//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',
|
||||
keyMap: "sublime",
|
||||
viewportMargin: 20,
|
||||
styleActiveLine: true,
|
||||
lineNumbers: true,
|
||||
lineWrapping: true,
|
||||
showCursorWhenSelecting: true,
|
||||
theme: "monokai",
|
||||
autofocus: true,
|
||||
inputStyle: "textarea",
|
||||
scrollbarStyle: "overlay",
|
||||
matchBrackets: true,
|
||||
autoCloseBrackets: true,
|
||||
matchTags: {
|
||||
|
@ -89,6 +92,7 @@ var editor = CodeMirror.fromTextArea(document.getElementById("textit"), {
|
|||
},
|
||||
readOnly: true
|
||||
});
|
||||
inlineAttachment.editors.codemirror4.attach(editor);
|
||||
|
||||
//ui vars
|
||||
var ui = {
|
||||
|
@ -162,9 +166,19 @@ $(document).ready(function () {
|
|||
}
|
||||
});
|
||||
//when page resize
|
||||
var windowResizeDelay = 200;
|
||||
var windowResizeTimer = null;
|
||||
$(window).resize(function () {
|
||||
checkResponsive();
|
||||
clearTimeout(windowResizeTimer);
|
||||
windowResizeTimer = setTimeout(function () {
|
||||
windowResize();
|
||||
}, windowResizeDelay);
|
||||
});
|
||||
function windowResize() {
|
||||
checkResponsive();
|
||||
clearMap();
|
||||
syncScrollToView();
|
||||
}
|
||||
//768-792px have a gap
|
||||
function checkResponsive() {
|
||||
visibleXS = $(".visible-xs").is(":visible");
|
||||
|
@ -176,6 +190,10 @@ function checkResponsive() {
|
|||
changeMode(modeType.edit);
|
||||
else
|
||||
changeMode(modeType.view);
|
||||
if (visibleXS)
|
||||
$('.CodeMirror').css('height', 'auto');
|
||||
else
|
||||
$('.CodeMirror').css('height', '');
|
||||
}
|
||||
|
||||
function showStatus(type, num) {
|
||||
|
@ -300,7 +318,9 @@ ui.toolbar.pretty.attr("href", url + "/pretty");
|
|||
ui.toolbar.download.markdown.click(function () {
|
||||
var filename = renderFilename(ui.area.markdown) + '.md';
|
||||
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);
|
||||
});
|
||||
//save to dropbox
|
||||
|
@ -308,7 +328,10 @@ ui.toolbar.save.dropbox.click(function() {
|
|||
var filename = renderFilename(ui.area.markdown) + '.md';
|
||||
var options = {
|
||||
files: [
|
||||
{'url': url + "/download", 'filename': filename}
|
||||
{
|
||||
'url': url + "/download",
|
||||
'filename': filename
|
||||
}
|
||||
]
|
||||
};
|
||||
Dropbox.save(options);
|
||||
|
@ -346,11 +369,19 @@ $("#clipboardModalConfirm").click(function() {
|
|||
$("#clipboardModalContent").html('');
|
||||
}
|
||||
});
|
||||
|
||||
function parseToEditor(data) {
|
||||
var parsed = toMarkdown(data);
|
||||
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) {
|
||||
//console.log(url);
|
||||
if (url == null) return;
|
||||
|
@ -372,6 +403,7 @@ function importFromUrl(url) {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
function isValidURL(str) {
|
||||
var pattern = new RegExp('^(https?:\\/\\/)?' + // protocol
|
||||
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
|
||||
|
@ -470,7 +502,16 @@ socket.on('online users', function (data) {
|
|||
if (debug)
|
||||
console.debug(data);
|
||||
showStatus(statusType.online, data.count);
|
||||
$('.other-cursors').html('');
|
||||
$('.other-cursors').children().each(function (key, value) {
|
||||
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];
|
||||
if (user.id != socket.id)
|
||||
|
@ -502,13 +543,18 @@ socket.on('cursor blur', function (data) {
|
|||
cursor.fadeOut();
|
||||
}
|
||||
});
|
||||
|
||||
function emitUserStatus() {
|
||||
checkIfAuth(
|
||||
function (data) {
|
||||
socket.emit('user status', {login:true});
|
||||
socket.emit('user status', {
|
||||
login: true
|
||||
});
|
||||
},
|
||||
function () {
|
||||
socket.emit('user status', {login:false});
|
||||
socket.emit('user status', {
|
||||
login: false
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -535,7 +581,10 @@ function buildCursor(id, color, pos) {
|
|||
cursor.attr('data-line', pos.line);
|
||||
cursor.attr('data-ch', pos.ch);
|
||||
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.top = coord.top + 'px';
|
||||
cursor[0].style.height = '18px';
|
||||
|
@ -566,6 +615,7 @@ editor.on('cursorActivity', function (cm) {
|
|||
clearTimeout(cursorActivityTimer);
|
||||
cursorActivityTimer = setTimeout(cursorActivity, cursorActivityDelay);
|
||||
});
|
||||
|
||||
function cursorActivity() {
|
||||
socket.emit('cursor activity', editor.getCursor());
|
||||
}
|
||||
|
@ -578,8 +628,9 @@ function saveInfo() {
|
|||
var top = $(document.body).scrollTop();
|
||||
switch (currentMode) {
|
||||
case modeType.edit:
|
||||
lastInfo.edit.scroll.left = left;
|
||||
lastInfo.edit.scroll.top = top;
|
||||
//lastInfo.edit.scroll.left = left;
|
||||
//lastInfo.edit.scroll.top = top;
|
||||
lastInfo.edit.scroll = editor.getScrollInfo();
|
||||
break;
|
||||
case modeType.view:
|
||||
lastInfo.view.scroll.left = left;
|
||||
|
@ -603,8 +654,12 @@ function restoreInfo() {
|
|||
|
||||
switch (currentMode) {
|
||||
case modeType.edit:
|
||||
$(document.body).scrollLeft(lastInfo.edit.scroll.left);
|
||||
$(document.body).scrollTop(lastInfo.edit.scroll.top);
|
||||
//$(document.body).scrollLeft(lastInfo.edit.scroll.left);
|
||||
//$(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;
|
||||
case modeType.view:
|
||||
$(document.body).scrollLeft(lastInfo.view.scroll.left);
|
||||
|
@ -652,9 +707,8 @@ function updateView() {
|
|||
finishView(ui.area.view);
|
||||
writeHistory(ui.area.markdown);
|
||||
isDirty = false;
|
||||
// reset lines mapping cache on content update
|
||||
scrollMap = null;
|
||||
emitUserStatus();
|
||||
clearMap();
|
||||
}
|
||||
|
||||
function partialUpdate(src, tar, des) {
|
||||
|
@ -702,7 +756,7 @@ function partialUpdate(src, tar, des) {
|
|||
}
|
||||
}
|
||||
//tar end
|
||||
for (var i = 1; i <= tar.length; i++) {
|
||||
for (var i = 1; i <= tar.length + 1; i++) {
|
||||
var srcLength = src.length;
|
||||
var tarLength = tar.length;
|
||||
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
||||
|
@ -715,7 +769,7 @@ function partialUpdate(src, tar, des) {
|
|||
}
|
||||
}
|
||||
//src end
|
||||
for (var i = 1; i <= src.length; i++) {
|
||||
for (var i = 1; i <= src.length + 1; i++) {
|
||||
var srcLength = src.length;
|
||||
var tarLength = tar.length;
|
||||
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
||||
|
@ -744,36 +798,55 @@ function partialUpdate(src, tar, des) {
|
|||
console.log('start:' + start);
|
||||
console.log('tarEnd:' + tarEnd);
|
||||
console.log('srcEnd:' + srcEnd);
|
||||
console.log('des[start]:' + des[start]);
|
||||
}
|
||||
tarEnd += overlap;
|
||||
srcEnd += overlap;
|
||||
//add new element
|
||||
var newElements = "";
|
||||
var repeatAdd = (start - srcEnd) < (start - tarEnd);
|
||||
var repeatDiff = Math.abs(srcEnd - tarEnd) - 1;
|
||||
//push new elements
|
||||
var newElements = [];
|
||||
if(srcEnd >= start) {
|
||||
for (var j = start; j <= srcEnd; j++) {
|
||||
if(debug)
|
||||
srcChanged += src[j].outerHTML;
|
||||
newElements += src[j].outerHTML;
|
||||
if (!src[j]) continue;
|
||||
newElements.push(src[j].outerHTML);
|
||||
}
|
||||
if(newElements && des[start]) {
|
||||
$(newElements).insertBefore(des[start]);
|
||||
} else {
|
||||
$(newElements).insertAfter(des[des.length-1]);
|
||||
} else if(repeatAdd) {
|
||||
for (var j = srcEnd - repeatDiff; j <= srcEnd; j++) {
|
||||
if (!des[j]) continue;
|
||||
newElements.push(des[j].outerHTML);
|
||||
}
|
||||
if(debug)
|
||||
console.log(srcChanged);
|
||||
//remove old element
|
||||
if(debug)
|
||||
var tarChanged = "";
|
||||
}
|
||||
//push remove elements
|
||||
var removeElements = [];
|
||||
if(tarEnd >= start) {
|
||||
for (var j = start; j <= tarEnd; j++) {
|
||||
if(debug)
|
||||
tarChanged += tar[j].outerHTML;
|
||||
if(des[j])
|
||||
des[j].remove();
|
||||
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]);
|
||||
}
|
||||
}
|
||||
//add elements
|
||||
if (debug) {
|
||||
console.log(tarChanged);
|
||||
var srcChanged = "";
|
||||
console.log('ADD ELEMENTS');
|
||||
console.log(newElements.join('\n'));
|
||||
}
|
||||
if (des[start])
|
||||
$(newElements.join('')).insertBefore(des[start]);
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -790,151 +863,3 @@ function copyAttribute(src, des, attr) {
|
|||
if (src && src.getAttribute(attr) && des)
|
||||
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;
|
||||
}
|
|
@ -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();
|
|
@ -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;
|
||||
}
|
||||
|
||||
.CodeMirror-dialog input::selection {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.CodeMirror-dialog button {
|
||||
font-size: 70%;
|
||||
}
|
||||
|
|
|
@ -97,7 +97,7 @@
|
|||
var height = Math.max(bottom - top, 3);
|
||||
|
||||
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";
|
||||
elt.className = this.options.className;
|
||||
}
|
||||
|
|
|
@ -38,8 +38,9 @@
|
|||
|
||||
.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
|
||||
position: absolute;
|
||||
background: #bcd;
|
||||
background: #ccc;
|
||||
border-radius: 3px;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {
|
||||
|
|
|
@ -75,14 +75,13 @@
|
|||
this.screen = clientSize;
|
||||
this.total = scrollSize;
|
||||
this.size = barSize;
|
||||
|
||||
var buttonSize = this.screen * (this.size / this.total);
|
||||
if (buttonSize < minButtonSize) {
|
||||
this.size -= minButtonSize - buttonSize;
|
||||
buttonSize = minButtonSize;
|
||||
}
|
||||
this.inner.style[this.orientation == "horizontal" ? "width" : "height"] =
|
||||
buttonSize + "px";
|
||||
(buttonSize - 4) + "px";
|
||||
this.inner.style[this.orientation == "horizontal" ? "left" : "top"] =
|
||||
this.pos * (this.size / this.total) + "px";
|
||||
};
|
||||
|
|
|
@ -118,7 +118,7 @@
|
|||
var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
|
||||
function replace(cm, all) {
|
||||
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) {
|
||||
if (!query) return;
|
||||
query = parseQuery(query);
|
||||
|
@ -128,8 +128,8 @@
|
|||
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
|
||||
if (typeof query != "string") {
|
||||
var match = cm.getRange(cursor.from(), cursor.to()).match(query);
|
||||
cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
|
||||
} else cursor.replace(text);
|
||||
cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}), "+input");
|
||||
} else cursor.replace(text, "+input");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
|
@ -149,7 +149,7 @@
|
|||
};
|
||||
var doReplace = function(match) {
|
||||
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();
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2,12 +2,21 @@ uglifyjs --compress --mangle --output codemirror.min.js \
|
|||
lib/codemirror.js \
|
||||
addon/mode/overlay.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/closebrackets.js \
|
||||
addon/edit/matchtags.js \
|
||||
addon/edit/closetag.js \
|
||||
addon/edit/continuelist.js \
|
||||
addon/comment/comment.js \
|
||||
addon/wrap/hardwrap.js \
|
||||
addon/fold/foldcode.js \
|
||||
addon/fold/brace-fold.js \
|
||||
addon/fold/foldgutter.js \
|
||||
addon/fold/markdown-fold.js \
|
||||
addon/fold/xml-fold.js \
|
||||
|
@ -19,4 +28,5 @@ mode/css/css.js \
|
|||
mode/htmlmixed/htmlmixed.js \
|
||||
mode/clike/clike.js \
|
||||
mode/clojure/clojure.js \
|
||||
mode/ruby/ruby.js
|
||||
mode/ruby/ruby.js \
|
||||
keymap/sublime.js
|
|
@ -258,7 +258,7 @@
|
|||
var actual = line - offset;
|
||||
if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -274,9 +274,9 @@
|
|||
for (var i = 0; i < rangeCount; i++) {
|
||||
var range = cm.listSelections()[i];
|
||||
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
|
||||
cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());
|
||||
cm.replaceRange(cm.getRange(range.from(), range.to()), range.from(), null, "+duplicateLine");
|
||||
}
|
||||
cm.scrollIntoView();
|
||||
});
|
||||
|
@ -311,7 +311,7 @@
|
|||
if (au != bu) { a = au; b = bu; }
|
||||
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) cm.setSelections(ranges, 0);
|
||||
|
@ -402,7 +402,7 @@
|
|||
if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;
|
||||
var word = wordAt(cm, range.head);
|
||||
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;
|
||||
if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }
|
||||
cm.state.sublimeKilled = cm.getRange(from, to);
|
||||
cm.replaceRange("", from, to);
|
||||
cm.replaceRange("", from, to, "+delete");
|
||||
}
|
||||
};
|
||||
cmds[map[cK + ctrl + "X"] = "swapWithSublimeMark"] = function(cm) {
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
return lineNumbers;
|
||||
}
|
||||
|
||||
$.fn.gist = function() {
|
||||
$.fn.gist = function(callback) {
|
||||
return this.each(function() {
|
||||
var $elem = $(this),
|
||||
id,
|
||||
|
@ -165,6 +165,10 @@
|
|||
},
|
||||
error: function(jqXHR, textStatus) {
|
||||
$elem.html('Failed loading gist ' + url + ': ' + textStatus);
|
||||
},
|
||||
complete: function() {
|
||||
if(callback)
|
||||
callback();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
})();
|
|
@ -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);
|
||||
};
|
|
@ -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))}});
|
|
@ -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();
|
||||
}));
|
|
@ -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; }
|
File diff suppressed because one or more lines are too long
|
@ -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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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}})();
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -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;
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
|
@ -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;
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 613 B |
Binary file not shown.
After Width: | Height: | Size: 845 B |
|
@ -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})
|
|
@ -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="//cdnjs.cloudflare.com/ajax/libs/spin.js/2.0.1/spin.min.js"></script>
|
||||
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
|
||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||
<script src="/vendor/spin.min.js" defer></script>
|
||||
<script src="/vendor/jquery-1.11.2.min.js" defer></script>
|
||||
<script src="/vendor/bootstrap/js/bootstrap.min.js" defer></script>
|
||||
<!--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-->
|
||||
<script src="/vendor/socket.io-1.3.5.js"></script>
|
||||
<script src="/vendor/remarkable.min.js"></script>
|
||||
<script src="/vendor/remarkable-regex.js"></script>
|
||||
<script src="/vendor/gist-embed.js"></script>
|
||||
<script src="/vendor/lz-string.min.js"></script>
|
||||
<script src="/vendor/highlight-js/highlight.min.js"></script>
|
||||
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script>
|
||||
<script src="/vendor/moment-with-locales.js"></script>
|
||||
<script src="/vendor/emojify/js/emojify.js"></script>
|
||||
<script src="/vendor/to-markdown.js"></script>
|
||||
<script src="/vendor/raphael-min.js"></script>
|
||||
<script src="/vendor/underscore-min.js"></script>
|
||||
<script src="/vendor/sequence-diagrams/sequence-diagram-min.js"></script>
|
||||
<script src="/vendor/flowchart/flowchart-1.4.0.min.js"></script>
|
||||
<script src="/vendor/FileSaver.min.js"></script>
|
||||
<script src="/vendor/socket.io-1.3.5.js" defer></script>
|
||||
<script src="/vendor/remarkable.min.js" defer></script>
|
||||
<script src="/vendor/remarkable-regex.js" defer></script>
|
||||
<script src="/vendor/gist-embed.js" defer></script>
|
||||
<script src="/vendor/lz-string.min.js" defer></script>
|
||||
<script src="/vendor/highlight-js/highlight.min.js" defer></script>
|
||||
<script src="/vendor/js.cookie.js" defer></script>
|
||||
<script src="/vendor/moment-with-locales.js" defer></script>
|
||||
<script src="/vendor/emojify/js/emojify.js" defer></script>
|
||||
<script src="/vendor/to-markdown.js" defer></script>
|
||||
<script src="/vendor/raphael-min.js" defer></script>
|
||||
<script src="/vendor/underscore-min.js" defer></script>
|
||||
<script src="/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
|
||||
<script src="/vendor/flowchart/flowchart-1.4.0.min.js" defer></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/x-mathjax-config">
|
||||
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
|
||||
</script>
|
||||
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<script src="/js/extra.js"></script>
|
||||
<script src="/js/history.js"></script>
|
||||
<script src="/js/index.js"></script>
|
||||
<script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
|
||||
<script src="/js/common.js" defer></script>
|
||||
<script src="/js/extra.js" defer></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="description" content="Realtime collaborative markdown notes on all platforms.">
|
||||
<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>
|
||||
<link rel="icon" type="image/png" href="/favicon.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="//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="/vendor/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="/vendor/font-awesome/css/font-awesome.min.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/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="/css/github-extract.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/emojify/css/emojify.min.css" />
|
||||
<link rel="stylesheet" href="/css/markdown.css">
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<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>
|
||||
<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 class="divider"></li>
|
||||
<li class="dropdown-header">Save</li>
|
||||
|
@ -75,7 +75,7 @@
|
|||
<i class="fa fa-plus"></i> New
|
||||
</a>
|
||||
<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>
|
||||
<span>
|
||||
<a class="btn btn-link" data-target="#" data-toggle="dropdown">
|
||||
|
|
|
@ -27,32 +27,23 @@
|
|||
</body>
|
||||
|
||||
</html>
|
||||
<!--<script src="<%- url %>/js/ga.js"></script>-->
|
||||
<script src="<%- url %>/vendor/jquery-1.11.2.min.js"></script>
|
||||
<script src="<%- url %>/vendor/lz-string.min.js"></script>
|
||||
<script src="<%- url %>/vendor/remarkable.min.js"></script>
|
||||
<script src="<%- url %>/vendor/remarkable-regex.js"></script>
|
||||
<script src="<%- url %>/vendor/gist-embed.js"></script>
|
||||
<script src="<%- url %>/vendor/string.min.js"></script>
|
||||
<script src="<%- url %>/vendor/highlight-js/highlight.min.js"></script>
|
||||
<script src="<%- url %>/vendor/emojify/js/emojify.min.js"></script>
|
||||
<script src="<%- url %>/vendor/raphael-min.js"></script>
|
||||
<script src="<%- url %>/vendor/underscore-min.js"></script>
|
||||
<script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js"></script>
|
||||
<script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js"></script>
|
||||
<!--<script src="<%- url %>/js/ga.js" async defer></script>-->
|
||||
<!--<script src="<%- url %>/js/newrelic.js" async defer></script>-->
|
||||
<script src="<%- url %>/vendor/jquery-1.11.2.min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/lz-string.min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/remarkable.min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/remarkable-regex.js" defer></script>
|
||||
<script src="<%- url %>/vendor/gist-embed.js" defer></script>
|
||||
<script src="<%- url %>/vendor/string.min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/highlight-js/highlight.min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/emojify/js/emojify.min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/raphael-min.js" defer></script>
|
||||
<script src="<%- url %>/vendor/underscore-min.js" defer></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">
|
||||
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
|
||||
</script>
|
||||
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||
<script src="<%- url %>/js/extra.js"></script>
|
||||
<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>
|
||||
<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" defer></script>
|
||||
<script src="<%- url %>/js/pretty.js" defer></script>
|
Loading…
Reference in New Issue