Marked as 0.2.8

This commit is contained in:
Wu Cheng-Han 2015-05-15 12:58:13 +08:00
parent 2d36d7ce84
commit 4e64583a0b
96 changed files with 3281 additions and 22102 deletions

View file

@ -1,12 +1,25 @@
HackMD 0.2.7 HackMD 0.2.8
=== ===
This is a realtime collaborative markdown notes on all platforms. This is a realtime collaborative markdown notes on all platforms.
But still in early stage, feel free to fork or contribute to it. But still in early stage, feel free to fork or contribute to it.
Thanks for your using. Thanks for your using!
There are some config you need to change in below files
```
./run.sh
./config.js
./public/js/common.js
```
You can use SSL to encrypt your site by passing certificate path in the `config.js` and set `usessl=true`.
And there is a script called `run.sh`, it's for someone like me to run the server via npm package `forever`, and can passing environment variable to the server, like heroku does.
To install `forever`, just type `npm install forever -g`
The notes are store in PostgreSQL, and I provided the schema in the `hackmd_schema.sql`. The notes are store in PostgreSQL, and I provided the schema in the `hackmd_schema.sql`.
The users and sessions are store in mongoDB, which don't need schema, so just connect it directly. The users and sessions are store in mongoDB, which don't need schema, so just connect it directly.
License under MIT. **License under MIT.**

126
app.js
View file

@ -1,6 +1,5 @@
//app //app
//external modules //external modules
var connect = require('connect');
var express = require('express'); var express = require('express');
var toobusy = require('toobusy-js'); var toobusy = require('toobusy-js');
var ejs = require('ejs'); var ejs = require('ejs');
@ -11,24 +10,45 @@ var mongoose = require('mongoose');
var compression = require('compression') var compression = require('compression')
var session = require('express-session'); var session = require('express-session');
var MongoStore = require('connect-mongo')(session); var MongoStore = require('connect-mongo')(session);
var fs = require('fs');
var shortid = require('shortid');
var imgur = require('imgur');
var formidable = require('formidable');
//core //core
var config = require("./config.js"); var config = require("./config.js");
var User = require("./lib/user.js"); var User = require("./lib/user.js");
var Temp = require("./lib/temp.js");
var auth = require("./lib/auth.js"); var auth = require("./lib/auth.js");
var response = require("./lib/response.js"); var response = require("./lib/response.js");
//server setup //server setup
var app = express(); if (config.usessl) {
var server = require('http').createServer(app); var ca = (function () {
var i, len, results;
results = [];
for (i = 0, len = config.sslcapath.length; i < len; i++) {
results.push(fs.readFileSync(config.sslcapath[i], 'utf8'));
}
return results;
})();
var options = {
key: fs.readFileSync(config.sslkeypath, 'utf8'),
cert: fs.readFileSync(config.sslcertpath, 'utf8'),
ca: ca,
requestCert: false,
rejectUnauthorized: false
};
var app = express();
var server = require('https').createServer(options, app);
} else {
var app = express();
var server = require('http').createServer(app);
}
var io = require('socket.io').listen(server); var io = require('socket.io').listen(server);
var port = process.env.PORT || config.testport;
// connect to the mongodb // connect to the mongodb
if (config.debug) mongoose.connect(process.env.MONGOLAB_URI || config.mongodbstring);
mongoose.connect(config.mongodbstring);
else
mongoose.connect(process.env.MONGOLAB_URI);
//others //others
var db = require("./lib/db.js"); var db = require("./lib/db.js");
@ -53,7 +73,7 @@ app.use(session({
name: config.sessionname, name: config.sessionname,
secret: config.sessionsecret, secret: config.sessionsecret,
resave: false, //don't save session if unmodified resave: false, //don't save session if unmodified
saveUninitialized: true, //don't create session until something stored saveUninitialized: false, //don't create session until something stored
cookie: { cookie: {
maxAge: new Date(Date.now() + config.sessionlife), maxAge: new Date(Date.now() + config.sessionlife),
expires: new Date(Date.now() + config.sessionlife), expires: new Date(Date.now() + config.sessionlife),
@ -111,6 +131,59 @@ app.get("/status", function (req, res, next) {
res.end(JSON.stringify(data)); res.end(JSON.stringify(data));
}); });
}); });
//get status
app.get("/temp", function (req, res) {
var host = req.get('host');
if (config.alloworigin.indexOf(host) == -1)
response.errorForbidden(res);
else {
var tempid = req.query.tempid;
if (!tempid)
response.errorForbidden(res);
else {
Temp.findTemp(tempid, function (err, temp) {
if (err || !temp)
response.errorForbidden(res);
else {
res.header("Access-Control-Allow-Origin", "*");
res.send({
temp: temp.data
});
temp.remove(function (err) {
if (err)
console.log('remove temp failed: ' + err);
});
}
});
}
}
});
//post status
app.post("/temp", urlencodedParser, function (req, res) {
var host = req.get('host');
if (config.alloworigin.indexOf(host) == -1)
response.errorForbidden(res);
else {
var id = shortid.generate();
var data = req.body.data;
if (!id || !data)
response.errorForbidden(res);
else {
if (config.debug)
console.log('SERVER received temp from [' + host + ']: ' + req.body.data);
Temp.newTemp(id, data, function (err, temp) {
if (!err && temp) {
res.header("Access-Control-Allow-Origin", "*");
res.send({
status: 'ok',
id: temp.id
});
} else
response.errorInternalError(res);
});
}
}
});
//facebook auth //facebook auth
app.get('/auth/facebook', app.get('/auth/facebook',
passport.authenticate('facebook'), passport.authenticate('facebook'),
@ -230,6 +303,29 @@ app.get('/me', function (req, res) {
}); });
} }
}); });
//upload to imgur
app.post('/uploadimage', function (req, res) {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
if (err || !files.image || !files.image.path) {
response.errorForbidden(res);
} else {
if (config.debug)
console.log('SERVER received uploadimage: ' + JSON.stringify(files.image));
imgur.setClientId(config.imgur.clientID);
imgur.uploadFile(files.image.path)
.then(function (json) {
if (config.debug)
console.log('SERVER uploadimage success: ' + JSON.stringify(json));
res.send({link:json.data.link});
})
.catch(function (err) {
console.error(err);
res.send(err.message);
});
}
});
});
//get new note //get new note
app.get("/new", response.newNote); app.get("/new", response.newNote);
//get features //get features
@ -248,6 +344,12 @@ io.set('heartbeat timeout', config.heartbeattimeout);
io.sockets.on('connection', realtime.connection); io.sockets.on('connection', realtime.connection);
//listen //listen
server.listen(port, function () { if (config.usessl) {
console.log('Server listening at port %d', port); server.listen(config.sslport, function () {
}); console.log('HTTPS Server listening at sslport %d', config.sslport);
});
} else {
server.listen(config.port, function () {
console.log('HTTP Server listening at port %d', config.port);
});
}

View file

@ -1,11 +1,33 @@
//config //config
var path = require('path'); var path = require('path');
var domain = process.env.DOMAIN;
var testport = '3000';
var testsslport = '3001';
var port = process.env.PORT || testport;
var sslport = process.env.SSLPORT || testsslport;
var usessl = false;
var urladdport = true; //add port on getserverurl
var config = { var config = {
debug: true, debug: true,
version: '0.2.7', version: '0.2.8',
domain: 'http://localhost:3000', domain: domain,
testport: '3000', alloworigin: ['add here to allow origin to cross'],
testport: testport,
testsslport: testsslport,
port: port,
sslport: sslport,
sslkeypath: 'change this',
sslcertpath: 'change this',
sslcapath: ['change this'],
usessl: usessl,
getserverurl: function() {
if(usessl)
return 'https://' + domain + (sslport == 443 || !urladdport ? '' : ':' + sslport);
else
return 'http://' + domain + (port == 80 || !urladdport ? '' : ':' + port);
},
//path //path
tmppath: "./tmp/", tmppath: "./tmp/",
defaultnotepath: path.join(__dirname, '/public', "default.md"), defaultnotepath: path.join(__dirname, '/public', "default.md"),
@ -14,36 +36,39 @@ var config = {
errorpath: path.join(__dirname, '/public/views', "error.ejs"), errorpath: path.join(__dirname, '/public/views', "error.ejs"),
prettypath: path.join(__dirname, '/public/views', 'pretty.ejs'), prettypath: path.join(__dirname, '/public/views', 'pretty.ejs'),
//db string //db string
postgresqlstring: "postgresql://localhost:5432/hackmd", postgresqlstring: "change this",
mongodbstring: "mongodb://localhost/hackmd", mongodbstring: "change this",
//constants //constants
featuresnotename: "features", featuresnotename: "features",
sessionname: 'please set this', sessionname: 'change this',
sessionsecret: 'please set this', sessionsecret: 'change this',
sessionlife: 14 * 24 * 60 * 60 * 1000, //14 days sessionlife: 14 * 24 * 60 * 60 * 1000, //14 days
sessiontouch: 1 * 3600, //1 hour sessiontouch: 1 * 3600, //1 hour
heartbeatinterval: 5000, heartbeatinterval: 5000,
heartbeattimeout: 10000, heartbeattimeout: 10000,
//auth //auth
facebook: { facebook: {
clientID: 'get yourself one', clientID: 'change this',
clientSecret: 'get yourself one', clientSecret: 'change this',
callbackPath: '/auth/facebook/callback' callbackPath: '/auth/facebook/callback'
}, },
twitter: { twitter: {
consumerKey: 'get yourself one', consumerKey: 'change this',
consumerSecret: 'get yourself one', consumerSecret: 'change this',
callbackPath: '/auth/twitter/callback' callbackPath: '/auth/twitter/callback'
}, },
github: { github: {
clientID: 'get yourself one', clientID: 'change this',
clientSecret: 'get yourself one', clientSecret: 'change this',
callbackPath: '/auth/github/callback' callbackPath: '/auth/github/callback'
}, },
dropbox: { dropbox: {
clientID: 'get yourself one', clientID: 'change this',
clientSecret: 'get yourself one', clientSecret: 'change this',
callbackPath: '/auth/dropbox/callback' callbackPath: '/auth/dropbox/callback'
},
imgur: {
clientID: 'change this'
} }
}; };

View file

@ -27,23 +27,23 @@ function callback(accessToken, refreshToken, profile, done) {
module.exports = passport.use(new FacebookStrategy({ module.exports = passport.use(new FacebookStrategy({
clientID: config.facebook.clientID, clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret, clientSecret: config.facebook.clientSecret,
callbackURL: config.domain + config.facebook.callbackPath callbackURL: config.getserverurl() + config.facebook.callbackPath
}, callback)); }, callback));
//twitter //twitter
passport.use(new TwitterStrategy({ passport.use(new TwitterStrategy({
consumerKey: config.twitter.consumerKey, consumerKey: config.twitter.consumerKey,
consumerSecret: config.twitter.consumerSecret, consumerSecret: config.twitter.consumerSecret,
callbackURL: config.domain + config.twitter.callbackPath callbackURL: config.getserverurl() + config.twitter.callbackPath
}, callback)); }, callback));
//github //github
passport.use(new GithubStrategy({ passport.use(new GithubStrategy({
clientID: config.github.clientID, clientID: config.github.clientID,
clientSecret: config.github.clientSecret, clientSecret: config.github.clientSecret,
callbackURL: config.domain + config.github.callbackPath callbackURL: config.getserverurl() + config.github.callbackPath
}, callback)); }, callback));
//dropbox //dropbox
passport.use(new DropboxStrategy({ passport.use(new DropboxStrategy({
clientID: config.dropbox.clientID, clientID: config.dropbox.clientID,
clientSecret: config.dropbox.clientSecret, clientSecret: config.dropbox.clientSecret,
callbackURL: config.domain + config.dropbox.callbackPath callbackURL: config.getserverurl() + config.dropbox.callbackPath
}, callback)); }, callback));

View file

@ -18,10 +18,7 @@ var db = {
}; };
function getDBClient() { function getDBClient() {
if (config.debug) return new pg.Client(process.env.DATABASE_URL || config.postgresqlstring);
return new pg.Client(config.postgresqlstring);
else
return new pg.Client(process.env.DATABASE_URL);
} }
function readFromFile(callback) { function readFromFile(callback) {
@ -49,12 +46,14 @@ function newToDB(id, owner, body, callback) {
var client = getDBClient(); var client = getDBClient();
client.connect(function (err) { client.connect(function (err) {
if (err) { if (err) {
client.end();
callback(err, null); callback(err, null);
return console.error('could not connect to postgres', err); return console.error('could not connect to postgres', err);
} }
var newnotequery = util.format(insertquery, id, owner, body); var newnotequery = util.format(insertquery, id, owner, body);
//console.log(newnotequery); //console.log(newnotequery);
client.query(newnotequery, function (err, result) { client.query(newnotequery, function (err, result) {
client.end();
if (err) { if (err) {
callback(err, null); callback(err, null);
return console.error("new note to db failed: " + err); return console.error("new note to db failed: " + err);
@ -62,7 +61,6 @@ function newToDB(id, owner, body, callback) {
if (config.debug) if (config.debug)
console.log("new note to db success"); console.log("new note to db success");
callback(null, result); callback(null, result);
client.end();
} }
}); });
}); });
@ -72,23 +70,25 @@ function readFromDB(id, callback) {
var client = getDBClient(); var client = getDBClient();
client.connect(function (err) { client.connect(function (err) {
if (err) { if (err) {
client.end();
callback(err, null); callback(err, null);
return console.error('could not connect to postgres', err); return console.error('could not connect to postgres', err);
} }
var readquery = util.format(selectquery, id); var readquery = util.format(selectquery, id);
//console.log(readquery); //console.log(readquery);
client.query(readquery, function (err, result) { client.query(readquery, function (err, result) {
client.end();
if (err) { if (err) {
callback(err, null); callback(err, null);
return console.error("read from db failed: " + err); return console.error("read from db failed: " + err);
} else { } else {
//console.log(result.rows); //console.log(result.rows);
if (result.rows.length <= 0) { if (result.rows.length <= 0) {
callback("not found note in db", null); callback("not found note in db: " + id, null);
} else { } else {
console.log("read from db success"); if(config.debug)
console.log("read from db success");
callback(null, result); callback(null, result);
client.end();
} }
} }
}); });
@ -99,12 +99,14 @@ function saveToDB(id, title, data, callback) {
var client = getDBClient(); var client = getDBClient();
client.connect(function (err) { client.connect(function (err) {
if (err) { if (err) {
client.end();
callback(err, null); callback(err, null);
return console.error('could not connect to postgres', err); return console.error('could not connect to postgres', err);
} }
var savequery = util.format(updatequery, title, data, id); var savequery = util.format(updatequery, title, data, id);
//console.log(savequery); //console.log(savequery);
client.query(savequery, function (err, result) { client.query(savequery, function (err, result) {
client.end();
if (err) { if (err) {
callback(err, null); callback(err, null);
return console.error("save to db failed: " + err); return console.error("save to db failed: " + err);
@ -112,7 +114,6 @@ function saveToDB(id, title, data, callback) {
if (config.debug) if (config.debug)
console.log("save to db success"); console.log("save to db success");
callback(null, result); callback(null, result);
client.end();
} }
}); });
}); });
@ -122,10 +123,12 @@ function countFromDB(callback) {
var client = getDBClient(); var client = getDBClient();
client.connect(function (err) { client.connect(function (err) {
if (err) { if (err) {
client.end();
callback(err, null); callback(err, null);
return console.error('could not connect to postgres', err); return console.error('could not connect to postgres', err);
} }
client.query(countquery, function (err, result) { client.query(countquery, function (err, result) {
client.end();
if (err) { if (err) {
callback(err, null); callback(err, null);
return console.error("count from db failed: " + err); return console.error("count from db failed: " + err);
@ -134,9 +137,9 @@ function countFromDB(callback) {
if (result.rows.length <= 0) { if (result.rows.length <= 0) {
callback("not found note in db", null); callback("not found note in db", null);
} else { } else {
console.log("count from db success"); if(config.debug)
console.log("count from db success");
callback(null, result); callback(null, result);
client.end();
} }
} }
}); });

View file

@ -81,10 +81,11 @@ function getStatus(callback) {
break; break;
} }
} }
if (!found) if (!found) {
distinctaddresses.push(value.address); distinctaddresses.push(value.address);
if(!found && value.login) if(value.login)
distinctregusers++; distinctregusers++;
}
}); });
User.getUserCount(function (err, regcount) { User.getUserCount(function (err, regcount) {
if (err) { if (err) {
@ -372,11 +373,19 @@ function connection(socket) {
switch (op.origin) { switch (op.origin) {
case '+input': case '+input':
case '+delete': case '+delete':
case '+transpose':
case 'paste': case 'paste':
case 'cut': case 'cut':
case 'undo': case 'undo':
case 'redo': case 'redo':
case 'drag': case 'drag':
case '*compose':
case 'case':
case '+insertLine':
case '+swapLine':
case '+joinLines':
case '+duplicateLine':
case '+sortLines':
notes[notename].socks.forEach(function (sock) { notes[notename].socks.forEach(function (sock) {
if (sock != socket) { if (sock != socket) {
if (config.debug) if (config.debug)

View file

@ -17,16 +17,16 @@ var Note = require("./note.js");
//public //public
var response = { var response = {
errorForbidden: function (res) { errorForbidden: function (res) {
res.status(403).send("Forbidden, oh no.") res.status(403).send("Forbidden, oh no.");
}, },
errorNotFound: function (res) { errorNotFound: function (res) {
responseError(res, "404", "Not Found", "oops.") responseError(res, "404", "Not Found", "oops.");
}, },
errorInternalError: function (res) { errorInternalError: function (res) {
responseError(res, "500", "Internal Error", "wtf.") responseError(res, "500", "Internal Error", "wtf.");
}, },
errorServiceUnavailable: function (res) { errorServiceUnavailable: function (res) {
res.status(503).send("I'm busy right now, try again later.") res.status(503).send("I'm busy right now, try again later.");
}, },
newNote: newNote, newNote: newNote,
showFeatures: showFeatures, showFeatures: showFeatures,

83
lib/temp.js Normal file
View file

@ -0,0 +1,83 @@
//temp
//external modules
var mongoose = require('mongoose');
//core
var config = require("../config.js");
// create a temp model
var model = mongoose.model('temp', {
id: String,
data: String,
created: Date
});
//public
var temp = {
model: model,
findTemp: findTemp,
newTemp: newTemp,
removeTemp: removeTemp,
getTempCount: getTempCount
};
function getTempCount(callback) {
model.count(function(err, count){
if(err) callback(err, null);
else callback(null, count);
});
}
function findTemp(id, callback) {
model.findOne({
id: id
}, function (err, temp) {
if (err) {
console.log('find temp failed: ' + err);
callback(err, null);
}
if (!err && temp) {
callback(null, temp);
} else {
console.log('find temp failed: ' + err);
callback(err, null);
};
});
}
function newTemp(id, data, callback) {
var temp = new model({
id: id,
data: data,
created: Date.now()
});
temp.save(function (err) {
if (err) {
console.log('new temp failed: ' + err);
callback(err, null);
} else {
console.log("new temp success: " + temp.id);
callback(null, temp);
};
});
}
function removeTemp(id, callback) {
findTemp(id, function(err, temp) {
if(!err && temp) {
temp.remove(function(err) {
if(err) {
console.log('remove temp failed: ' + err);
callback(err, null);
} else {
callback(null, null);
}
});
} else {
console.log('remove temp failed: ' + err);
callback(err, null);
}
});
}
module.exports = temp;

View file

@ -37,7 +37,7 @@ function findUser(id, callback) {
console.log('find user failed: ' + err); console.log('find user failed: ' + err);
callback(err, null); callback(err, null);
} }
if (!err && user != null) { if (!err && user) {
callback(null, user); callback(null, user);
} else { } else {
console.log('find user failed: ' + err); console.log('find user failed: ' + err);
@ -65,7 +65,7 @@ function newUser(id, profile, callback) {
function findOrNewUser(id, profile, callback) { function findOrNewUser(id, profile, callback) {
findUser(id, function(err, user) { findUser(id, function(err, user) {
if(err || user == null) { if(err || !user) {
newUser(id, profile, function(err, user) { newUser(id, profile, function(err, user) {
if(err) { if(err) {
console.log('find or new user failed: ' + err); console.log('find or new user failed: ' + err);

View file

@ -1,9 +1,9 @@
{ {
"name": "hackmd", "name": "hackmd",
"version": "0.2.7", "version": "0.2.8",
"description": "Realtime collaborative markdown notes on all platforms.", "description": "Realtime collaborative markdown notes on all platforms.",
"main": "server.js", "main": "app.js",
"author": "jackymaxj", "author": "jackycute",
"private": true, "private": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -11,7 +11,6 @@
"body-parser": "^1.12.3", "body-parser": "^1.12.3",
"cheerio": "^0.19.0", "cheerio": "^0.19.0",
"compression": "^1.4.3", "compression": "^1.4.3",
"connect": "3.x",
"connect-mongo": "^0.8.1", "connect-mongo": "^0.8.1",
"cookie": "0.1.2", "cookie": "0.1.2",
"cookie-parser": "1.3.3", "cookie-parser": "1.3.3",
@ -19,8 +18,9 @@
"emojify.js": "^1.0.1", "emojify.js": "^1.0.1",
"express": "4.x", "express": "4.x",
"express-session": "^1.11.1", "express-session": "^1.11.1",
"formidable": "^1.0.17",
"highlight.js": "^8.4.0", "highlight.js": "^8.4.0",
"html": "0.0.7", "imgur": "^0.1.5",
"jsdom-nogyp": "^0.8.3", "jsdom-nogyp": "^0.8.3",
"lz-string": "1.3.6", "lz-string": "1.3.6",
"markdown-pdf": "^5.2.0", "markdown-pdf": "^5.2.0",

View file

@ -23,13 +23,15 @@ a:hover {
/* /*
* Base structure * Base structure
*/ */
html {
height: 100%;
}
html, html,
body { body {
height: 100%;
background-color: #333; background-color: #333;
} }
body { body {
min-height: 100%;
color: #fff; color: #fff;
text-align: center; text-align: center;
text-shadow: 0 1px 3px rgba(0, 0, 0, .5); text-shadow: 0 1px 3px rgba(0, 0, 0, .5);
@ -40,7 +42,7 @@ body {
padding: 10px; padding: 10px;
display: table; display: table;
width: 100%; width: 100%;
height: 100%; height: 100vh;
/* For at least Firefox */ /* For at least Firefox */
min-height: 100%; min-height: 100%;
-webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, .5); -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, .5);
@ -156,7 +158,7 @@ body {
.masthead, .masthead,
.mastfoot, .mastfoot,
.cover-container { .cover-container {
width: 700px; width: 1000px;
} }
} }
.section ul { .section ul {
@ -168,41 +170,14 @@ html,
body { body {
overflow-x: hidden; overflow-x: hidden;
} }
.select2-selection,
.select2-search__field {
outline: 0;
}
.select2-search__field:hover {
border: 1px solid #b9b9b9 !important;
border-top-color: #a0a0a0 !important;
}
.select2-search__field:focus {
border: 1px solid #4d90fe !important;
}
input { input {
color: black; color: black;
} }
.mastfoot { .mastfoot {
position: relative; position: relative;
} }
.select2 { .select2-container {
width: 100% !important; margin: 0 auto !important;
max-width: 400px;
}
.select2-selection {
height: 32px !important;
}
.select2-selection__rendered {
line-height: 32px !important;
}
.select2-selection__arrow {
height: 30px !important;
}
.select2-selection__rendered,
.select2-selection__placeholder,
.select2-results__option {
color: #000;
text-shadow: none;
} }
.list { .list {
width: 100%; width: 100%;
@ -276,3 +251,23 @@ input {
text-align: left; text-align: left;
color: black; color: black;
} }
.btn-file {
position: relative;
overflow: hidden;
}
.btn-file input[type=file] {
position: absolute;
top: 0;
right: 0;
min-width: 100%;
min-height: 100%;
font-size: 100px;
text-align: right;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: inherit;
display: block;
}

View file

@ -1,6 +1,5 @@
.markdown-body { .markdown-body {
overflow: hidden; overflow: hidden;
font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
font-size: 16px; font-size: 16px;
line-height: 1.6; line-height: 1.6;
word-wrap: break-word; word-wrap: break-word;
@ -339,7 +338,7 @@
} }
.task-list-item-checkbox { .task-list-item-checkbox {
float: left; float: left;
margin: 0.4em 0 0.2em -1.3em !important; margin: 0.31em 0 0.2em -1.3em !important;
vertical-align: middle; vertical-align: middle;
cursor: default !important; cursor: default !important;
} }

View file

@ -20,7 +20,7 @@ form,
font-family: 'Source Code Pro', Consolas, monaco, monospace; font-family: 'Source Code Pro', Consolas, monaco, monospace;
line-height: 18px; line-height: 18px;
font-size: 16px; font-size: 16px;
height: auto; /*height: auto;*/
min-height: 100%; min-height: 100%;
overflow-y: hidden !important; overflow-y: hidden !important;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
@ -30,7 +30,7 @@ form,
overflow-y: auto !important; overflow-y: auto !important;
} }
.CodeMirror-code { .CodeMirror-code {
padding-bottom: 100px; /*padding-bottom: 72px;*/
} }
.CodeMirror-linenumber { .CodeMirror-linenumber {
opacity: 0.5; opacity: 0.5;
@ -43,7 +43,7 @@ form,
.CodeMirror-foldmarker { .CodeMirror-foldmarker {
color: #d0d0d0; color: #d0d0d0;
text-shadow: none; text-shadow: none;
font-family: arial; font-family: Arial;
line-height: .3; line-height: .3;
cursor: pointer; cursor: pointer;
margin: 2px; margin: 2px;

View file

@ -6,6 +6,7 @@ body {
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004); text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004);
/*text-rendering: optimizeLegibility;*/ /*text-rendering: optimizeLegibility;*/
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
font-family: "Helvetica Neue", Helvetica, Arial, "Microsoft JhengHei", sans-serif !important;
} }
:focus { :focus {
outline: none !important; outline: none !important;

View file

@ -10,13 +10,6 @@
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<meta name="description" content="Realtime collaborative markdown notes on all platforms."> <meta name="description" content="Realtime collaborative markdown notes on all platforms.">
<meta name="author" content="jackycute"> <meta name="author" content="jackycute">
<!-- Open Graph data -->
<meta property="og:title" content="HackMD - Collaborative notes">
<meta property="og:type" content="website">
<meta property="og:url" content="https://hackmd.herokuapp.com/">
<meta property="og:description" content="Realtime collaborative markdown notes on all platforms.">
<meta property="og:site_name" content="HackMD">
<meta property="fb:admins" content="1463801565">
<title>HackMD - Collaborative notes</title> <title>HackMD - Collaborative notes</title>
<link rel="icon" type="image/png" href="/favicon.png"> <link rel="icon" type="image/png" href="/favicon.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png"> <link rel="apple-touch-icon" href="/apple-touch-icon.png">
@ -24,7 +17,8 @@
<!-- Bootstrap core CSS --> <!-- Bootstrap core CSS -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link rel="stylesheet" href="/vendor/select2/css/select2.min.css"> <link rel="stylesheet" href="/vendor/select2/select2.css">
<link rel="stylesheet" href="/vendor/select2/select2-bootstrap.css">
<!-- Custom styles for this template --> <!-- Custom styles for this template -->
<link rel="stylesheet" href="/css/cover.css"> <link rel="stylesheet" href="/css/cover.css">
<link rel="stylesheet" href="/css/bootstrap-social.css"> <link rel="stylesheet" href="/css/bootstrap-social.css">
@ -56,9 +50,7 @@
<div class="inner cover"> <div class="inner cover">
<h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1> <h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1>
<p class="lead"> <p class="lead">
Realtime collaborate notes. Realtime collaborative markdown notes on all platforms.
<br> Using markdown syntax.
<br> On all platforms.
</p> </p>
<a type="button" class="btn btn-lg btn-success ui-signin" data-toggle="modal" data-target=".bs-example-modal-sm" style="display:none;">Sign In</a> <a type="button" class="btn btn-lg btn-success ui-signin" data-toggle="modal" data-target=".bs-example-modal-sm" style="display:none;">Sign In</a>
<div class="ui-or" style="display:none;">Or</div> <div class="ui-or" style="display:none;">Or</div>
@ -76,12 +68,12 @@
<h4> <h4>
<a type="button" class="btn btn-success" data-toggle="modal" data-target=".bs-example-modal-sm">Sign In</a> to get own history! <a type="button" class="btn btn-success" data-toggle="modal" data-target=".bs-example-modal-sm">Sign In</a> to get own history!
</h4> </h4>
<p>Below are history from cookie</p> <p>Below are history from browser</p>
</div> </div>
<div class="ui-signout" style="display:none;"> <div class="ui-signout" style="display:none;">
<h4 class="ui-welcome">Welcome! <span class="ui-name"></span></h4> <h4 class="ui-welcome">Welcome! <span class="ui-name"></span></h4>
<a href="/new" class="btn btn-default">Start new note</a> Or <a href="/new" class="btn btn-default">Start new note</a> Or
<a href="/logout" class="btn btn-danger">Sign Out</a> <a href="#" class="btn btn-danger ui-logout">Sign Out</a>
<br> <br>
<br> <br>
<a href="/features">See all features here <i class="fa fa-info-circle"></i></a> <a href="/features">See all features here <i class="fa fa-info-circle"></i></a>
@ -89,24 +81,34 @@
</div> </div>
<hr> <hr>
<form class="form-inline"> <form class="form-inline">
<div class="form-group">
<input class="form-control ui-use-tags" style="width:172px;" />
</div>
<div class="form-group"> <div class="form-group">
<input class="search form-control" placeholder="Search anything..." /> <input class="search form-control" placeholder="Search anything..." />
</div> </div>
<a href="#" class="sort btn btn-default" data-sort="text"> <a href="#" class="sort btn btn-default" data-sort="text" title="Sort by title">
Sort by title Title
</a> </a>
<a href="#" class="sort btn btn-default" data-sort="timestamp"> <a href="#" class="sort btn btn-default" data-sort="timestamp" title="Sort by time">
Sort by time Time
</a> </a>
<span class="hidden-xs hidden-sm">
<a href="#" class="btn btn-default ui-save-history" title="Export history"><i class="fa fa-save"></i></a>
<span class="btn btn-default btn-file ui-open-history" title="Import history">
<i class="fa fa-folder-open-o"></i><input type="file" />
</span>
<a href="#" class="btn btn-default ui-clear-history" title="Clear history"><i class="fa fa-trash-o"></i></a>
</span>
<a href="#" class="btn btn-default ui-refresh-history" title="Refresh history"><i class="fa fa-refresh"></i></a>
</form> </form>
<h4 class="ui-nohistory"> <h4 class="ui-nohistory" style="display:none;">
No history No history
</h4> </h4>
<a href="#" class="btn btn-primary ui-import-from-cookie" style="display:none;">Import from cookie</a> <a href="#" class="btn btn-primary ui-import-from-browser" style="display:none;">Import from browser</a>
<ul id="history-list" class="list"> <ul id="history-list" class="list">
</ul> </ul>
</div> </div>
<div id="releasenotes" class="section" style="display:none;"> <div id="releasenotes" class="section" style="display:none;">
<div id="template" style="display:none;"> <div id="template" style="display:none;">
{{#each release}} {{#each release}}
@ -140,6 +142,11 @@
<div class="mastfoot"> <div class="mastfoot">
<div class="inner"> <div class="inner">
<h6>
<div class="fb-like" data-href="https://www.facebook.com/TakeHackMD" data-width="80" data-layout="button_count" data-action="like" data-show-faces="true" data-share="false" style="vertical-align:middle;"></div>
&nbsp;
<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>&copy; 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>&copy; 2015 <a href="https://www.facebook.com/TakeHackMD" target="_blank"><i class="fa fa-facebook-square"></i> HackMD</a> by <a href="https://github.com/jackycute" target="_blank"><i class="fa fa-github-square"></i> jackycute</a>
</p> </p>
</div> </div>
@ -174,21 +181,25 @@
</div> </div>
</div> </div>
</div> </div>
<div id="fb-root"></div>
<!-- Bootstrap core JavaScript <!-- Bootstrap core JavaScript
================================================== --> ================================================== -->
<!-- Placed at the end of the document so the pages load faster --> <!-- Placed at the end of the document so the pages load faster -->
<!--<script src="/js/ga.js"></script>--> <script src="/js/fb.js" async defer></script>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script src="//code.jquery.com/jquery-1.11.3.min.js" defer></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script> <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" defer></script>
<script src="/vendor/select2/js/select2.min.js"></script> <script src="/vendor/select2/select2.min.js" defer></script>
<script src="/vendor/select2/js/i18n/en.js"></script> <script src="/vendor/js.cookie.js" defer></script>
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script> <script src="/vendor/moment-with-locales.js" defer></script>
<script src="/vendor/moment-with-locales.js"></script> <script src="/vendor/handlebars-v3.0.0.js" defer></script>
<script src="/vendor/handlebars-v3.0.0.js"></script> <script src="/vendor/list.min.js" defer></script>
<script src="/vendor/list.min.js"></script> <script src="/vendor/FileSaver.min.js" defer></script>
<script src="/js/history.js"></script> <script src="/vendor/store.min.js" defer></script>
<script src="/js/cover.js"></script> <script src="/vendor/url.min.js" defer></script>
<script src="/js/common.js" defer></script>
<script src="/js/history.js" defer></script>
<script src="/js/cover.js" defer></script>
</body> </body>
</html> </html>

53
public/js/common.js Normal file
View file

@ -0,0 +1,53 @@
//common
var domain = 'change this';
var checkAuth = false;
var profile = null;
var lastLoginState = getLoginState();
var loginStateChangeEvent = null;
function resetCheckAuth() {
checkAuth = false;
}
function setLoginState(bool) {
Cookies.set('loginstate', bool, {
expires: 14
});
if (loginStateChangeEvent && bool != lastLoginState)
loginStateChangeEvent();
lastLoginState = bool;
}
function getLoginState() {
return Cookies.get('loginstate') === "true";
}
function clearLoginState() {
Cookies.remove('loginstate');
}
function checkIfAuth(yesCallback, noCallback) {
var cookieLoginState = getLoginState();
if (!checkAuth || typeof cookieLoginState == 'undefined') {
$.get('/me')
.done(function (data) {
if (data && data.status == 'ok') {
profile = data;
yesCallback(profile);
setLoginState(true);
} else {
noCallback();
setLoginState(false);
}
})
.fail(function () {
noCallback();
setLoginState(false);
});
checkAuth = true;
} else if (cookieLoginState) {
yesCallback(profile);
} else {
noCallback();
}
}

View file

@ -1,3 +1,47 @@
var options = {
valueNames: ['id', 'text', 'timestamp', 'fromNow', 'time', 'tags'],
item: '<li class="col-xs-12 col-sm-6 col-md-6 col-lg-4">\
<span class="id" style="display:none;"></span>\
<a href="#">\
<div class="item">\
<div class="ui-history-close fa fa-close fa-fw"></div>\
<h4 class="text"></h4>\
<p><i class="fromNow"><i class="fa fa-clock-o"></i></i>\
<br>\
<i class="timestamp" style="display:none;"></i><i class="time"></i></p>\
<p class="tags"></p>\
</div>\
</a>\
</li>'
};
var historyList = new List('history', options);
migrateHistoryFromTempCallback = pageInit;
loginStateChangeEvent = pageInit;
pageInit();
function pageInit() {
checkIfAuth(
function (data) {
$('.ui-signin').hide();
$('.ui-or').hide();
$('.ui-welcome').show();
$('.ui-name').html(data.name);
$('.ui-signout').show();
$(".ui-history").click();
parseServerToHistory(historyList, parseHistoryCallback);
},
function () {
$('.ui-signin').slideDown();
$('.ui-or').slideDown();
$('.ui-welcome').hide();
$('.ui-name').html('');
$('.ui-signout').hide();
parseStorageToHistory(historyList, parseHistoryCallback);
}
);
}
$(".masthead-nav li").click(function () { $(".masthead-nav li").click(function () {
$(this).siblings().removeClass("active"); $(this).siblings().removeClass("active");
$(this).addClass("active"); $(this).addClass("active");
@ -19,63 +63,202 @@ $(".ui-releasenotes").click(function () {
}); });
function checkHistoryList() { function checkHistoryList() {
if ($("#history-list").children().length > 0) if ($("#history-list").children().length > 0) {
$(".ui-nohistory").hide(); $(".ui-nohistory").hide();
else if ($("#history-list").children().length == 0) { $(".ui-import-from-browser").hide();
} else if ($("#history-list").children().length == 0) {
$(".ui-nohistory").slideDown(); $(".ui-nohistory").slideDown();
var cookienotehistory = JSON.parse($.cookie('notehistory')); getStorageHistory(function (data) {
if (login && cookienotehistory && cookienotehistory.length > 0) { if (data && data.length > 0 && getLoginState() && historyList.items.length == 0) {
$(".ui-import-from-cookie").slideDown(); $(".ui-import-from-browser").slideDown();
} }
});
} }
} }
function parseHistoryCallback() { function parseHistoryCallback(list, notehistory) {
checkHistoryList(); checkHistoryList();
list.sort('timestamp', {
order: "desc"
});
var filtertags = [];
$(".item").each(function (key, value) {
var a = $(this).closest("a");
var id = a.siblings("span").html();
var tagsEl = $(this).find(".tags");
var item = historyList.get('id', id);
if (item.length > 0 && item[0]) {
var values = item[0].values();
//parse link to element a
a.attr('href', '/' + values.id);
//parse tags
if (values.tags) {
var tags = values.tags;
if (tags.length > 0) {
var labels = [];
for (var j = 0; j < tags.length; j++) {
//push info filtertags if not found
var found = false;
if (filtertags.indexOf(tags[j]) != -1)
found = true;
if (!found)
filtertags.push(tags[j]);
//push into the item label
labels.push("<span class='label label-default'>" + tags[j] + "</span>");
}
tagsEl.html(labels.join(' '));
}
}
}
});
$(".ui-history-close").click(function (e) { $(".ui-history-close").click(function (e) {
e.preventDefault(); e.preventDefault();
var id = $(this).closest("a").attr("href").split('/')[1]; var id = $(this).closest("a").siblings("span").html();
getHistory(function (notehistory) { getHistory(function (notehistory) {
var newnotehistory = removeHistory(id, notehistory); var newnotehistory = removeHistory(id, notehistory);
saveHistory(newnotehistory); saveHistory(newnotehistory);
}); });
$(this).closest("li").remove(); list.remove('id', id);
checkHistoryList(); checkHistoryList();
}); });
buildTagsFilter(filtertags);
} }
var login = false; $(".ui-import-from-browser").click(function () {
saveStorageHistoryToServer(function () {
checkIfAuth( parseStorageToHistory(historyList, parseHistoryCallback);
function (data) {
$('.ui-signin').hide();
$('.ui-or').hide();
$('.ui-welcome').show();
$('.ui-name').html(data.name);
$('.ui-signout').show();
$(".ui-history").click();
login = true;
},
function () {
$('.ui-signin').slideDown();
$('.ui-or').slideDown();
login = false;
}
);
parseHistory(parseHistoryCallback);
$(".ui-import-from-cookie").click(function () {
saveCookieHistoryToServer(function() {
parseCookieToHistory(parseHistoryCallback);
$(".ui-import-from-cookie").hide();
}); });
}); });
$(".ui-save-history").click(function () {
getHistory(function (data) {
var history = JSON.stringify(data);
var blob = new Blob([history], {
type: "application/json;charset=utf-8"
});
saveAs(blob, 'hackmd_history_' + moment().format('YYYYMMDDHHmmss'));
});
});
$(".ui-open-history").bind("change", function (e) {
var files = e.target.files || e.dataTransfer.files;
var file = files[0];
var reader = new FileReader();
reader.onload = function () {
var notehistory = JSON.parse(reader.result);
//console.log(notehistory);
if (!reader.result) return;
getHistory(function (data) {
var mergedata = data.concat(notehistory);
mergedata = clearDuplicatedHistory(mergedata);
saveHistory(mergedata);
parseHistory(historyList, parseHistoryCallback);
});
$(".ui-open-history").replaceWith($(".ui-open-history").val('').clone(true));
};
reader.readAsText(file);
});
$(".ui-clear-history").click(function () {
saveHistory([]);
historyList.clear();
checkHistoryList();
});
$(".ui-refresh-history").click(function () {
resetCheckAuth();
historyList.clear();
parseHistory(historyList, parseHistoryCallback);
});
$(".ui-logout").click(function () {
clearLoginState();
location.href = '/logout';
});
var filtertags = [];
$(".ui-use-tags").select2({
placeholder: 'Use tags...',
multiple: true,
data: function () {
return {
results: filtertags
};
}
});
$('.select2-input').css('width', 'inherit');
buildTagsFilter([]);
function buildTagsFilter(tags) {
for (var i = 0; i < tags.length; i++)
tags[i] = {
id: i,
text: tags[i]
};
filtertags = tags;
}
$(".ui-use-tags").on('change', function () {
var tags = [];
var data = $(this).select2('data');
for (var i = 0; i < data.length; i++)
tags.push(data[i].text);
if (tags.length > 0) {
historyList.filter(function (item) {
var values = item.values();
if (!values.tags) return false;
var found = false;
for (var i = 0; i < tags.length; i++) {
if (values.tags.indexOf(tags[i]) != -1) {
found = true;
break;
}
}
return found;
});
} else {
historyList.filter();
}
checkHistoryList();
});
$('.search').keyup(function () {
checkHistoryList();
});
var source = $("#template").html(); var source = $("#template").html();
var template = Handlebars.compile(source); var template = Handlebars.compile(source);
var context = { var context = {
release: [ release: [
{
version: "0.2.8",
tag: "flame",
date: moment("201505151200", 'YYYYMMDDhhmm').fromNow(),
detail: [
{
title: "Features",
item: [
"+ Support drag-n-drop(exclude firefox) and paste image inline",
"+ Support tags filter in history",
"+ Support sublime-like shortcut keys"
]
},
{
title: "Enhancements",
item: [
"* Adjust index description",
"* Adjust toolbar ui and view font",
"* Remove scroll sync delay and gain accuracy"
]
},
{
title: "Fixes",
item: [
"* Partial update in the front and the end might not render properly",
"* Server not handle some editor events"
]
}
]
},
{ {
version: "0.2.7", version: "0.2.7",
tag: "fuel", tag: "fuel",

View file

@ -28,6 +28,8 @@ function renderFilename(view) {
return filename; return filename;
} }
var viewAjaxCallback = null;
//dynamic event or object binding here //dynamic event or object binding here
function finishView(view) { function finishView(view) {
//youtube //youtube
@ -42,7 +44,7 @@ function finishView(view) {
.each(function (key, value) { .each(function (key, value) {
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: 'http://vimeo.com/api/v2/video/' + $(value).attr('videoid') + '.json', url: '//vimeo.com/api/v2/video/' + $(value).attr('videoid') + '.json',
jsonp: 'callback', jsonp: 'callback',
dataType: 'jsonp', dataType: 'jsonp',
success: function (data) { success: function (data) {
@ -54,7 +56,7 @@ function finishView(view) {
//gist //gist
view.find("code[data-gist-id]").each(function(key, value) { view.find("code[data-gist-id]").each(function(key, value) {
if($(value).children().length == 0) if($(value).children().length == 0)
$(value).gist(); $(value).gist(viewAjaxCallback);
}); });
//emojify //emojify
emojify.run(view[0]); emojify.run(view[0]);

8
public/js/fb.js Normal file
View file

@ -0,0 +1,8 @@
(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3&appId=1436904003272070";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

View file

@ -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');

View file

@ -1,16 +1,35 @@
//common var migrateHistoryFromTempCallback = null;
function checkIfAuth(yesCallback, noCallback) {
$.get('/me') migrateHistoryFromTemp();
.done(function (data) {
if (data && data.status == 'ok') { function migrateHistoryFromTemp() {
yesCallback(data); if (url('#tempid')) {
} else { $.get('/temp', {
noCallback(); tempid: url('#tempid')
} })
}) .done(function (data) {
.fail(function () { if (data && data.temp) {
noCallback(); getStorageHistory(function (olddata) {
}); if (!olddata || olddata.length == 0) {
saveHistoryToStorage(JSON.parse(data.temp));
}
});
}
})
.always(function () {
var hash = location.hash.split('#')[1];
hash = hash.split('&');
for (var i = 0; i < hash.length; i++)
if (hash[i].indexOf('tempid') == 0) {
hash.splice(i, 1);
i--;
}
hash = hash.join('&');
location.hash = hash;
if (migrateHistoryFromTempCallback)
migrateHistoryFromTempCallback();
});
}
} }
function saveHistory(notehistory) { function saveHistory(notehistory) {
@ -19,13 +38,20 @@ function saveHistory(notehistory) {
saveHistoryToServer(notehistory); saveHistoryToServer(notehistory);
}, },
function () { function () {
saveHistoryToCookie(notehistory); saveHistoryToStorage(notehistory);
} }
); );
} }
function saveHistoryToStorage(notehistory) {
if (store.enabled)
store.set('notehistory', JSON.stringify(notehistory));
else
saveHistoryToCookie(notehistory);
}
function saveHistoryToCookie(notehistory) { function saveHistoryToCookie(notehistory) {
$.cookie('notehistory', JSON.stringify(notehistory), { Cookies.set('notehistory', notehistory, {
expires: 365 expires: 365
}); });
} }
@ -36,12 +62,29 @@ function saveHistoryToServer(notehistory) {
}); });
} }
function saveCookieHistoryToStorage(callback) {
store.set('notehistory', Cookies.get('notehistory'));
callback();
}
function saveStorageHistoryToServer(callback) {
var data = store.get('notehistory');
if (data) {
$.post('/history', {
history: data
})
.done(function (data) {
callback(data);
});
}
}
function saveCookieHistoryToServer(callback) { function saveCookieHistoryToServer(callback) {
$.post('/history', { $.post('/history', {
history: $.cookie('notehistory') history: Cookies.get('notehistory')
}) })
.done(function (data) { .done(function (data) {
callback(); callback(data);
}); });
} }
@ -58,7 +101,7 @@ function clearDuplicatedHistory(notehistory) {
if (!found) if (!found)
newnotehistory.push(notehistory[i]); newnotehistory.push(notehistory[i]);
} }
return notehistory; return newnotehistory;
} }
function addHistory(id, text, time, tags, notehistory) { function addHistory(id, text, time, tags, notehistory) {
@ -86,7 +129,7 @@ function writeHistory(view) {
writeHistoryToServer(view); writeHistoryToServer(view);
}, },
function () { function () {
writeHistoryToCookie(view); writeHistoryToStorage(view);
} }
); );
} }
@ -113,7 +156,7 @@ function writeHistoryToServer(view) {
function writeHistoryToCookie(view) { function writeHistoryToCookie(view) {
try { try {
var notehistory = JSON.parse($.cookie('notehistory')); var notehistory = Cookies.getJSON('notehistory');
} catch (err) { } catch (err) {
var notehistory = []; var notehistory = [];
} }
@ -122,6 +165,22 @@ function writeHistoryToCookie(view) {
saveHistoryToCookie(newnotehistory); saveHistoryToCookie(newnotehistory);
} }
function writeHistoryToStorage(view) {
if (store.enabled) {
var data = store.get('notehistory');
if (data) {
if (typeof data == "string")
data = JSON.parse(data);
var notehistory = data;
} else
var notehistory = [];
var newnotehistory = generateHistory(view, notehistory);
saveHistoryToStorage(newnotehistory);
} else {
writeHistoryToCookie(view);
}
}
function renderHistory(view) { function renderHistory(view) {
var title = renderFilename(view); var title = renderFilename(view);
@ -169,7 +228,7 @@ function getHistory(callback) {
getServerHistory(callback); getServerHistory(callback);
}, },
function () { function () {
getCookieHistory(callback); getStorageHistory(callback);
} }
); );
} }
@ -187,70 +246,76 @@ function getServerHistory(callback) {
} }
function getCookieHistory(callback) { function getCookieHistory(callback) {
callback(JSON.parse($.cookie('notehistory'))); callback(Cookies.getJSON('notehistory'));
} }
function parseHistory(callback) { function getStorageHistory(callback) {
if (store.enabled) {
var data = store.get('notehistory');
if (data) {
if (typeof data == "string")
data = JSON.parse(data);
callback(data);
} else
getCookieHistory(callback);
} else {
getCookieHistory(callback);
}
}
function parseHistory(list, callback) {
checkIfAuth( checkIfAuth(
function () { function () {
parseServerToHistory(callback); parseServerToHistory(list, callback);
}, },
function () { function () {
parseCookieToHistory(callback); parseStorageToHistory(list, callback);
} }
); );
} }
function parseServerToHistory(callback) { function parseServerToHistory(list, callback) {
$.get('/history') $.get('/history')
.done(function (data) { .done(function (data) {
if (data.history) { if (data.history) {
//console.log(data.history); parseToHistory(list, data.history, callback);
parseToHistory(data.history, callback);
} }
}) })
.fail(function () { .fail(function () {
parseCookieToHistory(callback); parseCookieToHistory(list, callback);
}); });
} }
function parseCookieToHistory(callback) { function parseCookieToHistory(list, callback) {
var notehistory = JSON.parse($.cookie('notehistory')); var notehistory = Cookies.getJSON('notehistory');
parseToHistory(notehistory, callback); parseToHistory(list, notehistory, callback);
} }
function parseToHistory(notehistory, callback) { function parseStorageToHistory(list, callback) {
if (notehistory && notehistory.length > 0) { if (store.enabled) {
//console.log(notehistory); var data = store.get('notehistory');
if (data) {
if (typeof data == "string")
data = JSON.parse(data);
parseToHistory(list, data, callback);
} else
parseCookieToHistory(list, callback);
} else {
parseCookieToHistory(list, callback);
}
}
function parseToHistory(list, notehistory, callback) {
if (!callback) return;
else if (!list || !notehistory) callback(list, notehistory);
else if (notehistory && notehistory.length > 0) {
for (var i = 0; i < notehistory.length; i++) { for (var i = 0; i < notehistory.length; i++) {
//parse time to timestamp and fromNow
notehistory[i].timestamp = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').unix(); notehistory[i].timestamp = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').unix();
notehistory[i].fromNow = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').fromNow(); notehistory[i].fromNow = moment(notehistory[i].time, 'MMMM Do YYYY, h:mm:ss a').fromNow();
if (list.get('id', notehistory[i].id).length == 0)
list.add(notehistory[i]);
} }
$(notehistory).each(function (key, value) {
var close = "<div class='ui-history-close fa fa-close fa-fw'></div>";
var text = "<h4 class='text'>" + value.text + "</h2>";
var timestamp = "<i class='timestamp' style='display:none;'>" + value.timestamp + "</i>";
var fromNow = "<i class='fromNow'><i class='fa fa-clock-o'></i> " + value.fromNow + "</i>";
var time = "<i class='time'>" + value.time + "</i>";
var tags = "";
if (value.tags) {
var labels = [];
for (var j = 0; j < value.tags.length; j++)
labels.push("<span class='label label-default'>" + value.tags[j] + "</span>");
tags = "<p class='tags'>" + labels.join(" ") + "</p>";
}
var li = "<li class='col-xs-12 col-sm-6 col-md-6 col-lg-6'><a href='" + "./" + value.id + "'><div class='item'>" + close + text + '<p>' + fromNow + '<br>' + timestamp + time + '</p>' + tags + "</div></a></li>"
//console.debug(li);
$("#history-list").append(li);
});
} }
callback(list, notehistory);
var options = {
valueNames: ['text', 'timestamp', 'fromNow', 'time', 'tags']
};
var historyList = new List('history', options);
historyList.sort('timestamp', {
order: "desc"
});
callback();
} }

View file

@ -1,12 +1,10 @@
//constant vars //constant vars
//settings //settings
var debug = false; var debug = true;
var version = '0.2.7'; var version = '0.2.8';
var doneTypingDelay = 400; var doneTypingDelay = 400;
var finishChangeDelay = 400; var finishChangeDelay = 400;
var cursorActivityDelay = 50; var cursorActivityDelay = 50;
var syncScrollDelay = 50;
var scrollAnimatePeriod = 100;
var cursorAnimatePeriod = 100; var cursorAnimatePeriod = 100;
var modeType = { var modeType = {
edit: {}, edit: {},
@ -67,15 +65,20 @@ var lastInfo = {
}; };
//editor settings //editor settings
var editor = CodeMirror.fromTextArea(document.getElementById("textit"), { var textit = document.getElementById("textit");
if (!textit) throw new Error("There was no textit area!");
var editor = CodeMirror.fromTextArea(textit, {
mode: 'gfm', mode: 'gfm',
keyMap: "sublime",
viewportMargin: 20, viewportMargin: 20,
styleActiveLine: true, styleActiveLine: true,
lineNumbers: true, lineNumbers: true,
lineWrapping: true, lineWrapping: true,
showCursorWhenSelecting: true,
theme: "monokai", theme: "monokai",
autofocus: true, autofocus: true,
inputStyle: "textarea", inputStyle: "textarea",
scrollbarStyle: "overlay",
matchBrackets: true, matchBrackets: true,
autoCloseBrackets: true, autoCloseBrackets: true,
matchTags: { matchTags: {
@ -89,6 +92,7 @@ var editor = CodeMirror.fromTextArea(document.getElementById("textit"), {
}, },
readOnly: true readOnly: true
}); });
inlineAttachment.editors.codemirror4.attach(editor);
//ui vars //ui vars
var ui = { var ui = {
@ -153,18 +157,28 @@ $(document).ready(function () {
/* bind events */ /* bind events */
$(document) $(document)
.on('focus', 'textarea, input', function() { .on('focus', 'textarea, input', function () {
$body.addClass('fixfixed'); $body.addClass('fixfixed');
}) })
.on('blur', 'textarea, input', function() { .on('blur', 'textarea, input', function () {
$body.removeClass('fixfixed'); $body.removeClass('fixfixed');
}); });
} }
}); });
//when page resize //when page resize
var windowResizeDelay = 200;
var windowResizeTimer = null;
$(window).resize(function () { $(window).resize(function () {
checkResponsive(); clearTimeout(windowResizeTimer);
windowResizeTimer = setTimeout(function () {
windowResize();
}, windowResizeDelay);
}); });
function windowResize() {
checkResponsive();
clearMap();
syncScrollToView();
}
//768-792px have a gap //768-792px have a gap
function checkResponsive() { function checkResponsive() {
visibleXS = $(".visible-xs").is(":visible"); visibleXS = $(".visible-xs").is(":visible");
@ -176,6 +190,10 @@ function checkResponsive() {
changeMode(modeType.edit); changeMode(modeType.edit);
else else
changeMode(modeType.view); changeMode(modeType.view);
if (visibleXS)
$('.CodeMirror').css('height', 'auto');
else
$('.CodeMirror').css('height', '');
} }
function showStatus(type, num) { function showStatus(type, num) {
@ -220,7 +238,7 @@ function showStatus(type, num) {
} }
function toggleMode() { function toggleMode() {
switch(currentMode) { switch (currentMode) {
case modeType.edit: case modeType.edit:
changeMode(modeType.view); changeMode(modeType.view);
break; break;
@ -297,26 +315,31 @@ var url = window.location.origin + '/' + noteId;
ui.toolbar.pretty.attr("href", url + "/pretty"); ui.toolbar.pretty.attr("href", url + "/pretty");
//download //download
//markdown //markdown
ui.toolbar.download.markdown.click(function() { ui.toolbar.download.markdown.click(function () {
var filename = renderFilename(ui.area.markdown) + '.md'; var filename = renderFilename(ui.area.markdown) + '.md';
var markdown = editor.getValue(); var markdown = editor.getValue();
var blob = new Blob([markdown], {type: "text/markdown;charset=utf-8"}); var blob = new Blob([markdown], {
type: "text/markdown;charset=utf-8"
});
saveAs(blob, filename); saveAs(blob, filename);
}); });
//save to dropbox //save to dropbox
ui.toolbar.save.dropbox.click(function() { ui.toolbar.save.dropbox.click(function () {
var filename = renderFilename(ui.area.markdown) + '.md'; var filename = renderFilename(ui.area.markdown) + '.md';
var options = { var options = {
files: [ files: [
{'url': url + "/download", 'filename': filename} {
'url': url + "/download",
'filename': filename
}
] ]
}; };
Dropbox.save(options); Dropbox.save(options);
}); });
//import from dropbox //import from dropbox
ui.toolbar.import.dropbox.click(function() { ui.toolbar.import.dropbox.click(function () {
var options = { var options = {
success: function(files) { success: function (files) {
ui.spinner.show(); ui.spinner.show();
var url = files[0].link; var url = files[0].link;
importFromUrl(url); importFromUrl(url);
@ -328,64 +351,73 @@ ui.toolbar.import.dropbox.click(function() {
Dropbox.choose(options); Dropbox.choose(options);
}); });
//import from clipboard //import from clipboard
ui.toolbar.import.clipboard.click(function() { ui.toolbar.import.clipboard.click(function () {
//na //na
}); });
//fix for wrong autofocus //fix for wrong autofocus
$('#clipboardModal').on('shown.bs.modal', function() { $('#clipboardModal').on('shown.bs.modal', function () {
$('#clipboardModal').blur(); $('#clipboardModal').blur();
}); });
$("#clipboardModalClear").click(function() { $("#clipboardModalClear").click(function () {
$("#clipboardModalContent").html(''); $("#clipboardModalContent").html('');
}); });
$("#clipboardModalConfirm").click(function() { $("#clipboardModalConfirm").click(function () {
var data = $("#clipboardModalContent").html(); var data = $("#clipboardModalContent").html();
if(data) { if (data) {
parseToEditor(data); parseToEditor(data);
$('#clipboardModal').modal('hide'); $('#clipboardModal').modal('hide');
$("#clipboardModalContent").html(''); $("#clipboardModalContent").html('');
} }
}); });
function parseToEditor(data) { function parseToEditor(data) {
var parsed = toMarkdown(data); var parsed = toMarkdown(data);
if(parsed) if (parsed)
editor.replaceRange(parsed, {line:0, ch:0}, {line:editor.lastLine(), ch:editor.lastLine().length}, '+input'); editor.replaceRange(parsed, {
line: 0,
ch: 0
}, {
line: editor.lastLine(),
ch: editor.lastLine().length
}, '+input');
} }
function importFromUrl(url) { function importFromUrl(url) {
//console.log(url); //console.log(url);
if(url == null) return; if (url == null) return;
if(!isValidURL(url)) { if (!isValidURL(url)) {
alert('Not valid URL :('); alert('Not valid URL :(');
return; return;
} }
$.ajax({ $.ajax({
method: "GET", method: "GET",
url: url, url: url,
success: function(data) { success: function (data) {
parseToEditor(data); parseToEditor(data);
}, },
error: function() { error: function () {
alert('Import failed :('); alert('Import failed :(');
}, },
complete: function() { complete: function () {
ui.spinner.hide(); ui.spinner.hide();
} }
}); });
} }
function isValidURL(str) { function isValidURL(str) {
var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol var pattern = new RegExp('^(https?:\\/\\/)?' + // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator
if(!pattern.test(str)) { if (!pattern.test(str)) {
return false; return false;
} else { } else {
return true; return true;
}
} }
} //mode
//mode
ui.toolbar.mode.click(function () { ui.toolbar.mode.click(function () {
toggleMode(); toggleMode();
}); });
@ -470,51 +502,65 @@ socket.on('online users', function (data) {
if (debug) if (debug)
console.debug(data); console.debug(data);
showStatus(statusType.online, data.count); showStatus(statusType.online, data.count);
$('.other-cursors').html(''); $('.other-cursors').children().each(function (key, value) {
for(var i = 0; i < data.users.length; i++) { var found = false;
for (var i = 0; i < data.users.length; i++) {
var user = data.users[i];
if ($(this).attr('id') == user.id)
found = true;
}
if (!found)
$(this).remove();
});
for (var i = 0; i < data.users.length; i++) {
var user = data.users[i]; var user = data.users[i];
if(user.id != socket.id) if (user.id != socket.id)
buildCursor(user.id, user.color, user.cursor); buildCursor(user.id, user.color, user.cursor);
} }
}); });
socket.on('cursor focus', function (data) { socket.on('cursor focus', function (data) {
if(debug) if (debug)
console.debug(data); console.debug(data);
var cursor = $('#' + data.id); var cursor = $('#' + data.id);
if(cursor.length > 0) { if (cursor.length > 0) {
cursor.fadeIn(); cursor.fadeIn();
} else { } else {
if(data.id != socket.id) if (data.id != socket.id)
buildCursor(data.id, data.color, data.cursor); buildCursor(data.id, data.color, data.cursor);
} }
}); });
socket.on('cursor activity', function (data) { socket.on('cursor activity', function (data) {
if(debug) if (debug)
console.debug(data); console.debug(data);
if(data.id != socket.id) if (data.id != socket.id)
buildCursor(data.id, data.color, data.cursor); buildCursor(data.id, data.color, data.cursor);
}); });
socket.on('cursor blur', function (data) { socket.on('cursor blur', function (data) {
if(debug) if (debug)
console.debug(data); console.debug(data);
var cursor = $('#' + data.id); var cursor = $('#' + data.id);
if(cursor.length > 0) { if (cursor.length > 0) {
cursor.fadeOut(); cursor.fadeOut();
} }
}); });
function emitUserStatus() { function emitUserStatus() {
checkIfAuth( checkIfAuth(
function (data) { function (data) {
socket.emit('user status', {login:true}); socket.emit('user status', {
login: true
});
}, },
function () { function () {
socket.emit('user status', {login:false}); socket.emit('user status', {
login: false
});
} }
); );
} }
function buildCursor(id, color, pos) { function buildCursor(id, color, pos) {
if(!pos) return; if (!pos) return;
if ($('.other-cursors').length <= 0) { if ($('.other-cursors').length <= 0) {
$("<div class='other-cursors'>").insertAfter('.CodeMirror-cursors'); $("<div class='other-cursors'>").insertAfter('.CodeMirror-cursors');
} }
@ -535,7 +581,10 @@ function buildCursor(id, color, pos) {
cursor.attr('data-line', pos.line); cursor.attr('data-line', pos.line);
cursor.attr('data-ch', pos.ch); cursor.attr('data-ch', pos.ch);
var coord = editor.charCoords(pos, 'windows'); var coord = editor.charCoords(pos, 'windows');
cursor.stop(true).css('opacity', 1).animate({"left":coord.left, "top":coord.top}, cursorAnimatePeriod); cursor.stop(true).css('opacity', 1).animate({
"left": coord.left,
"top": coord.top
}, cursorAnimatePeriod);
//cursor[0].style.left = coord.left + 'px'; //cursor[0].style.left = coord.left + 'px';
//cursor[0].style.top = coord.top + 'px'; //cursor[0].style.top = coord.top + 'px';
cursor[0].style.height = '18px'; cursor[0].style.height = '18px';
@ -566,6 +615,7 @@ editor.on('cursorActivity', function (cm) {
clearTimeout(cursorActivityTimer); clearTimeout(cursorActivityTimer);
cursorActivityTimer = setTimeout(cursorActivity, cursorActivityDelay); cursorActivityTimer = setTimeout(cursorActivity, cursorActivityDelay);
}); });
function cursorActivity() { function cursorActivity() {
socket.emit('cursor activity', editor.getCursor()); socket.emit('cursor activity', editor.getCursor());
} }
@ -578,8 +628,9 @@ function saveInfo() {
var top = $(document.body).scrollTop(); var top = $(document.body).scrollTop();
switch (currentMode) { switch (currentMode) {
case modeType.edit: case modeType.edit:
lastInfo.edit.scroll.left = left; //lastInfo.edit.scroll.left = left;
lastInfo.edit.scroll.top = top; //lastInfo.edit.scroll.top = top;
lastInfo.edit.scroll = editor.getScrollInfo();
break; break;
case modeType.view: case modeType.view:
lastInfo.view.scroll.left = left; lastInfo.view.scroll.left = left;
@ -603,8 +654,12 @@ function restoreInfo() {
switch (currentMode) { switch (currentMode) {
case modeType.edit: case modeType.edit:
$(document.body).scrollLeft(lastInfo.edit.scroll.left); //$(document.body).scrollLeft(lastInfo.edit.scroll.left);
$(document.body).scrollTop(lastInfo.edit.scroll.top); //$(document.body).scrollTop(lastInfo.edit.scroll.top);
var left = lastInfo.edit.scroll.left;
var top = lastInfo.edit.scroll.top;
editor.scrollIntoView();
editor.scrollTo(left, top);
break; break;
case modeType.view: case modeType.view:
$(document.body).scrollLeft(lastInfo.view.scroll.left); $(document.body).scrollLeft(lastInfo.view.scroll.left);
@ -652,9 +707,8 @@ function updateView() {
finishView(ui.area.view); finishView(ui.area.view);
writeHistory(ui.area.markdown); writeHistory(ui.area.markdown);
isDirty = false; isDirty = false;
// reset lines mapping cache on content update
scrollMap = null;
emitUserStatus(); emitUserStatus();
clearMap();
} }
function partialUpdate(src, tar, des) { function partialUpdate(src, tar, des) {
@ -702,7 +756,7 @@ function partialUpdate(src, tar, des) {
} }
} }
//tar end //tar end
for (var i = 1; i <= tar.length; i++) { for (var i = 1; i <= tar.length + 1; i++) {
var srcLength = src.length; var srcLength = src.length;
var tarLength = tar.length; var tarLength = tar.length;
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline'); copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
@ -715,7 +769,7 @@ function partialUpdate(src, tar, des) {
} }
} }
//src end //src end
for (var i = 1; i <= src.length; i++) { for (var i = 1; i <= src.length + 1; i++) {
var srcLength = src.length; var srcLength = src.length;
var tarLength = tar.length; var tarLength = tar.length;
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline'); copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
@ -730,56 +784,75 @@ function partialUpdate(src, tar, des) {
//check if tar end overlap tar start //check if tar end overlap tar start
var overlap = 0; var overlap = 0;
for (var i = start; i >= 0; i--) { for (var i = start; i >= 0; i--) {
var rawTarStart = cloneAndRemoveDataAttr(tar[i-1]); var rawTarStart = cloneAndRemoveDataAttr(tar[i - 1]);
var rawTarEnd = cloneAndRemoveDataAttr(tar[tarEnd+1+start-i]); var rawTarEnd = cloneAndRemoveDataAttr(tar[tarEnd + 1 + start - i]);
if(rawTarStart && rawTarEnd && rawTarStart.outerHTML == rawTarEnd.outerHTML) if (rawTarStart && rawTarEnd && rawTarStart.outerHTML == rawTarEnd.outerHTML)
overlap++; overlap++;
else else
break; break;
} }
if(debug) if (debug)
console.log('overlap:' + overlap); console.log('overlap:' + overlap);
//show diff content //show diff content
if(debug) { if (debug) {
console.log('start:' + start); console.log('start:' + start);
console.log('tarEnd:' + tarEnd); console.log('tarEnd:' + tarEnd);
console.log('srcEnd:' + srcEnd); console.log('srcEnd:' + srcEnd);
console.log('des[start]:' + des[start]);
} }
tarEnd += overlap; tarEnd += overlap;
srcEnd += overlap; srcEnd += overlap;
//add new element var repeatAdd = (start - srcEnd) < (start - tarEnd);
var newElements = ""; var repeatDiff = Math.abs(srcEnd - tarEnd) - 1;
for (var j = start; j <= srcEnd; j++) { //push new elements
if(debug) var newElements = [];
srcChanged += src[j].outerHTML; if(srcEnd >= start) {
newElements += src[j].outerHTML; for (var j = start; j <= srcEnd; j++) {
if (!src[j]) continue;
newElements.push(src[j].outerHTML);
}
} else if(repeatAdd) {
for (var j = srcEnd - repeatDiff; j <= srcEnd; j++) {
if (!des[j]) continue;
newElements.push(des[j].outerHTML);
}
} }
if(newElements && des[start]) { //push remove elements
$(newElements).insertBefore(des[start]); var removeElements = [];
} else { if(tarEnd >= start) {
$(newElements).insertAfter(des[des.length-1]); for (var j = start; j <= tarEnd; j++) {
if (!des[j]) continue;
removeElements.push(des[j]);
}
} else if(!repeatAdd) {
for (var j = start; j <= start + repeatDiff; j++) {
if (!des[j]) continue;
removeElements.push(des[j]);
}
} }
if(debug) //add elements
console.log(srcChanged); if (debug) {
//remove old element console.log('ADD ELEMENTS');
if(debug) console.log(newElements.join('\n'));
var tarChanged = "";
for (var j = start; j <= tarEnd; j++) {
if(debug)
tarChanged += tar[j].outerHTML;
if(des[j])
des[j].remove();
} }
if(debug) { if (des[start])
console.log(tarChanged); $(newElements.join('')).insertBefore(des[start]);
var srcChanged = ""; else
$(newElements.join('')).insertAfter(des[start - 1]);
//remove elements
if (debug)
console.log('REMOVE ELEMENTS');
for (var j = 0; j < removeElements.length; j++) {
if (debug) {
console.log(removeElements[j].outerHTML);
}
if (removeElements[j])
removeElements[j].remove();
} }
} }
} }
function cloneAndRemoveDataAttr(el) { function cloneAndRemoveDataAttr(el) {
if(!el) return; if (!el) return;
var rawEl = $(el).clone(true)[0]; var rawEl = $(el).clone(true)[0];
rawEl.removeAttribute('data-startline'); rawEl.removeAttribute('data-startline');
rawEl.removeAttribute('data-endline'); rawEl.removeAttribute('data-endline');
@ -790,151 +863,3 @@ function copyAttribute(src, des, attr) {
if (src && src.getAttribute(attr) && des) if (src && src.getAttribute(attr) && des)
des.setAttribute(attr, src.getAttribute(attr)); des.setAttribute(attr, src.getAttribute(attr));
} }
//
// Inject line numbers for sync scroll. Notes:
//
// - We track only headings and paragraphs on first level. That's enougth.
// - Footnotes content causes jumps. Level limit filter it automatically.
//
md.renderer.rules.paragraph_open = function (tokens, idx) {
var line;
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<p class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
}
return '';
};
md.renderer.rules.heading_open = function (tokens, idx) {
var line;
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<h' + tokens[idx].hLevel + ' class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
}
return '<h' + tokens[idx].hLevel + '>';
};
editor.on('scroll', _.debounce(syncScrollToView, syncScrollDelay));
//ui.area.view.on('scroll', _.debounce(syncScrollToEdit, 50));
var scrollMap;
// Build offsets for each line (lines can be wrapped)
// That's a bit dirty to process each line everytime, but ok for demo.
// Optimizations are required only for big texts.
function buildScrollMap() {
var i, offset, nonEmptyList, pos, a, b, lineHeightMap, linesCount,
acc, sourceLikeDiv, textarea = ui.area.codemirror,
_scrollMap;
sourceLikeDiv = $('<div />').css({
position: 'absolute',
visibility: 'hidden',
height: 'auto',
width: editor.getScrollInfo().clientWidth,
'font-size': textarea.css('font-size'),
'font-family': textarea.css('font-family'),
'line-height': textarea.css('line-height'),
'white-space': textarea.css('white-space')
}).appendTo('body');
offset = ui.area.view.scrollTop() - ui.area.view.offset().top;
_scrollMap = [];
nonEmptyList = [];
lineHeightMap = [];
acc = 0;
editor.getValue().split('\n').forEach(function (str) {
var h, lh;
lineHeightMap.push(acc);
if (str.length === 0) {
acc++;
return;
}
sourceLikeDiv.text(str);
h = parseFloat(sourceLikeDiv.css('height'));
lh = parseFloat(sourceLikeDiv.css('line-height'));
acc += Math.round(h / lh);
});
sourceLikeDiv.remove();
lineHeightMap.push(acc);
linesCount = acc;
for (i = 0; i < linesCount; i++) {
_scrollMap.push(-1);
}
nonEmptyList.push(0);
_scrollMap[0] = 0;
ui.area.markdown.find('.part').each(function (n, el) {
var $el = $(el),
t = $el.data('startline');
if (t === '') {
return;
}
t = lineHeightMap[t];
if (t !== 0) {
nonEmptyList.push(t);
}
_scrollMap[t] = Math.round($el.offset().top + offset);
});
nonEmptyList.push(linesCount);
_scrollMap[linesCount] = ui.area.view[0].scrollHeight;
pos = 0;
for (i = 1; i < linesCount; i++) {
if (_scrollMap[i] !== -1) {
pos++;
continue;
}
a = nonEmptyList[pos];
b = nonEmptyList[pos + 1];
_scrollMap[i] = Math.round((_scrollMap[b] * (i - a) + _scrollMap[a] * (b - i)) / (b - a));
}
return _scrollMap;
}
function syncScrollToView() {
var lineNo, posTo;
var scrollInfo = editor.getScrollInfo();
if (!scrollMap) {
scrollMap = buildScrollMap();
}
lineNo = Math.floor(scrollInfo.top / editor.defaultTextHeight());
posTo = scrollMap[lineNo];
ui.area.view.stop(true).animate({scrollTop: posTo}, scrollAnimatePeriod);
}
function syncScrollToEdit() {
var lineNo, posTo;
if (!scrollMap) {
scrollMap = buildScrollMap();
}
var top = ui.area.view.scrollTop();
lineNo = closestIndex(top, scrollMap);
posTo = lineNo * editor.defaultTextHeight();
editor.scrollTo(0, posTo);
}
function closestIndex(num, arr) {
var curr = arr[0];
var index = 0;
var diff = Math.abs(num - curr);
for (var val = 0; val < arr.length; val++) {
var newdiff = Math.abs(num - arr[val]);
if (newdiff < diff) {
diff = newdiff;
curr = arr[val];
index = val;
}
}
return index;
}

9
public/js/pretty.js Normal file
View file

@ -0,0 +1,9 @@
var raw = $(".markdown-body").text();
var markdown = LZString.decompressFromBase64(raw);
var result = postProcess(md.render(markdown));
var markdown = $(".markdown-body");
markdown.html(result);
markdown.show();
finishView(markdown);
autoLinkify(markdown);
scrollToHash();

327
public/js/syncscroll.js Normal file
View file

@ -0,0 +1,327 @@
//
// Inject line numbers for sync scroll. Notes:
//
// - We track only headings and paragraphs on first level. That's enougth.
// - Footnotes content causes jumps. Level limit filter it automatically.
//
md.renderer.rules.blockquote_open = function (tokens, idx /*, options, env */ ) {
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<blockquote class="part" data-startline="' + startline + '" data-endline="' + endline + '">\n';
}
return '<blockquote>\n';
};
md.renderer.rules.table_open = function (tokens, idx /*, options, env */ ) {
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<table class="part" data-startline="' + startline + '" data-endline="' + endline + '">\n';
}
return '<table>\n';
};
md.renderer.rules.bullet_list_open = function (tokens, idx /*, options, env */ ) {
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<ul class="part" data-startline="' + startline + '" data-endline="' + endline + '">\n';
}
return '<ul>\n';
};
md.renderer.rules.ordered_list_open = function (tokens, idx /*, options, env */ ) {
var token = tokens[idx];
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<ol class="part" data-startline="' + startline + '" data-endline="' + endline + '"' + (token.order > 1 ? ' start="' + token.order + '"' : '') + '>\n';
}
return '<ol' + (token.order > 1 ? ' start="' + token.order + '"' : '') + '>\n';
};
md.renderer.rules.link_open = function (tokens, idx /*, options, env */ ) {
var title = tokens[idx].title ? (' title="' + Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(tokens[idx].title)) + '"') : '';
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<a class="part" data-startline="' + startline + '" data-endline="' + endline + '" href="' + Remarkable.utils.escapeHtml(tokens[idx].href) + '"' + title + '>';
}
return '<a href="' + Remarkable.utils.escapeHtml(tokens[idx].href) + '"' + title + '>';
};
md.renderer.rules.paragraph_open = function (tokens, idx) {
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<p class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
}
return '';
};
md.renderer.rules.heading_open = function (tokens, idx) {
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<h' + tokens[idx].hLevel + ' class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
}
return '<h' + tokens[idx].hLevel + '>';
};
md.renderer.rules.image = function (tokens, idx, options /*, env */ ) {
var src = ' src="' + Remarkable.utils.escapeHtml(tokens[idx].src) + '"';
var title = tokens[idx].title ? (' title="' + Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(tokens[idx].title)) + '"') : '';
var alt = ' alt="' + (tokens[idx].alt ? Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(tokens[idx].alt)) : '') + '"';
var suffix = options.xhtmlOut ? ' /' : '';
var image = $('<img' + src + alt + title + suffix + '>');
image[0].onload = function (e) {
if (viewAjaxCallback)
viewAjaxCallback();
};
return image[0].outerHTML;
};
md.renderer.rules.fence = function (tokens, idx, options, env, self) {
var token = tokens[idx];
var langClass = '';
var langPrefix = options.langPrefix;
var langName = '',
fenceName;
var highlighted;
if (token.params) {
//
// ```foo bar
//
// Try custom renderer "foo" first. That will simplify overwrite
// for diagrams, latex, and any other fenced block with custom look
//
fenceName = token.params.split(/\s+/g)[0];
if (Remarkable.utils.has(self.rules.fence_custom, fenceName)) {
return self.rules.fence_custom[fenceName](tokens, idx, options, env, self);
}
langName = Remarkable.utils.escapeHtml(Remarkable.utils.replaceEntities(Remarkable.utils.unescapeMd(fenceName)));
langClass = ' class="' + langPrefix + langName + '"';
}
if (options.highlight) {
highlighted = options.highlight(token.content, langName) || Remarkable.utils.escapeHtml(token.content);
} else {
highlighted = Remarkable.utils.escapeHtml(token.content);
}
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<pre class="part" data-startline="' + startline + '" data-endline="' + endline + '"><code' + langClass + '>' + highlighted + '</code></pre>' + md.renderer.getBreak(tokens, idx);
}
return '<pre><code' + langClass + '>' + highlighted + '</code></pre>' + md.renderer.getBreak(tokens, idx);
};
md.renderer.rules.code = function (tokens, idx /*, options, env */ ) {
if (tokens[idx].block) {
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<pre class="part" data-startline="' + startline + '" data-endline="' + endline + '"><code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code></pre>' + md.renderer.getBreak(tokens, idx);
}
return '<pre><code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code></pre>' + md.renderer.getBreak(tokens, idx);
}
if (tokens[idx].lines && tokens[idx].level === 0) {
var startline = tokens[idx].lines[0] + 1;
var endline = tokens[idx].lines[1];
return '<code class="part" data-startline="' + startline + '" data-endline="' + endline + '">' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code>';
}
return '<code>' + Remarkable.utils.escapeHtml(tokens[idx].content) + '</code>';
};
var viewScrolling = false;
var viewScrollingDelay = 200;
var viewScrollingTimer = null;
editor.on('scroll', syncScrollToView);
ui.area.view.on('scroll', function () {
viewScrolling = true;
clearTimeout(viewScrollingTimer);
viewScrollingTimer = setTimeout(function () {
viewScrolling = false;
}, viewScrollingDelay);
});
//editor.on('scroll', _.debounce(syncScrollToView, syncScrollDelay));
//ui.area.view.on('scroll', _.debounce(syncScrollToEdit, 50));
var scrollMap, lineHeightMap;
viewAjaxCallback = clearMap;
function clearMap() {
scrollMap = null;
lineHeightMap = null;
}
// Build offsets for each line (lines can be wrapped)
// That's a bit dirty to process each line everytime, but ok for demo.
// Optimizations are required only for big texts.
function buildMap() {
var i, offset, nonEmptyList, pos, a, b, _lineHeightMap, linesCount,
acc, sourceLikeDiv, textarea = ui.area.codemirror,
wrap = $('.CodeMirror-wrap pre'),
_scrollMap;
sourceLikeDiv = $('<div />').css({
position: 'absolute',
visibility: 'hidden',
height: 'auto',
width: wrap.width(),
padding: wrap.css('padding'),
margin: wrap.css('margin'),
'font-size': textarea.css('font-size'),
'font-family': textarea.css('font-family'),
'line-height': textarea.css('line-height'),
'word-wrap': wrap.css('word-wrap'),
'white-space': wrap.css('white-space'),
'word-break': wrap.css('word-break')
}).appendTo('body');
offset = ui.area.view.scrollTop() - ui.area.view.offset().top;
_scrollMap = [];
nonEmptyList = [];
_lineHeightMap = [];
acc = 0;
editor.getValue().split('\n').forEach(function (str) {
var h, lh;
_lineHeightMap.push(acc);
if (str.length === 0) {
acc++;
return;
}
sourceLikeDiv.text(str);
h = parseFloat(sourceLikeDiv.css('height'));
lh = parseFloat(sourceLikeDiv.css('line-height'));
acc += Math.round(h / lh);
});
sourceLikeDiv.remove();
_lineHeightMap.push(acc);
linesCount = acc;
for (i = 0; i < linesCount; i++) {
_scrollMap.push(-1);
}
nonEmptyList.push(0);
_scrollMap[0] = 0;
ui.area.markdown.find('.part').each(function (n, el) {
var $el = $(el),
t = $el.data('startline') - 1;
if (t === '') {
return;
}
t = _lineHeightMap[t];
if (t !== 0) {
nonEmptyList.push(t);
}
_scrollMap[t] = Math.round($el.offset().top + offset);
});
nonEmptyList.push(linesCount);
_scrollMap[linesCount] = ui.area.view[0].scrollHeight;
pos = 0;
for (i = 1; i < linesCount; i++) {
if (_scrollMap[i] !== -1) {
pos++;
continue;
}
a = nonEmptyList[pos];
b = nonEmptyList[pos + 1];
_scrollMap[i] = Math.round((_scrollMap[b] * (i - a) + _scrollMap[a] * (b - i)) / (b - a));
}
_scrollMap[0] = 0;
scrollMap = _scrollMap;
lineHeightMap = _lineHeightMap;
}
function getPartByEditorLineNo(lineNo) {
var part = null;
ui.area.markdown.find('.part').each(function (n, el) {
if (part) return;
var $el = $(el),
t = $el.data('startline') - 1,
f = $el.data('endline') - 1;
if (t === '' || f === '') {
return;
}
if (lineNo >= t && lineNo <= f) {
part = $el;
}
});
if (part)
return {
startline: part.data('startline') - 1,
endline: part.data('endline') - 1,
linediff: Math.abs(part.data('endline') - part.data('startline')) + 1,
element: part
};
else
return null;
}
function getEditorLineNoByTop(top) {
for (var i = 0; i < lineHeightMap.length; i++)
if (lineHeightMap[i] * editor.defaultTextHeight() > top)
return i;
return null;
}
function syncScrollToView(_lineNo) {
var lineNo, posTo;
var scrollInfo = editor.getScrollInfo();
if (!scrollMap || !lineHeightMap) {
buildMap();
}
if (typeof _lineNo != "number") {
var topDiffPercent, posToNextDiff;
var textHeight = editor.defaultTextHeight();
lineNo = Math.floor(scrollInfo.top / textHeight);
var lineCount = editor.lineCount();
var lastLineHeight = editor.getLineHandle(lineCount - 1).height;
//if reach last line, then scroll to end
if (scrollInfo.top + scrollInfo.clientHeight >= scrollInfo.height - lastLineHeight) {
posTo = ui.area.view[0].scrollHeight - ui.area.view.height();
} else {
topDiffPercent = (scrollInfo.top % textHeight) / textHeight;
posTo = scrollMap[lineNo];
posToNextDiff = (scrollMap[lineNo + 1] - posTo) * topDiffPercent;
posTo += Math.floor(posToNextDiff);
}
} else {
if (viewScrolling) return;
posTo = scrollMap[lineHeightMap[_lineNo]];
}
var posDiff = Math.abs(ui.area.view.scrollTop() - posTo);
if (posDiff > scrollInfo.clientHeight / 5) {
var duration = posDiff / 50;
ui.area.view.stop(true).animate({
scrollTop: posTo
}, duration >= 50 ? duration : 100, "linear");
} else {
ui.area.view.stop(true).scrollTop(posTo);
}
}

View file

@ -27,6 +27,10 @@
font-family: monospace; font-family: monospace;
} }
.CodeMirror-dialog input::selection {
color: white;
}
.CodeMirror-dialog button { .CodeMirror-dialog button {
font-size: 70%; font-size: 70%;
} }

View file

@ -97,7 +97,7 @@
var height = Math.max(bottom - top, 3); var height = Math.max(bottom - top, 3);
var elt = frag.appendChild(document.createElement("div")); var elt = frag.appendChild(document.createElement("div"));
elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth * 2, 2) + "px; top: "
+ (top + this.buttonHeight) + "px; height: " + height + "px"; + (top + this.buttonHeight) + "px; height: " + height + "px";
elt.className = this.options.className; elt.className = this.options.className;
} }

View file

@ -38,8 +38,9 @@
.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { .CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
position: absolute; position: absolute;
background: #bcd; background: #ccc;
border-radius: 3px; border-radius: 3px;
margin: 2px;
} }
.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { .CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {

View file

@ -75,14 +75,13 @@
this.screen = clientSize; this.screen = clientSize;
this.total = scrollSize; this.total = scrollSize;
this.size = barSize; this.size = barSize;
var buttonSize = this.screen * (this.size / this.total); var buttonSize = this.screen * (this.size / this.total);
if (buttonSize < minButtonSize) { if (buttonSize < minButtonSize) {
this.size -= minButtonSize - buttonSize; this.size -= minButtonSize - buttonSize;
buttonSize = minButtonSize; buttonSize = minButtonSize;
} }
this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = this.inner.style[this.orientation == "horizontal" ? "width" : "height"] =
buttonSize + "px"; (buttonSize - 4) + "px";
this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = this.inner.style[this.orientation == "horizontal" ? "left" : "top"] =
this.pos * (this.size / this.total) + "px"; this.pos * (this.size / this.total) + "px";
}; };

View file

@ -118,7 +118,7 @@
var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>"; var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
function replace(cm, all) { function replace(cm, all) {
if (cm.getOption("readOnly")) return; if (cm.getOption("readOnly")) return;
var query = cm.getSelection() || getSearchState().lastQuery; var query = cm.getSelection() || getSearchState(cm).lastQuery;
dialog(cm, replaceQueryDialog, "Replace:", query, function(query) { dialog(cm, replaceQueryDialog, "Replace:", query, function(query) {
if (!query) return; if (!query) return;
query = parseQuery(query); query = parseQuery(query);
@ -128,8 +128,8 @@
for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
if (typeof query != "string") { if (typeof query != "string") {
var match = cm.getRange(cursor.from(), cursor.to()).match(query); var match = cm.getRange(cursor.from(), cursor.to()).match(query);
cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}), "+input");
} else cursor.replace(text); } else cursor.replace(text, "+input");
} }
}); });
} else { } else {
@ -149,7 +149,7 @@
}; };
var doReplace = function(match) { var doReplace = function(match) {
cursor.replace(typeof query == "string" ? text : cursor.replace(typeof query == "string" ? text :
text.replace(/\$(\d)/g, function(_, i) {return match[i];})); text.replace(/\$(\d)/g, function(_, i) {return match[i];}), "+input");
advance(); advance();
}; };
advance(); advance();

File diff suppressed because one or more lines are too long

View file

@ -2,12 +2,21 @@ uglifyjs --compress --mangle --output codemirror.min.js \
lib/codemirror.js \ lib/codemirror.js \
addon/mode/overlay.js \ addon/mode/overlay.js \
addon/selection/active-line.js \ addon/selection/active-line.js \
addon/search/searchcursor.js \
addon/search/search.js \
addon/search/matchesonscrollbar.js \
addon/scroll/simplescrollbars.js \
addon/scroll/annotatescrollbar.js \
addon/dialog/dialog.js \
addon/edit/matchbrackets.js \ addon/edit/matchbrackets.js \
addon/edit/closebrackets.js \ addon/edit/closebrackets.js \
addon/edit/matchtags.js \ addon/edit/matchtags.js \
addon/edit/closetag.js \ addon/edit/closetag.js \
addon/edit/continuelist.js \ addon/edit/continuelist.js \
addon/comment/comment.js \
addon/wrap/hardwrap.js \
addon/fold/foldcode.js \ addon/fold/foldcode.js \
addon/fold/brace-fold.js \
addon/fold/foldgutter.js \ addon/fold/foldgutter.js \
addon/fold/markdown-fold.js \ addon/fold/markdown-fold.js \
addon/fold/xml-fold.js \ addon/fold/xml-fold.js \
@ -19,4 +28,5 @@ mode/css/css.js \
mode/htmlmixed/htmlmixed.js \ mode/htmlmixed/htmlmixed.js \
mode/clike/clike.js \ mode/clike/clike.js \
mode/clojure/clojure.js \ mode/clojure/clojure.js \
mode/ruby/ruby.js mode/ruby/ruby.js \
keymap/sublime.js

View file

@ -258,7 +258,7 @@
var actual = line - offset; var actual = line - offset;
if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1); if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);
if (actual < cm.lastLine()) { if (actual < cm.lastLine()) {
cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length)); cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length), "+joinLines");
++offset; ++offset;
} }
} }
@ -274,9 +274,9 @@
for (var i = 0; i < rangeCount; i++) { for (var i = 0; i < rangeCount; i++) {
var range = cm.listSelections()[i]; var range = cm.listSelections()[i];
if (range.empty()) if (range.empty())
cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0)); cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0), null, "+duplicateLine");
else else
cm.replaceRange(cm.getRange(range.from(), range.to()), range.from()); cm.replaceRange(cm.getRange(range.from(), range.to()), range.from(), null, "+duplicateLine");
} }
cm.scrollIntoView(); cm.scrollIntoView();
}); });
@ -311,7 +311,7 @@
if (au != bu) { a = au; b = bu; } if (au != bu) { a = au; b = bu; }
return a < b ? -1 : a == b ? 0 : 1; return a < b ? -1 : a == b ? 0 : 1;
}); });
cm.replaceRange(lines, start, end); cm.replaceRange(lines, start, end, "+sortLines");
if (selected) ranges.push({anchor: start, head: end}); if (selected) ranges.push({anchor: start, head: end});
} }
if (selected) cm.setSelections(ranges, 0); if (selected) cm.setSelections(ranges, 0);
@ -402,7 +402,7 @@
if (at && CodeMirror.cmpPos(range.head, at) > 0) continue; if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;
var word = wordAt(cm, range.head); var word = wordAt(cm, range.head);
at = word.from; at = word.from;
cm.replaceRange(mod(word.word), word.from, word.to); cm.replaceRange(mod(word.word), word.from, word.to, "case");
} }
}); });
} }
@ -452,7 +452,7 @@
var from = cm.getCursor(), to = found; var from = cm.getCursor(), to = found;
if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; } if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }
cm.state.sublimeKilled = cm.getRange(from, to); cm.state.sublimeKilled = cm.getRange(from, to);
cm.replaceRange("", from, to); cm.replaceRange("", from, to, "+delete");
} }
}; };
cmds[map[cK + ctrl + "X"] = "swapWithSublimeMark"] = function(cm) { cmds[map[cK + ctrl + "X"] = "swapWithSublimeMark"] = function(cm) {

View file

@ -25,7 +25,7 @@
return lineNumbers; return lineNumbers;
} }
$.fn.gist = function() { $.fn.gist = function(callback) {
return this.each(function() { return this.each(function() {
var $elem = $(this), var $elem = $(this),
id, id,
@ -165,6 +165,10 @@
}, },
error: function(jqXHR, textStatus) { error: function(jqXHR, textStatus) {
$elem.html('Failed loading gist ' + url + ': ' + textStatus); $elem.html('Failed loading gist ' + url + ': ' + textStatus);
},
complete: function() {
if(callback)
callback();
} }
}); });

View file

@ -0,0 +1,95 @@
/*jslint newcap: true */
/*global inlineAttachment: false */
/**
* CodeMirror version for inlineAttachment
*
* Call inlineAttachment.attach(editor) to attach to a codemirror instance
*/
(function() {
'use strict';
var codeMirrorEditor = function(instance) {
if (!instance.getWrapperElement) {
throw "Invalid CodeMirror object given";
}
this.codeMirror = instance;
};
codeMirrorEditor.prototype.getValue = function() {
return this.codeMirror.getValue();
};
codeMirrorEditor.prototype.insertValue = function(val) {
this.codeMirror.replaceSelection(val);
};
codeMirrorEditor.prototype.setValue = function(val) {
var cursor = this.codeMirror.getCursor();
this.codeMirror.setValue(val);
this.codeMirror.setCursor(cursor);
};
codeMirrorEditor.prototype.replaceRange = function(val) {
this.codeMirror.replaceRange(val.replacement, val.from, val.to, "+input");
};
/**
* Attach InlineAttachment to CodeMirror
*
* @param {CodeMirror} codeMirror
*/
codeMirrorEditor.attach = function(codeMirror, options) {
options = options || {};
var editor = new codeMirrorEditor(codeMirror),
inlineattach = new inlineAttachment(options, editor),
el = codeMirror.getWrapperElement();
el.addEventListener('paste', function(e) {
inlineattach.onPaste(e);
}, false);
codeMirror.setOption('onDragEvent', function(data, e) {
if (e.type === "drop") {
e.stopPropagation();
e.preventDefault();
return inlineattach.onDrop(e);
}
});
};
inlineAttachment.editors.codemirror3 = codeMirrorEditor;
var codeMirrorEditor4 = function(instance) {
codeMirrorEditor.call(this, instance);
};
codeMirrorEditor4.attach = function(codeMirror, options) {
options = options || {};
var editor = new codeMirrorEditor(codeMirror),
inlineattach = new inlineAttachment(options, editor),
el = codeMirror.getWrapperElement();
el.addEventListener('paste', function(e) {
inlineattach.onPaste(e);
}, false);
codeMirror.on('drop', function(data, e) {
if (inlineattach.onDrop(e)) {
e.stopPropagation();
e.preventDefault();
return true;
} else {
return false;
}
});
};
inlineAttachment.editors.codemirror4 = codeMirrorEditor4;
})();

View file

@ -0,0 +1,435 @@
/*jslint newcap: true */
/*global XMLHttpRequest: false, FormData: false */
/*
* Inline Text Attachment
*
* Author: Roy van Kaathoven
* Contact: ik@royvankaathoven.nl
*/
(function(document, window) {
'use strict';
var inlineAttachment = function(options, instance) {
this.settings = inlineAttachment.util.merge(options, inlineAttachment.defaults);
this.editor = instance;
this.filenameTag = '{filename}';
this.lastValue = null;
};
/**
* Will holds the available editors
*
* @type {Object}
*/
inlineAttachment.editors = {};
/**
* Utility functions
*/
inlineAttachment.util = {
/**
* Simple function to merge the given objects
*
* @param {Object[]} object Multiple object parameters
* @returns {Object}
*/
merge: function() {
var result = {};
for (var i = arguments.length - 1; i >= 0; i--) {
var obj = arguments[i];
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
result[k] = obj[k];
}
}
}
return result;
},
/**
* Append a line of text at the bottom, ensuring there aren't unnecessary newlines
*
* @param {String} appended Current content
* @param {String} previous Value which should be appended after the current content
*/
appendInItsOwnLine: function(previous, appended) {
return (previous + "\n\n[[D]]" + appended)
.replace(/(\n{2,})\[\[D\]\]/, "\n\n")
.replace(/^(\n*)/, "");
},
/**
* Inserts the given value at the current cursor position of the textarea element
*
* @param {HtmlElement} el
* @param {String} value Text which will be inserted at the cursor position
*/
insertTextAtCursor: function(el, text) {
var scrollPos = el.scrollTop,
strPos = 0,
browser = false,
range;
if ((el.selectionStart || el.selectionStart === '0')) {
browser = "ff";
} else if (document.selection) {
browser = "ie";
}
if (browser === "ie") {
el.focus();
range = document.selection.createRange();
range.moveStart('character', -el.value.length);
strPos = range.text.length;
} else if (browser === "ff") {
strPos = el.selectionStart;
}
var front = (el.value).substring(0, strPos);
var back = (el.value).substring(strPos, el.value.length);
el.value = front + text + back;
strPos = strPos + text.length;
if (browser === "ie") {
el.focus();
range = document.selection.createRange();
range.moveStart('character', -el.value.length);
range.moveStart('character', strPos);
range.moveEnd('character', 0);
range.select();
} else if (browser === "ff") {
el.selectionStart = strPos;
el.selectionEnd = strPos;
el.focus();
}
el.scrollTop = scrollPos;
}
};
/**
* Default configuration options
*
* @type {Object}
*/
inlineAttachment.defaults = {
/**
* URL where the file will be send
*/
uploadUrl: 'uploadimage',
/**
* Which method will be used to send the file to the upload URL
*/
uploadMethod: 'POST',
/**
* Name in which the file will be placed
*/
uploadFieldName: 'image',
/**
* Extension which will be used when a file extension could not
* be detected
*/
defualtExtension: 'png',
/**
* JSON field which refers to the uploaded file URL
*/
jsonFieldName: 'link',
/**
* Allowed MIME types
*/
allowedTypes: [
'image/jpeg',
'image/png',
'image/jpg',
'image/gif'
],
/**
* Text which will be inserted when dropping or pasting a file.
* Acts as a placeholder which will be replaced when the file is done with uploading
*/
progressText: '![Uploading file...{filename}]()',
/**
* When a file has successfully been uploaded the progressText
* will be replaced by the urlText, the {filename} tag will be replaced
* by the filename that has been returned by the server
*/
urlText: "![]({filename})",
/**
* Text which will be used when uploading has failed
*/
errorText: "Error uploading file",
/**
* Extra parameters which will be send when uploading a file
*/
extraParams: {},
/**
* Extra headers which will be send when uploading a file
*/
extraHeaders: {},
/**
* Before the file is send
*/
beforeFileUpload: function() {
return true;
},
/**
* Triggers when a file is dropped or pasted
*/
onFileReceived: function() {},
/**
* Custom upload handler
*
* @return {Boolean} when false is returned it will prevent default upload behavior
*/
onFileUploadResponse: function() {
return true;
},
/**
* Custom error handler. Runs after removing the placeholder text and before the alert().
* Return false from this function to prevent the alert dialog.
*
* @return {Boolean} when false is returned it will prevent default error behavior
*/
onFileUploadError: function() {
return true;
},
/**
* When a file has succesfully been uploaded
*/
onFileUploaded: function() {}
};
/**
* Uploads the blob
*
* @param {Blob} file blob data received from event.dataTransfer object
* @return {XMLHttpRequest} request object which sends the file
*/
inlineAttachment.prototype.uploadFile = function(file, id) {
var me = this,
formData = new FormData(),
xhr = new XMLHttpRequest(),
id = id,
settings = this.settings,
extension = settings.defualtExtension;
if (typeof settings.setupFormData === 'function') {
settings.setupFormData(formData, file);
}
// Attach the file. If coming from clipboard, add a default filename (only works in Chrome for now)
// http://stackoverflow.com/questions/6664967/how-to-give-a-blob-uploaded-as-formdata-a-file-name
if (file.name) {
var fileNameMatches = file.name.match(/\.(.+)$/);
if (fileNameMatches) {
extension = fileNameMatches[1];
}
}
var remoteFilename = "image-" + Date.now() + "." + extension;
if (typeof settings.remoteFilename === 'function') {
remoteFilename = settings.remoteFilename(file);
}
formData.append(settings.uploadFieldName, file, remoteFilename);
// Append the extra parameters to the formdata
if (typeof settings.extraParams === "object") {
for (var key in settings.extraParams) {
if (settings.extraParams.hasOwnProperty(key)) {
formData.append(key, settings.extraParams[key]);
}
}
}
xhr.open('POST', settings.uploadUrl);
// Add any available extra headers
if (typeof settings.extraHeaders === "object") {
for (var header in settings.extraHeaders) {
if (settings.extraHeaders.hasOwnProperty(header)) {
xhr.setRequestHeader(header, settings.extraHeaders[header]);
}
}
}
xhr.onload = function() {
// If HTTP status is OK or Created
if (xhr.status === 200 || xhr.status === 201) {
me.onFileUploadResponse(xhr, id);
} else {
me.onFileUploadError(xhr, id);
}
};
if (settings.beforeFileUpload(xhr) !== false) {
xhr.send(formData);
}
return xhr;
};
/**
* Returns if the given file is allowed to handle
*
* @param {File} clipboard data file
*/
inlineAttachment.prototype.isFileAllowed = function(file) {
if (this.settings.allowedTypes.indexOf('*') === 0){
return true;
} else {
return this.settings.allowedTypes.indexOf(file.type) >= 0;
}
};
/**
* Handles upload response
*
* @param {XMLHttpRequest} xhr
* @return {Void}
*/
inlineAttachment.prototype.onFileUploadResponse = function(xhr, id) {
if (this.settings.onFileUploadResponse.call(this, xhr) !== false) {
var result = JSON.parse(xhr.responseText),
filename = result[this.settings.jsonFieldName];
if (result && filename) {
var replacements = [];
var string = this.settings.progressText.replace(this.filenameTag, id);
var lines = this.editor.getValue().split('\n');
var newValue = this.settings.urlText.replace(this.filenameTag, filename);
for(var i = 0; i < lines.length; i++) {
var ch = lines[i].indexOf(string);
if(ch != -1)
replacements.push({replacement:newValue, from:{line:i, ch:ch}, to:{line:i, ch:ch + string.length}});
}
for(var i = 0; i < replacements.length; i++)
this.editor.replaceRange(replacements[i]);
}
}
};
/**
* Called when a file has failed to upload
*
* @param {XMLHttpRequest} xhr
* @return {Void}
*/
inlineAttachment.prototype.onFileUploadError = function(xhr, id) {
if (this.settings.onFileUploadError.call(this, xhr) !== false) {
var replacements = [];
var string = this.settings.progressText.replace(this.filenameTag, id);
var lines = this.editor.getValue().split('\n');
for(var i = 0; i < lines.length; i++) {
var ch = lines[i].indexOf(this.lastValue);
if(ch != -1)
replacements.push({replacement:"", from:{line:i, ch:ch}, to:{line:i, ch:ch + string.length}});
}
for(var i = 0; i < replacements.length; i++)
this.editor.replaceRange(replacements[i]);
}
};
/**
* Called when a file has been inserted, either by drop or paste
*
* @param {File} file
* @return {Void}
*/
inlineAttachment.prototype.onFileInserted = function(file, id) {
if (this.settings.onFileReceived.call(this, file) !== false) {
this.lastValue = this.settings.progressText.replace(this.filenameTag, id);
this.editor.insertValue(this.lastValue);
}
};
/**
* Called when a paste event occured
* @param {Event} e
* @return {Boolean} if the event was handled
*/
inlineAttachment.prototype.onPaste = function(e) {
var result = false,
clipboardData = e.clipboardData,
items;
if (typeof clipboardData === "object") {
items = clipboardData.items || clipboardData.files || [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (this.isFileAllowed(item)) {
result = true;
var id = ID();
this.onFileInserted(item.getAsFile(), id);
this.uploadFile(item.getAsFile(), id);
}
}
}
if (result) { e.preventDefault(); }
return result;
};
/**
* Called when a drop event occures
* @param {Event} e
* @return {Boolean} if the event was handled
*/
inlineAttachment.prototype.onDrop = function(e) {
var result = false;
for (var i = 0; i < e.dataTransfer.files.length; i++) {
var file = e.dataTransfer.files[i];
if (this.isFileAllowed(file)) {
result = true;
var id = ID();
this.onFileInserted(file, id);
this.uploadFile(file, id);
}
}
return result;
};
window.inlineAttachment = inlineAttachment;
})(document, window);
// Generate unique IDs for use as pseudo-private/protected names.
// Similar in concept to
// <http://wiki.ecmascript.org/doku.php?id=strawman:names>.
//
// The goals of this function are twofold:
//
// * Provide a way to generate a string guaranteed to be unique when compared
// to other strings generated by this function.
// * Make the string complex enough that it is highly unlikely to be
// accidentally duplicated by hand (this is key if you're using `ID`
// as a private/protected name on an object).
//
// Use:
//
// var privateName = ID();
// var o = { 'public': 'foo' };
// o[privateName] = 'bar';
var ID = function () {
// Math.random should be unique because of its seeding algorithm.
// Convert it to base 36 (numbers + letters), and grab the first 9 characters
// after the decimal.
return '_' + Math.random().toString(36).substr(2, 9);
};

View file

@ -1,2 +0,0 @@
/*! jquery.cookie v1.4.1 | MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});

137
public/vendor/js.cookie.js vendored Executable file
View file

@ -0,0 +1,137 @@
/*!
* JavaScript Cookie v2.0.0-pre
* https://github.com/js-cookie/js-cookie
*
* Copyright 2006, 2015 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(factory);
} else if (typeof exports === 'object') {
module.exports = factory();
} else {
var _OldCookies = window.Cookies;
var api = window.Cookies = factory(window.jQuery);
api.noConflict = function () {
window.Cookies = _OldCookies;
return api;
};
}
}(function () {
function extend () {
var i = 0;
var result = {};
for (; i < arguments.length; i++) {
var attributes = arguments[ i ];
for (var key in attributes) {
result[key] = attributes[key];
}
}
return result;
}
function init (converter) {
function api (key, value, attributes) {
var result;
// Write
if (arguments.length > 1) {
attributes = extend({
path: '/'
}, api.defaults, attributes);
if (typeof attributes.expires === 'number') {
var expires = new Date();
expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
attributes.expires = expires;
}
try {
result = JSON.stringify(value);
if (/^[\{\[]/.test(result)) {
value = result;
}
} catch (e) {}
value = encodeURIComponent(String(value));
value = value.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
key = encodeURIComponent(String(key));
key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
key = key.replace(/[\(\)]/g, escape);
return (document.cookie = [
key, '=', value,
attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE
attributes.path && '; path=' + attributes.path,
attributes.domain && '; domain=' + attributes.domain,
attributes.secure && '; secure'
].join(''));
}
// Read
if (!key) {
result = {};
}
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling "get()"
var cookies = document.cookie ? document.cookie.split('; ') : [];
var rdecode = /(%[0-9A-Z]{2})+/g;
var i = 0;
for (; i < cookies.length; i++) {
var parts = cookies[i].split('=');
var name = parts[0].replace(rdecode, decodeURIComponent);
var cookie = parts.slice(1).join('=');
if (cookie.charAt(0) === '"') {
cookie = cookie.slice(1, -1);
}
cookie = converter && converter(cookie, name) || cookie.replace(rdecode, decodeURIComponent);
if (this.json) {
try {
cookie = JSON.parse(cookie);
} catch (e) {}
}
if (key === name) {
result = cookie;
break;
}
if (!key) {
result[name] = cookie;
}
}
return result;
}
api.get = api.set = api;
api.getJSON = function () {
return api.apply({
json: true
}, [].slice.call(arguments));
};
api.defaults = {};
api.remove = function (key, attributes) {
api(key, '', extend(attributes, {
expires: -1
}));
};
api.withConverter = init;
return api;
}
return init();
}));

View file

@ -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

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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}})();

View file

@ -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

View file

@ -0,0 +1,495 @@
/*! Select2 Bootstrap 3 CSS v1.4.6 | MIT License | github.com/t0m/select2-bootstrap-css */
/**
* Reset Bootstrap 3 .form-control styles which - if applied to the
* original <select>-element the Select2-plugin may be run against -
* are copied to the .select2-container.
*
* 1. Overwrite .select2-container's original display:inline-block
* with Bootstrap 3's default for .form-control, display:block;
* courtesy of @juristr (@see https://github.com/fk/select2-bootstrap-css/pull/1)
*/
.select2-container.form-control {
background: transparent;
box-shadow: none;
border: none;
display: block;
/* 1 */
margin: 0;
padding: 0;
}
/**
* Adjust Select2 inputs to fit Bootstrap 3 default .form-control appearance.
*/
.select2-container .select2-choices .select2-search-field input,
.select2-container .select2-choice,
.select2-container .select2-choices {
background: none;
padding: 0;
border-color: #cccccc;
border-radius: 4px;
color: #555555;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
background-color: white;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.select2-search input {
border-color: #cccccc;
border-radius: 4px;
color: #555555;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
background-color: white;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}
.select2-container .select2-choices .select2-search-field input {
-webkit-box-shadow: none;
box-shadow: none;
}
/**
* Adjust Select2 input heights to match the Bootstrap default.
*/
.select2-container .select2-choice {
height: 34px;
line-height: 1.42857;
}
/**
* Address Multi Select2's height which - depending on how many elements have been selected -
* may grown higher than their initial size.
*/
.select2-container.select2-container-multi.form-control {
height: auto;
}
/**
* Address Bootstrap 3 control sizing classes
* @see http://getbootstrap.com/css/#forms-control-sizes
*/
.select2-container.input-sm .select2-choice,
.input-group-sm .select2-container .select2-choice {
height: 30px;
line-height: 1.5;
border-radius: 3px;
}
.select2-container.input-lg .select2-choice,
.input-group-lg .select2-container .select2-choice {
height: 46px;
line-height: 1.33333;
border-radius: 6px;
}
.select2-container-multi .select2-choices .select2-search-field input {
height: 32px;
}
.select2-container-multi.input-sm .select2-choices .select2-search-field input,
.input-group-sm .select2-container-multi .select2-choices .select2-search-field input {
height: 28px;
}
.select2-container-multi.input-lg .select2-choices .select2-search-field input,
.input-group-lg .select2-container-multi .select2-choices .select2-search-field input {
height: 44px;
}
/**
* Adjust height and line-height for .select2-search-field amd multi-select Select2 widgets.
*
* 1. Class repetition to address missing .select2-chosen in Select2 < 3.3.2.
*/
.select2-container-multi .select2-choices .select2-search-field input {
margin: 0;
}
.select2-chosen,
.select2-choice > span:first-child,
.select2-container .select2-choices .select2-search-field input {
padding: 6px 12px;
}
.input-sm .select2-chosen,
.input-group-sm .select2-chosen,
.input-sm .select2-choice > span:first-child,
.input-group-sm .select2-choice > span:first-child,
.input-sm .select2-choices .select2-search-field input,
.input-group-sm .select2-choices .select2-search-field input {
padding: 5px 10px;
}
.input-lg .select2-chosen,
.input-group-lg .select2-chosen,
.input-lg .select2-choice > span:first-child,
.input-group-lg .select2-choice > span:first-child,
.input-lg .select2-choices .select2-search-field input,
.input-group-lg .select2-choices .select2-search-field input {
padding: 10px 16px;
}
.select2-container-multi .select2-choices .select2-search-choice {
margin-top: 5px;
margin-bottom: 3px;
}
.select2-container-multi.input-sm .select2-choices .select2-search-choice,
.input-group-sm .select2-container-multi .select2-choices .select2-search-choice {
margin-top: 3px;
margin-bottom: 2px;
}
.select2-container-multi.input-lg .select2-choices .select2-search-choice,
.input-group-lg .select2-container-multi .select2-choices .select2-search-choice {
line-height: 24px;
}
/**
* Adjust the single Select2's dropdown arrow button appearance.
*
* 1. For Select2 v.3.3.2.
*/
.select2-container .select2-choice .select2-arrow,
.select2-container .select2-choice div {
border-left: none;
background: none;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.select2-dropdown-open .select2-choice .select2-arrow,
.select2-dropdown-open .select2-choice div {
border-left-color: transparent;
background: none;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
/**
* Adjust the dropdown arrow button icon position for the single-select Select2 elements
* to make it line up vertically now that we increased the height of .select2-container.
*
* 1. Class repetition to address missing .select2-chosen in Select2 v.3.3.2.
*/
.select2-container .select2-choice .select2-arrow b,
.select2-container .select2-choice div b {
background-position: 0 3px;
}
.select2-dropdown-open .select2-choice .select2-arrow b,
.select2-dropdown-open .select2-choice div b {
background-position: -18px 3px;
}
.select2-container.input-sm .select2-choice .select2-arrow b,
.input-group-sm .select2-container .select2-choice .select2-arrow b,
.select2-container.input-sm .select2-choice div b,
.input-group-sm .select2-container .select2-choice div b {
background-position: 0 1px;
}
.select2-dropdown-open.input-sm .select2-choice .select2-arrow b,
.input-group-sm .select2-dropdown-open .select2-choice .select2-arrow b,
.select2-dropdown-open.input-sm .select2-choice div b,
.input-group-sm .select2-dropdown-open .select2-choice div b {
background-position: -18px 1px;
}
.select2-container.input-lg .select2-choice .select2-arrow b,
.input-group-lg .select2-container .select2-choice .select2-arrow b,
.select2-container.input-lg .select2-choice div b,
.input-group-lg .select2-container .select2-choice div b {
background-position: 0 9px;
}
.select2-dropdown-open.input-lg .select2-choice .select2-arrow b,
.input-group-lg .select2-dropdown-open .select2-choice .select2-arrow b,
.select2-dropdown-open.input-lg .select2-choice div b,
.input-group-lg .select2-dropdown-open .select2-choice div b {
background-position: -18px 9px;
}
/**
* Address Bootstrap's validation states and change Select2's border colors and focus states.
* Apply .has-warning, .has-danger or .has-succes to #select2-drop to match Bootstraps' colors.
*/
.has-warning .select2-choice,
.has-warning .select2-choices {
border-color: #8a6d3b;
}
.has-warning .select2-container-active .select2-choice,
.has-warning .select2-container-multi.select2-container-active .select2-choices {
border-color: #66512c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
}
.has-warning.select2-drop-active {
border-color: #66512c;
}
.has-warning.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #66512c;
}
.has-error .select2-choice,
.has-error .select2-choices {
border-color: #a94442;
}
.has-error .select2-container-active .select2-choice,
.has-error .select2-container-multi.select2-container-active .select2-choices {
border-color: #843534;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
}
.has-error.select2-drop-active {
border-color: #843534;
}
.has-error.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #843534;
}
.has-success .select2-choice,
.has-success .select2-choices {
border-color: #3c763d;
}
.has-success .select2-container-active .select2-choice,
.has-success .select2-container-multi.select2-container-active .select2-choices {
border-color: #2b542c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
}
.has-success.select2-drop-active {
border-color: #2b542c;
}
.has-success.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #2b542c;
}
/**
* Make Select2's active-styles - applied to .select2-container when the widget receives focus -
* fit Bootstrap 3's .form-element:focus appearance.
*/
.select2-container-active .select2-choice,
.select2-container-multi.select2-container-active .select2-choices {
border-color: #66afe9;
outline: none;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
-o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.select2-drop-active {
border-color: #66afe9;
}
.select2-drop-auto-width,
.select2-drop.select2-drop-above.select2-drop-active {
border-top-color: #66afe9;
}
/**
* Select2 widgets in Bootstrap Input Groups
*
* When Select2 widgets are combined with other elements using Bootstrap 3's
* "Input Group" component, we don't want specific edges of the Select2 container
* to have a border-radius.
*
* In Bootstrap 2, input groups required a markup where these style adjustments
* could be bound to a CSS-class identifying if the additional elements are appended,
* prepended or both.
*
* Bootstrap 3 doesn't rely on these classes anymore, so we have to use our own.
* Use .select2-bootstrap-prepend and .select2-bootstrap-append on a Bootstrap 3 .input-group
* to let the contained Select2 widget know which edges should not be rounded as they are
* directly followed by another element.
*
* @see http://getbootstrap.com/components/#input-groups
*/
.input-group.select2-bootstrap-prepend [class^="select2-choice"] {
border-bottom-left-radius: 0 !important;
border-top-left-radius: 0 !important;
}
.input-group.select2-bootstrap-append [class^="select2-choice"] {
border-bottom-right-radius: 0 !important;
border-top-right-radius: 0 !important;
}
.select2-dropdown-open [class^="select2-choice"] {
border-bottom-right-radius: 0 !important;
border-bottom-left-radius: 0 !important;
}
.select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-top-right-radius: 0 !important;
border-top-left-radius: 0 !important;
border-bottom-right-radius: 4px !important;
border-bottom-left-radius: 4px !important;
background: white;
filter: none;
}
.input-group.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-bottom-left-radius: 0 !important;
border-top-left-radius: 0 !important;
}
.input-group.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-bottom-right-radius: 0 !important;
border-top-right-radius: 0 !important;
}
.input-group.input-group-sm.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-bottom-right-radius: 3px !important;
}
.input-group.input-group-lg.select2-bootstrap-prepend .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-bottom-right-radius: 6px !important;
}
.input-group.input-group-sm.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-bottom-left-radius: 3px !important;
}
.input-group.input-group-lg.select2-bootstrap-append .select2-dropdown-open.select2-drop-above [class^="select2-choice"] {
border-bottom-left-radius: 6px !important;
}
/**
* Adjust Select2's choices hover and selected styles to match Bootstrap 3's default dropdown styles.
*/
.select2-results .select2-highlighted {
color: white;
background-color: #337ab7;
}
/**
* Adjust alignment of Bootstrap 3 buttons in Bootstrap 3 Input Groups to address
* Multi Select2's height which - depending on how many elements have been selected -
* may grown higher than their initial size.
*/
.select2-bootstrap-append .select2-container-multiple,
.select2-bootstrap-append .input-group-btn,
.select2-bootstrap-append .input-group-btn .btn,
.select2-bootstrap-prepend .select2-container-multiple,
.select2-bootstrap-prepend .input-group-btn,
.select2-bootstrap-prepend .input-group-btn .btn {
vertical-align: top;
}
/**
* Make Multi Select2's choices match Bootstrap 3's default button styles.
*/
.select2-container-multi .select2-choices .select2-search-choice {
color: #555555;
background: white;
border-color: #cccccc;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-webkit-box-shadow: none;
box-shadow: none;
}
.select2-container-multi .select2-choices .select2-search-choice-focus {
background: #ebebeb;
border-color: #adadad;
color: #333333;
-webkit-box-shadow: none;
box-shadow: none;
}
/**
* Address Multi Select2's choice close-button vertical alignment.
*/
.select2-search-choice-close {
margin-top: -7px;
top: 50%;
}
/**
* Adjust the single Select2's clear button position (used to reset the select box
* back to the placeholder value and visible once a selection is made
* activated by Select2's "allowClear" option).
*/
.select2-container .select2-choice abbr {
top: 50%;
}
/**
* Adjust "no results" and "selection limit" messages to make use
* of Bootstrap 3's default "Alert" style.
*
* @see http://getbootstrap.com/components/#alerts-default
*/
.select2-results .select2-no-results,
.select2-results .select2-searching,
.select2-results .select2-selection-limit {
background-color: #fcf8e3;
color: #8a6d3b;
}
/**
* Address disabled Select2 styles.
*
* 1. For Select2 v.3.3.2.
* 2. Revert border-left:0 inherited from Select2's CSS to prevent the arrow
* from jumping when switching from disabled to enabled state and vice versa.
*/
.select2-container.select2-container-disabled .select2-choice,
.select2-container.select2-container-disabled .select2-choices {
cursor: not-allowed;
background-color: #eeeeee;
border-color: #cccccc;
}
.select2-container.select2-container-disabled .select2-choice .select2-arrow,
.select2-container.select2-container-disabled .select2-choice div,
.select2-container.select2-container-disabled .select2-choices .select2-arrow,
.select2-container.select2-container-disabled .select2-choices div {
background-color: transparent;
border-left: 1px solid transparent;
/* 2 */
}
/**
* Address Select2's loading indicator position - which should not stick
* to the right edge of Select2's search input.
*
* 1. in .select2-search input
* 2. in Multi Select2's .select2-search-field input
* 3. in the status-message of infinite-scroll with remote data (@see http://ivaynberg.github.io/select2/#infinite)
*
* These styles alter Select2's default background-position of 100%
* and supply the new background-position syntax to browsers which support it:
*
* 1. Android, Safari < 6/Mobile, IE<9: change to a relative background-position of 99%
* 2. Chrome 25+, Firefox 13+, IE 9+, Opera 10.5+: use the new CSS3-background-position syntax
*
* @see http://www.w3.org/TR/css3-background/#background-position
*
* @todo Since both Select2 and Bootstrap 3 only support IE8 and above,
* we could use the :after-pseudo-element to display the loading indicator.
* Alternatively, we could supply an altered loading indicator image which already
* contains an offset to the right.
*/
.select2-search input.select2-active,
.select2-container-multi .select2-choices .select2-search-field input.select2-active,
.select2-more-results.select2-active {
background-position: 99%;
/* 4 */
background-position: right 4px center;
/* 5 */
}
/**
* To support Select2 pre v3.4.2 in combination with Bootstrap v3.2.0,
* ensure that .select2-offscreen width, height and position can not be overwritten.
*
* This adresses changes in Bootstrap somewhere after the initial v3.0.0 which -
* in combination with Select2's pre-v3.4.2 CSS missing the "!important" after
* the following rules - allow Bootstrap to overwrite the latter, which results in
* the original <select> element Select2 is replacing not be properly being hidden
* when used in a "Bootstrap Input Group with Addon".
**/
.select2-offscreen,
.select2-offscreen:focus {
width: 1px !important;
height: 1px !important;
position: absolute !important;
}

BIN
public/vendor/select2/select2-spinner.gif vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

704
public/vendor/select2/select2.css vendored Executable file
View file

@ -0,0 +1,704 @@
/*
Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
*/
.select2-container {
margin: 0;
position: relative;
display: inline-block;
/* inline-block for ie7 */
zoom: 1;
*display: inline;
vertical-align: middle;
}
.select2-container,
.select2-drop,
.select2-search,
.select2-search input {
/*
Force border-box so that % widths fit the parent
container without overlap because of margin/padding.
More Info : http://www.quirksmode.org/css/box.html
*/
-webkit-box-sizing: border-box; /* webkit */
-moz-box-sizing: border-box; /* firefox */
box-sizing: border-box; /* css3 */
}
.select2-container .select2-choice {
display: block;
height: 26px;
padding: 0 0 0 8px;
overflow: hidden;
position: relative;
border: 1px solid #aaa;
white-space: nowrap;
line-height: 26px;
color: #444;
text-decoration: none;
border-radius: 4px;
background-clip: padding-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #fff;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
background-image: linear-gradient(to top, #eee 0%, #fff 50%);
}
html[dir="rtl"] .select2-container .select2-choice {
padding: 0 8px 0 0;
}
.select2-container.select2-drop-above .select2-choice {
border-bottom-color: #aaa;
border-radius: 0 0 4px 4px;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
}
.select2-container.select2-allowclear .select2-choice .select2-chosen {
margin-right: 42px;
}
.select2-container .select2-choice > .select2-chosen {
margin-right: 26px;
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
float: none;
width: auto;
}
html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
margin-left: 26px;
margin-right: 0;
}
.select2-container .select2-choice abbr {
display: none;
width: 12px;
height: 12px;
position: absolute;
right: 24px;
top: 8px;
font-size: 1px;
text-decoration: none;
border: 0;
background: url('select2.png') right top no-repeat;
cursor: pointer;
outline: 0;
}
.select2-container.select2-allowclear .select2-choice abbr {
display: inline-block;
}
.select2-container .select2-choice abbr:hover {
background-position: right -11px;
cursor: pointer;
}
.select2-drop-mask {
border: 0;
margin: 0;
padding: 0;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 9998;
/* styles required for IE to work */
background-color: #fff;
filter: alpha(opacity=0);
}
.select2-drop {
width: 100%;
margin-top: -1px;
position: absolute;
z-index: 9999;
top: 100%;
background: #fff;
color: #000;
border: 1px solid #aaa;
border-top: 0;
border-radius: 0 0 4px 4px;
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
}
.select2-drop.select2-drop-above {
margin-top: 1px;
border-top: 1px solid #aaa;
border-bottom: 0;
border-radius: 4px 4px 0 0;
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
}
.select2-drop-active {
border: 1px solid #5897fb;
border-top: none;
}
.select2-drop.select2-drop-above.select2-drop-active {
border-top: 1px solid #5897fb;
}
.select2-drop-auto-width {
border-top: 1px solid #aaa;
width: auto;
}
.select2-drop-auto-width .select2-search {
padding-top: 4px;
}
.select2-container .select2-choice .select2-arrow {
display: inline-block;
width: 18px;
height: 100%;
position: absolute;
right: 0;
top: 0;
border-left: 1px solid #aaa;
border-radius: 0 4px 4px 0;
background-clip: padding-box;
background: #ccc;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
}
html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
left: 0;
right: auto;
border-left: none;
border-right: 1px solid #aaa;
border-radius: 4px 0 0 4px;
}
.select2-container .select2-choice .select2-arrow b {
display: block;
width: 100%;
height: 100%;
background: url('select2.png') no-repeat 0 1px;
}
html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
background-position: 2px 1px;
}
.select2-search {
display: inline-block;
width: 100%;
min-height: 26px;
margin: 0;
padding-left: 4px;
padding-right: 4px;
position: relative;
z-index: 10000;
white-space: nowrap;
}
.select2-search input {
width: 100%;
height: auto !important;
min-height: 26px;
padding: 4px 20px 4px 5px;
margin: 0;
outline: 0;
font-family: sans-serif;
font-size: 1em;
border: 1px solid #aaa;
border-radius: 0;
-webkit-box-shadow: none;
box-shadow: none;
background: #fff url('select2.png') no-repeat 100% -22px;
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
}
html[dir="rtl"] .select2-search input {
padding: 4px 5px 4px 20px;
background: #fff url('select2.png') no-repeat -37px -22px;
background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
}
.select2-drop.select2-drop-above .select2-search input {
margin-top: 4px;
}
.select2-search input.select2-active {
background: #fff url('select2-spinner.gif') no-repeat 100%;
background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
}
.select2-container-active .select2-choice,
.select2-container-active .select2-choices {
border: 1px solid #5897fb;
outline: none;
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
}
.select2-dropdown-open .select2-choice {
border-bottom-color: transparent;
-webkit-box-shadow: 0 1px 0 #fff inset;
box-shadow: 0 1px 0 #fff inset;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
background-color: #eee;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
background-image: linear-gradient(to top, #fff 0%, #eee 50%);
}
.select2-dropdown-open.select2-drop-above .select2-choice,
.select2-dropdown-open.select2-drop-above .select2-choices {
border: 1px solid #5897fb;
border-top-color: transparent;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
}
.select2-dropdown-open .select2-choice .select2-arrow {
background: transparent;
border-left: none;
filter: none;
}
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
border-right: none;
}
.select2-dropdown-open .select2-choice .select2-arrow b {
background-position: -18px 1px;
}
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
background-position: -16px 1px;
}
.select2-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/* results */
.select2-results {
max-height: 200px;
padding: 0 0 0 4px;
margin: 4px 4px 4px 0;
position: relative;
overflow-x: hidden;
overflow-y: auto;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
html[dir="rtl"] .select2-results {
padding: 0 4px 0 0;
margin: 4px 0 4px 4px;
}
.select2-results ul.select2-result-sub {
margin: 0;
padding-left: 0;
}
.select2-results li {
list-style: none;
display: list-item;
background-image: none;
}
.select2-results li.select2-result-with-children > .select2-result-label {
font-weight: bold;
}
.select2-results .select2-result-label {
padding: 3px 7px 4px;
margin: 0;
cursor: pointer;
min-height: 1em;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.select2-results-dept-1 .select2-result-label { padding-left: 20px }
.select2-results-dept-2 .select2-result-label { padding-left: 40px }
.select2-results-dept-3 .select2-result-label { padding-left: 60px }
.select2-results-dept-4 .select2-result-label { padding-left: 80px }
.select2-results-dept-5 .select2-result-label { padding-left: 100px }
.select2-results-dept-6 .select2-result-label { padding-left: 110px }
.select2-results-dept-7 .select2-result-label { padding-left: 120px }
.select2-results .select2-highlighted {
background: #3875d7;
color: #fff;
}
.select2-results li em {
background: #feffde;
font-style: normal;
}
.select2-results .select2-highlighted em {
background: transparent;
}
.select2-results .select2-highlighted ul {
background: #fff;
color: #000;
}
.select2-results .select2-no-results,
.select2-results .select2-searching,
.select2-results .select2-ajax-error,
.select2-results .select2-selection-limit {
background: #f4f4f4;
display: list-item;
padding-left: 5px;
}
/*
disabled look for disabled choices in the results dropdown
*/
.select2-results .select2-disabled.select2-highlighted {
color: #666;
background: #f4f4f4;
display: list-item;
cursor: default;
}
.select2-results .select2-disabled {
background: #f4f4f4;
display: list-item;
cursor: default;
}
.select2-results .select2-selected {
display: none;
}
.select2-more-results.select2-active {
background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
}
.select2-results .select2-ajax-error {
background: rgba(255, 50, 50, .2);
}
.select2-more-results {
background: #f4f4f4;
display: list-item;
}
/* disabled styles */
.select2-container.select2-container-disabled .select2-choice {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.select2-container.select2-container-disabled .select2-choice .select2-arrow {
background-color: #f4f4f4;
background-image: none;
border-left: 0;
}
.select2-container.select2-container-disabled .select2-choice abbr {
display: none;
}
/* multiselect */
.select2-container-multi .select2-choices {
height: auto !important;
height: 1%;
margin: 0;
padding: 0 5px 0 0;
position: relative;
border: 1px solid #aaa;
cursor: text;
overflow: hidden;
background-color: #fff;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
}
html[dir="rtl"] .select2-container-multi .select2-choices {
padding: 0 0 0 5px;
}
.select2-locked {
padding: 3px 5px 3px 5px !important;
}
.select2-container-multi .select2-choices {
min-height: 26px;
}
.select2-container-multi.select2-container-active .select2-choices {
border: 1px solid #5897fb;
outline: none;
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
}
.select2-container-multi .select2-choices li {
float: left;
list-style: none;
}
html[dir="rtl"] .select2-container-multi .select2-choices li
{
float: right;
}
.select2-container-multi .select2-choices .select2-search-field {
margin: 0;
padding: 0;
white-space: nowrap;
}
.select2-container-multi .select2-choices .select2-search-field input {
padding: 5px;
margin: 1px 0;
font-family: sans-serif;
font-size: 100%;
color: #666;
outline: 0;
border: 0;
-webkit-box-shadow: none;
box-shadow: none;
background: transparent !important;
}
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
background: #fff url('select2-spinner.gif') no-repeat 100% !important;
}
.select2-default {
color: #999 !important;
}
.select2-container-multi .select2-choices .select2-search-choice {
padding: 3px 5px 3px 18px;
margin: 3px 0 3px 5px;
position: relative;
line-height: 13px;
color: #333;
cursor: default;
border: 1px solid #aaaaaa;
border-radius: 3px;
-webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
background-clip: padding-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #e4e4e4;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
}
html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
{
margin: 3px 5px 3px 0;
padding: 3px 18px 3px 5px;
}
.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
cursor: default;
}
.select2-container-multi .select2-choices .select2-search-choice-focus {
background: #d4d4d4;
}
.select2-search-choice-close {
display: block;
width: 12px;
height: 13px;
position: absolute;
right: 3px;
top: 4px;
font-size: 1px;
outline: none;
background: url('select2.png') right top no-repeat;
}
html[dir="rtl"] .select2-search-choice-close {
right: auto;
left: 3px;
}
.select2-container-multi .select2-search-choice-close {
left: 3px;
}
html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
left: auto;
right: 2px;
}
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
background-position: right -11px;
}
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
background-position: right -11px;
}
/* disabled styles */
.select2-container-multi.select2-container-disabled .select2-choices {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
padding: 3px 5px 3px 5px;
border: 1px solid #ddd;
background-image: none;
background-color: #f4f4f4;
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
background: none;
}
/* end multiselect */
.select2-result-selectable .select2-match,
.select2-result-unselectable .select2-match {
text-decoration: underline;
}
.select2-offscreen, .select2-offscreen:focus {
clip: rect(0 0 0 0) !important;
width: 1px !important;
height: 1px !important;
border: 0 !important;
margin: 0 !important;
padding: 0 !important;
overflow: hidden !important;
position: absolute !important;
outline: 0 !important;
left: 0px !important;
top: 0px !important;
}
.select2-display-none {
display: none;
}
.select2-measure-scrollbar {
position: absolute;
top: -10000px;
left: -10000px;
width: 100px;
height: 100px;
overflow: scroll;
}
/* Retina-ize icons */
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
.select2-search input,
.select2-search-choice-close,
.select2-container .select2-choice abbr,
.select2-container .select2-choice .select2-arrow b {
background-image: url('select2x2.png') !important;
background-repeat: no-repeat !important;
background-size: 60px 40px !important;
}
.select2-search input {
background-position: 100% -21px !important;
}
}

23
public/vendor/select2/select2.min.js vendored Executable file

File diff suppressed because one or more lines are too long

BIN
public/vendor/select2/select2.png vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

BIN
public/vendor/select2/select2x2.png vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

2
public/vendor/store.min.js vendored Normal file
View file

@ -0,0 +1,2 @@
/* Copyright (c) 2010-2013 Marcus Westin */
"use strict";(function(e,t){typeof define=="function"&&define.amd?define([],t):typeof exports=="object"?module.exports=t():e.store=t()})(this,function(){function o(){try{return r in t&&t[r]}catch(e){return!1}}var e={},t=window,n=t.document,r="localStorage",i="script",s;e.disabled=!1,e.version="1.3.17",e.set=function(e,t){},e.get=function(e,t){},e.has=function(t){return e.get(t)!==undefined},e.remove=function(e){},e.clear=function(){},e.transact=function(t,n,r){r==null&&(r=n,n=null),n==null&&(n={});var i=e.get(t,n);r(i),e.set(t,i)},e.getAll=function(){},e.forEach=function(){},e.serialize=function(e){return JSON.stringify(e)},e.deserialize=function(e){if(typeof e!="string")return undefined;try{return JSON.parse(e)}catch(t){return e||undefined}};if(o())s=t[r],e.set=function(t,n){return n===undefined?e.remove(t):(s.setItem(t,e.serialize(n)),n)},e.get=function(t,n){var r=e.deserialize(s.getItem(t));return r===undefined?n:r},e.remove=function(e){s.removeItem(e)},e.clear=function(){s.clear()},e.getAll=function(){var t={};return e.forEach(function(e,n){t[e]=n}),t},e.forEach=function(t){for(var n=0;n<s.length;n++){var r=s.key(n);t(r,e.get(r))}};else if(n.documentElement.addBehavior){var u,a;try{a=new ActiveXObject("htmlfile"),a.open(),a.write("<"+i+">document.w=window</"+i+'><iframe src="/favicon.ico"></iframe>'),a.close(),u=a.w.frames[0].document,s=u.createElement("div")}catch(f){s=n.createElement("div"),u=n.body}var l=function(t){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(s),u.appendChild(s),s.addBehavior("#default#userData"),s.load(r);var i=t.apply(e,n);return u.removeChild(s),i}},c=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g"),h=function(e){return e.replace(/^d/,"___$&").replace(c,"___")};e.set=l(function(t,n,i){return n=h(n),i===undefined?e.remove(n):(t.setAttribute(n,e.serialize(i)),t.save(r),i)}),e.get=l(function(t,n,r){n=h(n);var i=e.deserialize(t.getAttribute(n));return i===undefined?r:i}),e.remove=l(function(e,t){t=h(t),e.removeAttribute(t),e.save(r)}),e.clear=l(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(r);while(t.length)e.removeAttribute(t[0].name);e.save(r)}),e.getAll=function(t){var n={};return e.forEach(function(e,t){n[e]=t}),n},e.forEach=l(function(t,n){var r=t.XMLDocument.documentElement.attributes;for(var i=0,s;s=r[i];++i)n(s.name,e.deserialize(t.getAttribute(s.name)))})}try{var p="__storejs__";e.set(p,p),e.get(p)!=p&&(e.disabled=!0),e.remove(p)}catch(f){e.disabled=!0}return e.enabled=!e.disabled,e})

1
public/vendor/url.min.js vendored Executable file
View file

@ -0,0 +1 @@
/*! url - v1.8.6 - 2013-11-22 */window.url=function(){function a(a){return!isNaN(parseFloat(a))&&isFinite(a)}return function(b,c){var d=c||window.location.toString();if(!b)return d;b=b.toString(),"//"===d.substring(0,2)?d="http:"+d:1===d.split("://").length&&(d="http://"+d),c=d.split("/");var e={auth:""},f=c[2].split("@");1===f.length?f=f[0].split(":"):(e.auth=f[0],f=f[1].split(":")),e.protocol=c[0],e.hostname=f[0],e.port=f[1]||("https"===e.protocol.split(":")[0].toLowerCase()?"443":"80"),e.pathname=(c.length>3?"/":"")+c.slice(3,c.length).join("/").split("?")[0].split("#")[0];var g=e.pathname;"/"===g.charAt(g.length-1)&&(g=g.substring(0,g.length-1));var h=e.hostname,i=h.split("."),j=g.split("/");if("hostname"===b)return h;if("domain"===b)return/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(h)?h:i.slice(-2).join(".");if("sub"===b)return i.slice(0,i.length-2).join(".");if("port"===b)return e.port;if("protocol"===b)return e.protocol.split(":")[0];if("auth"===b)return e.auth;if("user"===b)return e.auth.split(":")[0];if("pass"===b)return e.auth.split(":")[1]||"";if("path"===b)return e.pathname;if("."===b.charAt(0)){if(b=b.substring(1),a(b))return b=parseInt(b,10),i[0>b?i.length+b:b-1]||""}else{if(a(b))return b=parseInt(b,10),j[0>b?j.length+b:b]||"";if("file"===b)return j.slice(-1)[0];if("filename"===b)return j.slice(-1)[0].split(".")[0];if("fileext"===b)return j.slice(-1)[0].split(".")[1]||"";if("?"===b.charAt(0)||"#"===b.charAt(0)){var k=d,l=null;if("?"===b.charAt(0)?k=(k.split("?")[1]||"").split("#")[0]:"#"===b.charAt(0)&&(k=k.split("#")[1]||""),!b.charAt(1))return k;b=b.substring(1),k=k.split("&");for(var m=0,n=k.length;n>m;m++)if(l=k[m].split("="),l[0]===b)return l[1]||"";return null}}return""}}(),"undefined"!=typeof jQuery&&jQuery.extend({url:function(a,b){return window.url(a,b)}});

View file

@ -1,30 +1,35 @@
<!--<script src="/js/ga.js"></script>--> <script src="/vendor/spin.min.js" defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/spin.js/2.0.1/spin.min.js"></script> <script src="/vendor/jquery-1.11.2.min.js" defer></script>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script> <script src="/vendor/bootstrap/js/bootstrap.min.js" defer></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<!--codemirror--> <!--codemirror-->
<script src="/vendor/codemirror/codemirror.min.js"></script> <script src="/vendor/codemirror/codemirror.min.js" defer></script>
<script src="/vendor/inlineAttachment/inline-attachment.js" defer></script>
<script src="/vendor/inlineAttachment/codemirror.inline-attachment.js" defer></script>
<!--others--> <!--others-->
<script src="/vendor/socket.io-1.3.5.js"></script> <script src="/vendor/socket.io-1.3.5.js" defer></script>
<script src="/vendor/remarkable.min.js"></script> <script src="/vendor/remarkable.min.js" defer></script>
<script src="/vendor/remarkable-regex.js"></script> <script src="/vendor/remarkable-regex.js" defer></script>
<script src="/vendor/gist-embed.js"></script> <script src="/vendor/gist-embed.js" defer></script>
<script src="/vendor/lz-string.min.js"></script> <script src="/vendor/lz-string.min.js" defer></script>
<script src="/vendor/highlight-js/highlight.min.js"></script> <script src="/vendor/highlight-js/highlight.min.js" defer></script>
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script> <script src="/vendor/js.cookie.js" defer></script>
<script src="/vendor/moment-with-locales.js"></script> <script src="/vendor/moment-with-locales.js" defer></script>
<script src="/vendor/emojify/js/emojify.js"></script> <script src="/vendor/emojify/js/emojify.js" defer></script>
<script src="/vendor/to-markdown.js"></script> <script src="/vendor/to-markdown.js" defer></script>
<script src="/vendor/raphael-min.js"></script> <script src="/vendor/raphael-min.js" defer></script>
<script src="/vendor/underscore-min.js"></script> <script src="/vendor/underscore-min.js" defer></script>
<script src="/vendor/sequence-diagrams/sequence-diagram-min.js"></script> <script src="/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
<script src="/vendor/flowchart/flowchart-1.4.0.min.js"></script> <script src="/vendor/flowchart/flowchart-1.4.0.min.js" defer></script>
<script src="/vendor/FileSaver.min.js"></script> <script src="/vendor/FileSaver.min.js" defer></script>
<script src="/vendor/store.min.js" defer></script>
<script src="/vendor/url.min.js" defer></script>
<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="rdoizrlnkuha23r" async defer></script> <script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id="dropboxjs" data-app-key="rdoizrlnkuha23r" async defer></script>
<script type="text/x-mathjax-config"> <script type="text/x-mathjax-config">
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }}); MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
</script> </script>
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="/js/extra.js"></script> <script src="/js/common.js" defer></script>
<script src="/js/history.js"></script> <script src="/js/extra.js" defer></script>
<script src="/js/index.js"></script> <script src="/js/history.js" defer></script>
<script src="/js/index.js" defer></script>
<script src="/js/syncscroll.js" defer></script>

View file

@ -6,25 +6,19 @@
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<meta name="description" content="Realtime collaborative markdown notes on all platforms."> <meta name="description" content="Realtime collaborative markdown notes on all platforms.">
<meta name="author" content="jackycute"> <meta name="author" content="jackycute">
<!-- Open Graph data -->
<meta property="og:title" content="HackMD - Collaborative notes">
<meta property="og:type" content="website">
<meta property="og:url" content="https://hackmd.herokuapp.com/">
<meta property="og:description" content="Realtime collaborative markdown notes on all platforms.">
<meta property="og:site_name" content="HackMD">
<meta property="fb:admins" content="1463801565">
<title>HackMD - Collaborative notes</title> <title>HackMD - Collaborative notes</title>
<link rel="icon" type="image/png" href="/favicon.png"> <link rel="icon" type="image/png" href="/favicon.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png"> <link rel="apple-touch-icon" href="/apple-touch-icon.png">
<!--<link rel="stylesheet" href="/vendor/bootstrap-3.3.1/css/bootstrap.min.css">--> <link rel="stylesheet" href="/vendor/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> <link rel="stylesheet" href="/vendor/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link rel="stylesheet" href="/vendor/codemirror/lib/codemirror.css"> <link rel="stylesheet" href="/vendor/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="/vendor/codemirror/addon/fold/foldgutter.css"> <link rel="stylesheet" href="/vendor/codemirror/addon/fold/foldgutter.css">
<link rel="stylesheet" href="/vendor/codemirror/addon/dialog/dialog.css">
<link rel="stylesheet" href="/vendor/codemirror/addon/scroll/simplescrollbars.css">
<link rel="stylesheet" href="/vendor/codemirror/addon/search/matchesonscrollbar.css">
<link rel="stylesheet" href="/vendor/codemirror/theme/monokai.css"> <link rel="stylesheet" href="/vendor/codemirror/theme/monokai.css">
<link rel="stylesheet" href="/css/github-extract.css"> <link rel="stylesheet" href="/css/github-extract.css">
<link rel="stylesheet" href="/css/gist.css"> <link rel="stylesheet" href="/css/gist.css">
<!--<link rel="stylesheet" href="/css/github-code-cdn.css">-->
<link rel="stylesheet" href="/vendor/highlight-js/github.min.css"> <link rel="stylesheet" href="/vendor/highlight-js/github.min.css">
<link rel="stylesheet" href="/vendor/emojify/css/emojify.min.css" /> <link rel="stylesheet" href="/vendor/emojify/css/emojify.min.css" />
<link rel="stylesheet" href="/css/markdown.css"> <link rel="stylesheet" href="/css/markdown.css">

View file

@ -19,7 +19,7 @@
<ul class="dropdown-menu" role="menu" aria-labelledby="menu"> <ul class="dropdown-menu" role="menu" aria-labelledby="menu">
<li role="presentation"><a role="menuitem" class="ui-new" tabindex="-1" href="./new" target="_blank"><i class="fa fa-plus fa-fw"></i> New</a> <li role="presentation"><a role="menuitem" class="ui-new" tabindex="-1" href="./new" target="_blank"><i class="fa fa-plus fa-fw"></i> New</a>
</li> </li>
<li role="presentation"><a role="menuitem" class="ui-pretty" tabindex="-1" href="#" target="_blank"><i class="fa fa-print fa-fw"></i> Pretty</a> <li role="presentation"><a role="menuitem" class="ui-pretty" tabindex="-1" href="#" target="_blank"><i class="fa fa-share-alt fa-fw"></i> Share</a>
</li> </li>
<li class="divider"></li> <li class="divider"></li>
<li class="dropdown-header">Save</li> <li class="dropdown-header">Save</li>
@ -75,7 +75,7 @@
<i class="fa fa-plus"></i> New <i class="fa fa-plus"></i> New
</a> </a>
<a href="#" target="_blank" class="btn btn-link ui-pretty"> <a href="#" target="_blank" class="btn btn-link ui-pretty">
<i class="fa fa-print"></i> Pretty <i class="fa fa-share-alt"></i> Share
</a> </a>
<span> <span>
<a class="btn btn-link" data-target="#" data-toggle="dropdown"> <a class="btn btn-link" data-target="#" data-toggle="dropdown">

View file

@ -27,32 +27,23 @@
</body> </body>
</html> </html>
<!--<script src="<%- url %>/js/ga.js"></script>--> <!--<script src="<%- url %>/js/ga.js" async defer></script>-->
<script src="<%- url %>/vendor/jquery-1.11.2.min.js"></script> <!--<script src="<%- url %>/js/newrelic.js" async defer></script>-->
<script src="<%- url %>/vendor/lz-string.min.js"></script> <script src="<%- url %>/vendor/jquery-1.11.2.min.js" defer></script>
<script src="<%- url %>/vendor/remarkable.min.js"></script> <script src="<%- url %>/vendor/lz-string.min.js" defer></script>
<script src="<%- url %>/vendor/remarkable-regex.js"></script> <script src="<%- url %>/vendor/remarkable.min.js" defer></script>
<script src="<%- url %>/vendor/gist-embed.js"></script> <script src="<%- url %>/vendor/remarkable-regex.js" defer></script>
<script src="<%- url %>/vendor/string.min.js"></script> <script src="<%- url %>/vendor/gist-embed.js" defer></script>
<script src="<%- url %>/vendor/highlight-js/highlight.min.js"></script> <script src="<%- url %>/vendor/string.min.js" defer></script>
<script src="<%- url %>/vendor/emojify/js/emojify.min.js"></script> <script src="<%- url %>/vendor/highlight-js/highlight.min.js" defer></script>
<script src="<%- url %>/vendor/raphael-min.js"></script> <script src="<%- url %>/vendor/emojify/js/emojify.min.js" defer></script>
<script src="<%- url %>/vendor/underscore-min.js"></script> <script src="<%- url %>/vendor/raphael-min.js" defer></script>
<script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js"></script> <script src="<%- url %>/vendor/underscore-min.js" defer></script>
<script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js"></script> <script src="<%- url %>/vendor/sequence-diagrams/sequence-diagram-min.js" defer></script>
<script src="<%- url %>/vendor/flowchart/flowchart-1.4.0.min.js" defer></script>
<script type="text/x-mathjax-config"> <script type="text/x-mathjax-config">
MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }}); MathJax.Hub.Config({ messageStyle: "none", skipStartupTypeset: true ,tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }});
</script> </script>
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script type="text/javascript" src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" defer></script>
<script src="<%- url %>/js/extra.js"></script> <script src="<%- url %>/js/extra.js" defer></script>
<script> <script src="<%- url %>/js/pretty.js" defer></script>
var raw = $(".markdown-body").text();
var markdown = LZString.decompressFromBase64(raw);
var result = postProcess(md.render(markdown));
var markdown = $(".markdown-body");
markdown.html(result);
markdown.show();
finishView(markdown);
autoLinkify(markdown);
scrollToHash();
</script>

7
run.sh Normal file
View file

@ -0,0 +1,7 @@
forever stop hackmd
DATABASE_URL='change this' \
MONGOLAB_URI='change this' \
PORT='80' \
SSLPORT='443' \
DOMAIN='change this' \
forever -a --uid hackmd start app.js