First commit, version 0.2.7
This commit is contained in:
parent
61eb11d23c
commit
4b0ca55eb7
1379 changed files with 173000 additions and 0 deletions
1
Procfile
Normal file
1
Procfile
Normal file
|
@ -0,0 +1 @@
|
||||||
|
web: node app.js
|
9
README.md
Normal file
9
README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
HackMD 0.2.7
|
||||||
|
===
|
||||||
|
|
||||||
|
This is a realtime collaborative markdown notes on all platforms.
|
||||||
|
But still in early stage, feel free to fork or contribute to it.
|
||||||
|
|
||||||
|
Thanks for your using.
|
||||||
|
|
||||||
|
License under MIT.
|
253
app.js
Normal file
253
app.js
Normal file
|
@ -0,0 +1,253 @@
|
||||||
|
//app
|
||||||
|
//external modules
|
||||||
|
var connect = require('connect');
|
||||||
|
var express = require('express');
|
||||||
|
var toobusy = require('toobusy-js');
|
||||||
|
var ejs = require('ejs');
|
||||||
|
var passport = require('passport');
|
||||||
|
var methodOverride = require('method-override');
|
||||||
|
var bodyParser = require('body-parser');
|
||||||
|
var mongoose = require('mongoose');
|
||||||
|
var compression = require('compression')
|
||||||
|
var session = require('express-session');
|
||||||
|
var MongoStore = require('connect-mongo')(session);
|
||||||
|
|
||||||
|
//core
|
||||||
|
var config = require("./config.js");
|
||||||
|
var User = require("./lib/user.js");
|
||||||
|
var auth = require("./lib/auth.js");
|
||||||
|
var response = require("./lib/response.js");
|
||||||
|
|
||||||
|
//server setup
|
||||||
|
var app = express();
|
||||||
|
var server = require('http').createServer(app);
|
||||||
|
var io = require('socket.io').listen(server);
|
||||||
|
var port = process.env.PORT || config.testport;
|
||||||
|
|
||||||
|
// connect to the mongodb
|
||||||
|
if (config.debug)
|
||||||
|
mongoose.connect(config.mongodbstring);
|
||||||
|
else
|
||||||
|
mongoose.connect(process.env.MONGOLAB_URI);
|
||||||
|
|
||||||
|
//others
|
||||||
|
var db = require("./lib/db.js");
|
||||||
|
var realtime = require("./lib/realtime.js");
|
||||||
|
|
||||||
|
//methodOverride
|
||||||
|
app.use(methodOverride('_method'));
|
||||||
|
|
||||||
|
// create application/json parser
|
||||||
|
var jsonParser = bodyParser.json();
|
||||||
|
|
||||||
|
// create application/x-www-form-urlencoded parser
|
||||||
|
var urlencodedParser = bodyParser.urlencoded({
|
||||||
|
extended: false
|
||||||
|
});
|
||||||
|
|
||||||
|
//compression
|
||||||
|
app.use(compression());
|
||||||
|
|
||||||
|
//session
|
||||||
|
app.use(session({
|
||||||
|
name: config.sessionname,
|
||||||
|
secret: config.sessionsecret,
|
||||||
|
resave: false, //don't save session if unmodified
|
||||||
|
saveUninitialized: true, //don't create session until something stored
|
||||||
|
cookie: {
|
||||||
|
maxAge: new Date(Date.now() + config.sessionlife),
|
||||||
|
expires: new Date(Date.now() + config.sessionlife),
|
||||||
|
},
|
||||||
|
maxAge: new Date(Date.now() + config.sessionlife),
|
||||||
|
store: new MongoStore({
|
||||||
|
mongooseConnection: mongoose.connection,
|
||||||
|
touchAfter: config.sessiontouch
|
||||||
|
},
|
||||||
|
function (err) {
|
||||||
|
console.log(err);
|
||||||
|
})
|
||||||
|
}));
|
||||||
|
|
||||||
|
//middleware which blocks requests when we're too busy
|
||||||
|
app.use(function (req, res, next) {
|
||||||
|
if (toobusy()) {
|
||||||
|
response.errorServiceUnavailable(res);
|
||||||
|
} else {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//passport
|
||||||
|
app.use(passport.initialize());
|
||||||
|
app.use(passport.session());
|
||||||
|
|
||||||
|
//serialize and deserialize
|
||||||
|
passport.serializeUser(function (user, done) {
|
||||||
|
//console.log('serializeUser: ' + user._id);
|
||||||
|
done(null, user._id);
|
||||||
|
});
|
||||||
|
passport.deserializeUser(function (id, done) {
|
||||||
|
User.model.findById(id, function (err, user) {
|
||||||
|
//console.log(user)
|
||||||
|
if (!err) done(null, user);
|
||||||
|
else done(err, null);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
//routes
|
||||||
|
//static files
|
||||||
|
app.use('/', express.static(__dirname + '/public'));
|
||||||
|
//template files
|
||||||
|
app.set('views', __dirname + '/public');
|
||||||
|
//set render engine
|
||||||
|
app.engine('html', ejs.renderFile);
|
||||||
|
//get index
|
||||||
|
app.get("/", function (req, res, next) {
|
||||||
|
res.render("index.html");
|
||||||
|
});
|
||||||
|
//get status
|
||||||
|
app.get("/status", function (req, res, next) {
|
||||||
|
realtime.getStatus(function (data) {
|
||||||
|
res.end(JSON.stringify(data));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
//facebook auth
|
||||||
|
app.get('/auth/facebook',
|
||||||
|
passport.authenticate('facebook'),
|
||||||
|
function (req, res) {});
|
||||||
|
//facebook auth callback
|
||||||
|
app.get('/auth/facebook/callback',
|
||||||
|
passport.authenticate('facebook', {
|
||||||
|
failureRedirect: '/'
|
||||||
|
}),
|
||||||
|
function (req, res) {
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
|
//twitter auth
|
||||||
|
app.get('/auth/twitter',
|
||||||
|
passport.authenticate('twitter'),
|
||||||
|
function (req, res) {});
|
||||||
|
//twitter auth callback
|
||||||
|
app.get('/auth/twitter/callback',
|
||||||
|
passport.authenticate('twitter', {
|
||||||
|
failureRedirect: '/'
|
||||||
|
}),
|
||||||
|
function (req, res) {
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
|
//github auth
|
||||||
|
app.get('/auth/github',
|
||||||
|
passport.authenticate('github'),
|
||||||
|
function (req, res) {});
|
||||||
|
//github auth callback
|
||||||
|
app.get('/auth/github/callback',
|
||||||
|
passport.authenticate('github', {
|
||||||
|
failureRedirect: '/'
|
||||||
|
}),
|
||||||
|
function (req, res) {
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
|
//dropbox auth
|
||||||
|
app.get('/auth/dropbox',
|
||||||
|
passport.authenticate('dropbox-oauth2'),
|
||||||
|
function (req, res) {});
|
||||||
|
//dropbox auth callback
|
||||||
|
app.get('/auth/dropbox/callback',
|
||||||
|
passport.authenticate('dropbox-oauth2', {
|
||||||
|
failureRedirect: '/'
|
||||||
|
}),
|
||||||
|
function (req, res) {
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
|
//logout
|
||||||
|
app.get('/logout', function (req, res) {
|
||||||
|
if (config.debug && req.session.passport.user)
|
||||||
|
console.log('user logout: ' + req.session.passport.user);
|
||||||
|
req.logout();
|
||||||
|
res.redirect('/');
|
||||||
|
});
|
||||||
|
//get history
|
||||||
|
app.get('/history', function (req, res) {
|
||||||
|
if (req.isAuthenticated()) {
|
||||||
|
User.model.findById(req.session.passport.user, function (err, user) {
|
||||||
|
if (err) {
|
||||||
|
console.log('read history failed: ' + err);
|
||||||
|
} else {
|
||||||
|
var history = [];
|
||||||
|
if (user.history)
|
||||||
|
history = JSON.parse(user.history);
|
||||||
|
res.send({
|
||||||
|
history: history
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
response.errorForbidden(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//post history
|
||||||
|
app.post('/history', urlencodedParser, function (req, res) {
|
||||||
|
if (req.isAuthenticated()) {
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER received history from [' + req.session.passport.user + ']: ' + req.body.history);
|
||||||
|
User.model.findById(req.session.passport.user, function (err, user) {
|
||||||
|
if (err) {
|
||||||
|
console.log('write history failed: ' + err);
|
||||||
|
} else {
|
||||||
|
user.history = req.body.history;
|
||||||
|
user.save(function (err) {
|
||||||
|
if (err) {
|
||||||
|
console.log('write user history failed: ' + err);
|
||||||
|
} else {
|
||||||
|
if (config.debug)
|
||||||
|
console.log("write user history success: " + user._id);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
res.end();
|
||||||
|
} else {
|
||||||
|
response.errorForbidden(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//get me info
|
||||||
|
app.get('/me', function (req, res) {
|
||||||
|
if (req.isAuthenticated()) {
|
||||||
|
User.model.findById(req.session.passport.user, function (err, user) {
|
||||||
|
if (err) {
|
||||||
|
console.log('read me failed: ' + err);
|
||||||
|
} else {
|
||||||
|
var profile = JSON.parse(user.profile);
|
||||||
|
res.send({
|
||||||
|
status: 'ok',
|
||||||
|
name: profile.displayName || profile.username
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.send({
|
||||||
|
status: 'forbidden'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//get new note
|
||||||
|
app.get("/new", response.newNote);
|
||||||
|
//get features
|
||||||
|
app.get("/features", response.showFeatures);
|
||||||
|
//get note by id
|
||||||
|
app.get("/:noteId", response.showNote);
|
||||||
|
//note actions
|
||||||
|
app.get("/:noteId/:action", response.noteActions);
|
||||||
|
|
||||||
|
//socket.io secure
|
||||||
|
io.use(realtime.secure);
|
||||||
|
//socket.io heartbeat
|
||||||
|
io.set('heartbeat interval', config.heartbeatinterval);
|
||||||
|
io.set('heartbeat timeout', config.heartbeattimeout);
|
||||||
|
//socket.io connection
|
||||||
|
io.sockets.on('connection', realtime.connection);
|
||||||
|
|
||||||
|
//listen
|
||||||
|
server.listen(port, function () {
|
||||||
|
console.log('Server listening at port %d', port);
|
||||||
|
});
|
50
config.js
Normal file
50
config.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
//config
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
debug: true,
|
||||||
|
version: '0.2.7',
|
||||||
|
domain: 'http://localhost:3000',
|
||||||
|
testport: '3000',
|
||||||
|
//path
|
||||||
|
tmppath: "./tmp/",
|
||||||
|
defaultnotepath: path.join(__dirname, '/public', "default.md"),
|
||||||
|
defaultfeaturespath: path.join(__dirname, '/public', "features.md"),
|
||||||
|
hackmdpath: path.join(__dirname, '/public/views', "index.ejs"),
|
||||||
|
errorpath: path.join(__dirname, '/public/views', "error.ejs"),
|
||||||
|
prettypath: path.join(__dirname, '/public/views', 'pretty.ejs'),
|
||||||
|
//db string
|
||||||
|
postgresqlstring: "postgresql://localhost:5432/hackmd",
|
||||||
|
mongodbstring: "mongodb://localhost/hackmd",
|
||||||
|
//constants
|
||||||
|
featuresnotename: "features",
|
||||||
|
sessionname: 'please set this',
|
||||||
|
sessionsecret: 'please set this',
|
||||||
|
sessionlife: 14 * 24 * 60 * 60 * 1000, //14 days
|
||||||
|
sessiontouch: 1 * 3600, //1 hour
|
||||||
|
heartbeatinterval: 5000,
|
||||||
|
heartbeattimeout: 10000,
|
||||||
|
//auth
|
||||||
|
facebook: {
|
||||||
|
clientID: 'get yourself one',
|
||||||
|
clientSecret: 'get yourself one',
|
||||||
|
callbackPath: '/auth/facebook/callback'
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
consumerKey: 'get yourself one',
|
||||||
|
consumerSecret: 'get yourself one',
|
||||||
|
callbackPath: '/auth/twitter/callback'
|
||||||
|
},
|
||||||
|
github: {
|
||||||
|
clientID: 'get yourself one',
|
||||||
|
clientSecret: 'get yourself one',
|
||||||
|
callbackPath: '/auth/github/callback'
|
||||||
|
},
|
||||||
|
dropbox: {
|
||||||
|
clientID: 'get yourself one',
|
||||||
|
clientSecret: 'get yourself one',
|
||||||
|
callbackPath: '/auth/dropbox/callback'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
49
lib/auth.js
Normal file
49
lib/auth.js
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
//auth
|
||||||
|
//external modules
|
||||||
|
var passport = require('passport');
|
||||||
|
var FacebookStrategy = require('passport-facebook').Strategy;
|
||||||
|
var TwitterStrategy = require('passport-twitter').Strategy;
|
||||||
|
var GithubStrategy = require('passport-github').Strategy;
|
||||||
|
var DropboxStrategy = require('passport-dropbox-oauth2').Strategy;
|
||||||
|
|
||||||
|
//core
|
||||||
|
var User = require('./user.js')
|
||||||
|
var config = require('../config.js')
|
||||||
|
|
||||||
|
function callback(accessToken, refreshToken, profile, done) {
|
||||||
|
//console.log(profile.displayName || profile.username);
|
||||||
|
User.findOrNewUser(profile.id, profile, function (err, user) {
|
||||||
|
if (err || user == null) {
|
||||||
|
console.log('auth callback failed: ' + err);
|
||||||
|
} else {
|
||||||
|
if(config.debug && user)
|
||||||
|
console.log('user login: ' + user._id);
|
||||||
|
done(null, user);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//facebook
|
||||||
|
module.exports = passport.use(new FacebookStrategy({
|
||||||
|
clientID: config.facebook.clientID,
|
||||||
|
clientSecret: config.facebook.clientSecret,
|
||||||
|
callbackURL: config.domain + config.facebook.callbackPath
|
||||||
|
}, callback));
|
||||||
|
//twitter
|
||||||
|
passport.use(new TwitterStrategy({
|
||||||
|
consumerKey: config.twitter.consumerKey,
|
||||||
|
consumerSecret: config.twitter.consumerSecret,
|
||||||
|
callbackURL: config.domain + config.twitter.callbackPath
|
||||||
|
}, callback));
|
||||||
|
//github
|
||||||
|
passport.use(new GithubStrategy({
|
||||||
|
clientID: config.github.clientID,
|
||||||
|
clientSecret: config.github.clientSecret,
|
||||||
|
callbackURL: config.domain + config.github.callbackPath
|
||||||
|
}, callback));
|
||||||
|
//dropbox
|
||||||
|
passport.use(new DropboxStrategy({
|
||||||
|
clientID: config.dropbox.clientID,
|
||||||
|
clientSecret: config.dropbox.clientSecret,
|
||||||
|
callbackURL: config.domain + config.dropbox.callbackPath
|
||||||
|
}, callback));
|
146
lib/db.js
Normal file
146
lib/db.js
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
//db
|
||||||
|
//external modules
|
||||||
|
var pg = require('pg');
|
||||||
|
var fs = require('fs');
|
||||||
|
var util = require('util');
|
||||||
|
|
||||||
|
//core
|
||||||
|
var config = require("../config.js");
|
||||||
|
|
||||||
|
//public
|
||||||
|
var db = {
|
||||||
|
readFromFile: readFromDB,
|
||||||
|
saveToFile: saveToFile,
|
||||||
|
newToDB: newToDB,
|
||||||
|
readFromDB: readFromDB,
|
||||||
|
saveToDB: saveToDB,
|
||||||
|
countFromDB: countFromDB
|
||||||
|
};
|
||||||
|
|
||||||
|
function getDBClient() {
|
||||||
|
if (config.debug)
|
||||||
|
return new pg.Client(config.postgresqlstring);
|
||||||
|
else
|
||||||
|
return new pg.Client(process.env.DATABASE_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
function readFromFile(callback) {
|
||||||
|
fs.readFile('hackmd', 'utf8', function (err, data) {
|
||||||
|
if (err) throw err;
|
||||||
|
callback(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveToFile(doc) {
|
||||||
|
fs.writeFile('hackmd', doc, function (err) {
|
||||||
|
if (err) throw err;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var updatequery = "UPDATE notes SET title='%s', content='%s', update_time=NOW() WHERE id='%s';";
|
||||||
|
var insertquery = "INSERT INTO notes (id, owner, content) VALUES ('%s', '%s', '%s');";
|
||||||
|
var insertifnotexistquery = "INSERT INTO notes (id, owner, content) \
|
||||||
|
SELECT '%s', '%s', '%s' \
|
||||||
|
WHERE NOT EXISTS (SELECT 1 FROM notes WHERE id='%s') RETURNING *;";
|
||||||
|
var selectquery = "SELECT * FROM notes WHERE id='%s';";
|
||||||
|
var countquery = "SELECT count(*) FROM notes;";
|
||||||
|
|
||||||
|
function newToDB(id, owner, body, callback) {
|
||||||
|
var client = getDBClient();
|
||||||
|
client.connect(function (err) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error('could not connect to postgres', err);
|
||||||
|
}
|
||||||
|
var newnotequery = util.format(insertquery, id, owner, body);
|
||||||
|
//console.log(newnotequery);
|
||||||
|
client.query(newnotequery, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error("new note to db failed: " + err);
|
||||||
|
} else {
|
||||||
|
if (config.debug)
|
||||||
|
console.log("new note to db success");
|
||||||
|
callback(null, result);
|
||||||
|
client.end();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function readFromDB(id, callback) {
|
||||||
|
var client = getDBClient();
|
||||||
|
client.connect(function (err) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error('could not connect to postgres', err);
|
||||||
|
}
|
||||||
|
var readquery = util.format(selectquery, id);
|
||||||
|
//console.log(readquery);
|
||||||
|
client.query(readquery, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error("read from db failed: " + err);
|
||||||
|
} else {
|
||||||
|
//console.log(result.rows);
|
||||||
|
if (result.rows.length <= 0) {
|
||||||
|
callback("not found note in db", null);
|
||||||
|
} else {
|
||||||
|
console.log("read from db success");
|
||||||
|
callback(null, result);
|
||||||
|
client.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveToDB(id, title, data, callback) {
|
||||||
|
var client = getDBClient();
|
||||||
|
client.connect(function (err) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error('could not connect to postgres', err);
|
||||||
|
}
|
||||||
|
var savequery = util.format(updatequery, title, data, id);
|
||||||
|
//console.log(savequery);
|
||||||
|
client.query(savequery, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error("save to db failed: " + err);
|
||||||
|
} else {
|
||||||
|
if (config.debug)
|
||||||
|
console.log("save to db success");
|
||||||
|
callback(null, result);
|
||||||
|
client.end();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function countFromDB(callback) {
|
||||||
|
var client = getDBClient();
|
||||||
|
client.connect(function (err) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error('could not connect to postgres', err);
|
||||||
|
}
|
||||||
|
client.query(countquery, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
callback(err, null);
|
||||||
|
return console.error("count from db failed: " + err);
|
||||||
|
} else {
|
||||||
|
//console.log(result.rows);
|
||||||
|
if (result.rows.length <= 0) {
|
||||||
|
callback("not found note in db", null);
|
||||||
|
} else {
|
||||||
|
console.log("count from db success");
|
||||||
|
callback(null, result);
|
||||||
|
client.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = db;
|
60
lib/note.js
Normal file
60
lib/note.js
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
//note
|
||||||
|
//external modules
|
||||||
|
var LZString = require('lz-string');
|
||||||
|
var marked = require('marked');
|
||||||
|
var cheerio = require('cheerio');
|
||||||
|
|
||||||
|
//others
|
||||||
|
var db = require("./db.js");
|
||||||
|
|
||||||
|
//public
|
||||||
|
var note = {
|
||||||
|
checkNoteIdValid: checkNoteIdValid,
|
||||||
|
checkNoteExist: checkNoteExist,
|
||||||
|
getNoteTitle: getNoteTitle
|
||||||
|
};
|
||||||
|
|
||||||
|
function checkNoteIdValid(noteId) {
|
||||||
|
try {
|
||||||
|
//console.log(noteId);
|
||||||
|
var id = LZString.decompressFromBase64(noteId);
|
||||||
|
if (!id) return false;
|
||||||
|
var uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
||||||
|
var result = id.match(uuidRegex);
|
||||||
|
if (result && result.length == 1)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkNoteExist(noteId) {
|
||||||
|
try {
|
||||||
|
//console.log(noteId);
|
||||||
|
var id = LZString.decompressFromBase64(noteId);
|
||||||
|
db.readFromDB(id, function (err, result) {
|
||||||
|
if (err) return false;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//get title
|
||||||
|
function getNoteTitle(body) {
|
||||||
|
var $ = cheerio.load(marked(body));
|
||||||
|
var h1s = $("h1");
|
||||||
|
var title = "";
|
||||||
|
if (h1s.length > 0)
|
||||||
|
title = h1s.first().text();
|
||||||
|
else
|
||||||
|
title = "Untitled";
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = note;
|
392
lib/realtime.js
Normal file
392
lib/realtime.js
Normal file
|
@ -0,0 +1,392 @@
|
||||||
|
//realtime
|
||||||
|
//external modules
|
||||||
|
var cookie = require('cookie');
|
||||||
|
var cookieParser = require('cookie-parser');
|
||||||
|
var url = require('url');
|
||||||
|
var async = require('async');
|
||||||
|
var LZString = require('lz-string');
|
||||||
|
var shortId = require('shortid');
|
||||||
|
var randomcolor = require("randomcolor");
|
||||||
|
|
||||||
|
//core
|
||||||
|
var config = require("../config.js");
|
||||||
|
|
||||||
|
//others
|
||||||
|
var db = require("./db.js");
|
||||||
|
var Note = require("./note.js");
|
||||||
|
var User = require("./user.js");
|
||||||
|
|
||||||
|
//public
|
||||||
|
var realtime = {
|
||||||
|
secure: secure,
|
||||||
|
connection: connection,
|
||||||
|
getStatus: getStatus
|
||||||
|
};
|
||||||
|
|
||||||
|
function secure(socket, next) {
|
||||||
|
try {
|
||||||
|
var handshakeData = socket.request;
|
||||||
|
if (handshakeData.headers.cookie) {
|
||||||
|
handshakeData.cookie = cookie.parse(handshakeData.headers.cookie);
|
||||||
|
handshakeData.sessionID = cookieParser.signedCookie(handshakeData.cookie[config.sessionname], config.sessionsecret);
|
||||||
|
if (handshakeData.cookie[config.sessionname] == handshakeData.sessionID) {
|
||||||
|
next(new Error('AUTH failed: Cookie is invalid.'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
next(new Error('AUTH failed: No cookie transmitted.'));
|
||||||
|
}
|
||||||
|
if (config.debug)
|
||||||
|
console.log("AUTH success cookie: " + handshakeData.sessionID);
|
||||||
|
|
||||||
|
next();
|
||||||
|
} catch (ex) {
|
||||||
|
next(new Error("AUTH failed:" + JSON.stringify(ex)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//actions
|
||||||
|
var users = {};
|
||||||
|
var notes = {};
|
||||||
|
var updater = setInterval(function () {
|
||||||
|
async.each(Object.keys(notes), function (key, callback) {
|
||||||
|
var note = notes[key];
|
||||||
|
if (note.isDirty) {
|
||||||
|
if (config.debug)
|
||||||
|
console.log("updater found dirty note: " + key);
|
||||||
|
var title = Note.getNoteTitle(LZString.decompressFromBase64(note.body));
|
||||||
|
db.saveToDB(key, title, note.body,
|
||||||
|
function (err, result) {});
|
||||||
|
note.isDirty = false;
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
}, function (err) {
|
||||||
|
if (err) return console.error('updater error', err);
|
||||||
|
});
|
||||||
|
}, 5000);
|
||||||
|
|
||||||
|
function getStatus(callback) {
|
||||||
|
db.countFromDB(function (err, data) {
|
||||||
|
if (err) return console.log(err);
|
||||||
|
var regusers = 0;
|
||||||
|
var distinctregusers = 0;
|
||||||
|
var distinctaddresses = [];
|
||||||
|
Object.keys(users).forEach(function (key) {
|
||||||
|
var value = users[key];
|
||||||
|
if(value.login)
|
||||||
|
regusers++;
|
||||||
|
var found = false;
|
||||||
|
for (var i = 0; i < distinctaddresses.length; i++) {
|
||||||
|
if (value.address == distinctaddresses[i]) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
distinctaddresses.push(value.address);
|
||||||
|
if(!found && value.login)
|
||||||
|
distinctregusers++;
|
||||||
|
});
|
||||||
|
User.getUserCount(function (err, regcount) {
|
||||||
|
if (err) {
|
||||||
|
console.log('get status failed: ' + err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (callback)
|
||||||
|
callback({
|
||||||
|
onlineNotes: Object.keys(notes).length,
|
||||||
|
onlineUsers: Object.keys(users).length,
|
||||||
|
distinctOnlineUsers: distinctaddresses.length,
|
||||||
|
notesCount: data.rows[0].count,
|
||||||
|
registeredUsers: regcount,
|
||||||
|
onlineRegisteredUsers: regusers,
|
||||||
|
distinctOnlineRegisteredUsers: distinctregusers
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNotenameFromSocket(socket) {
|
||||||
|
var hostUrl = url.parse(socket.handshake.headers.referer);
|
||||||
|
var notename = hostUrl.pathname.split('/')[1];
|
||||||
|
if (notename == config.featuresnotename) {
|
||||||
|
return notename;
|
||||||
|
}
|
||||||
|
if (!Note.checkNoteIdValid(notename)) {
|
||||||
|
socket.emit('info', {
|
||||||
|
code: 404
|
||||||
|
});
|
||||||
|
return socket.disconnect();
|
||||||
|
}
|
||||||
|
notename = LZString.decompressFromBase64(notename);
|
||||||
|
return notename;
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitOnlineUsers(socket) {
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename || !notes[notename]) return;
|
||||||
|
var users = [];
|
||||||
|
Object.keys(notes[notename].users).forEach(function (key) {
|
||||||
|
var user = notes[notename].users[key];
|
||||||
|
if (user)
|
||||||
|
users.push({
|
||||||
|
id: user.id,
|
||||||
|
color: user.color,
|
||||||
|
cursor: user.cursor
|
||||||
|
});
|
||||||
|
});
|
||||||
|
notes[notename].socks.forEach(function (sock) {
|
||||||
|
sock.emit('online users', {
|
||||||
|
count: notes[notename].socks.length,
|
||||||
|
users: users
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var isConnectionBusy = false;
|
||||||
|
var connectionSocketQueue = [];
|
||||||
|
var isDisconnectBusy = false;
|
||||||
|
var disconnectSocketQueue = [];
|
||||||
|
|
||||||
|
function finishConnection(socket, notename) {
|
||||||
|
notes[notename].users[socket.id] = users[socket.id];
|
||||||
|
notes[notename].socks.push(socket);
|
||||||
|
emitOnlineUsers(socket);
|
||||||
|
socket.emit('refresh', {
|
||||||
|
body: notes[notename].body
|
||||||
|
});
|
||||||
|
|
||||||
|
//clear finished socket in queue
|
||||||
|
for (var i = 0; i < connectionSocketQueue.length; i++) {
|
||||||
|
if (connectionSocketQueue[i].id == socket.id)
|
||||||
|
connectionSocketQueue.splice(i, 1);
|
||||||
|
}
|
||||||
|
//seek for next socket
|
||||||
|
isConnectionBusy = false;
|
||||||
|
if (connectionSocketQueue.length > 0)
|
||||||
|
startConnection(connectionSocketQueue[0]);
|
||||||
|
|
||||||
|
if (config.debug) {
|
||||||
|
console.log('SERVER connected a client to [' + notename + ']:');
|
||||||
|
console.log(JSON.stringify(users[socket.id]));
|
||||||
|
//console.log(notes);
|
||||||
|
getStatus(function (data) {
|
||||||
|
console.log(JSON.stringify(data));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function startConnection(socket) {
|
||||||
|
if (isConnectionBusy) return;
|
||||||
|
isConnectionBusy = true;
|
||||||
|
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename) return;
|
||||||
|
|
||||||
|
if (!notes[notename]) {
|
||||||
|
db.readFromDB(notename, function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
socket.emit('info', {
|
||||||
|
code: 404
|
||||||
|
});
|
||||||
|
socket.disconnect();
|
||||||
|
//clear err socket in queue
|
||||||
|
for (var i = 0; i < connectionSocketQueue.length; i++) {
|
||||||
|
if (connectionSocketQueue[i].id == socket.id)
|
||||||
|
connectionSocketQueue.splice(i, 1);
|
||||||
|
}
|
||||||
|
isConnectionBusy = false;
|
||||||
|
return console.error(err);
|
||||||
|
}
|
||||||
|
var body = data.rows[0].content;
|
||||||
|
notes[notename] = {
|
||||||
|
socks: [],
|
||||||
|
body: body,
|
||||||
|
isDirty: false,
|
||||||
|
users: {}
|
||||||
|
};
|
||||||
|
finishConnection(socket, notename);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
finishConnection(socket, notename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function disconnect(socket) {
|
||||||
|
if (isDisconnectBusy) return;
|
||||||
|
isDisconnectBusy = true;
|
||||||
|
|
||||||
|
if (config.debug) {
|
||||||
|
console.log("SERVER disconnected a client");
|
||||||
|
console.log(JSON.stringify(users[socket.id]));
|
||||||
|
}
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename) return;
|
||||||
|
if (users[socket.id]) {
|
||||||
|
delete users[socket.id];
|
||||||
|
}
|
||||||
|
if (notes[notename]) {
|
||||||
|
delete notes[notename].users[socket.id];
|
||||||
|
var index = notes[notename].socks.indexOf(socket);
|
||||||
|
if (index > -1) {
|
||||||
|
notes[notename].socks.splice(index, 1);
|
||||||
|
}
|
||||||
|
if (Object.keys(notes[notename].users).length <= 0) {
|
||||||
|
var title = Note.getNoteTitle(LZString.decompressFromBase64(notes[notename].body));
|
||||||
|
db.saveToDB(notename, title, notes[notename].body,
|
||||||
|
function (err, result) {
|
||||||
|
delete notes[notename];
|
||||||
|
if (config.debug) {
|
||||||
|
//console.log(notes);
|
||||||
|
getStatus(function (data) {
|
||||||
|
console.log(JSON.stringify(data));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emitOnlineUsers(socket);
|
||||||
|
|
||||||
|
//clear finished socket in queue
|
||||||
|
for (var i = 0; i < disconnectSocketQueue.length; i++) {
|
||||||
|
if (disconnectSocketQueue[i].id == socket.id)
|
||||||
|
disconnectSocketQueue.splice(i, 1);
|
||||||
|
}
|
||||||
|
//seek for next socket
|
||||||
|
isDisconnectBusy = false;
|
||||||
|
if (disconnectSocketQueue.length > 0)
|
||||||
|
disconnect(disconnectSocketQueue[0]);
|
||||||
|
|
||||||
|
if (config.debug) {
|
||||||
|
//console.log(notes);
|
||||||
|
getStatus(function (data) {
|
||||||
|
console.log(JSON.stringify(data));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function connection(socket) {
|
||||||
|
users[socket.id] = {
|
||||||
|
id: socket.id,
|
||||||
|
address: socket.handshake.address,
|
||||||
|
'user-agent': socket.handshake.headers['user-agent'],
|
||||||
|
otk: shortId.generate(),
|
||||||
|
color: randomcolor({
|
||||||
|
luminosity: 'light'
|
||||||
|
}),
|
||||||
|
cursor: null,
|
||||||
|
login: false
|
||||||
|
};
|
||||||
|
|
||||||
|
connectionSocketQueue.push(socket);
|
||||||
|
startConnection(socket);
|
||||||
|
|
||||||
|
//when a new client coming or received a client refresh request
|
||||||
|
socket.on('refresh', function (body_) {
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename) return;
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER received [' + notename + '] data updated: ' + socket.id);
|
||||||
|
if (notes[notename].body != body_) {
|
||||||
|
notes[notename].body = body_;
|
||||||
|
notes[notename].isDirty = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('user status', function (data) {
|
||||||
|
if(data)
|
||||||
|
users[socket.id].login = data.login;
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('online users', function () {
|
||||||
|
emitOnlineUsers(socket);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('version', function () {
|
||||||
|
socket.emit('version', config.version);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('cursor focus', function (data) {
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename || !notes[notename]) return;
|
||||||
|
users[socket.id].cursor = data;
|
||||||
|
notes[notename].socks.forEach(function (sock) {
|
||||||
|
if (sock != socket) {
|
||||||
|
var out = {
|
||||||
|
id: socket.id,
|
||||||
|
color: users[socket.id].color,
|
||||||
|
cursor: data
|
||||||
|
};
|
||||||
|
sock.emit('cursor focus', out);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('cursor activity', function (data) {
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename || !notes[notename]) return;
|
||||||
|
users[socket.id].cursor = data;
|
||||||
|
notes[notename].socks.forEach(function (sock) {
|
||||||
|
if (sock != socket) {
|
||||||
|
var out = {
|
||||||
|
id: socket.id,
|
||||||
|
color: users[socket.id].color,
|
||||||
|
cursor: data
|
||||||
|
};
|
||||||
|
sock.emit('cursor activity', out);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('cursor blur', function () {
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename || !notes[notename]) return;
|
||||||
|
users[socket.id].cursor = null;
|
||||||
|
notes[notename].socks.forEach(function (sock) {
|
||||||
|
if (sock != socket) {
|
||||||
|
var out = {
|
||||||
|
id: socket.id
|
||||||
|
};
|
||||||
|
if (sock != socket) {
|
||||||
|
sock.emit('cursor blur', out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//when a new client disconnect
|
||||||
|
socket.on('disconnect', function () {
|
||||||
|
disconnectSocketQueue.push(socket);
|
||||||
|
disconnect(socket);
|
||||||
|
});
|
||||||
|
|
||||||
|
//when received client change data request
|
||||||
|
socket.on('change', function (op) {
|
||||||
|
var notename = getNotenameFromSocket(socket);
|
||||||
|
if (!notename) return;
|
||||||
|
op = LZString.decompressFromBase64(op);
|
||||||
|
if (op)
|
||||||
|
op = JSON.parse(op);
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER received [' + notename + '] data changed: ' + socket.id + ', op:' + JSON.stringify(op));
|
||||||
|
switch (op.origin) {
|
||||||
|
case '+input':
|
||||||
|
case '+delete':
|
||||||
|
case 'paste':
|
||||||
|
case 'cut':
|
||||||
|
case 'undo':
|
||||||
|
case 'redo':
|
||||||
|
case 'drag':
|
||||||
|
notes[notename].socks.forEach(function (sock) {
|
||||||
|
if (sock != socket) {
|
||||||
|
if (config.debug)
|
||||||
|
console.log('SERVER emit sync data out [' + notename + ']: ' + sock.id + ', op:' + JSON.stringify(op));
|
||||||
|
sock.emit('change', LZString.compressToBase64(JSON.stringify(op)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = realtime;
|
211
lib/response.js
Normal file
211
lib/response.js
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
//response
|
||||||
|
//external modules
|
||||||
|
var ejs = require('ejs');
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var uuid = require('node-uuid');
|
||||||
|
var markdownpdf = require("markdown-pdf");
|
||||||
|
var LZString = require('lz-string');
|
||||||
|
|
||||||
|
//core
|
||||||
|
var config = require("../config.js");
|
||||||
|
|
||||||
|
//others
|
||||||
|
var db = require("./db.js");
|
||||||
|
var Note = require("./note.js");
|
||||||
|
|
||||||
|
//public
|
||||||
|
var response = {
|
||||||
|
errorForbidden: function (res) {
|
||||||
|
res.status(403).send("Forbidden, oh no.")
|
||||||
|
},
|
||||||
|
errorNotFound: function (res) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.")
|
||||||
|
},
|
||||||
|
errorInternalError: function (res) {
|
||||||
|
responseError(res, "500", "Internal Error", "wtf.")
|
||||||
|
},
|
||||||
|
errorServiceUnavailable: function (res) {
|
||||||
|
res.status(503).send("I'm busy right now, try again later.")
|
||||||
|
},
|
||||||
|
newNote: newNote,
|
||||||
|
showFeatures: showFeatures,
|
||||||
|
showNote: showNote,
|
||||||
|
noteActions: noteActions
|
||||||
|
};
|
||||||
|
|
||||||
|
function responseError(res, code, detail, msg) {
|
||||||
|
res.writeHead(code, {
|
||||||
|
'Content-Type': 'text/html'
|
||||||
|
});
|
||||||
|
var content = ejs.render(fs.readFileSync(config.errorpath, 'utf8'), {
|
||||||
|
cache: !config.debug,
|
||||||
|
filename: config.errorpath,
|
||||||
|
code: code,
|
||||||
|
detail: detail,
|
||||||
|
msg: msg
|
||||||
|
});
|
||||||
|
res.write(content);
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
function responseHackMD(res) {
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type': 'text/html'
|
||||||
|
});
|
||||||
|
var content = ejs.render(fs.readFileSync(config.hackmdpath, 'utf8'), {
|
||||||
|
cache: !config.debug,
|
||||||
|
filename: config.hackmdpath
|
||||||
|
});
|
||||||
|
res.write(content);
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
function newNote(req, res, next) {
|
||||||
|
var newId = uuid.v4();
|
||||||
|
var body = fs.readFileSync(config.defaultnotepath, 'utf8');
|
||||||
|
body = LZString.compressToBase64(body);
|
||||||
|
var owner = null;
|
||||||
|
if (req.isAuthenticated()) {
|
||||||
|
owner = req.session.passport.user;
|
||||||
|
}
|
||||||
|
db.newToDB(newId, owner, body, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
responseError(res, "500", "Internal Error", "wtf.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
res.redirect("/" + LZString.compressToBase64(newId));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showFeatures(req, res, next) {
|
||||||
|
db.readFromDB(config.featuresnotename, function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
var body = fs.readFileSync(config.defaultfeaturespath, 'utf8');
|
||||||
|
body = LZString.compressToBase64(body);
|
||||||
|
db.newToDB(config.featuresnotename, null, body, function (err, result) {
|
||||||
|
if (err) {
|
||||||
|
responseError(res, "500", "Internal Error", "wtf.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
responseHackMD(res);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
responseHackMD(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showNote(req, res, next) {
|
||||||
|
var noteId = req.params.noteId;
|
||||||
|
if (!Note.checkNoteIdValid(noteId)) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
responseHackMD(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
function actionPretty(req, res, noteId) {
|
||||||
|
db.readFromDB(noteId, function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var body = data.rows[0].content;
|
||||||
|
var template = config.prettypath;
|
||||||
|
var compiled = ejs.compile(fs.readFileSync(template, 'utf8'));
|
||||||
|
var origin = "//" + req.headers.host;
|
||||||
|
var html = compiled({
|
||||||
|
url: origin,
|
||||||
|
body: body
|
||||||
|
});
|
||||||
|
var buf = html;
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type': 'text/html; charset=UTF-8',
|
||||||
|
'Cache-Control': 'private',
|
||||||
|
'Content-Length': buf.length
|
||||||
|
});
|
||||||
|
res.end(buf);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function actionDownload(req, res, noteId) {
|
||||||
|
db.readFromDB(noteId, function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var body = LZString.decompressFromBase64(data.rows[0].content);
|
||||||
|
var title = Note.getNoteTitle(body);
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type': 'text/markdown; charset=UTF-8',
|
||||||
|
'Cache-Control': 'private',
|
||||||
|
'Content-disposition': 'attachment; filename=' + title + '.md',
|
||||||
|
'Content-Length': body.length
|
||||||
|
});
|
||||||
|
res.end(body);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function actionPDF(req, res, noteId) {
|
||||||
|
db.readFromDB(noteId, function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var body = LZString.decompressFromBase64(data.rows[0].content);
|
||||||
|
var title = Note.getNoteTitle(body);
|
||||||
|
|
||||||
|
if (!fs.existsSync(config.tmppath)) {
|
||||||
|
fs.mkdirSync(config.tmppath);
|
||||||
|
}
|
||||||
|
var path = config.tmppath + Date.now() + '.pdf';
|
||||||
|
markdownpdf().from.string(body).to(path, function () {
|
||||||
|
var stream = fs.createReadStream(path);
|
||||||
|
var filename = title;
|
||||||
|
// Be careful of special characters
|
||||||
|
filename = encodeURIComponent(filename);
|
||||||
|
// Ideally this should strip them
|
||||||
|
res.setHeader('Content-disposition', 'attachment; filename="' + filename + '.pdf"');
|
||||||
|
res.setHeader('Cache-Control', 'private');
|
||||||
|
res.setHeader('Content-Type', 'application/pdf; charset=UTF-8');
|
||||||
|
stream.pipe(res);
|
||||||
|
fs.unlink(path);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function noteActions(req, res, next) {
|
||||||
|
var noteId = req.params.noteId;
|
||||||
|
if (noteId != config.featuresnotename) {
|
||||||
|
if (!Note.checkNoteIdValid(noteId)) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
noteId = LZString.decompressFromBase64(noteId);
|
||||||
|
if (!noteId) {
|
||||||
|
responseError(res, "404", "Not Found", "oops.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var action = req.params.action;
|
||||||
|
switch (action) {
|
||||||
|
case "pretty":
|
||||||
|
actionPretty(req, res, noteId);
|
||||||
|
break;
|
||||||
|
case "download":
|
||||||
|
actionDownload(req, res, noteId);
|
||||||
|
break;
|
||||||
|
case "pdf":
|
||||||
|
actionPDF(req, res, noteId);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (noteId != config.featuresnotename)
|
||||||
|
res.redirect('/' + LZString.compressToBase64(noteId));
|
||||||
|
else
|
||||||
|
res.redirect('/' + noteId);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = response;
|
83
lib/user.js
Normal file
83
lib/user.js
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
//user
|
||||||
|
//external modules
|
||||||
|
var mongoose = require('mongoose');
|
||||||
|
|
||||||
|
//core
|
||||||
|
var config = require("../config.js");
|
||||||
|
|
||||||
|
// create a user model
|
||||||
|
var model = mongoose.model('user', {
|
||||||
|
id: String,
|
||||||
|
profile: String,
|
||||||
|
history: String,
|
||||||
|
created: Date
|
||||||
|
});
|
||||||
|
|
||||||
|
//public
|
||||||
|
var user = {
|
||||||
|
model: model,
|
||||||
|
findUser: findUser,
|
||||||
|
newUser: newUser,
|
||||||
|
findOrNewUser: findOrNewUser,
|
||||||
|
getUserCount: getUserCount
|
||||||
|
};
|
||||||
|
|
||||||
|
function getUserCount(callback) {
|
||||||
|
model.count(function(err, count){
|
||||||
|
if(err) callback(err, null);
|
||||||
|
else callback(null, count);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function findUser(id, callback) {
|
||||||
|
model.findOne({
|
||||||
|
id: id
|
||||||
|
}, function (err, user) {
|
||||||
|
if (err) {
|
||||||
|
console.log('find user failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
}
|
||||||
|
if (!err && user != null) {
|
||||||
|
callback(null, user);
|
||||||
|
} else {
|
||||||
|
console.log('find user failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function newUser(id, profile, callback) {
|
||||||
|
var user = new model({
|
||||||
|
id: id,
|
||||||
|
profile: JSON.stringify(profile),
|
||||||
|
created: Date.now()
|
||||||
|
});
|
||||||
|
user.save(function (err) {
|
||||||
|
if (err) {
|
||||||
|
console.log('new user failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
} else {
|
||||||
|
console.log("new user success: " + user.id);
|
||||||
|
callback(null, user);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function findOrNewUser(id, profile, callback) {
|
||||||
|
findUser(id, function(err, user) {
|
||||||
|
if(err || user == null) {
|
||||||
|
newUser(id, profile, function(err, user) {
|
||||||
|
if(err) {
|
||||||
|
console.log('find or new user failed: ' + err);
|
||||||
|
callback(err, null);
|
||||||
|
} else {
|
||||||
|
callback(null, user);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback(null, user);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = user;
|
45
package.json
Normal file
45
package.json
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
"name": "hackmd",
|
||||||
|
"version": "0.2.7",
|
||||||
|
"description": "Realtime collaborative markdown notes on all platforms.",
|
||||||
|
"main": "server.js",
|
||||||
|
"author": "jackymaxj",
|
||||||
|
"private": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"async": "^0.9.0",
|
||||||
|
"body-parser": "^1.12.3",
|
||||||
|
"cheerio": "^0.19.0",
|
||||||
|
"compression": "^1.4.3",
|
||||||
|
"connect": "3.x",
|
||||||
|
"connect-mongo": "^0.8.1",
|
||||||
|
"cookie": "0.1.2",
|
||||||
|
"cookie-parser": "1.3.3",
|
||||||
|
"ejs": "^1.0.0",
|
||||||
|
"emojify.js": "^1.0.1",
|
||||||
|
"express": "4.x",
|
||||||
|
"express-session": "^1.11.1",
|
||||||
|
"highlight.js": "^8.4.0",
|
||||||
|
"html": "0.0.7",
|
||||||
|
"jsdom-nogyp": "^0.8.3",
|
||||||
|
"lz-string": "1.3.6",
|
||||||
|
"markdown-pdf": "^5.2.0",
|
||||||
|
"marked": "^0.3.3",
|
||||||
|
"method-override": "^2.3.2",
|
||||||
|
"mongoose": "^4.0.2",
|
||||||
|
"node-uuid": "^1.4.3",
|
||||||
|
"passport": "^0.2.1",
|
||||||
|
"passport-dropbox-oauth2": "^0.1.6",
|
||||||
|
"passport-facebook": "^2.0.0",
|
||||||
|
"passport-github": "^0.1.5",
|
||||||
|
"passport-twitter": "^1.0.3",
|
||||||
|
"pg": "4.x",
|
||||||
|
"randomcolor": "^0.2.0",
|
||||||
|
"shortid": "2.1.3",
|
||||||
|
"socket.io": "1.3.5",
|
||||||
|
"toobusy-js": "^0.4.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "0.10.x"
|
||||||
|
}
|
||||||
|
}
|
45
public/GFM.md
Normal file
45
public/GFM.md
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
GitHub Flavored Markdown
|
||||||
|
========================
|
||||||
|
|
||||||
|
Everything from markdown plus GFM features:
|
||||||
|
|
||||||
|
## URL autolinking
|
||||||
|
|
||||||
|
Underscores_are_allowed_between_words.
|
||||||
|
asdasdasd
|
||||||
|
|
||||||
|
## Strikethrough text
|
||||||
|
|
||||||
|
GFM adds syntax to strikethrough text, which is missing from standard Markdown.
|
||||||
|
|
||||||
|
~~Mistaken text.~~
|
||||||
|
~~**works with other fomatting**~~
|
||||||
|
|
||||||
|
~~spans across
|
||||||
|
lines~~
|
||||||
|
|
||||||
|
## Fenced code blocks (and syntax highlighting)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
for (var i = 0; i < items.length; i++) {
|
||||||
|
console.log(items[i], i); // log them
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Task Lists
|
||||||
|
|
||||||
|
- [ ] Incomplete task list item
|
||||||
|
- [x] **Completed** task list item
|
||||||
|
|
||||||
|
## A bit of GitHub spice
|
||||||
|
|
||||||
|
* SHA: be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
|
||||||
|
* User@SHA ref: mojombo@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
|
||||||
|
* User/Project@SHA: mojombo/god@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2
|
||||||
|
* \#Num: #1
|
||||||
|
* User/#Num: mojombo#1
|
||||||
|
* User/Project#Num: mojombo/god#1
|
||||||
|
|
||||||
|
See http://github.github.com/github-flavored-markdown/.
|
||||||
|
|
||||||
|
|
BIN
public/apple-touch-icon.png
Normal file
BIN
public/apple-touch-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
101
public/css/bootstrap-social.css
vendored
Executable file
101
public/css/bootstrap-social.css
vendored
Executable file
|
@ -0,0 +1,101 @@
|
||||||
|
/*
|
||||||
|
* Social Buttons for Bootstrap
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 Panayiotis Lipiridis
|
||||||
|
* Licensed under the MIT License
|
||||||
|
*
|
||||||
|
* https://github.com/lipis/bootstrap-social
|
||||||
|
*/
|
||||||
|
|
||||||
|
.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}
|
||||||
|
.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}
|
||||||
|
.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}
|
||||||
|
.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}
|
||||||
|
.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}
|
||||||
|
.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}
|
||||||
|
.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}
|
||||||
|
.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}
|
||||||
|
.btn-social-icon :first-child{border:none;text-align:center;width:100% !important}
|
||||||
|
.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}
|
||||||
|
.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}
|
||||||
|
.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}
|
||||||
|
.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:hover,.btn-adn:focus,.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}
|
||||||
|
.btn-adn.disabled,.btn-adn[disabled],fieldset[disabled] .btn-adn,.btn-adn.disabled:hover,.btn-adn[disabled]:hover,fieldset[disabled] .btn-adn:hover,.btn-adn.disabled:focus,.btn-adn[disabled]:focus,fieldset[disabled] .btn-adn:focus,.btn-adn.disabled:active,.btn-adn[disabled]:active,fieldset[disabled] .btn-adn:active,.btn-adn.disabled.active,.btn-adn[disabled].active,fieldset[disabled] .btn-adn.active{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-adn .badge{color:#d87a68;background-color:#fff}
|
||||||
|
.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover,.btn-bitbucket:focus,.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}
|
||||||
|
.btn-bitbucket.disabled,.btn-bitbucket[disabled],fieldset[disabled] .btn-bitbucket,.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket[disabled]:focus,fieldset[disabled] .btn-bitbucket:focus,.btn-bitbucket.disabled:active,.btn-bitbucket[disabled]:active,fieldset[disabled] .btn-bitbucket:active,.btn-bitbucket.disabled.active,.btn-bitbucket[disabled].active,fieldset[disabled] .btn-bitbucket.active{background-color:#205081;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-bitbucket .badge{color:#205081;background-color:#fff}
|
||||||
|
.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover,.btn-dropbox:focus,.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}
|
||||||
|
.btn-dropbox.disabled,.btn-dropbox[disabled],fieldset[disabled] .btn-dropbox,.btn-dropbox.disabled:hover,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox:hover,.btn-dropbox.disabled:focus,.btn-dropbox[disabled]:focus,fieldset[disabled] .btn-dropbox:focus,.btn-dropbox.disabled:active,.btn-dropbox[disabled]:active,fieldset[disabled] .btn-dropbox:active,.btn-dropbox.disabled.active,.btn-dropbox[disabled].active,fieldset[disabled] .btn-dropbox.active{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-dropbox .badge{color:#1087dd;background-color:#fff}
|
||||||
|
.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover,.btn-facebook:focus,.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}
|
||||||
|
.btn-facebook.disabled,.btn-facebook[disabled],fieldset[disabled] .btn-facebook,.btn-facebook.disabled:hover,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook:hover,.btn-facebook.disabled:focus,.btn-facebook[disabled]:focus,fieldset[disabled] .btn-facebook:focus,.btn-facebook.disabled:active,.btn-facebook[disabled]:active,fieldset[disabled] .btn-facebook:active,.btn-facebook.disabled.active,.btn-facebook[disabled].active,fieldset[disabled] .btn-facebook.active{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-facebook .badge{color:#3b5998;background-color:#fff}
|
||||||
|
.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover,.btn-flickr:focus,.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}
|
||||||
|
.btn-flickr.disabled,.btn-flickr[disabled],fieldset[disabled] .btn-flickr,.btn-flickr.disabled:hover,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr:hover,.btn-flickr.disabled:focus,.btn-flickr[disabled]:focus,fieldset[disabled] .btn-flickr:focus,.btn-flickr.disabled:active,.btn-flickr[disabled]:active,fieldset[disabled] .btn-flickr:active,.btn-flickr.disabled.active,.btn-flickr[disabled].active,fieldset[disabled] .btn-flickr.active{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-flickr .badge{color:#ff0084;background-color:#fff}
|
||||||
|
.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover,.btn-foursquare:focus,.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}
|
||||||
|
.btn-foursquare.disabled,.btn-foursquare[disabled],fieldset[disabled] .btn-foursquare,.btn-foursquare.disabled:hover,.btn-foursquare[disabled]:hover,fieldset[disabled] .btn-foursquare:hover,.btn-foursquare.disabled:focus,.btn-foursquare[disabled]:focus,fieldset[disabled] .btn-foursquare:focus,.btn-foursquare.disabled:active,.btn-foursquare[disabled]:active,fieldset[disabled] .btn-foursquare:active,.btn-foursquare.disabled.active,.btn-foursquare[disabled].active,fieldset[disabled] .btn-foursquare.active{background-color:#f94877;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-foursquare .badge{color:#f94877;background-color:#fff}
|
||||||
|
.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:hover,.btn-github:focus,.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}
|
||||||
|
.btn-github.disabled,.btn-github[disabled],fieldset[disabled] .btn-github,.btn-github.disabled:hover,.btn-github[disabled]:hover,fieldset[disabled] .btn-github:hover,.btn-github.disabled:focus,.btn-github[disabled]:focus,fieldset[disabled] .btn-github:focus,.btn-github.disabled:active,.btn-github[disabled]:active,fieldset[disabled] .btn-github:active,.btn-github.disabled.active,.btn-github[disabled].active,fieldset[disabled] .btn-github.active{background-color:#444;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-github .badge{color:#444;background-color:#fff}
|
||||||
|
.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:hover,.btn-google:focus,.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}
|
||||||
|
.btn-google.disabled,.btn-google[disabled],fieldset[disabled] .btn-google,.btn-google.disabled:hover,.btn-google[disabled]:hover,fieldset[disabled] .btn-google:hover,.btn-google.disabled:focus,.btn-google[disabled]:focus,fieldset[disabled] .btn-google:focus,.btn-google.disabled:active,.btn-google[disabled]:active,fieldset[disabled] .btn-google:active,.btn-google.disabled.active,.btn-google[disabled].active,fieldset[disabled] .btn-google.active{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-google .badge{color:#dd4b39;background-color:#fff}
|
||||||
|
.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover,.btn-instagram:focus,.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}
|
||||||
|
.btn-instagram.disabled,.btn-instagram[disabled],fieldset[disabled] .btn-instagram,.btn-instagram.disabled:hover,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram:hover,.btn-instagram.disabled:focus,.btn-instagram[disabled]:focus,fieldset[disabled] .btn-instagram:focus,.btn-instagram.disabled:active,.btn-instagram[disabled]:active,fieldset[disabled] .btn-instagram:active,.btn-instagram.disabled.active,.btn-instagram[disabled].active,fieldset[disabled] .btn-instagram.active{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-instagram .badge{color:#3f729b;background-color:#fff}
|
||||||
|
.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover,.btn-linkedin:focus,.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}
|
||||||
|
.btn-linkedin.disabled,.btn-linkedin[disabled],fieldset[disabled] .btn-linkedin,.btn-linkedin.disabled:hover,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin:hover,.btn-linkedin.disabled:focus,.btn-linkedin[disabled]:focus,fieldset[disabled] .btn-linkedin:focus,.btn-linkedin.disabled:active,.btn-linkedin[disabled]:active,fieldset[disabled] .btn-linkedin:active,.btn-linkedin.disabled.active,.btn-linkedin[disabled].active,fieldset[disabled] .btn-linkedin.active{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-linkedin .badge{color:#007bb6;background-color:#fff}
|
||||||
|
.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover,.btn-microsoft:focus,.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}
|
||||||
|
.btn-microsoft.disabled,.btn-microsoft[disabled],fieldset[disabled] .btn-microsoft,.btn-microsoft.disabled:hover,.btn-microsoft[disabled]:hover,fieldset[disabled] .btn-microsoft:hover,.btn-microsoft.disabled:focus,.btn-microsoft[disabled]:focus,fieldset[disabled] .btn-microsoft:focus,.btn-microsoft.disabled:active,.btn-microsoft[disabled]:active,fieldset[disabled] .btn-microsoft:active,.btn-microsoft.disabled.active,.btn-microsoft[disabled].active,fieldset[disabled] .btn-microsoft.active{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-microsoft .badge{color:#2672ec;background-color:#fff}
|
||||||
|
.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:hover,.btn-openid:focus,.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}
|
||||||
|
.btn-openid.disabled,.btn-openid[disabled],fieldset[disabled] .btn-openid,.btn-openid.disabled:hover,.btn-openid[disabled]:hover,fieldset[disabled] .btn-openid:hover,.btn-openid.disabled:focus,.btn-openid[disabled]:focus,fieldset[disabled] .btn-openid:focus,.btn-openid.disabled:active,.btn-openid[disabled]:active,fieldset[disabled] .btn-openid:active,.btn-openid.disabled.active,.btn-openid[disabled].active,fieldset[disabled] .btn-openid.active{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-openid .badge{color:#f7931e;background-color:#fff}
|
||||||
|
.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover,.btn-pinterest:focus,.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}
|
||||||
|
.btn-pinterest.disabled,.btn-pinterest[disabled],fieldset[disabled] .btn-pinterest,.btn-pinterest.disabled:hover,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest:hover,.btn-pinterest.disabled:focus,.btn-pinterest[disabled]:focus,fieldset[disabled] .btn-pinterest:focus,.btn-pinterest.disabled:active,.btn-pinterest[disabled]:active,fieldset[disabled] .btn-pinterest:active,.btn-pinterest.disabled.active,.btn-pinterest[disabled].active,fieldset[disabled] .btn-pinterest.active{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-pinterest .badge{color:#cb2027;background-color:#fff}
|
||||||
|
.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover,.btn-reddit:focus,.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}
|
||||||
|
.btn-reddit.disabled,.btn-reddit[disabled],fieldset[disabled] .btn-reddit,.btn-reddit.disabled:hover,.btn-reddit[disabled]:hover,fieldset[disabled] .btn-reddit:hover,.btn-reddit.disabled:focus,.btn-reddit[disabled]:focus,fieldset[disabled] .btn-reddit:focus,.btn-reddit.disabled:active,.btn-reddit[disabled]:active,fieldset[disabled] .btn-reddit:active,.btn-reddit.disabled.active,.btn-reddit[disabled].active,fieldset[disabled] .btn-reddit.active{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-reddit .badge{color:#eff7ff;background-color:#000}
|
||||||
|
.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover,.btn-soundcloud:focus,.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}
|
||||||
|
.btn-soundcloud.disabled,.btn-soundcloud[disabled],fieldset[disabled] .btn-soundcloud,.btn-soundcloud.disabled:hover,.btn-soundcloud[disabled]:hover,fieldset[disabled] .btn-soundcloud:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud[disabled]:focus,fieldset[disabled] .btn-soundcloud:focus,.btn-soundcloud.disabled:active,.btn-soundcloud[disabled]:active,fieldset[disabled] .btn-soundcloud:active,.btn-soundcloud.disabled.active,.btn-soundcloud[disabled].active,fieldset[disabled] .btn-soundcloud.active{background-color:#f50;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-soundcloud .badge{color:#f50;background-color:#fff}
|
||||||
|
.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover,.btn-tumblr:focus,.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}
|
||||||
|
.btn-tumblr.disabled,.btn-tumblr[disabled],fieldset[disabled] .btn-tumblr,.btn-tumblr.disabled:hover,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr:hover,.btn-tumblr.disabled:focus,.btn-tumblr[disabled]:focus,fieldset[disabled] .btn-tumblr:focus,.btn-tumblr.disabled:active,.btn-tumblr[disabled]:active,fieldset[disabled] .btn-tumblr:active,.btn-tumblr.disabled.active,.btn-tumblr[disabled].active,fieldset[disabled] .btn-tumblr.active{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-tumblr .badge{color:#2c4762;background-color:#fff}
|
||||||
|
.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover,.btn-twitter:focus,.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}
|
||||||
|
.btn-twitter.disabled,.btn-twitter[disabled],fieldset[disabled] .btn-twitter,.btn-twitter.disabled:hover,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter:hover,.btn-twitter.disabled:focus,.btn-twitter[disabled]:focus,fieldset[disabled] .btn-twitter:focus,.btn-twitter.disabled:active,.btn-twitter[disabled]:active,fieldset[disabled] .btn-twitter:active,.btn-twitter.disabled.active,.btn-twitter[disabled].active,fieldset[disabled] .btn-twitter.active{background-color:#55acee;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-twitter .badge{color:#55acee;background-color:#fff}
|
||||||
|
.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover,.btn-vimeo:focus,.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}
|
||||||
|
.btn-vimeo.disabled,.btn-vimeo[disabled],fieldset[disabled] .btn-vimeo,.btn-vimeo.disabled:hover,.btn-vimeo[disabled]:hover,fieldset[disabled] .btn-vimeo:hover,.btn-vimeo.disabled:focus,.btn-vimeo[disabled]:focus,fieldset[disabled] .btn-vimeo:focus,.btn-vimeo.disabled:active,.btn-vimeo[disabled]:active,fieldset[disabled] .btn-vimeo:active,.btn-vimeo.disabled.active,.btn-vimeo[disabled].active,fieldset[disabled] .btn-vimeo.active{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}
|
||||||
|
.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:hover,.btn-vk:focus,.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}
|
||||||
|
.btn-vk.disabled,.btn-vk[disabled],fieldset[disabled] .btn-vk,.btn-vk.disabled:hover,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk:hover,.btn-vk.disabled:focus,.btn-vk[disabled]:focus,fieldset[disabled] .btn-vk:focus,.btn-vk.disabled:active,.btn-vk[disabled]:active,fieldset[disabled] .btn-vk:active,.btn-vk.disabled.active,.btn-vk[disabled].active,fieldset[disabled] .btn-vk.active{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-vk .badge{color:#587ea3;background-color:#fff}
|
||||||
|
.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover,.btn-yahoo:focus,.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}
|
||||||
|
.btn-yahoo.disabled,.btn-yahoo[disabled],fieldset[disabled] .btn-yahoo,.btn-yahoo.disabled:hover,.btn-yahoo[disabled]:hover,fieldset[disabled] .btn-yahoo:hover,.btn-yahoo.disabled:focus,.btn-yahoo[disabled]:focus,fieldset[disabled] .btn-yahoo:focus,.btn-yahoo.disabled:active,.btn-yahoo[disabled]:active,fieldset[disabled] .btn-yahoo:active,.btn-yahoo.disabled.active,.btn-yahoo[disabled].active,fieldset[disabled] .btn-yahoo.active{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}
|
||||||
|
.btn-yahoo .badge{color:#720e9e;background-color:#fff}
|
13
public/css/center.css
Normal file
13
public/css/center.css
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
html,
|
||||||
|
body,
|
||||||
|
.container-fluid {
|
||||||
|
height: 98%;
|
||||||
|
}
|
||||||
|
.container-fluid {
|
||||||
|
display: table;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.vertical-center-row {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
278
public/css/cover.css
Normal file
278
public/css/cover.css
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
/*
|
||||||
|
* Globals
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Links */
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:focus,
|
||||||
|
a:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
/* Custom default button */
|
||||||
|
|
||||||
|
.btn-default,
|
||||||
|
.btn-default:hover,
|
||||||
|
.btn-default:focus {
|
||||||
|
color: #333;
|
||||||
|
text-shadow: none;
|
||||||
|
/* Prevent inheritence from `body` */
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #fff;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Base structure
|
||||||
|
*/
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: 0 1px 3px rgba(0, 0, 0, .5);
|
||||||
|
}
|
||||||
|
/* Extra markup and styles for table-esque vertical and horizontal centering */
|
||||||
|
|
||||||
|
.site-wrapper {
|
||||||
|
padding: 10px;
|
||||||
|
display: table;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
/* For at least Firefox */
|
||||||
|
min-height: 100%;
|
||||||
|
-webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, .5);
|
||||||
|
box-shadow: inset 0 0 100px rgba(0, 0, 0, .5);
|
||||||
|
}
|
||||||
|
.site-wrapper-inner {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.cover-container {
|
||||||
|
margin-right: auto;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
/* Padding for spacing */
|
||||||
|
|
||||||
|
.inner {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Header
|
||||||
|
*/
|
||||||
|
|
||||||
|
.masthead-brand {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.masthead-nav > li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.masthead-nav > li + li {
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
.masthead-nav > li > a {
|
||||||
|
padding-right: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
/* IE8 proofing */
|
||||||
|
color: rgba(255, 255, 255, .75);
|
||||||
|
border-bottom: 2px solid transparent;
|
||||||
|
}
|
||||||
|
.masthead-nav > li > a:hover,
|
||||||
|
.masthead-nav > li > a:focus {
|
||||||
|
background-color: transparent;
|
||||||
|
border-bottom-color: #a9a9a9;
|
||||||
|
border-bottom-color: rgba(255, 255, 255, .25);
|
||||||
|
}
|
||||||
|
.masthead-nav > .active > a,
|
||||||
|
.masthead-nav > .active > a:hover,
|
||||||
|
.masthead-nav > .active > a:focus {
|
||||||
|
color: #fff;
|
||||||
|
border-bottom-color: #fff;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.masthead-brand {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.masthead-nav {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
.inner {
|
||||||
|
padding: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Cover
|
||||||
|
*/
|
||||||
|
|
||||||
|
.cover {
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
.cover .btn-lg {
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Footer
|
||||||
|
*/
|
||||||
|
|
||||||
|
.mastfoot {
|
||||||
|
color: #999;
|
||||||
|
/* IE8 proofing */
|
||||||
|
color: rgba(255, 255, 255, .5);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Affix and center
|
||||||
|
*/
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
/* Pull out the header and footer */
|
||||||
|
.masthead {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.mastfoot {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
/* Start the vertical centering */
|
||||||
|
.site-wrapper-inner {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
/* Handle the widths */
|
||||||
|
.masthead,
|
||||||
|
.mastfoot,
|
||||||
|
.cover-container {
|
||||||
|
width: 100%;
|
||||||
|
/* Must be percentage or pixels for horizontal alignment */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.masthead,
|
||||||
|
.mastfoot,
|
||||||
|
.cover-container {
|
||||||
|
width: 700px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.section ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
/* custom */
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
.select2-selection,
|
||||||
|
.select2-search__field {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
.select2-search__field:hover {
|
||||||
|
border: 1px solid #b9b9b9 !important;
|
||||||
|
border-top-color: #a0a0a0 !important;
|
||||||
|
}
|
||||||
|
.select2-search__field:focus {
|
||||||
|
border: 1px solid #4d90fe !important;
|
||||||
|
}
|
||||||
|
input {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
.mastfoot {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.select2 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
.select2-selection {
|
||||||
|
height: 32px !important;
|
||||||
|
}
|
||||||
|
.select2-selection__rendered {
|
||||||
|
line-height: 32px !important;
|
||||||
|
}
|
||||||
|
.select2-selection__arrow {
|
||||||
|
height: 30px !important;
|
||||||
|
}
|
||||||
|
.select2-selection__rendered,
|
||||||
|
.select2-selection__placeholder,
|
||||||
|
.select2-results__option {
|
||||||
|
color: #000;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.list {
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 0;
|
||||||
|
display: -webkit-inline-flex;
|
||||||
|
display: -moz-inline-flex;
|
||||||
|
display: -ms-inline-flex;
|
||||||
|
display: -o-inline-flex;
|
||||||
|
display: inline-flex;
|
||||||
|
-webkit-flex-direction: row;
|
||||||
|
-moz-flex-direction: row;
|
||||||
|
-ms-flex-direction: row;
|
||||||
|
flex-direction: row;
|
||||||
|
-webkit-flex-flow: row wrap;
|
||||||
|
-moz-flex-flow: row wrap;
|
||||||
|
-ms-flex-flow: row wrap;
|
||||||
|
flex-flow: row wrap;
|
||||||
|
-webkit-justify-content: flex-start;
|
||||||
|
-moz-justify-content: flex-start;
|
||||||
|
-ms-justify-content: flex-start;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
.list {
|
||||||
|
margin: 20px 0;
|
||||||
|
}
|
||||||
|
.list li {
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
.list li * {
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
.list li a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.list li p {
|
||||||
|
color: gray;
|
||||||
|
}
|
||||||
|
.list li .item {
|
||||||
|
padding: 5px 25px;
|
||||||
|
margin: 10px 0;
|
||||||
|
background: white;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: black;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.list li .item .tags {
|
||||||
|
line-height: 25px;
|
||||||
|
}
|
||||||
|
.form-inline {
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
.sort.asc {
|
||||||
|
text-decoration: overline;
|
||||||
|
}
|
||||||
|
.sort.desc {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
.ui-history-close {
|
||||||
|
position: absolute;
|
||||||
|
right: 14px;
|
||||||
|
top: 15px;
|
||||||
|
font-size: 16px;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
.ui-history-close:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title {
|
||||||
|
text-align: left;
|
||||||
|
color: black;
|
||||||
|
}
|
47
public/css/extra.css
Normal file
47
public/css/extra.css
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/* for extra features should include this */
|
||||||
|
|
||||||
|
.vimeo,
|
||||||
|
.youtube {
|
||||||
|
cursor: pointer;
|
||||||
|
display: table;
|
||||||
|
max-width: 540px;
|
||||||
|
text-align: center;
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
.vimeo .icon,
|
||||||
|
.youtube .icon {
|
||||||
|
opacity: 0.5;
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
height: inherit;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.vimeo:hover .icon,
|
||||||
|
.youtube:hover .icon {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
h1:hover .header-link,
|
||||||
|
h2:hover .header-link,
|
||||||
|
h3:hover .header-link,
|
||||||
|
h4:hover .header-link,
|
||||||
|
h5:hover .header-link,
|
||||||
|
h6:hover .header-link {
|
||||||
|
opacity: 1;
|
||||||
|
-webkit-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
-moz-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
-o-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
}
|
||||||
|
.header-link {
|
||||||
|
position: relative;
|
||||||
|
left: 0.5em;
|
||||||
|
opacity: 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
-webkit-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
-moz-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
-o-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
}
|
647
public/css/gist.css
Normal file
647
public/css/gist.css
Normal file
|
@ -0,0 +1,647 @@
|
||||||
|
.gist {
|
||||||
|
color: #333;
|
||||||
|
font-size: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body {
|
||||||
|
overflow: hidden;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.6;
|
||||||
|
word-wrap: break-word
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body>*:first-child {
|
||||||
|
margin-top: 0 !important
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body>*:last-child {
|
||||||
|
margin-bottom: 0 !important
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body .absent {
|
||||||
|
color: #c00
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body .anchor {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
display: block;
|
||||||
|
padding-right: 6px;
|
||||||
|
padding-left: 30px;
|
||||||
|
margin-left: -30px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body .anchor:focus {
|
||||||
|
outline: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h1,
|
||||||
|
.gist .markdown-body h2,
|
||||||
|
.gist .markdown-body h3,
|
||||||
|
.gist .markdown-body h4,
|
||||||
|
.gist .markdown-body h5,
|
||||||
|
.gist .markdown-body h6 {
|
||||||
|
position: relative;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.4
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h1 .octicon-link,
|
||||||
|
.gist .markdown-body h2 .octicon-link,
|
||||||
|
.gist .markdown-body h3 .octicon-link,
|
||||||
|
.gist .markdown-body h4 .octicon-link,
|
||||||
|
.gist .markdown-body h5 .octicon-link,
|
||||||
|
.gist .markdown-body h6 .octicon-link {
|
||||||
|
display: none;
|
||||||
|
color: #000;
|
||||||
|
vertical-align: middle
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h1:hover .anchor,
|
||||||
|
.gist .markdown-body h2:hover .anchor,
|
||||||
|
.gist .markdown-body h3:hover .anchor,
|
||||||
|
.gist .markdown-body h4:hover .anchor,
|
||||||
|
.gist .markdown-body h5:hover .anchor,
|
||||||
|
.gist .markdown-body h6:hover .anchor {
|
||||||
|
padding-left: 8px;
|
||||||
|
margin-left: -30px;
|
||||||
|
line-height: 1;
|
||||||
|
text-decoration: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h1:hover .anchor .octicon-link,
|
||||||
|
.gist .markdown-body h2:hover .anchor .octicon-link,
|
||||||
|
.gist .markdown-body h3:hover .anchor .octicon-link,
|
||||||
|
.gist .markdown-body h4:hover .anchor .octicon-link,
|
||||||
|
.gist .markdown-body h5:hover .anchor .octicon-link,
|
||||||
|
.gist .markdown-body h6:hover .anchor .octicon-link {
|
||||||
|
display: inline-block
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h1 tt,
|
||||||
|
.gist .markdown-body h1 code,
|
||||||
|
.gist .markdown-body h2 tt,
|
||||||
|
.gist .markdown-body h2 code,
|
||||||
|
.gist .markdown-body h3 tt,
|
||||||
|
.gist .markdown-body h3 code,
|
||||||
|
.gist .markdown-body h4 tt,
|
||||||
|
.gist .markdown-body h4 code,
|
||||||
|
.gist .markdown-body h5 tt,
|
||||||
|
.gist .markdown-body h5 code,
|
||||||
|
.gist .markdown-body h6 tt,
|
||||||
|
.gist .markdown-body h6 code {
|
||||||
|
font-size: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h1 {
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
font-size: 2.25em;
|
||||||
|
line-height: 1.2;
|
||||||
|
border-bottom: 1px solid #eee
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h2 {
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
font-size: 1.75em;
|
||||||
|
line-height: 1.225;
|
||||||
|
border-bottom: 1px solid #eee
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h3 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 1.43
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h4 {
|
||||||
|
font-size: 1.25em
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h5 {
|
||||||
|
font-size: 1em
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body h6 {
|
||||||
|
font-size: 1em;
|
||||||
|
color: #777
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body p,
|
||||||
|
.gist .markdown-body blockquote,
|
||||||
|
.gist .markdown-body ul,
|
||||||
|
.gist .markdown-body ol,
|
||||||
|
.gist .markdown-body dl,
|
||||||
|
.gist .markdown-body table,
|
||||||
|
.gist .markdown-body pre {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body hr {
|
||||||
|
height: 4px;
|
||||||
|
padding: 0;
|
||||||
|
margin: 16px 0;
|
||||||
|
background-color: #e7e7e7;
|
||||||
|
border: 0 none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body ul,
|
||||||
|
.gist .markdown-body ol {
|
||||||
|
padding-left: 2em
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body ul.no-list,
|
||||||
|
.gist .markdown-body ol.no-list {
|
||||||
|
padding: 0;
|
||||||
|
list-style-type: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body ul ul,
|
||||||
|
.gist .markdown-body ul ol,
|
||||||
|
.gist .markdown-body ol ol,
|
||||||
|
.gist .markdown-body ol ul {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body li>p {
|
||||||
|
margin-top: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body dl {
|
||||||
|
padding: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body dl dt {
|
||||||
|
padding: 0;
|
||||||
|
margin-top: 16px;
|
||||||
|
font-size: 1em;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: bold
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body dl dd {
|
||||||
|
padding: 0 16px;
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body blockquote {
|
||||||
|
padding: 0 15px;
|
||||||
|
color: #777;
|
||||||
|
border-left: 4px solid #ddd
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body blockquote>:first-child {
|
||||||
|
margin-top: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body blockquote>:last-child {
|
||||||
|
margin-bottom: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body table {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
word-break: normal;
|
||||||
|
word-break: keep-all
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body table th {
|
||||||
|
font-weight: bold
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body table th,
|
||||||
|
.gist .markdown-body table td {
|
||||||
|
padding: 6px 13px;
|
||||||
|
border: 1px solid #ddd
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body table tr {
|
||||||
|
background-color: #fff;
|
||||||
|
border-top: 1px solid #ccc
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body table tr:nth-child(2n) {
|
||||||
|
background-color: #f8f8f8
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body img {
|
||||||
|
max-width: 100%;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.frame {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.frame>span {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
width: auto;
|
||||||
|
padding: 7px;
|
||||||
|
margin: 13px 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid #ddd
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.frame span img {
|
||||||
|
display: block;
|
||||||
|
float: left
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.frame span span {
|
||||||
|
display: block;
|
||||||
|
padding: 5px 0 0;
|
||||||
|
clear: both;
|
||||||
|
color: #333
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.align-center {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
clear: both
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.align-center>span {
|
||||||
|
display: block;
|
||||||
|
margin: 13px auto 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.align-center span img {
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.align-right {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
clear: both
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.align-right>span {
|
||||||
|
display: block;
|
||||||
|
margin: 13px 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: right
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.align-right span img {
|
||||||
|
margin: 0;
|
||||||
|
text-align: right
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.float-left {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
margin-right: 13px;
|
||||||
|
overflow: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.float-left span {
|
||||||
|
margin: 13px 0 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.float-right {
|
||||||
|
display: block;
|
||||||
|
float: right;
|
||||||
|
margin-left: 13px;
|
||||||
|
overflow: hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body span.float-right>span {
|
||||||
|
display: block;
|
||||||
|
margin: 13px auto 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: right
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body code,
|
||||||
|
.gist .markdown-body tt {
|
||||||
|
padding: 0;
|
||||||
|
padding-top: 0.2em;
|
||||||
|
padding-bottom: 0.2em;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 85%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.04);
|
||||||
|
border-radius: 3px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body code:before,
|
||||||
|
.gist .markdown-body code:after,
|
||||||
|
.gist .markdown-body tt:before,
|
||||||
|
.gist .markdown-body tt:after {
|
||||||
|
letter-spacing: -0.2em;
|
||||||
|
content: "\00a0"
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body code br,
|
||||||
|
.gist .markdown-body tt br {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body del code {
|
||||||
|
text-decoration: inherit
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body pre>code {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
word-break: normal;
|
||||||
|
white-space: pre;
|
||||||
|
background: transparent;
|
||||||
|
border: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body .highlight {
|
||||||
|
margin-bottom: 16px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body .highlight pre,
|
||||||
|
.gist .markdown-body pre {
|
||||||
|
padding: 16px;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 85%;
|
||||||
|
line-height: 1.45;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
border-radius: 3px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body .highlight pre {
|
||||||
|
margin-bottom: 0;
|
||||||
|
word-break: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body pre {
|
||||||
|
word-wrap: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body pre code,
|
||||||
|
.gist .markdown-body pre tt {
|
||||||
|
display: inline;
|
||||||
|
max-width: initial;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
overflow: initial;
|
||||||
|
line-height: inherit;
|
||||||
|
word-wrap: normal;
|
||||||
|
background-color: transparent;
|
||||||
|
border: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body pre code:before,
|
||||||
|
.gist .markdown-body pre code:after,
|
||||||
|
.gist .markdown-body pre tt:before,
|
||||||
|
.gist .markdown-body pre tt:after {
|
||||||
|
content: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .markdown-body kbd {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 3px 5px;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 10px;
|
||||||
|
color: #555;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-color: #fcfcfc;
|
||||||
|
border: solid 1px #ccc;
|
||||||
|
border-bottom-color: #bbb;
|
||||||
|
border-radius: 3px;
|
||||||
|
-webkit-box-shadow: inset 0 -1px 0 #bbb;
|
||||||
|
box-shadow: inset 0 -1px 0 #bbb
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .highlight {
|
||||||
|
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1.4;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: #fff;
|
||||||
|
color: #333
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-c {
|
||||||
|
color: #969896
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-c1,
|
||||||
|
.gist .pl-mdh,
|
||||||
|
.gist .pl-mm,
|
||||||
|
.gist .pl-mp,
|
||||||
|
.gist .pl-mr,
|
||||||
|
.gist .pl-s1 .pl-v,
|
||||||
|
.gist .pl-s3,
|
||||||
|
.gist .pl-sc,
|
||||||
|
.gist .pl-sv {
|
||||||
|
color: #0086b3
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-e,
|
||||||
|
.gist .pl-en {
|
||||||
|
color: #795da3
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-s1 .pl-s2,
|
||||||
|
.gist .pl-smi,
|
||||||
|
.gist .pl-smp,
|
||||||
|
.gist .pl-stj,
|
||||||
|
.gist .pl-vo,
|
||||||
|
.gist .pl-vpf {
|
||||||
|
color: #333
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-ent {
|
||||||
|
color: #63a35c
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-k,
|
||||||
|
.gist .pl-s,
|
||||||
|
.gist .pl-st {
|
||||||
|
color: #a71d5d
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-pds,
|
||||||
|
.gist .pl-s1,
|
||||||
|
.gist .pl-s1 .pl-pse .pl-s2,
|
||||||
|
.gist .pl-sr,
|
||||||
|
.gist .pl-sr .pl-cce,
|
||||||
|
.gist .pl-sr .pl-sra,
|
||||||
|
.gist .pl-sr .pl-sre,
|
||||||
|
.gist .pl-src {
|
||||||
|
color: #df5000
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mo,
|
||||||
|
.gist .pl-v {
|
||||||
|
color: #1d3e81
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-id {
|
||||||
|
color: #b52a1d
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-ii {
|
||||||
|
background-color: #b52a1d;
|
||||||
|
color: #f8f8f8
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-sr .pl-cce {
|
||||||
|
color: #63a35c;
|
||||||
|
font-weight: bold
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-ml {
|
||||||
|
color: #693a17
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mh,
|
||||||
|
.gist .pl-mh .pl-en,
|
||||||
|
.gist .pl-ms {
|
||||||
|
color: #1d3e81;
|
||||||
|
font-weight: bold
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mq {
|
||||||
|
color: #008080
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mi {
|
||||||
|
color: #333;
|
||||||
|
font-style: italic
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mb {
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-md,
|
||||||
|
.gist .pl-mdhf {
|
||||||
|
background-color: #ffecec;
|
||||||
|
color: #bd2c00
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mdht,
|
||||||
|
.gist .pl-mi1 {
|
||||||
|
background-color: #eaffea;
|
||||||
|
color: #55a532
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .pl-mdr {
|
||||||
|
color: #795da3;
|
||||||
|
font-weight: bold
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .render-viewer-error,
|
||||||
|
.gist .render-viewer-fatal,
|
||||||
|
.gist .octospinner {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-render iframe {
|
||||||
|
width: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist pre,
|
||||||
|
.gist code {
|
||||||
|
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace !important;
|
||||||
|
white-space: pre
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-file {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
border-radius: 3px
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-file.gist-render {
|
||||||
|
border: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-meta {
|
||||||
|
padding: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
font: 12px Helvetica, arial, freesans, clean, sans-serif;
|
||||||
|
color: #999;
|
||||||
|
background-color: #f7f7f7
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-meta a {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #666;
|
||||||
|
text-decoration: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-data {
|
||||||
|
overflow: auto;
|
||||||
|
word-wrap: normal;
|
||||||
|
background-color: #fff;
|
||||||
|
border-bottom: 1px solid #ddd
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .file-data {
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.4
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-file.scroll .gist-data {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 30px;
|
||||||
|
left: 0;
|
||||||
|
overflow: scroll
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-file.scroll .gist-meta {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .line-data {
|
||||||
|
padding: .5em !important
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .line-pre {
|
||||||
|
padding: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace !important;
|
||||||
|
font-size: 100% !important;
|
||||||
|
line-height: inherit !important;
|
||||||
|
background: transparent !important;
|
||||||
|
border: 0 !important
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .gist-highlight {
|
||||||
|
background: transparent !important
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .line-numbers {
|
||||||
|
padding: .5em;
|
||||||
|
color: #aaa;
|
||||||
|
text-align: right;
|
||||||
|
background-color: #fff;
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
line-height: 1.4
|
||||||
|
}
|
||||||
|
|
||||||
|
.gist .line-number {
|
||||||
|
display: block;
|
||||||
|
clear: right
|
||||||
|
}
|
3
public/css/github-cdn.css
Normal file
3
public/css/github-cdn.css
Normal file
File diff suppressed because one or more lines are too long
1
public/css/github-code-cdn.css
Normal file
1
public/css/github-code-cdn.css
Normal file
File diff suppressed because one or more lines are too long
12935
public/css/github-code-unminify.css
Normal file
12935
public/css/github-code-unminify.css
Normal file
File diff suppressed because it is too large
Load diff
13772
public/css/github-emoji-unminify.css
Normal file
13772
public/css/github-emoji-unminify.css
Normal file
File diff suppressed because it is too large
Load diff
3
public/css/github-emoji.css
Normal file
3
public/css/github-emoji.css
Normal file
File diff suppressed because one or more lines are too long
345
public/css/github-extract.css
Normal file
345
public/css/github-extract.css
Normal file
|
@ -0,0 +1,345 @@
|
||||||
|
.markdown-body {
|
||||||
|
overflow: hidden;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.6;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
.markdown-body>*:first-child {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
}
|
||||||
|
.markdown-body>*:last-child {
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
.markdown-body .absent {
|
||||||
|
color: #c00;
|
||||||
|
}
|
||||||
|
.markdown-body .anchor {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
display: block;
|
||||||
|
padding-right: 6px;
|
||||||
|
padding-left: 30px;
|
||||||
|
margin-left: -30px;
|
||||||
|
}
|
||||||
|
.markdown-body .anchor:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {
|
||||||
|
position: relative;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
.markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link {
|
||||||
|
display: none;
|
||||||
|
color: #000;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor {
|
||||||
|
padding-left: 8px;
|
||||||
|
margin-left: -30px;
|
||||||
|
line-height: 1;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code {
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
.markdown-body h1 {
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
font-size: 2.25em;
|
||||||
|
line-height: 1.2;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.markdown-body h2 {
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
font-size: 1.75em;
|
||||||
|
line-height: 1.225;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.markdown-body h3 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 1.43;
|
||||||
|
}
|
||||||
|
.markdown-body h4 {
|
||||||
|
font-size: 1.25em;
|
||||||
|
}
|
||||||
|
.markdown-body h5 {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.markdown-body h6 {
|
||||||
|
font-size: 1em;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
.markdown-body hr {
|
||||||
|
height: 4px;
|
||||||
|
padding: 0;
|
||||||
|
margin: 16px 0;
|
||||||
|
background-color: #e7e7e7;
|
||||||
|
border: 0 none;
|
||||||
|
}
|
||||||
|
.markdown-body ul, .markdown-body ol {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
.markdown-body ul.no-list, .markdown-body ol.no-list {
|
||||||
|
padding: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.markdown-body li>p {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
.markdown-body dl {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.markdown-body dl dt {
|
||||||
|
padding: 0;
|
||||||
|
margin-top: 16px;
|
||||||
|
font-size: 1em;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.markdown-body dl dd {
|
||||||
|
padding: 0 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
.markdown-body blockquote {
|
||||||
|
padding: 0 15px;
|
||||||
|
color: #777;
|
||||||
|
border-left: 4px solid #ddd;
|
||||||
|
}
|
||||||
|
.markdown-body blockquote>:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.markdown-body blockquote>:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.markdown-body table {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
word-break: normal;
|
||||||
|
word-break: keep-all;
|
||||||
|
}
|
||||||
|
.markdown-body table th {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.markdown-body table th, .markdown-body table td {
|
||||||
|
padding: 6px 13px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.markdown-body table tr {
|
||||||
|
background-color: #fff;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
.markdown-body table tr:nth-child(2n) {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
}
|
||||||
|
.markdown-body img {
|
||||||
|
max-width: 100%;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.markdown-body .emoji {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
max-width: none;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.markdown-body span.frame {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.markdown-body span.frame>span {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
width: auto;
|
||||||
|
padding: 7px;
|
||||||
|
margin: 13px 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
.markdown-body span.frame span img {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.markdown-body span.frame span span {
|
||||||
|
display: block;
|
||||||
|
padding: 5px 0 0;
|
||||||
|
clear: both;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.markdown-body span.align-center {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
.markdown-body span.align-center>span {
|
||||||
|
display: block;
|
||||||
|
margin: 13px auto 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.markdown-body span.align-center span img {
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.markdown-body span.align-right {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
.markdown-body span.align-right>span {
|
||||||
|
display: block;
|
||||||
|
margin: 13px 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.markdown-body span.align-right span img {
|
||||||
|
margin: 0;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.markdown-body span.float-left {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
margin-right: 13px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.markdown-body span.float-left span {
|
||||||
|
margin: 13px 0 0;
|
||||||
|
}
|
||||||
|
.markdown-body span.float-right {
|
||||||
|
display: block;
|
||||||
|
float: right;
|
||||||
|
margin-left: 13px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.markdown-body span.float-right>span {
|
||||||
|
display: block;
|
||||||
|
margin: 13px auto 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.markdown-body code, .markdown-body tt {
|
||||||
|
padding: 0;
|
||||||
|
padding-top: 0.2em;
|
||||||
|
padding-bottom: 0.2em;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 85%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.04);
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.markdown-body code:before, .markdown-body code:after, .markdown-body tt:before, .markdown-body tt:after {
|
||||||
|
letter-spacing: -0.2em;
|
||||||
|
content: "\00a0"}
|
||||||
|
.markdown-body code br, .markdown-body tt br {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.markdown-body del code {
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
.markdown-body pre>code {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
word-break: normal;
|
||||||
|
white-space: pre;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.markdown-body .highlight {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
.markdown-body .highlight pre, .markdown-body pre {
|
||||||
|
padding: 16px;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 85%;
|
||||||
|
line-height: 1.45;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.markdown-body .highlight pre {
|
||||||
|
margin-bottom: 0;
|
||||||
|
word-break: normal;
|
||||||
|
}
|
||||||
|
.markdown-body pre {
|
||||||
|
word-wrap: normal;
|
||||||
|
}
|
||||||
|
.markdown-body pre code, .markdown-body pre tt {
|
||||||
|
display: inline;
|
||||||
|
max-width: initial;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
overflow: initial;
|
||||||
|
line-height: inherit;
|
||||||
|
word-wrap: normal;
|
||||||
|
background-color: transparent;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.markdown-body pre code:before, .markdown-body pre code:after, .markdown-body pre tt:before, .markdown-body pre tt:after {
|
||||||
|
content: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .csv-data td, .markdown-body .csv-data th {
|
||||||
|
padding: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1;
|
||||||
|
text-align: left;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.markdown-body .csv-data .blob-line-num {
|
||||||
|
padding: 10px 8px 9px;
|
||||||
|
text-align: right;
|
||||||
|
background: #fff;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
.markdown-body .csv-data tr {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
.markdown-body .csv-data th {
|
||||||
|
font-weight: bold;
|
||||||
|
background: #f8f8f8;
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.news .alert .markdown-body blockquote {
|
||||||
|
padding: 0 0 0 40px;
|
||||||
|
border: 0 none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-tab .news .markdown-body blockquote, .activity-tab .news .alert .commits {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.task-list-item {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
.task-list-item label {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.task-list-item.enabled label {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.task-list-item+.task-list-item {
|
||||||
|
margin-top: 3px;
|
||||||
|
}
|
||||||
|
.task-list-item-checkbox {
|
||||||
|
float: left;
|
||||||
|
margin: 0.4em 0 0.2em -1.3em !important;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: default !important;
|
||||||
|
}
|
625
public/css/github-markdown.css
Executable file
625
public/css/github-markdown.css
Executable file
|
@ -0,0 +1,625 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: octicons-anchor;
|
||||||
|
src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAYcAA0AAAAACjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca8vGTk9TLzIAAAFMAAAARAAAAFZG1VHVY21hcAAAAZAAAAA+AAABQgAP9AdjdnQgAAAB0AAAAAQAAAAEACICiGdhc3AAAAHUAAAACAAAAAj//wADZ2x5ZgAAAdwAAADRAAABEKyikaNoZWFkAAACsAAAAC0AAAA2AtXoA2hoZWEAAALgAAAAHAAAACQHngNFaG10eAAAAvwAAAAQAAAAEAwAACJsb2NhAAADDAAAAAoAAAAKALIAVG1heHAAAAMYAAAAHwAAACABEAB2bmFtZQAAAzgAAALBAAAFu3I9x/Nwb3N0AAAF/AAAAB0AAAAvaoFvbwAAAAEAAAAAzBdyYwAAAADP2IQvAAAAAM/bz7t4nGNgZGFgnMDAysDB1Ml0hoGBoR9CM75mMGLkYGBgYmBlZsAKAtJcUxgcPsR8iGF2+O/AEMPsznAYKMwIkgMA5REMOXicY2BgYGaAYBkGRgYQsAHyGMF8FgYFIM0ChED+h5j//yEk/3KoSgZGNgYYk4GRCUgwMaACRoZhDwCs7QgGAAAAIgKIAAAAAf//AAJ4nHWMMQrCQBBF/0zWrCCIKUQsTDCL2EXMohYGSSmorScInsRGL2DOYJe0Ntp7BK+gJ1BxF1stZvjz/v8DRghQzEc4kIgKwiAppcA9LtzKLSkdNhKFY3HF4lK69ExKslx7Xa+vPRVS43G98vG1DnkDMIBUgFN0MDXflU8tbaZOUkXUH0+U27RoRpOIyCKjbMCVejwypzJJG4jIwb43rfl6wbwanocrJm9XFYfskuVC5K/TPyczNU7b84CXcbxks1Un6H6tLH9vf2LRnn8Ax7A5WQAAAHicY2BkYGAA4teL1+yI57f5ysDNwgAC529f0kOmWRiYVgEpDgYmEA8AUzEKsQAAAHicY2BkYGB2+O/AEMPCAAJAkpEBFbAAADgKAe0EAAAiAAAAAAQAAAAEAAAAAAAAKgAqACoAiAAAeJxjYGRgYGBhsGFgYgABEMkFhAwM/xn0QAIAD6YBhwB4nI1Ty07cMBS9QwKlQapQW3VXySvEqDCZGbGaHULiIQ1FKgjWMxknMfLEke2A+IJu+wntrt/QbVf9gG75jK577Lg8K1qQPCfnnnt8fX1NRC/pmjrk/zprC+8D7tBy9DHgBXoWfQ44Av8t4Bj4Z8CLtBL9CniJluPXASf0Lm4CXqFX8Q84dOLnMB17N4c7tBo1AS/Qi+hTwBH4rwHHwN8DXqQ30XXAS7QaLwSc0Gn8NuAVWou/gFmnjLrEaEh9GmDdDGgL3B4JsrRPDU2hTOiMSuJUIdKQQayiAth69r6akSSFqIJuA19TrzCIaY8sIoxyrNIrL//pw7A2iMygkX5vDj+G+kuoLdX4GlGK/8Lnlz6/h9MpmoO9rafrz7ILXEHHaAx95s9lsI7AHNMBWEZHULnfAXwG9/ZqdzLI08iuwRloXE8kfhXYAvE23+23DU3t626rbs8/8adv+9DWknsHp3E17oCf+Z48rvEQNZ78paYM38qfk3v/u3l3u3GXN2Dmvmvpf1Srwk3pB/VSsp512bA/GG5i2WJ7wu430yQ5K3nFGiOqgtmSB5pJVSizwaacmUZzZhXLlZTq8qGGFY2YcSkqbth6aW1tRmlaCFs2016m5qn36SbJrqosG4uMV4aP2PHBmB3tjtmgN2izkGQyLWprekbIntJFing32a5rKWCN/SdSoga45EJykyQ7asZvHQ8PTm6cslIpwyeyjbVltNikc2HTR7YKh9LBl9DADC0U/jLcBZDKrMhUBfQBvXRzLtFtjU9eNHKin0x5InTqb8lNpfKv1s1xHzTXRqgKzek/mb7nB8RZTCDhGEX3kK/8Q75AmUM/eLkfA+0Hi908Kx4eNsMgudg5GLdRD7a84npi+YxNr5i5KIbW5izXas7cHXIMAau1OueZhfj+cOcP3P8MNIWLyYOBuxL6DRylJ4cAAAB4nGNgYoAALjDJyIAOWMCiTIxMLDmZedkABtIBygAAAA==) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body {
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
color: #333;
|
||||||
|
overflow: hidden;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.6;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body a {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body a:active,
|
||||||
|
.markdown-body a:hover {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 0.67em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body hr {
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code,
|
||||||
|
.markdown-body kbd,
|
||||||
|
.markdown-body pre {
|
||||||
|
font-family: monospace, monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body input {
|
||||||
|
color: inherit;
|
||||||
|
font: inherit;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body html input[disabled] {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body input {
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body input[type="checkbox"] {
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body td,
|
||||||
|
.markdown-body th {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body * {
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body input {
|
||||||
|
font: 13px/1.4 Helvetica, arial, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body a {
|
||||||
|
color: #4183c4;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body a:hover,
|
||||||
|
.markdown-body a:focus,
|
||||||
|
.markdown-body a:active {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body hr {
|
||||||
|
height: 0;
|
||||||
|
margin: 15px 0;
|
||||||
|
overflow: hidden;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body hr:before {
|
||||||
|
display: table;
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body hr:after {
|
||||||
|
display: table;
|
||||||
|
clear: both;
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1,
|
||||||
|
.markdown-body h2,
|
||||||
|
.markdown-body h3,
|
||||||
|
.markdown-body h4,
|
||||||
|
.markdown-body h5,
|
||||||
|
.markdown-body h6 {
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1 {
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h2 {
|
||||||
|
font-size: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h5 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h6 {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body blockquote {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body ul,
|
||||||
|
.markdown-body ol {
|
||||||
|
padding: 0;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body ol ol,
|
||||||
|
.markdown-body ul ol {
|
||||||
|
list-style-type: lower-roman;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body ul ul ol,
|
||||||
|
.markdown-body ul ol ol,
|
||||||
|
.markdown-body ol ul ol,
|
||||||
|
.markdown-body ol ol ol {
|
||||||
|
list-style-type: lower-alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body dd {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code {
|
||||||
|
font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .octicon {
|
||||||
|
font: normal normal 16px octicons-anchor;
|
||||||
|
line-height: 1;
|
||||||
|
display: inline-block;
|
||||||
|
text-decoration: none;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .octicon-link:before {
|
||||||
|
content: '\f05c';
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body>*:first-child {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body>*:last-child {
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .anchor {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
display: block;
|
||||||
|
padding-right: 6px;
|
||||||
|
padding-left: 30px;
|
||||||
|
margin-left: -30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .anchor:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1,
|
||||||
|
.markdown-body h2,
|
||||||
|
.markdown-body h3,
|
||||||
|
.markdown-body h4,
|
||||||
|
.markdown-body h5,
|
||||||
|
.markdown-body h6 {
|
||||||
|
position: relative;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1 .octicon-link,
|
||||||
|
.markdown-body h2 .octicon-link,
|
||||||
|
.markdown-body h3 .octicon-link,
|
||||||
|
.markdown-body h4 .octicon-link,
|
||||||
|
.markdown-body h5 .octicon-link,
|
||||||
|
.markdown-body h6 .octicon-link {
|
||||||
|
display: none;
|
||||||
|
color: #000;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1:hover .anchor,
|
||||||
|
.markdown-body h2:hover .anchor,
|
||||||
|
.markdown-body h3:hover .anchor,
|
||||||
|
.markdown-body h4:hover .anchor,
|
||||||
|
.markdown-body h5:hover .anchor,
|
||||||
|
.markdown-body h6:hover .anchor {
|
||||||
|
padding-left: 8px;
|
||||||
|
margin-left: -30px;
|
||||||
|
line-height: 1;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1:hover .anchor .octicon-link,
|
||||||
|
.markdown-body h2:hover .anchor .octicon-link,
|
||||||
|
.markdown-body h3:hover .anchor .octicon-link,
|
||||||
|
.markdown-body h4:hover .anchor .octicon-link,
|
||||||
|
.markdown-body h5:hover .anchor .octicon-link,
|
||||||
|
.markdown-body h6:hover .anchor .octicon-link {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h1 {
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
font-size: 2.25em;
|
||||||
|
line-height: 1.2;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h2 {
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
font-size: 1.75em;
|
||||||
|
line-height: 1.225;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h3 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
line-height: 1.43;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h4 {
|
||||||
|
font-size: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h5 {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body h6 {
|
||||||
|
font-size: 1em;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body p,
|
||||||
|
.markdown-body blockquote,
|
||||||
|
.markdown-body ul,
|
||||||
|
.markdown-body ol,
|
||||||
|
.markdown-body dl,
|
||||||
|
.markdown-body table,
|
||||||
|
.markdown-body pre {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body hr {
|
||||||
|
height: 4px;
|
||||||
|
padding: 0;
|
||||||
|
margin: 16px 0;
|
||||||
|
background-color: #e7e7e7;
|
||||||
|
border: 0 none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body ul,
|
||||||
|
.markdown-body ol {
|
||||||
|
padding-left: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body ul ul,
|
||||||
|
.markdown-body ul ol,
|
||||||
|
.markdown-body ol ol,
|
||||||
|
.markdown-body ol ul {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body li>p {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body dl {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body dl dt {
|
||||||
|
padding: 0;
|
||||||
|
margin-top: 16px;
|
||||||
|
font-size: 1em;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body dl dd {
|
||||||
|
padding: 0 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body blockquote {
|
||||||
|
padding: 0 15px;
|
||||||
|
color: #777;
|
||||||
|
border-left: 4px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body blockquote>:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body blockquote>:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
word-break: normal;
|
||||||
|
word-break: keep-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table th {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table th,
|
||||||
|
.markdown-body table td {
|
||||||
|
padding: 6px 13px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table tr {
|
||||||
|
background-color: #fff;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body table tr:nth-child(2n) {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body img {
|
||||||
|
max-width: 100%;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code {
|
||||||
|
padding: 0;
|
||||||
|
padding-top: 0.2em;
|
||||||
|
padding-bottom: 0.2em;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 85%;
|
||||||
|
background-color: rgba(0,0,0,0.04);
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code:before,
|
||||||
|
.markdown-body code:after {
|
||||||
|
letter-spacing: -0.2em;
|
||||||
|
content: "\00a0";
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre>code {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
word-break: normal;
|
||||||
|
white-space: pre;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .highlight {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .highlight pre,
|
||||||
|
.markdown-body pre {
|
||||||
|
padding: 16px;
|
||||||
|
overflow: auto;
|
||||||
|
font-size: 85%;
|
||||||
|
line-height: 1.45;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .highlight pre {
|
||||||
|
margin-bottom: 0;
|
||||||
|
word-break: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre {
|
||||||
|
word-wrap: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre code {
|
||||||
|
display: inline;
|
||||||
|
max-width: initial;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
overflow: initial;
|
||||||
|
line-height: inherit;
|
||||||
|
word-wrap: normal;
|
||||||
|
background-color: transparent;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre code:before,
|
||||||
|
.markdown-body pre code:after {
|
||||||
|
content: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-c {
|
||||||
|
color: #969896;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-c1,
|
||||||
|
.markdown-body .pl-mdh,
|
||||||
|
.markdown-body .pl-mm,
|
||||||
|
.markdown-body .pl-mp,
|
||||||
|
.markdown-body .pl-mr,
|
||||||
|
.markdown-body .pl-s1 .pl-v,
|
||||||
|
.markdown-body .pl-s3,
|
||||||
|
.markdown-body .pl-sc,
|
||||||
|
.markdown-body .pl-sv {
|
||||||
|
color: #0086b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-e,
|
||||||
|
.markdown-body .pl-en {
|
||||||
|
color: #795da3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-s1 .pl-s2,
|
||||||
|
.markdown-body .pl-smi,
|
||||||
|
.markdown-body .pl-smp,
|
||||||
|
.markdown-body .pl-stj,
|
||||||
|
.markdown-body .pl-vo,
|
||||||
|
.markdown-body .pl-vpf {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-ent {
|
||||||
|
color: #63a35c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-k,
|
||||||
|
.markdown-body .pl-s,
|
||||||
|
.markdown-body .pl-st {
|
||||||
|
color: #a71d5d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-pds,
|
||||||
|
.markdown-body .pl-s1,
|
||||||
|
.markdown-body .pl-s1 .pl-pse .pl-s2,
|
||||||
|
.markdown-body .pl-sr,
|
||||||
|
.markdown-body .pl-sr .pl-cce,
|
||||||
|
.markdown-body .pl-sr .pl-sra,
|
||||||
|
.markdown-body .pl-sr .pl-sre,
|
||||||
|
.markdown-body .pl-src,
|
||||||
|
.markdown-body .pl-v {
|
||||||
|
color: #df5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-id {
|
||||||
|
color: #b52a1d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-ii {
|
||||||
|
background-color: #b52a1d;
|
||||||
|
color: #f8f8f8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-sr .pl-cce {
|
||||||
|
color: #63a35c;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-ml {
|
||||||
|
color: #693a17;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mh,
|
||||||
|
.markdown-body .pl-mh .pl-en,
|
||||||
|
.markdown-body .pl-ms {
|
||||||
|
color: #1d3e81;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mq {
|
||||||
|
color: #008080;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mi {
|
||||||
|
color: #333;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mb {
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-md,
|
||||||
|
.markdown-body .pl-mdhf {
|
||||||
|
background-color: #ffecec;
|
||||||
|
color: #bd2c00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mdht,
|
||||||
|
.markdown-body .pl-mi1 {
|
||||||
|
background-color: #eaffea;
|
||||||
|
color: #55a532;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mdr {
|
||||||
|
color: #795da3;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .pl-mo {
|
||||||
|
color: #1d3e81;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body kbd {
|
||||||
|
background-color: #e7e7e7;
|
||||||
|
background-image: -webkit-linear-gradient(#fefefe, #e7e7e7);
|
||||||
|
background-image: linear-gradient(#fefefe, #e7e7e7);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 3px 5px;
|
||||||
|
font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
line-height: 10px;
|
||||||
|
color: #000;
|
||||||
|
border: 1px solid #cfcfcf;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .task-list-item {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .task-list-item+.task-list-item {
|
||||||
|
margin-top: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .task-list-item input {
|
||||||
|
float: left;
|
||||||
|
margin: 0.3em 0 0.25em -1.6em;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body :checked+.radio-label {
|
||||||
|
z-index: 1;
|
||||||
|
position: relative;
|
||||||
|
border-color: #4183c4;
|
||||||
|
}
|
10670
public/css/github-unminify.css
Normal file
10670
public/css/github-unminify.css
Normal file
File diff suppressed because it is too large
Load diff
277
public/css/github.css
Normal file
277
public/css/github.css
Normal file
|
@ -0,0 +1,277 @@
|
||||||
|
body {
|
||||||
|
font-family: Helvetica, arial, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.6;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
background-color: white;
|
||||||
|
padding: 30px; }
|
||||||
|
|
||||||
|
body > *:first-child {
|
||||||
|
margin-top: 0 !important; }
|
||||||
|
body > *:last-child {
|
||||||
|
margin-bottom: 0 !important; }
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #4183C4; }
|
||||||
|
a.absent {
|
||||||
|
color: #cc0000; }
|
||||||
|
a.anchor {
|
||||||
|
display: block;
|
||||||
|
padding-left: 30px;
|
||||||
|
margin-left: -30px;
|
||||||
|
cursor: pointer;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0; }
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
margin: 20px 0 10px;
|
||||||
|
padding: 0;
|
||||||
|
font-weight: bold;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
cursor: text;
|
||||||
|
position: relative; }
|
||||||
|
|
||||||
|
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
|
||||||
|
background: url("../../images/modules/styleguide/para.png") no-repeat 10px center;
|
||||||
|
text-decoration: none; }
|
||||||
|
|
||||||
|
h1 tt, h1 code {
|
||||||
|
font-size: inherit; }
|
||||||
|
|
||||||
|
h2 tt, h2 code {
|
||||||
|
font-size: inherit; }
|
||||||
|
|
||||||
|
h3 tt, h3 code {
|
||||||
|
font-size: inherit; }
|
||||||
|
|
||||||
|
h4 tt, h4 code {
|
||||||
|
font-size: inherit; }
|
||||||
|
|
||||||
|
h5 tt, h5 code {
|
||||||
|
font-size: inherit; }
|
||||||
|
|
||||||
|
h6 tt, h6 code {
|
||||||
|
font-size: inherit; }
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 28px;
|
||||||
|
color: black; }
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 24px;
|
||||||
|
border-bottom: 1px solid #cccccc;
|
||||||
|
color: black; }
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 18px; }
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 16px; }
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
font-size: 14px; }
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
color: #777777;
|
||||||
|
font-size: 14px; }
|
||||||
|
|
||||||
|
p, blockquote, ul, ol, dl, li, table, pre {
|
||||||
|
margin: 15px 0; }
|
||||||
|
|
||||||
|
hr {
|
||||||
|
background: transparent url("../../images/modules/pulls/dirty-shade.png") repeat-x 0 0;
|
||||||
|
border: 0 none;
|
||||||
|
color: #cccccc;
|
||||||
|
height: 4px;
|
||||||
|
padding: 0; }
|
||||||
|
|
||||||
|
body > h2:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0; }
|
||||||
|
body > h1:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0; }
|
||||||
|
body > h1:first-child + h2 {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0; }
|
||||||
|
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0; }
|
||||||
|
|
||||||
|
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0; }
|
||||||
|
|
||||||
|
h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
|
||||||
|
margin-top: 0; }
|
||||||
|
|
||||||
|
li p.first {
|
||||||
|
display: inline-block; }
|
||||||
|
|
||||||
|
ul, ol {
|
||||||
|
padding-left: 30px; }
|
||||||
|
|
||||||
|
ul :first-child, ol :first-child {
|
||||||
|
margin-top: 0; }
|
||||||
|
|
||||||
|
ul :last-child, ol :last-child {
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
dl {
|
||||||
|
padding: 0; }
|
||||||
|
dl dt {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: italic;
|
||||||
|
padding: 0;
|
||||||
|
margin: 15px 0 5px; }
|
||||||
|
dl dt:first-child {
|
||||||
|
padding: 0; }
|
||||||
|
dl dt > :first-child {
|
||||||
|
margin-top: 0; }
|
||||||
|
dl dt > :last-child {
|
||||||
|
margin-bottom: 0; }
|
||||||
|
dl dd {
|
||||||
|
margin: 0 0 15px;
|
||||||
|
padding: 0 15px; }
|
||||||
|
dl dd > :first-child {
|
||||||
|
margin-top: 0; }
|
||||||
|
dl dd > :last-child {
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
border-left: 4px solid #dddddd;
|
||||||
|
padding: 0 15px;
|
||||||
|
color: #777777; }
|
||||||
|
blockquote > :first-child {
|
||||||
|
margin-top: 0; }
|
||||||
|
blockquote > :last-child {
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
table {
|
||||||
|
padding: 0; }
|
||||||
|
table tr {
|
||||||
|
border-top: 1px solid #cccccc;
|
||||||
|
background-color: white;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0; }
|
||||||
|
table tr:nth-child(2n) {
|
||||||
|
background-color: #f8f8f8; }
|
||||||
|
table tr th {
|
||||||
|
font-weight: bold;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
text-align: left;
|
||||||
|
margin: 0;
|
||||||
|
padding: 6px 13px; }
|
||||||
|
table tr td {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
text-align: left;
|
||||||
|
margin: 0;
|
||||||
|
padding: 6px 13px; }
|
||||||
|
table tr th :first-child, table tr td :first-child {
|
||||||
|
margin-top: 0; }
|
||||||
|
table tr th :last-child, table tr td :last-child {
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%; }
|
||||||
|
|
||||||
|
span.frame {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden; }
|
||||||
|
span.frame > span {
|
||||||
|
border: 1px solid #dddddd;
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 13px 0 0;
|
||||||
|
padding: 7px;
|
||||||
|
width: auto; }
|
||||||
|
span.frame span img {
|
||||||
|
display: block;
|
||||||
|
float: left; }
|
||||||
|
span.frame span span {
|
||||||
|
clear: both;
|
||||||
|
color: #333333;
|
||||||
|
display: block;
|
||||||
|
padding: 5px 0 0; }
|
||||||
|
span.align-center {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
clear: both; }
|
||||||
|
span.align-center > span {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 13px auto 0;
|
||||||
|
text-align: center; }
|
||||||
|
span.align-center span img {
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center; }
|
||||||
|
span.align-right {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
clear: both; }
|
||||||
|
span.align-right > span {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 13px 0 0;
|
||||||
|
text-align: right; }
|
||||||
|
span.align-right span img {
|
||||||
|
margin: 0;
|
||||||
|
text-align: right; }
|
||||||
|
span.float-left {
|
||||||
|
display: block;
|
||||||
|
margin-right: 13px;
|
||||||
|
overflow: hidden;
|
||||||
|
float: left; }
|
||||||
|
span.float-left span {
|
||||||
|
margin: 13px 0 0; }
|
||||||
|
span.float-right {
|
||||||
|
display: block;
|
||||||
|
margin-left: 13px;
|
||||||
|
overflow: hidden;
|
||||||
|
float: right; }
|
||||||
|
span.float-right > span {
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 13px auto 0;
|
||||||
|
text-align: right; }
|
||||||
|
|
||||||
|
code, tt {
|
||||||
|
margin: 0 2px;
|
||||||
|
padding: 0 5px;
|
||||||
|
white-space: nowrap;
|
||||||
|
border: 1px solid #eaeaea;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border-radius: 3px; }
|
||||||
|
|
||||||
|
pre code {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
white-space: pre;
|
||||||
|
border: none;
|
||||||
|
background: transparent; }
|
||||||
|
|
||||||
|
.highlight pre {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 19px;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border-radius: 3px; }
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 19px;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border-radius: 3px; }
|
||||||
|
pre code, pre tt {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none; }
|
108
public/css/index.css
Normal file
108
public/css/index.css
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
@import url(https://fonts.googleapis.com/css?family=Source+Code+Pro&subset=latin,latin-ext);
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
max-width: inherit;
|
||||||
|
min-width: 200px;
|
||||||
|
height: 100%;
|
||||||
|
/*margin-right: 15px;*/
|
||||||
|
padding-top: 50px;
|
||||||
|
/*overflow: hidden;*/
|
||||||
|
}
|
||||||
|
html,
|
||||||
|
form,
|
||||||
|
.row,
|
||||||
|
.row > * {
|
||||||
|
height: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
.CodeMirror {
|
||||||
|
font-family: 'Source Code Pro', Consolas, monaco, monospace;
|
||||||
|
line-height: 18px;
|
||||||
|
font-size: 16px;
|
||||||
|
height: auto;
|
||||||
|
min-height: 100%;
|
||||||
|
overflow-y: hidden !important;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
.CodeMirror-scroll {
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
overflow-y: auto !important;
|
||||||
|
}
|
||||||
|
.CodeMirror-code {
|
||||||
|
padding-bottom: 100px;
|
||||||
|
}
|
||||||
|
.CodeMirror-linenumber {
|
||||||
|
opacity: 0.5;
|
||||||
|
width: 29px;
|
||||||
|
}
|
||||||
|
.CodeMirror-matchingtag {
|
||||||
|
background: rgba(255, 255, 255, .1);
|
||||||
|
line-height: 1em;
|
||||||
|
}
|
||||||
|
.CodeMirror-foldmarker {
|
||||||
|
color: #d0d0d0;
|
||||||
|
text-shadow: none;
|
||||||
|
font-family: arial;
|
||||||
|
line-height: .3;
|
||||||
|
cursor: pointer;
|
||||||
|
margin: 2px;
|
||||||
|
}
|
||||||
|
.row {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.ui-edit-area {
|
||||||
|
/*padding-left: 15px;*/
|
||||||
|
padding-left: 0 !important;
|
||||||
|
padding-right: 0 !important;
|
||||||
|
}
|
||||||
|
.ui-view-area {
|
||||||
|
/*overflow-y: scroll;*/
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
.ui-scrollable {
|
||||||
|
height: 100%;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.ui-status * {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.nav-status .ui-status * {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.nav-mobile {
|
||||||
|
position: relative;
|
||||||
|
margin-top: 8px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
.nav-status {
|
||||||
|
float: right !important;
|
||||||
|
padding: 7px 8px;
|
||||||
|
}
|
||||||
|
.ui-status {
|
||||||
|
min-width: 120px;
|
||||||
|
}
|
||||||
|
.ui-short-status {
|
||||||
|
min-width: 40px;
|
||||||
|
}
|
||||||
|
.navbar-right {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.other-cursors {
|
||||||
|
position:relative;
|
||||||
|
z-index:3;
|
||||||
|
}
|
||||||
|
.other-cursor {
|
||||||
|
width: 0px;
|
||||||
|
position: absolute;
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
.fixfixed .navbar-fixed-top {
|
||||||
|
position: absolute !important;
|
||||||
|
}
|
||||||
|
div[contenteditable]:empty:not(:focus):before{
|
||||||
|
content:attr(data-ph);
|
||||||
|
color: gray;
|
||||||
|
}
|
89
public/css/markdown.css
Normal file
89
public/css/markdown.css
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/* for markdown-body */
|
||||||
|
|
||||||
|
.markdown-body {
|
||||||
|
padding-top: 40px;
|
||||||
|
padding-bottom: 40px;
|
||||||
|
max-width: 758px;
|
||||||
|
}
|
||||||
|
/*fixed style for bootstrap comflict*/
|
||||||
|
|
||||||
|
.markdown-body pre {
|
||||||
|
border: inherit !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code {
|
||||||
|
color: inherit !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre code .wrapper {
|
||||||
|
display: -webkit-inline-flex;
|
||||||
|
display: -moz-inline-flex;
|
||||||
|
display: -ms-inline-flex;
|
||||||
|
display: -o-inline-flex;
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre code .gutter {
|
||||||
|
float: left;
|
||||||
|
overflow: hidden;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre code .gutter .linenumber {
|
||||||
|
text-align: right;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
float: right;
|
||||||
|
cursor: default;
|
||||||
|
z-index: 4;
|
||||||
|
padding: 0 8px 0 0;
|
||||||
|
min-width: 20px;
|
||||||
|
box-sizing: content-box;
|
||||||
|
color: #afafaf !important;
|
||||||
|
border-right: 3px solid #6ce26c !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body pre code .code {
|
||||||
|
float: left;
|
||||||
|
margin: 0 0 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .gist .line-numbers {
|
||||||
|
border-left: none;
|
||||||
|
border-top: none;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .gist .line-data {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .gist table {
|
||||||
|
border-spacing: 0;
|
||||||
|
border-collapse: inherit !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code[data-gist-id] {
|
||||||
|
background: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code[data-gist-id]:before {
|
||||||
|
content: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body code[data-gist-id]:after {
|
||||||
|
content: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-body .sequence-diagram, .markdown-body .flow-chart {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.markdown-body .flow-chart {
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
svg {
|
||||||
|
width: 100%;
|
||||||
|
max-height: 70vh;
|
||||||
|
}
|
15
public/css/site.css
Normal file
15
public/css/site.css
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
/* for all pages should include this */
|
||||||
|
body {
|
||||||
|
font-smoothing: subpixel-antialiased !important;
|
||||||
|
-webkit-font-smoothing: subpixel-antialiased !important;
|
||||||
|
-moz-osx-font-smoothing: auto !important;
|
||||||
|
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.004);
|
||||||
|
/*text-rendering: optimizeLegibility;*/
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
:focus {
|
||||||
|
outline: none !important;
|
||||||
|
}
|
||||||
|
::-moz-focus-inner {
|
||||||
|
border: 0 !important;
|
||||||
|
}
|
3
public/default.md
Normal file
3
public/default.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Untitled
|
||||||
|
===
|
||||||
|
Markdown tutorial: https://help.github.com/articles/markdown-basics/
|
BIN
public/favicon.png
Normal file
BIN
public/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
332
public/features.md
Normal file
332
public/features.md
Normal file
|
@ -0,0 +1,332 @@
|
||||||
|
Features
|
||||||
|
===
|
||||||
|
### Embed HackMD
|
||||||
|
```html
|
||||||
|
<iframe width="100%" height="500" src="http://hackmd.herokuapp.com/features" frameborder="0">
|
||||||
|
</iframe>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Emoji
|
||||||
|
:smile: :smiley: :cry:
|
||||||
|
|
||||||
|
### Todo List
|
||||||
|
- [ ] Not
|
||||||
|
- [ ] No yet
|
||||||
|
- asd
|
||||||
|
- [ ] right away
|
||||||
|
- [x] Done
|
||||||
|
- Test
|
||||||
|
- [x] yes
|
||||||
|
- asd
|
||||||
|
- [x] cool
|
||||||
|
- Test
|
||||||
|
- asd
|
||||||
|
- qwe
|
||||||
|
- vgfhddfgh
|
||||||
|
- jhlkj
|
||||||
|
- jkhkjh
|
||||||
|
- kjhgkh
|
||||||
|
- gkjhgkj
|
||||||
|
|
||||||
|
### Code Highlighting
|
||||||
|
```javascript
|
||||||
|
var s = "JavaScript syntax highlighting";
|
||||||
|
alert(s);
|
||||||
|
function $initHighlight(block, cls) {
|
||||||
|
try {
|
||||||
|
if (cls.search(/\bno\-highlight\b/) != -1)
|
||||||
|
return process(block, true, 0x0F) +
|
||||||
|
' class=""';
|
||||||
|
} catch (e) {
|
||||||
|
/* handle exception */
|
||||||
|
}
|
||||||
|
for (var i = 0 / 2; i < classes.length; i++) {
|
||||||
|
if (checkCondition(classes[i]) === undefined)
|
||||||
|
return /\d+[\s/]/g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
#### with line number
|
||||||
|
> add '=' after the code block lang
|
||||||
|
|
||||||
|
```javascript=
|
||||||
|
var s = "JavaScript syntax highlighting";
|
||||||
|
alert(s);
|
||||||
|
function $initHighlight(block, cls) {
|
||||||
|
try {
|
||||||
|
if (cls.search(/\bno\-highlight\b/) != -1)
|
||||||
|
return process(block, true, 0x0F) +
|
||||||
|
' class=""';
|
||||||
|
} catch (e) {
|
||||||
|
/* handle exception */
|
||||||
|
}
|
||||||
|
for (var i = 0 / 2; i < classes.length; i++) {
|
||||||
|
if (checkCondition(classes[i]) === undefined)
|
||||||
|
return /\d+[\s/]/g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
smartList
|
||||||
|
---
|
||||||
|
#### cool
|
||||||
|
|
||||||
|
* XD
|
||||||
|
* QQ
|
||||||
|
|
||||||
|
|
||||||
|
1. yes
|
||||||
|
2. no
|
||||||
|
|
||||||
|
smartypants
|
||||||
|
---
|
||||||
|
- "asd"
|
||||||
|
- --asd
|
||||||
|
- asd---
|
||||||
|
|
||||||
|
Table
|
||||||
|
---
|
||||||
|
First Header | Second Header
|
||||||
|
------------- | -------------
|
||||||
|
Content Cell | Content Cell
|
||||||
|
Content Cell | Content Cell
|
||||||
|
|
||||||
|
First Header | Second Header
|
||||||
|
------------- | -------------
|
||||||
|
|
||||||
|
Image
|
||||||
|
---
|
||||||
|
![](http://cached.imagescaler.hbpl.co.uk/resize/scaleWidth/620/offlinehbpl.hbpl.co.uk/news/OKM/bubblescropped-20141024090315599.png)
|
||||||
|
|
||||||
|
Video
|
||||||
|
---
|
||||||
|
#### Youtube
|
||||||
|
|
||||||
|
{%youtube 1G4isv_Fylg %}
|
||||||
|
|
||||||
|
#### Vimeo
|
||||||
|
|
||||||
|
{%vimeo 124148255 %}
|
||||||
|
|
||||||
|
Gist
|
||||||
|
---
|
||||||
|
{%gist schacon/4277 %}
|
||||||
|
|
||||||
|
tags
|
||||||
|
---
|
||||||
|
> using like below
|
||||||
|
|
||||||
|
###### tags: `features` `cool`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# h1 Heading
|
||||||
|
## h2 Heading
|
||||||
|
### h3 Heading
|
||||||
|
#### h4 Heading
|
||||||
|
##### h5 Heading
|
||||||
|
###### h6 Heading
|
||||||
|
|
||||||
|
|
||||||
|
## Horizontal Rules
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
|
||||||
|
## Typographic replacements
|
||||||
|
|
||||||
|
Enable typographer option to see result.
|
||||||
|
|
||||||
|
(c) (C) (r) (R) (tm) (TM) (p) (P) +-
|
||||||
|
|
||||||
|
test.. test... test..... test?..... test!....
|
||||||
|
|
||||||
|
!!!!!! ???? ,,
|
||||||
|
|
||||||
|
Remarkable -- awesome
|
||||||
|
|
||||||
|
"Smartypants, double quotes"
|
||||||
|
|
||||||
|
'Smartypants, single quotes'
|
||||||
|
|
||||||
|
|
||||||
|
## Emphasis
|
||||||
|
|
||||||
|
**This is bold text**
|
||||||
|
|
||||||
|
__This is bold text__
|
||||||
|
|
||||||
|
*This is italic text*
|
||||||
|
|
||||||
|
_This is italic text_
|
||||||
|
|
||||||
|
~~Deleted text~~
|
||||||
|
|
||||||
|
Superscript: 19^th^
|
||||||
|
|
||||||
|
Subscript: H~2~O
|
||||||
|
|
||||||
|
++Inserted text++
|
||||||
|
|
||||||
|
==Marked text==
|
||||||
|
|
||||||
|
|
||||||
|
## Blockquotes
|
||||||
|
|
||||||
|
|
||||||
|
> Blockquotes can also be nested...
|
||||||
|
>> ...by using additional greater-than signs right next to each other...
|
||||||
|
> > > ...or with spaces between arrows.
|
||||||
|
|
||||||
|
|
||||||
|
## Lists
|
||||||
|
|
||||||
|
Unordered
|
||||||
|
|
||||||
|
+ Create a list by starting a line with `+`, `-`, or `*`
|
||||||
|
+ Sub-lists are made by indenting 2 spaces:
|
||||||
|
- Marker character change forces new list start:
|
||||||
|
* Ac tristique libero volutpat at
|
||||||
|
+ Facilisis in pretium nisl aliquet
|
||||||
|
- Nulla volutpat aliquam velit
|
||||||
|
+ Very easy!
|
||||||
|
|
||||||
|
Ordered
|
||||||
|
|
||||||
|
1. Lorem ipsum dolor sit amet
|
||||||
|
2. Consectetur adipiscing elit
|
||||||
|
3. Integer molestie lorem at massa
|
||||||
|
|
||||||
|
|
||||||
|
1. You can use sequential numbers...
|
||||||
|
1. ...or keep all the numbers as `1.`
|
||||||
|
|
||||||
|
Start numbering with offset:
|
||||||
|
|
||||||
|
57. foo
|
||||||
|
1. bar
|
||||||
|
|
||||||
|
|
||||||
|
## Code
|
||||||
|
|
||||||
|
Inline `code`
|
||||||
|
|
||||||
|
Indented code
|
||||||
|
|
||||||
|
// Some comments
|
||||||
|
line 1 of code
|
||||||
|
line 2 of code
|
||||||
|
line 3 of code
|
||||||
|
|
||||||
|
|
||||||
|
Block code "fences"
|
||||||
|
|
||||||
|
```
|
||||||
|
Sample text here...
|
||||||
|
```
|
||||||
|
|
||||||
|
Syntax highlighting
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var foo = function (bar) {
|
||||||
|
return bar++;
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(foo(5));
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tables
|
||||||
|
|
||||||
|
| Option | Description |
|
||||||
|
| ------ | ----------- |
|
||||||
|
| data | path to data files to supply the data that will be passed into templates. |
|
||||||
|
| engine | engine to be used for processing templates. Handlebars is the default. |
|
||||||
|
| ext | extension to be used for dest files. |
|
||||||
|
|
||||||
|
Right aligned columns
|
||||||
|
|
||||||
|
| Option | Description |
|
||||||
|
| ------:| -----------:|
|
||||||
|
| data | path to data files to supply the data that will be passed into templates. |
|
||||||
|
| engine | engine to be used for processing templates. Handlebars is the default. |
|
||||||
|
| ext | extension to be used for dest files. |
|
||||||
|
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
[link text](http://dev.nodeca.com)
|
||||||
|
|
||||||
|
[link with title](http://nodeca.github.io/pica/demo/ "title text!")
|
||||||
|
|
||||||
|
Autoconverted link https://github.com/nodeca/pica
|
||||||
|
|
||||||
|
|
||||||
|
## Images
|
||||||
|
|
||||||
|
![Minion](https://octodex.github.com/images/minion.png)
|
||||||
|
![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")
|
||||||
|
|
||||||
|
Like links, Images also have a footnote style syntax
|
||||||
|
|
||||||
|
![Alt text][id]
|
||||||
|
|
||||||
|
With a reference later in the document defining the URL location:
|
||||||
|
|
||||||
|
[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"
|
||||||
|
|
||||||
|
|
||||||
|
## Footnotes
|
||||||
|
|
||||||
|
Footnote 1 link[^first].
|
||||||
|
|
||||||
|
Footnote 2 link[^second].
|
||||||
|
|
||||||
|
Inline footnote^[Text of inline footnote] definition.
|
||||||
|
|
||||||
|
Duplicated footnote reference[^second].
|
||||||
|
|
||||||
|
[^first]: Footnote **can have markup**
|
||||||
|
|
||||||
|
and multiple paragraphs.
|
||||||
|
|
||||||
|
[^second]: Footnote text.
|
||||||
|
|
||||||
|
|
||||||
|
## Definition lists
|
||||||
|
|
||||||
|
Term 1
|
||||||
|
|
||||||
|
: Definition 1
|
||||||
|
with lazy continuation.
|
||||||
|
|
||||||
|
Term 2 with *inline markup*
|
||||||
|
|
||||||
|
: Definition 2
|
||||||
|
|
||||||
|
{ some code, part of Definition 2 }
|
||||||
|
|
||||||
|
Third paragraph of definition 2.
|
||||||
|
|
||||||
|
_Compact style:_
|
||||||
|
|
||||||
|
Term 1
|
||||||
|
~ Definition 1
|
||||||
|
|
||||||
|
Term 2
|
||||||
|
~ Definition 2a
|
||||||
|
~ Definition 2b
|
||||||
|
|
||||||
|
|
||||||
|
## Abbreviations
|
||||||
|
|
||||||
|
This is HTML abbreviation example.
|
||||||
|
|
||||||
|
It converts "HTML", but keep intact partial entries like "xxxHTMLyyy" and so on.
|
||||||
|
|
||||||
|
*[HTML]: Hyper Text Markup Language
|
194
public/index.html
Normal file
194
public/index.html
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
|
<meta name="description" content="Realtime collaborative markdown notes on all platforms.">
|
||||||
|
<meta name="author" content="jackycute">
|
||||||
|
<!-- Open Graph data -->
|
||||||
|
<meta property="og:title" content="HackMD - Collaborative notes">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="https://hackmd.herokuapp.com/">
|
||||||
|
<meta property="og:description" content="Realtime collaborative markdown notes on all platforms.">
|
||||||
|
<meta property="og:site_name" content="HackMD">
|
||||||
|
<meta property="fb:admins" content="1463801565">
|
||||||
|
<title>HackMD - Collaborative notes</title>
|
||||||
|
<link rel="icon" type="image/png" href="/favicon.png">
|
||||||
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||||
|
|
||||||
|
<!-- Bootstrap core CSS -->
|
||||||
|
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
|
||||||
|
<link rel="stylesheet" href="/vendor/select2/css/select2.min.css">
|
||||||
|
<!-- Custom styles for this template -->
|
||||||
|
<link rel="stylesheet" href="/css/cover.css">
|
||||||
|
<link rel="stylesheet" href="/css/bootstrap-social.css">
|
||||||
|
<link rel="stylesheet" href="/css/site.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-wrapper-inner">
|
||||||
|
<div class="cover-container">
|
||||||
|
|
||||||
|
<div class="masthead clearfix">
|
||||||
|
<div class="inner">
|
||||||
|
<h3 class="masthead-brand"></h3>
|
||||||
|
<nav>
|
||||||
|
<ul class="nav masthead-nav">
|
||||||
|
<li class="ui-home active"><a href="#">Home</a>
|
||||||
|
</li>
|
||||||
|
<li class="ui-history"><a href="#">History</a>
|
||||||
|
</li>
|
||||||
|
<li class="ui-releasenotes"><a href="#">Release Notes</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="home" class="section">
|
||||||
|
<div class="inner cover">
|
||||||
|
<h1 class="cover-heading"><i class="fa fa-file-text"></i> HackMD</h1>
|
||||||
|
<p class="lead">
|
||||||
|
Realtime collaborate notes.
|
||||||
|
<br> Using markdown syntax.
|
||||||
|
<br> On all platforms.
|
||||||
|
</p>
|
||||||
|
<a type="button" class="btn btn-lg btn-success ui-signin" data-toggle="modal" data-target=".bs-example-modal-sm" style="display:none;">Sign In</a>
|
||||||
|
<div class="ui-or" style="display:none;">Or</div>
|
||||||
|
<p class="lead">
|
||||||
|
<a href="/new" class="btn btn-lg btn-default">Start new note</a>
|
||||||
|
</p>
|
||||||
|
<a href="/features">See all features here <i class="fa fa-info-circle"></i></a>
|
||||||
|
<br> Share note via the links <i class="fa fa-link"></i> directly!
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="history" class="section" style="display:none;">
|
||||||
|
<div class="ui-signin">
|
||||||
|
<h4>
|
||||||
|
<a type="button" class="btn btn-success" data-toggle="modal" data-target=".bs-example-modal-sm">Sign In</a> to get own history!
|
||||||
|
</h4>
|
||||||
|
<p>Below are history from cookie</p>
|
||||||
|
</div>
|
||||||
|
<div class="ui-signout" style="display:none;">
|
||||||
|
<h4 class="ui-welcome">Welcome! <span class="ui-name"></span></h4>
|
||||||
|
<a href="/new" class="btn btn-default">Start new note</a> Or
|
||||||
|
<a href="/logout" class="btn btn-danger">Sign Out</a>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<a href="/features">See all features here <i class="fa fa-info-circle"></i></a>
|
||||||
|
<br> Share note via the links <i class="fa fa-link"></i> directly!
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<form class="form-inline">
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="search form-control" placeholder="Search anything..." />
|
||||||
|
</div>
|
||||||
|
<a href="#" class="sort btn btn-default" data-sort="text">
|
||||||
|
Sort by title
|
||||||
|
</a>
|
||||||
|
<a href="#" class="sort btn btn-default" data-sort="timestamp">
|
||||||
|
Sort by time
|
||||||
|
</a>
|
||||||
|
</form>
|
||||||
|
<h4 class="ui-nohistory">
|
||||||
|
No history
|
||||||
|
</h4>
|
||||||
|
<a href="#" class="btn btn-primary ui-import-from-cookie" style="display:none;">Import from cookie</a>
|
||||||
|
<ul id="history-list" class="list">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="releasenotes" class="section" style="display:none;">
|
||||||
|
<div id="template" style="display:none;">
|
||||||
|
{{#each release}}
|
||||||
|
<div class="inner cover">
|
||||||
|
<h5 class="cover-heading">
|
||||||
|
<div class="text-left">
|
||||||
|
<i class="fa fa-tag"></i> {{version}}
|
||||||
|
<span class="label label-default">{{tag}}</span>
|
||||||
|
<div class="pull-right">
|
||||||
|
<i class="fa fa-clock-o"></i> {{date}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</h5>
|
||||||
|
<hr>{{#each detail}}
|
||||||
|
<div class="text-left">
|
||||||
|
<h5><i class="fa fa-dot-circle-o"></i> {{title}}</h5>
|
||||||
|
<ul>
|
||||||
|
{{#each item}}
|
||||||
|
<li>
|
||||||
|
{{this}}
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{#unless @last}}
|
||||||
|
<br>{{/unless}} {{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mastfoot">
|
||||||
|
<div class="inner">
|
||||||
|
<p>© 2015 <a href="https://www.facebook.com/TakeHackMD" target="_blank"><i class="fa fa-facebook-square"></i> HackMD</a> by <a href="https://github.com/jackycute" target="_blank"><i class="fa fa-github-square"></i> jackycute</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- signin modal -->
|
||||||
|
<div class="modal fade bs-example-modal-sm" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title" id="mySmallModalLabel">Choose method</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<a href="/auth/facebook" class="btn btn-lg btn-block btn-social btn-facebook">
|
||||||
|
<i class="fa fa-facebook"></i> Sign in via Facebook
|
||||||
|
</a>
|
||||||
|
<a href="/auth/twitter" class="btn btn-lg btn-block btn-social btn-twitter">
|
||||||
|
<i class="fa fa-twitter"></i> Sign in via Twitter
|
||||||
|
</a>
|
||||||
|
<a href="/auth/github" class="btn btn-lg btn-block btn-social btn-github">
|
||||||
|
<i class="fa fa-github"></i> Sign in via GitHub
|
||||||
|
</a>
|
||||||
|
<a href="/auth/dropbox" class="btn btn-lg btn-block btn-social btn-dropbox">
|
||||||
|
<i class="fa fa-dropbox"></i> Sign in via Dropbox
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript
|
||||||
|
================================================== -->
|
||||||
|
<!-- Placed at the end of the document so the pages load faster -->
|
||||||
|
<!--<script src="/js/ga.js"></script>-->
|
||||||
|
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
|
||||||
|
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||||
|
<script src="/vendor/select2/js/select2.min.js"></script>
|
||||||
|
<script src="/vendor/select2/js/i18n/en.js"></script>
|
||||||
|
<script src="/vendor/jquery.cookie-1.4.1.min.js"></script>
|
||||||
|
<script src="/vendor/moment-with-locales.js"></script>
|
||||||
|
<script src="/vendor/handlebars-v3.0.0.js"></script>
|
||||||
|
<script src="/vendor/list.min.js"></script>
|
||||||
|
<script src="/js/history.js"></script>
|
||||||
|
<script src="/js/cover.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
311
public/js/cover.js
Normal file
311
public/js/cover.js
Normal file
|
@ -0,0 +1,311 @@
|
||||||
|
$(".masthead-nav li").click(function () {
|
||||||
|
$(this).siblings().removeClass("active");
|
||||||
|
$(this).addClass("active");
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-home").click(function () {
|
||||||
|
$(".section").hide();
|
||||||
|
$("#home").fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-history").click(function () {
|
||||||
|
$(".section").hide();
|
||||||
|
$("#history").fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".ui-releasenotes").click(function () {
|
||||||
|
$(".section").hide();
|
||||||
|
$("#releasenotes").fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
function checkHistoryList() {
|
||||||
|
if ($("#history-list").children().length > 0)
|
||||||
|
$(".ui-nohistory").hide();
|
||||||
|
else if ($("#history-list").children().length == 0) {
|
||||||
|
$(".ui-nohistory").slideDown();
|
||||||
|
var cookienotehistory = JSON.parse($.cookie('notehistory'));
|
||||||
|
if (login && cookienotehistory && cookienotehistory.length > 0) {
|
||||||
|
$(".ui-import-from-cookie").slideDown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseHistoryCallback() {
|
||||||
|
checkHistoryList();
|
||||||
|
$(".ui-history-close").click(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var id = $(this).closest("a").attr("href").split('/')[1];
|
||||||
|
getHistory(function (notehistory) {
|
||||||
|
var newnotehistory = removeHistory(id, notehistory);
|
||||||
|
saveHistory(newnotehistory);
|
||||||
|
});
|
||||||
|
$(this).closest("li").remove();
|
||||||
|
checkHistoryList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var login = false;
|
||||||
|
|
||||||
|
checkIfAuth(
|
||||||
|
function (data) {
|
||||||
|
$('.ui-signin').hide();
|
||||||
|
$('.ui-or').hide();
|
||||||
|
$('.ui-welcome').show();
|
||||||
|
$('.ui-name').html(data.name);
|
||||||
|
$('.ui-signout').show();
|
||||||
|
$(".ui-history").click();
|
||||||
|
login = true;
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
$('.ui-signin').slideDown();
|
||||||
|
$('.ui-or').slideDown();
|
||||||
|
login = false;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
parseHistory(parseHistoryCallback);
|
||||||
|
|
||||||
|
$(".ui-import-from-cookie").click(function () {
|
||||||
|
saveCookieHistoryToServer(function() {
|
||||||
|
parseCookieToHistory(parseHistoryCallback);
|
||||||
|
$(".ui-import-from-cookie").hide();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var source = $("#template").html();
|
||||||
|
var template = Handlebars.compile(source);
|
||||||
|
var context = {
|
||||||
|
release: [
|
||||||
|
{
|
||||||
|
version: "0.2.7",
|
||||||
|
tag: "fuel",
|
||||||
|
date: moment("201505031200", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support facebook, twitter, github, dropbox login",
|
||||||
|
"+ Support own history"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"* Adjust history ui",
|
||||||
|
"* Upgrade realtime package",
|
||||||
|
"* Upgrade editor package, now support composition input better"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Partial update might not render properly",
|
||||||
|
"* Cursor focus might not at correct position"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.6",
|
||||||
|
tag: "zippo",
|
||||||
|
date: moment("201504241600", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support sync scroll",
|
||||||
|
"+ Support partial update"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"* Added feedback ui",
|
||||||
|
"* Adjust animations and delays",
|
||||||
|
"* Adjust editor viewportMargin for performance",
|
||||||
|
"* Adjust emit refresh event occasion",
|
||||||
|
"* Added editor fallback fonts",
|
||||||
|
"* Index page auto focus at history if valid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Server might not disconnect client properly",
|
||||||
|
"* Resume connection might restore wrong info"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.5",
|
||||||
|
tag: "lightning",
|
||||||
|
date: moment("201504142110", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support import from dropbox and clipboard",
|
||||||
|
"+ Support more code highlighting",
|
||||||
|
"+ Support mathjax, sequence diagram and flow chart"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"* Adjust toolbar and layout style",
|
||||||
|
"* Adjust mobile layout style",
|
||||||
|
"* Adjust history layout style",
|
||||||
|
"* Server using heartbeat to gain accuracy of online users"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Virtual keyboard might broken the navbar",
|
||||||
|
"* Adjust editor viewportMargin for preloading content"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.4",
|
||||||
|
tag: "flint",
|
||||||
|
date: moment("201504101240", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support save to dropbox",
|
||||||
|
"+ Show other users' cursor with light color"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"* Adjust toolbar layout style for future"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Title might not render properly",
|
||||||
|
"* Code border style might not show properly",
|
||||||
|
"* Server might not connect concurrent client properly"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.3",
|
||||||
|
tag: "light",
|
||||||
|
date: moment("201504062030", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support youtube, vimeo",
|
||||||
|
"+ Support gist",
|
||||||
|
"+ Added quick link in pretty",
|
||||||
|
"+ Added font-smoothing style"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"* Change the rendering engine to remarkable",
|
||||||
|
"* Adjust view, todo list layout style for UX",
|
||||||
|
"+ Added responsive layout check",
|
||||||
|
"+ Auto reload if client version mismatch",
|
||||||
|
"+ Keep history stack after reconnect if nothing changed",
|
||||||
|
"+ Added features page"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Closetags auto input might not have proper origin",
|
||||||
|
"* Autofocus on editor only if it's on desktop",
|
||||||
|
"+ Prevent using real script and iframe tags",
|
||||||
|
"* Sorting in history by time not percise"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.2",
|
||||||
|
tag: "fire",
|
||||||
|
date: moment("201503272110", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support smartLists, smartypants",
|
||||||
|
"+ Support line number on code block",
|
||||||
|
"+ Support tags and search or sort history"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"+ Added delay on socket change",
|
||||||
|
"+ Updated markdown-body width to match github style",
|
||||||
|
"+ Socket changes now won't add to editor's history",
|
||||||
|
"* Reduce redundant server events"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Fixes",
|
||||||
|
item: [
|
||||||
|
"* Toolbar links might get wrong",
|
||||||
|
"* Wrong action redirections"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.1",
|
||||||
|
tag: "spark",
|
||||||
|
date: moment("201503171340", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Support github-like todo-list",
|
||||||
|
"+ Support emoji"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Enhancements",
|
||||||
|
item: [
|
||||||
|
"+ Added more effects on transition",
|
||||||
|
"+ Reduced rendering delay",
|
||||||
|
"+ Auto close and match brackets",
|
||||||
|
"+ Auto close and match tags",
|
||||||
|
"+ Added code fold and fold gutters",
|
||||||
|
"+ Added continue listing of markdown"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "0.2.0",
|
||||||
|
tag: "launch-day",
|
||||||
|
date: moment("201503142020", 'YYYYMMDDhhmm').fromNow(),
|
||||||
|
detail: [
|
||||||
|
{
|
||||||
|
title: "Features",
|
||||||
|
item: [
|
||||||
|
"+ Markdown editor",
|
||||||
|
"+ Preview html",
|
||||||
|
"+ Realtime collaborate",
|
||||||
|
"+ Cross-platformed",
|
||||||
|
"+ Recently used history"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
var html = template(context);
|
||||||
|
$("#releasenotes").html(html);
|
278
public/js/extra.js
Normal file
278
public/js/extra.js
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
//get title
|
||||||
|
function getTitle(view) {
|
||||||
|
var h1s = view.find("h1");
|
||||||
|
var title = "";
|
||||||
|
if (h1s.length > 0) {
|
||||||
|
title = h1s.first().text();
|
||||||
|
} else {
|
||||||
|
title = null;
|
||||||
|
}
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
//render title
|
||||||
|
function renderTitle(view) {
|
||||||
|
var title = getTitle(view);
|
||||||
|
if (title) {
|
||||||
|
title += ' - HackMD';
|
||||||
|
} else {
|
||||||
|
title = 'HackMD - Collaborative notes';
|
||||||
|
}
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
//render filename
|
||||||
|
function renderFilename(view) {
|
||||||
|
var filename = getTitle(view);
|
||||||
|
if (!filename) {
|
||||||
|
filename = 'Untitled';
|
||||||
|
}
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
//dynamic event or object binding here
|
||||||
|
function finishView(view) {
|
||||||
|
//youtube
|
||||||
|
view.find(".youtube").click(function () {
|
||||||
|
imgPlayiframe(this, '//www.youtube.com/embed/');
|
||||||
|
});
|
||||||
|
//vimeo
|
||||||
|
view.find(".vimeo")
|
||||||
|
.click(function () {
|
||||||
|
imgPlayiframe(this, '//player.vimeo.com/video/');
|
||||||
|
})
|
||||||
|
.each(function (key, value) {
|
||||||
|
$.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: 'http://vimeo.com/api/v2/video/' + $(value).attr('videoid') + '.json',
|
||||||
|
jsonp: 'callback',
|
||||||
|
dataType: 'jsonp',
|
||||||
|
success: function (data) {
|
||||||
|
var thumbnail_src = data[0].thumbnail_large;
|
||||||
|
$(value).css('background-image', 'url(' + thumbnail_src + ')');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
//gist
|
||||||
|
view.find("code[data-gist-id]").each(function(key, value) {
|
||||||
|
if($(value).children().length == 0)
|
||||||
|
$(value).gist();
|
||||||
|
});
|
||||||
|
//emojify
|
||||||
|
emojify.run(view[0]);
|
||||||
|
//mathjax
|
||||||
|
var mathjaxdivs = view.find('.mathjax').toArray();
|
||||||
|
try {
|
||||||
|
for (var i = 0; i < mathjaxdivs.length; i++) {
|
||||||
|
MathJax.Hub.Queue(["Typeset", MathJax.Hub, mathjaxdivs[i].innerHTML]);
|
||||||
|
$(mathjaxdivs[i]).removeClass("mathjax");
|
||||||
|
}
|
||||||
|
} catch(err) {
|
||||||
|
}
|
||||||
|
//sequence diagram
|
||||||
|
var sequence = view.find(".sequence-diagram");
|
||||||
|
try {
|
||||||
|
sequence.sequenceDiagram({
|
||||||
|
theme: 'simple'
|
||||||
|
});
|
||||||
|
sequence.parent().parent().replaceWith(sequence);
|
||||||
|
sequence.removeClass("sequence-diagram");
|
||||||
|
} catch(err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
//flowchart
|
||||||
|
var flow = view.find(".flow-chart");
|
||||||
|
flow.each(function (key, value) {
|
||||||
|
try {
|
||||||
|
var chart = flowchart.parse($(value).text());
|
||||||
|
$(value).html('');
|
||||||
|
chart.drawSVG(value, {
|
||||||
|
'line-width': 2,
|
||||||
|
'fill': 'none',
|
||||||
|
'font-size': '16px',
|
||||||
|
'font-family': "'Andale Mono', monospace"
|
||||||
|
});
|
||||||
|
$(value).parent().parent().replaceWith(value);
|
||||||
|
$(value).removeClass("flow-chart");
|
||||||
|
} catch(err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//render title
|
||||||
|
document.title = renderTitle(view);
|
||||||
|
}
|
||||||
|
//only static transform should be here
|
||||||
|
function postProcess(code) {
|
||||||
|
var result = $('<div>' + code + '</div>');
|
||||||
|
//prevent XSS
|
||||||
|
result.find("script").replaceWith(function () {
|
||||||
|
return "<noscript>" + $(this).html() + "</noscript>"
|
||||||
|
});
|
||||||
|
result.find("iframe").replaceWith(function () {
|
||||||
|
return "<noiframe>" + $(this).html() + "</noiframe>"
|
||||||
|
});
|
||||||
|
//todo list
|
||||||
|
var lis = result[0].getElementsByTagName('li');
|
||||||
|
for (var i = 0; i < lis.length; i++) {
|
||||||
|
var html = lis[i].innerHTML;
|
||||||
|
if (/^\s*\[[x ]\]\s+/.test(html)) {
|
||||||
|
lis[i].innerHTML = html.replace(/^\s*\[ \]\s*/, '<input type="checkbox" class="task-list-item-checkbox" disabled>')
|
||||||
|
.replace(/^\s*\[x\]\s*/, '<input type="checkbox" class="task-list-item-checkbox" checked disabled>');
|
||||||
|
lis[i].setAttribute('class', 'task-list-item');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSizebyAttr(element, target) {
|
||||||
|
var width = $(element).attr("width") ? $(element).attr("width") : '100%';
|
||||||
|
var height = $(element).attr("height") ? $(element).attr("height") : '360px';
|
||||||
|
$(target).width(width);
|
||||||
|
$(target).height(height);
|
||||||
|
}
|
||||||
|
|
||||||
|
function imgPlayiframe(element, src) {
|
||||||
|
if (!$(element).attr("videoid")) return;
|
||||||
|
var iframe = $("<iframe frameborder='0' webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>");
|
||||||
|
$(iframe).attr("src", src + $(element).attr("videoid") + '?autoplay=1');
|
||||||
|
setSizebyAttr(element, iframe);
|
||||||
|
$(element).html(iframe);
|
||||||
|
}
|
||||||
|
|
||||||
|
var anchorForId = function (id) {
|
||||||
|
var anchor = document.createElement("a");
|
||||||
|
anchor.className = "header-link";
|
||||||
|
anchor.href = "#" + id;
|
||||||
|
anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
|
||||||
|
anchor.title = "Permalink";
|
||||||
|
return anchor;
|
||||||
|
};
|
||||||
|
|
||||||
|
var linkifyAnchors = function (level, containingElement) {
|
||||||
|
var headers = containingElement.getElementsByTagName("h" + level);
|
||||||
|
for (var h = 0; h < headers.length; h++) {
|
||||||
|
var header = headers[h];
|
||||||
|
|
||||||
|
if (typeof header.id == "undefined" || header.id == "") {
|
||||||
|
var id = S(header.innerHTML.toLowerCase()).trim().stripTags().dasherize().s;
|
||||||
|
header.id = encodeURIComponent(id);
|
||||||
|
}
|
||||||
|
header.appendChild(anchorForId(header.id));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function autoLinkify(view) {
|
||||||
|
var contentBlock = view[0];
|
||||||
|
if (!contentBlock) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (var level = 1; level <= 6; level++) {
|
||||||
|
linkifyAnchors(level, contentBlock);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function scrollToHash() {
|
||||||
|
var hash = location.hash;
|
||||||
|
location.hash = "";
|
||||||
|
location.hash = hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
function highlightRender(code, lang) {
|
||||||
|
if (!lang || /no(-?)highlight|plain|text/.test(lang))
|
||||||
|
return;
|
||||||
|
if(lang == 'sequence') {
|
||||||
|
return '<div class="sequence-diagram">' + code + '</div>';
|
||||||
|
} else if(lang == 'flow') {
|
||||||
|
return '<div class="flow-chart">' + code + '</div>';
|
||||||
|
}
|
||||||
|
var reallang = lang.replace('=', '');
|
||||||
|
var languages = hljs.listLanguages();
|
||||||
|
if (languages.indexOf(reallang) == -1) {
|
||||||
|
var result = hljs.highlightAuto(code);
|
||||||
|
} else {
|
||||||
|
var result = hljs.highlight(reallang, code);
|
||||||
|
}
|
||||||
|
if (/\=$/.test(lang)) {
|
||||||
|
var lines = result.value.split('\n');
|
||||||
|
var linenumbers = [];
|
||||||
|
for (var i = 0; i < lines.length; i++) {
|
||||||
|
linenumbers[i] = "<div class='linenumber'>" + (i + 1) + "</div>";
|
||||||
|
}
|
||||||
|
var linegutter = "<div class='gutter'>" + linenumbers.join('\n') + "</div>";
|
||||||
|
result.value = "<div class='wrapper'>" + linegutter + "<div class='code'>" + result.value + "</div></div>";
|
||||||
|
}
|
||||||
|
return result.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
emojify.setConfig({
|
||||||
|
img_dir: '/vendor/emojify/images',
|
||||||
|
ignore_emoticons: true
|
||||||
|
});
|
||||||
|
|
||||||
|
var md = new Remarkable('full', {
|
||||||
|
html: true,
|
||||||
|
linkify: true,
|
||||||
|
typographer: true,
|
||||||
|
highlight: highlightRender
|
||||||
|
});
|
||||||
|
//youtube
|
||||||
|
var youtubePlugin = new Plugin(
|
||||||
|
// regexp to match
|
||||||
|
/{%youtube\s*([\d\D]*?)\s*%}/,
|
||||||
|
|
||||||
|
// this function will be called when something matches
|
||||||
|
function (match, utils) {
|
||||||
|
var videoid = match[1];
|
||||||
|
if (!videoid) return;
|
||||||
|
var div = $('<div class="youtube"></div>');
|
||||||
|
setSizebyAttr(div, div);
|
||||||
|
div.attr('videoid', videoid);
|
||||||
|
var icon = '<i class="icon fa fa-youtube-play fa-5x"></i>';
|
||||||
|
div.append(icon);
|
||||||
|
var thumbnail_src = '//img.youtube.com/vi/' + videoid + '/hqdefault.jpg';
|
||||||
|
div.css('background-image', 'url(' + thumbnail_src + ')');
|
||||||
|
return div[0].outerHTML;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
//vimeo
|
||||||
|
var vimeoPlugin = new Plugin(
|
||||||
|
// regexp to match
|
||||||
|
/{%vimeo\s*([\d\D]*?)\s*%}/,
|
||||||
|
|
||||||
|
// this function will be called when something matches
|
||||||
|
function (match, utils) {
|
||||||
|
var videoid = match[1];
|
||||||
|
if (!videoid) return;
|
||||||
|
var div = $('<div class="vimeo"></div>');
|
||||||
|
setSizebyAttr(div, div);
|
||||||
|
div.attr('videoid', videoid);
|
||||||
|
var icon = '<i class="icon fa fa-vimeo-square fa-5x"></i>';
|
||||||
|
div.append(icon);
|
||||||
|
return div[0].outerHTML;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
//gist
|
||||||
|
var gistPlugin = new Plugin(
|
||||||
|
// regexp to match
|
||||||
|
/{%gist\s*([\d\D]*?)\s*%}/,
|
||||||
|
|
||||||
|
// this function will be called when something matches
|
||||||
|
function (match, utils) {
|
||||||
|
var gistid = match[1];
|
||||||
|
var code = '<code data-gist-id="' + gistid + '"/>';
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
//mathjax
|
||||||
|
var mathjaxPlugin = new Plugin(
|
||||||
|
// regexp to match
|
||||||
|
/^\$\$\n([\d\D]*?)\n\$\$$|\$([\d\D]*?)\$/,
|
||||||
|
|
||||||
|
// this function will be called when something matches
|
||||||
|
function (match, utils) {
|
||||||
|
//var code = $(match).text();
|
||||||
|
return '<span class="mathjax">' + match[0] + '</span>';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
md.use(youtubePlugin);
|
||||||
|
md.use(vimeoPlugin);
|
||||||
|
md.use(gistPlugin);
|
||||||
|
md.use(mathjaxPlugin);
|
14
public/js/ga.js
Normal file
14
public/js/ga.js
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
(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');
|
256
public/js/history.js
Normal file
256
public/js/history.js
Normal file
|
@ -0,0 +1,256 @@
|
||||||
|
//common
|
||||||
|
function checkIfAuth(yesCallback, noCallback) {
|
||||||
|
$.get('/me')
|
||||||
|
.done(function (data) {
|
||||||
|
if (data && data.status == 'ok') {
|
||||||
|
yesCallback(data);
|
||||||
|
} else {
|
||||||
|
noCallback();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function () {
|
||||||
|
noCallback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveHistory(notehistory) {
|
||||||
|
checkIfAuth(
|
||||||
|
function () {
|
||||||
|
saveHistoryToServer(notehistory);
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
saveHistoryToCookie(notehistory);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveHistoryToCookie(notehistory) {
|
||||||
|
$.cookie('notehistory', JSON.stringify(notehistory), {
|
||||||
|
expires: 365
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveHistoryToServer(notehistory) {
|
||||||
|
$.post('/history', {
|
||||||
|
history: JSON.stringify(notehistory)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveCookieHistoryToServer(callback) {
|
||||||
|
$.post('/history', {
|
||||||
|
history: $.cookie('notehistory')
|
||||||
|
})
|
||||||
|
.done(function (data) {
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearDuplicatedHistory(notehistory) {
|
||||||
|
var newnotehistory = [];
|
||||||
|
for (var i = 0; i < notehistory.length; i++) {
|
||||||
|
var found = false;
|
||||||
|
for (var j = 0; j < newnotehistory.length; j++) {
|
||||||
|
if (notehistory[i].id == newnotehistory[j].id) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
newnotehistory.push(notehistory[i]);
|
||||||
|
}
|
||||||
|
return notehistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
function addHistory(id, text, time, tags, notehistory) {
|
||||||
|
notehistory.push({
|
||||||
|
id: id,
|
||||||
|
text: text,
|
||||||
|
time: time,
|
||||||
|
tags: tags
|
||||||
|
});
|
||||||
|
return notehistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeHistory(id, notehistory) {
|
||||||
|
for (var i = 0; i < notehistory.length; i++) {
|
||||||
|
if (notehistory[i].id == id)
|
||||||
|
notehistory.splice(i, 1);
|
||||||
|
}
|
||||||
|
return notehistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
//used for inner
|
||||||
|
function writeHistory(view) {
|
||||||
|
checkIfAuth(
|
||||||
|
function () {
|
||||||
|
writeHistoryToServer(view);
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
writeHistoryToCookie(view);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeHistoryToServer(view) {
|
||||||
|
$.get('/history')
|
||||||
|
.done(function (data) {
|
||||||
|
try {
|
||||||
|
if (data.history) {
|
||||||
|
var notehistory = data.history;
|
||||||
|
} else {
|
||||||
|
var notehistory = [];
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
var notehistory = [];
|
||||||
|
}
|
||||||
|
var newnotehistory = generateHistory(view, notehistory);
|
||||||
|
saveHistoryToServer(newnotehistory);
|
||||||
|
})
|
||||||
|
.fail(function () {
|
||||||
|
writeHistoryToCookie(view);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeHistoryToCookie(view) {
|
||||||
|
try {
|
||||||
|
var notehistory = JSON.parse($.cookie('notehistory'));
|
||||||
|
} catch (err) {
|
||||||
|
var notehistory = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
var newnotehistory = generateHistory(view, notehistory);
|
||||||
|
saveHistoryToCookie(newnotehistory);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderHistory(view) {
|
||||||
|
var title = renderFilename(view);
|
||||||
|
|
||||||
|
var tags = [];
|
||||||
|
var rawtags = [];
|
||||||
|
view.find('h6').each(function (key, value) {
|
||||||
|
if (/^tags/gmi.test($(value).text())) {
|
||||||
|
var codes = $(value).find("code");
|
||||||
|
for (var i = 0; i < codes.length; i++)
|
||||||
|
rawtags.push(codes[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (var i = 0; i < rawtags.length; i++) {
|
||||||
|
var found = false;
|
||||||
|
for (var j = 0; j < tags.length; j++) {
|
||||||
|
if (tags[j] == rawtags[i].innerHTML) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
tags.push(rawtags[i].innerHTML);
|
||||||
|
}
|
||||||
|
//console.debug(tags);
|
||||||
|
return {
|
||||||
|
id: location.pathname.split('/')[1],
|
||||||
|
text: title,
|
||||||
|
time: moment().format('MMMM Do YYYY, h:mm:ss a'),
|
||||||
|
tags: tags
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateHistory(view, notehistory) {
|
||||||
|
var info = renderHistory(view);
|
||||||
|
notehistory = clearDuplicatedHistory(notehistory);
|
||||||
|
notehistory = removeHistory(info.id, notehistory);
|
||||||
|
notehistory = addHistory(info.id, info.text, info.time, info.tags, notehistory);
|
||||||
|
return notehistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
//used for outer
|
||||||
|
function getHistory(callback) {
|
||||||
|
checkIfAuth(
|
||||||
|
function () {
|
||||||
|
getServerHistory(callback);
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
getCookieHistory(callback);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getServerHistory(callback) {
|
||||||
|
$.get('/history')
|
||||||
|
.done(function (data) {
|
||||||
|
if (data.history) {
|
||||||
|
callback(data.history);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function () {
|
||||||
|
getCookieHistory(callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCookieHistory(callback) {
|
||||||
|
callback(JSON.parse($.cookie('notehistory')));
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseHistory(callback) {
|
||||||
|
checkIfAuth(
|
||||||
|
function () {
|
||||||
|
parseServerToHistory(callback);
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
parseCookieToHistory(callback);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseServerToHistory(callback) {
|
||||||
|
$.get('/history')
|
||||||
|
.done(function (data) {
|
||||||
|
if (data.history) {
|
||||||
|
//console.log(data.history);
|
||||||
|
parseToHistory(data.history, callback);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function () {
|
||||||
|
parseCookieToHistory(callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseCookieToHistory(callback) {
|
||||||
|
var notehistory = JSON.parse($.cookie('notehistory'));
|
||||||
|
parseToHistory(notehistory, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseToHistory(notehistory, callback) {
|
||||||
|
if (notehistory && notehistory.length > 0) {
|
||||||
|
//console.log(notehistory);
|
||||||
|
for (var i = 0; i < notehistory.length; i++) {
|
||||||
|
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).each(function (key, value) {
|
||||||
|
var close = "<div class='ui-history-close fa fa-close fa-fw'></div>";
|
||||||
|
var text = "<h4 class='text'>" + value.text + "</h2>";
|
||||||
|
var timestamp = "<i class='timestamp' style='display:none;'>" + value.timestamp + "</i>";
|
||||||
|
var fromNow = "<i class='fromNow'><i class='fa fa-clock-o'></i> " + value.fromNow + "</i>";
|
||||||
|
var time = "<i class='time'>" + value.time + "</i>";
|
||||||
|
var tags = "";
|
||||||
|
if (value.tags) {
|
||||||
|
var labels = [];
|
||||||
|
for (var j = 0; j < value.tags.length; j++)
|
||||||
|
labels.push("<span class='label label-default'>" + value.tags[j] + "</span>");
|
||||||
|
tags = "<p class='tags'>" + labels.join(" ") + "</p>";
|
||||||
|
}
|
||||||
|
var li = "<li class='col-xs-12 col-sm-6 col-md-6 col-lg-6'><a href='" + "./" + value.id + "'><div class='item'>" + close + text + '<p>' + fromNow + '<br>' + timestamp + time + '</p>' + tags + "</div></a></li>"
|
||||||
|
//console.debug(li);
|
||||||
|
$("#history-list").append(li);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
valueNames: ['text', 'timestamp', 'fromNow', 'time', 'tags']
|
||||||
|
};
|
||||||
|
var historyList = new List('history', options);
|
||||||
|
historyList.sort('timestamp', {
|
||||||
|
order: "desc"
|
||||||
|
});
|
||||||
|
callback();
|
||||||
|
}
|
940
public/js/index.js
Normal file
940
public/js/index.js
Normal file
|
@ -0,0 +1,940 @@
|
||||||
|
//constant vars
|
||||||
|
//settings
|
||||||
|
var debug = false;
|
||||||
|
var version = '0.2.7';
|
||||||
|
var doneTypingDelay = 400;
|
||||||
|
var finishChangeDelay = 400;
|
||||||
|
var cursorActivityDelay = 50;
|
||||||
|
var syncScrollDelay = 50;
|
||||||
|
var scrollAnimatePeriod = 100;
|
||||||
|
var cursorAnimatePeriod = 100;
|
||||||
|
var modeType = {
|
||||||
|
edit: {},
|
||||||
|
view: {},
|
||||||
|
both: {}
|
||||||
|
}
|
||||||
|
var statusType = {
|
||||||
|
connected: {
|
||||||
|
msg: "CONNECTED",
|
||||||
|
label: "label-warning",
|
||||||
|
fa: "fa-wifi"
|
||||||
|
},
|
||||||
|
online: {
|
||||||
|
msg: "ONLINE: ",
|
||||||
|
label: "label-primary",
|
||||||
|
fa: "fa-users"
|
||||||
|
},
|
||||||
|
offline: {
|
||||||
|
msg: "OFFLINE",
|
||||||
|
label: "label-danger",
|
||||||
|
fa: "fa-plug"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var defaultMode = modeType.both;
|
||||||
|
|
||||||
|
//global vars
|
||||||
|
var loaded = false;
|
||||||
|
var isDirty = false;
|
||||||
|
var editShown = false;
|
||||||
|
var visibleXS = false;
|
||||||
|
var visibleSM = false;
|
||||||
|
var visibleMD = false;
|
||||||
|
var visibleLG = false;
|
||||||
|
var isTouchDevice = 'ontouchstart' in document.documentElement;
|
||||||
|
var currentMode = defaultMode;
|
||||||
|
var currentStatus = statusType.offline;
|
||||||
|
var lastInfo = {
|
||||||
|
needRestore: false,
|
||||||
|
cursor: null,
|
||||||
|
scroll: null,
|
||||||
|
edit: {
|
||||||
|
scroll: {
|
||||||
|
left: null,
|
||||||
|
top: null
|
||||||
|
},
|
||||||
|
cursor: {
|
||||||
|
line: null,
|
||||||
|
ch: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
scroll: {
|
||||||
|
left: null,
|
||||||
|
top: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
history: null
|
||||||
|
};
|
||||||
|
|
||||||
|
//editor settings
|
||||||
|
var editor = CodeMirror.fromTextArea(document.getElementById("textit"), {
|
||||||
|
mode: 'gfm',
|
||||||
|
viewportMargin: 20,
|
||||||
|
styleActiveLine: true,
|
||||||
|
lineNumbers: true,
|
||||||
|
lineWrapping: true,
|
||||||
|
theme: "monokai",
|
||||||
|
autofocus: true,
|
||||||
|
inputStyle: "textarea",
|
||||||
|
matchBrackets: true,
|
||||||
|
autoCloseBrackets: true,
|
||||||
|
matchTags: {
|
||||||
|
bothTags: true
|
||||||
|
},
|
||||||
|
autoCloseTags: true,
|
||||||
|
foldGutter: true,
|
||||||
|
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
|
||||||
|
extraKeys: {
|
||||||
|
"Enter": "newlineAndIndentContinueMarkdownList"
|
||||||
|
},
|
||||||
|
readOnly: true
|
||||||
|
});
|
||||||
|
|
||||||
|
//ui vars
|
||||||
|
var ui = {
|
||||||
|
spinner: $(".ui-spinner"),
|
||||||
|
content: $(".ui-content"),
|
||||||
|
toolbar: {
|
||||||
|
shortStatus: $(".ui-short-status"),
|
||||||
|
status: $(".ui-status"),
|
||||||
|
new: $(".ui-new"),
|
||||||
|
pretty: $(".ui-pretty"),
|
||||||
|
download: {
|
||||||
|
markdown: $(".ui-download-markdown")
|
||||||
|
},
|
||||||
|
save: {
|
||||||
|
dropbox: $(".ui-save-dropbox")
|
||||||
|
},
|
||||||
|
import: {
|
||||||
|
dropbox: $(".ui-import-dropbox"),
|
||||||
|
clipboard: $(".ui-import-clipboard")
|
||||||
|
},
|
||||||
|
mode: $(".ui-mode"),
|
||||||
|
edit: $(".ui-edit"),
|
||||||
|
view: $(".ui-view"),
|
||||||
|
both: $(".ui-both")
|
||||||
|
},
|
||||||
|
area: {
|
||||||
|
edit: $(".ui-edit-area"),
|
||||||
|
view: $(".ui-view-area"),
|
||||||
|
codemirror: $(".ui-edit-area .CodeMirror"),
|
||||||
|
markdown: $(".ui-view-area .markdown-body")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//page actions
|
||||||
|
var opts = {
|
||||||
|
lines: 11, // The number of lines to draw
|
||||||
|
length: 20, // The length of each line
|
||||||
|
width: 2, // The line thickness
|
||||||
|
radius: 30, // The radius of the inner circle
|
||||||
|
corners: 0, // Corner roundness (0..1)
|
||||||
|
rotate: 0, // The rotation offset
|
||||||
|
direction: 1, // 1: clockwise, -1: counterclockwise
|
||||||
|
color: '#000', // #rgb or #rrggbb or array of colors
|
||||||
|
speed: 1.1, // Rounds per second
|
||||||
|
trail: 60, // Afterglow percentage
|
||||||
|
shadow: false, // Whether to render a shadow
|
||||||
|
hwaccel: true, // Whether to use hardware acceleration
|
||||||
|
className: 'spinner', // The CSS class to assign to the spinner
|
||||||
|
zIndex: 2e9, // The z-index (defaults to 2000000000)
|
||||||
|
top: '50%', // Top position relative to parent
|
||||||
|
left: '50%' // Left position relative to parent
|
||||||
|
};
|
||||||
|
var spinner = new Spinner(opts).spin(ui.spinner[0]);
|
||||||
|
//when page ready
|
||||||
|
$(document).ready(function () {
|
||||||
|
checkResponsive();
|
||||||
|
changeMode(currentMode);
|
||||||
|
/* we need this only on touch devices */
|
||||||
|
if (isTouchDevice) {
|
||||||
|
/* cache dom references */
|
||||||
|
var $body = jQuery('body');
|
||||||
|
|
||||||
|
/* bind events */
|
||||||
|
$(document)
|
||||||
|
.on('focus', 'textarea, input', function() {
|
||||||
|
$body.addClass('fixfixed');
|
||||||
|
})
|
||||||
|
.on('blur', 'textarea, input', function() {
|
||||||
|
$body.removeClass('fixfixed');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//when page resize
|
||||||
|
$(window).resize(function () {
|
||||||
|
checkResponsive();
|
||||||
|
});
|
||||||
|
//768-792px have a gap
|
||||||
|
function checkResponsive() {
|
||||||
|
visibleXS = $(".visible-xs").is(":visible");
|
||||||
|
visibleSM = $(".visible-sm").is(":visible");
|
||||||
|
visibleMD = $(".visible-md").is(":visible");
|
||||||
|
visibleLG = $(".visible-lg").is(":visible");
|
||||||
|
if (visibleXS && currentMode == modeType.both)
|
||||||
|
if (editor.hasFocus())
|
||||||
|
changeMode(modeType.edit);
|
||||||
|
else
|
||||||
|
changeMode(modeType.view);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showStatus(type, num) {
|
||||||
|
currentStatus = type;
|
||||||
|
var shortStatus = ui.toolbar.shortStatus;
|
||||||
|
var status = ui.toolbar.status;
|
||||||
|
var label = $('<span class="label"></span>');
|
||||||
|
var fa = $('<i class="fa"></i>');
|
||||||
|
var msg = "";
|
||||||
|
var shortMsg = "";
|
||||||
|
|
||||||
|
shortStatus.html("");
|
||||||
|
status.html("");
|
||||||
|
|
||||||
|
switch (currentStatus) {
|
||||||
|
case statusType.connected:
|
||||||
|
label.addClass(statusType.connected.label);
|
||||||
|
fa.addClass(statusType.connected.fa);
|
||||||
|
msg = statusType.connected.msg;
|
||||||
|
break;
|
||||||
|
case statusType.online:
|
||||||
|
label.addClass(statusType.online.label);
|
||||||
|
fa.addClass(statusType.online.fa);
|
||||||
|
shortMsg = " " + num;
|
||||||
|
msg = statusType.online.msg + num;
|
||||||
|
break;
|
||||||
|
case statusType.offline:
|
||||||
|
label.addClass(statusType.offline.label);
|
||||||
|
fa.addClass(statusType.offline.fa);
|
||||||
|
msg = statusType.offline.msg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
label.append(fa);
|
||||||
|
var shortLabel = label.clone();
|
||||||
|
|
||||||
|
shortLabel.append(" " + shortMsg);
|
||||||
|
shortStatus.append(shortLabel);
|
||||||
|
|
||||||
|
label.append(" " + msg);
|
||||||
|
status.append(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleMode() {
|
||||||
|
switch(currentMode) {
|
||||||
|
case modeType.edit:
|
||||||
|
changeMode(modeType.view);
|
||||||
|
break;
|
||||||
|
case modeType.view:
|
||||||
|
changeMode(modeType.edit);
|
||||||
|
break;
|
||||||
|
case modeType.both:
|
||||||
|
changeMode(modeType.view);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function changeMode(type) {
|
||||||
|
saveInfo();
|
||||||
|
if (type)
|
||||||
|
currentMode = type;
|
||||||
|
var responsiveClass = "col-lg-6 col-md-6 col-sm-6";
|
||||||
|
var scrollClass = "ui-scrollable";
|
||||||
|
ui.area.codemirror.removeClass(scrollClass);
|
||||||
|
ui.area.edit.removeClass(responsiveClass);
|
||||||
|
ui.area.view.removeClass(scrollClass);
|
||||||
|
ui.area.view.removeClass(responsiveClass);
|
||||||
|
switch (currentMode) {
|
||||||
|
case modeType.edit:
|
||||||
|
ui.area.edit.show();
|
||||||
|
ui.area.view.hide();
|
||||||
|
if (!editShown) {
|
||||||
|
editor.refresh();
|
||||||
|
editShown = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case modeType.view:
|
||||||
|
ui.area.edit.hide();
|
||||||
|
ui.area.view.show();
|
||||||
|
break;
|
||||||
|
case modeType.both:
|
||||||
|
ui.area.codemirror.addClass(scrollClass);
|
||||||
|
ui.area.edit.addClass(responsiveClass).show();
|
||||||
|
ui.area.view.addClass(scrollClass);
|
||||||
|
ui.area.view.addClass(responsiveClass).show();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (currentMode != modeType.view && visibleLG) {
|
||||||
|
editor.focus();
|
||||||
|
editor.refresh();
|
||||||
|
} else {
|
||||||
|
editor.getInputField().blur();
|
||||||
|
}
|
||||||
|
if (changeMode != modeType.edit)
|
||||||
|
updateView();
|
||||||
|
restoreInfo();
|
||||||
|
|
||||||
|
ui.toolbar.both.removeClass("active");
|
||||||
|
ui.toolbar.edit.removeClass("active");
|
||||||
|
ui.toolbar.view.removeClass("active");
|
||||||
|
var modeIcon = ui.toolbar.mode.find('i');
|
||||||
|
modeIcon.removeClass('fa-toggle-on').removeClass('fa-toggle-off');
|
||||||
|
if (ui.area.edit.is(":visible") && ui.area.view.is(":visible")) { //both
|
||||||
|
ui.toolbar.both.addClass("active");
|
||||||
|
modeIcon.addClass('fa-eye');
|
||||||
|
} else if (ui.area.edit.is(":visible")) { //edit
|
||||||
|
ui.toolbar.edit.addClass("active");
|
||||||
|
modeIcon.addClass('fa-toggle-off');
|
||||||
|
} else if (ui.area.view.is(":visible")) { //view
|
||||||
|
ui.toolbar.view.addClass("active");
|
||||||
|
modeIcon.addClass('fa-toggle-on');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//button actions
|
||||||
|
var noteId = window.location.pathname.split('/')[1];
|
||||||
|
var url = window.location.origin + '/' + noteId;
|
||||||
|
//pretty
|
||||||
|
ui.toolbar.pretty.attr("href", url + "/pretty");
|
||||||
|
//download
|
||||||
|
//markdown
|
||||||
|
ui.toolbar.download.markdown.click(function() {
|
||||||
|
var filename = renderFilename(ui.area.markdown) + '.md';
|
||||||
|
var markdown = editor.getValue();
|
||||||
|
var blob = new Blob([markdown], {type: "text/markdown;charset=utf-8"});
|
||||||
|
saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
//save to dropbox
|
||||||
|
ui.toolbar.save.dropbox.click(function() {
|
||||||
|
var filename = renderFilename(ui.area.markdown) + '.md';
|
||||||
|
var options = {
|
||||||
|
files: [
|
||||||
|
{'url': url + "/download", 'filename': filename}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
Dropbox.save(options);
|
||||||
|
});
|
||||||
|
//import from dropbox
|
||||||
|
ui.toolbar.import.dropbox.click(function() {
|
||||||
|
var options = {
|
||||||
|
success: function(files) {
|
||||||
|
ui.spinner.show();
|
||||||
|
var url = files[0].link;
|
||||||
|
importFromUrl(url);
|
||||||
|
},
|
||||||
|
linkType: "direct",
|
||||||
|
multiselect: false,
|
||||||
|
extensions: ['.md', '.html']
|
||||||
|
};
|
||||||
|
Dropbox.choose(options);
|
||||||
|
});
|
||||||
|
//import from clipboard
|
||||||
|
ui.toolbar.import.clipboard.click(function() {
|
||||||
|
//na
|
||||||
|
});
|
||||||
|
//fix for wrong autofocus
|
||||||
|
$('#clipboardModal').on('shown.bs.modal', function() {
|
||||||
|
$('#clipboardModal').blur();
|
||||||
|
});
|
||||||
|
$("#clipboardModalClear").click(function() {
|
||||||
|
$("#clipboardModalContent").html('');
|
||||||
|
});
|
||||||
|
$("#clipboardModalConfirm").click(function() {
|
||||||
|
var data = $("#clipboardModalContent").html();
|
||||||
|
if(data) {
|
||||||
|
parseToEditor(data);
|
||||||
|
$('#clipboardModal').modal('hide');
|
||||||
|
$("#clipboardModalContent").html('');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function parseToEditor(data) {
|
||||||
|
var parsed = toMarkdown(data);
|
||||||
|
if(parsed)
|
||||||
|
editor.replaceRange(parsed, {line:0, ch:0}, {line:editor.lastLine(), ch:editor.lastLine().length}, '+input');
|
||||||
|
}
|
||||||
|
function importFromUrl(url) {
|
||||||
|
//console.log(url);
|
||||||
|
if(url == null) return;
|
||||||
|
if(!isValidURL(url)) {
|
||||||
|
alert('Not valid URL :(');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
method: "GET",
|
||||||
|
url: url,
|
||||||
|
success: function(data) {
|
||||||
|
parseToEditor(data);
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Import failed :(');
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
ui.spinner.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function isValidURL(str) {
|
||||||
|
var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
|
||||||
|
'((([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+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
|
||||||
|
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
|
||||||
|
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
|
||||||
|
if(!pattern.test(str)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//mode
|
||||||
|
ui.toolbar.mode.click(function () {
|
||||||
|
toggleMode();
|
||||||
|
});
|
||||||
|
//edit
|
||||||
|
ui.toolbar.edit.click(function () {
|
||||||
|
changeMode(modeType.edit);
|
||||||
|
});
|
||||||
|
//view
|
||||||
|
ui.toolbar.view.click(function () {
|
||||||
|
changeMode(modeType.view);
|
||||||
|
});
|
||||||
|
//both
|
||||||
|
ui.toolbar.both.click(function () {
|
||||||
|
changeMode(modeType.both);
|
||||||
|
});
|
||||||
|
|
||||||
|
//socket.io actions
|
||||||
|
var socket = io.connect();
|
||||||
|
socket.on('info', function (data) {
|
||||||
|
console.error(data);
|
||||||
|
location.href = "./404.html";
|
||||||
|
});
|
||||||
|
socket.on('disconnect', function (data) {
|
||||||
|
showStatus(statusType.offline);
|
||||||
|
if (loaded) {
|
||||||
|
saveInfo();
|
||||||
|
lastInfo.history = editor.getHistory();
|
||||||
|
}
|
||||||
|
if (!editor.getOption('readOnly'))
|
||||||
|
editor.setOption('readOnly', true);
|
||||||
|
});
|
||||||
|
socket.on('connect', function (data) {
|
||||||
|
showStatus(statusType.connected);
|
||||||
|
socket.emit('version');
|
||||||
|
});
|
||||||
|
socket.on('version', function (data) {
|
||||||
|
if (data != version)
|
||||||
|
location.reload(true);
|
||||||
|
});
|
||||||
|
socket.on('refresh', function (data) {
|
||||||
|
saveInfo();
|
||||||
|
|
||||||
|
var body = data.body;
|
||||||
|
body = LZString.decompressFromBase64(body);
|
||||||
|
if (body)
|
||||||
|
editor.setValue(body);
|
||||||
|
else
|
||||||
|
editor.setValue("");
|
||||||
|
|
||||||
|
if (!loaded) {
|
||||||
|
editor.clearHistory();
|
||||||
|
ui.spinner.hide();
|
||||||
|
ui.content.fadeIn();
|
||||||
|
changeMode();
|
||||||
|
loaded = true;
|
||||||
|
} else {
|
||||||
|
if (LZString.compressToBase64(editor.getValue()) !== data.body)
|
||||||
|
editor.clearHistory();
|
||||||
|
else {
|
||||||
|
if (lastInfo.history)
|
||||||
|
editor.setHistory(lastInfo.history);
|
||||||
|
}
|
||||||
|
lastInfo.history = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateView();
|
||||||
|
|
||||||
|
if (editor.getOption('readOnly'))
|
||||||
|
editor.setOption('readOnly', false);
|
||||||
|
|
||||||
|
restoreInfo();
|
||||||
|
});
|
||||||
|
socket.on('change', function (data) {
|
||||||
|
data = LZString.decompressFromBase64(data);
|
||||||
|
data = JSON.parse(data);
|
||||||
|
editor.replaceRange(data.text, data.from, data.to, "ignoreHistory");
|
||||||
|
isDirty = true;
|
||||||
|
clearTimeout(finishChangeTimer);
|
||||||
|
finishChangeTimer = setTimeout(finishChange, finishChangeDelay);
|
||||||
|
});
|
||||||
|
socket.on('online users', function (data) {
|
||||||
|
if (debug)
|
||||||
|
console.debug(data);
|
||||||
|
showStatus(statusType.online, data.count);
|
||||||
|
$('.other-cursors').html('');
|
||||||
|
for(var i = 0; i < data.users.length; i++) {
|
||||||
|
var user = data.users[i];
|
||||||
|
if(user.id != socket.id)
|
||||||
|
buildCursor(user.id, user.color, user.cursor);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
socket.on('cursor focus', function (data) {
|
||||||
|
if(debug)
|
||||||
|
console.debug(data);
|
||||||
|
var cursor = $('#' + data.id);
|
||||||
|
if(cursor.length > 0) {
|
||||||
|
cursor.fadeIn();
|
||||||
|
} else {
|
||||||
|
if(data.id != socket.id)
|
||||||
|
buildCursor(data.id, data.color, data.cursor);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
socket.on('cursor activity', function (data) {
|
||||||
|
if(debug)
|
||||||
|
console.debug(data);
|
||||||
|
if(data.id != socket.id)
|
||||||
|
buildCursor(data.id, data.color, data.cursor);
|
||||||
|
});
|
||||||
|
socket.on('cursor blur', function (data) {
|
||||||
|
if(debug)
|
||||||
|
console.debug(data);
|
||||||
|
var cursor = $('#' + data.id);
|
||||||
|
if(cursor.length > 0) {
|
||||||
|
cursor.fadeOut();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function emitUserStatus() {
|
||||||
|
checkIfAuth(
|
||||||
|
function (data) {
|
||||||
|
socket.emit('user status', {login:true});
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
socket.emit('user status', {login:false});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCursor(id, color, pos) {
|
||||||
|
if(!pos) return;
|
||||||
|
if ($('.other-cursors').length <= 0) {
|
||||||
|
$("<div class='other-cursors'>").insertAfter('.CodeMirror-cursors');
|
||||||
|
}
|
||||||
|
if ($('#' + id).length <= 0) {
|
||||||
|
var cursor = $('<div id="' + id + '" class="other-cursor"> </div>');
|
||||||
|
//console.debug(pos);
|
||||||
|
cursor.attr('data-line', pos.line);
|
||||||
|
cursor.attr('data-ch', pos.ch);
|
||||||
|
var coord = editor.charCoords(pos, 'windows');
|
||||||
|
cursor[0].style.left = coord.left + 'px';
|
||||||
|
cursor[0].style.top = coord.top + 'px';
|
||||||
|
cursor[0].style.height = '18px';
|
||||||
|
cursor[0].style.borderLeft = '2px solid ' + color;
|
||||||
|
$('.other-cursors').append(cursor);
|
||||||
|
cursor.hide().fadeIn();
|
||||||
|
} else {
|
||||||
|
var cursor = $('#' + id);
|
||||||
|
cursor.attr('data-line', pos.line);
|
||||||
|
cursor.attr('data-ch', pos.ch);
|
||||||
|
var coord = editor.charCoords(pos, 'windows');
|
||||||
|
cursor.stop(true).css('opacity', 1).animate({"left":coord.left, "top":coord.top}, cursorAnimatePeriod);
|
||||||
|
//cursor[0].style.left = coord.left + 'px';
|
||||||
|
//cursor[0].style.top = coord.top + 'px';
|
||||||
|
cursor[0].style.height = '18px';
|
||||||
|
cursor[0].style.borderLeft = '2px solid ' + color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//editor actions
|
||||||
|
editor.on('beforeChange', function (cm, change) {
|
||||||
|
if (debug)
|
||||||
|
console.debug(change);
|
||||||
|
});
|
||||||
|
editor.on('change', function (i, op) {
|
||||||
|
if (debug)
|
||||||
|
console.debug(op);
|
||||||
|
if (op.origin != 'setValue' && op.origin != 'ignoreHistory') {
|
||||||
|
socket.emit('change', LZString.compressToBase64(JSON.stringify(op)));
|
||||||
|
}
|
||||||
|
isDirty = true;
|
||||||
|
clearTimeout(doneTypingTimer);
|
||||||
|
doneTypingTimer = setTimeout(doneTyping, doneTypingDelay);
|
||||||
|
});
|
||||||
|
editor.on('focus', function (cm) {
|
||||||
|
socket.emit('cursor focus', editor.getCursor());
|
||||||
|
});
|
||||||
|
var cursorActivityTimer = null;
|
||||||
|
editor.on('cursorActivity', function (cm) {
|
||||||
|
clearTimeout(cursorActivityTimer);
|
||||||
|
cursorActivityTimer = setTimeout(cursorActivity, cursorActivityDelay);
|
||||||
|
});
|
||||||
|
function cursorActivity() {
|
||||||
|
socket.emit('cursor activity', editor.getCursor());
|
||||||
|
}
|
||||||
|
editor.on('blur', function (cm) {
|
||||||
|
socket.emit('cursor blur');
|
||||||
|
});
|
||||||
|
|
||||||
|
function saveInfo() {
|
||||||
|
var left = $(document.body).scrollLeft();
|
||||||
|
var top = $(document.body).scrollTop();
|
||||||
|
switch (currentMode) {
|
||||||
|
case modeType.edit:
|
||||||
|
lastInfo.edit.scroll.left = left;
|
||||||
|
lastInfo.edit.scroll.top = top;
|
||||||
|
break;
|
||||||
|
case modeType.view:
|
||||||
|
lastInfo.view.scroll.left = left;
|
||||||
|
lastInfo.view.scroll.top = top;
|
||||||
|
break;
|
||||||
|
case modeType.both:
|
||||||
|
lastInfo.edit.scroll = editor.getScrollInfo();
|
||||||
|
lastInfo.view.scroll.left = ui.area.view.scrollLeft();
|
||||||
|
lastInfo.view.scroll.top = ui.area.view.scrollTop();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lastInfo.edit.cursor = editor.getCursor();
|
||||||
|
lastInfo.needRestore = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function restoreInfo() {
|
||||||
|
if (lastInfo.needRestore) {
|
||||||
|
var line = lastInfo.edit.cursor.line;
|
||||||
|
var ch = lastInfo.edit.cursor.ch;
|
||||||
|
editor.setCursor(line, ch);
|
||||||
|
|
||||||
|
switch (currentMode) {
|
||||||
|
case modeType.edit:
|
||||||
|
$(document.body).scrollLeft(lastInfo.edit.scroll.left);
|
||||||
|
$(document.body).scrollTop(lastInfo.edit.scroll.top);
|
||||||
|
break;
|
||||||
|
case modeType.view:
|
||||||
|
$(document.body).scrollLeft(lastInfo.view.scroll.left);
|
||||||
|
$(document.body).scrollTop(lastInfo.view.scroll.top);
|
||||||
|
break;
|
||||||
|
case modeType.both:
|
||||||
|
var left = lastInfo.edit.scroll.left;
|
||||||
|
var top = lastInfo.edit.scroll.top;
|
||||||
|
editor.scrollIntoView();
|
||||||
|
editor.scrollTo(left, top);
|
||||||
|
ui.area.view.scrollLeft(lastInfo.view.scroll.left);
|
||||||
|
ui.area.view.scrollTop(lastInfo.view.scroll.top);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastInfo.needRestore = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//view actions
|
||||||
|
var doneTypingTimer = null;
|
||||||
|
var finishChangeTimer = null;
|
||||||
|
var input = editor.getInputField();
|
||||||
|
//user is "finished typing," do something
|
||||||
|
function doneTyping() {
|
||||||
|
updateView();
|
||||||
|
var value = editor.getValue();
|
||||||
|
socket.emit('refresh', LZString.compressToBase64(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishChange() {
|
||||||
|
updateView();
|
||||||
|
}
|
||||||
|
|
||||||
|
var lastResult = null;
|
||||||
|
|
||||||
|
function updateView() {
|
||||||
|
if (currentMode == modeType.edit || !isDirty) return;
|
||||||
|
var value = editor.getValue();
|
||||||
|
var result = postProcess(md.render(value)).children().toArray();
|
||||||
|
//ui.area.markdown.html(result);
|
||||||
|
//finishView(ui.area.markdown);
|
||||||
|
partialUpdate(result, lastResult, ui.area.markdown.children().toArray());
|
||||||
|
lastResult = $(result).clone(true);
|
||||||
|
finishView(ui.area.view);
|
||||||
|
writeHistory(ui.area.markdown);
|
||||||
|
isDirty = false;
|
||||||
|
// reset lines mapping cache on content update
|
||||||
|
scrollMap = null;
|
||||||
|
emitUserStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function partialUpdate(src, tar, des) {
|
||||||
|
if (!src || src.length == 0 || !tar || tar.length == 0 || !des || des.length == 0) {
|
||||||
|
ui.area.markdown.html(src);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (src.length == tar.length) { //same length
|
||||||
|
for (var i = 0; i < src.length; i++) {
|
||||||
|
copyAttribute(src[i], des[i], 'data-startline');
|
||||||
|
copyAttribute(src[i], des[i], 'data-endline');
|
||||||
|
var rawSrc = cloneAndRemoveDataAttr(src[i]);
|
||||||
|
var rawTar = cloneAndRemoveDataAttr(tar[i]);
|
||||||
|
if (rawSrc.outerHTML != rawTar.outerHTML) {
|
||||||
|
//console.log(rawSrc);
|
||||||
|
//console.log(rawTar);
|
||||||
|
$(des[i]).replaceWith(src[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { //diff length
|
||||||
|
var start = 0;
|
||||||
|
var end = 0;
|
||||||
|
//find diff start position
|
||||||
|
for (var i = 0; i < tar.length; i++) {
|
||||||
|
copyAttribute(src[i], des[i], 'data-startline');
|
||||||
|
copyAttribute(src[i], des[i], 'data-endline');
|
||||||
|
var rawSrc = cloneAndRemoveDataAttr(src[i]);
|
||||||
|
var rawTar = cloneAndRemoveDataAttr(tar[i]);
|
||||||
|
if (!rawSrc || !rawTar || rawSrc.outerHTML != rawTar.outerHTML) {
|
||||||
|
start = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//find diff end position
|
||||||
|
var srcEnd = 0;
|
||||||
|
var tarEnd = 0;
|
||||||
|
for (var i = 0; i < src.length; i++) {
|
||||||
|
copyAttribute(src[i], des[i], 'data-startline');
|
||||||
|
copyAttribute(src[i], des[i], 'data-endline');
|
||||||
|
var rawSrc = cloneAndRemoveDataAttr(src[i]);
|
||||||
|
var rawTar = cloneAndRemoveDataAttr(tar[i]);
|
||||||
|
if (!rawSrc || !rawTar || rawSrc.outerHTML != rawTar.outerHTML) {
|
||||||
|
start = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//tar end
|
||||||
|
for (var i = 1; i <= tar.length; i++) {
|
||||||
|
var srcLength = src.length;
|
||||||
|
var tarLength = tar.length;
|
||||||
|
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
||||||
|
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-endline');
|
||||||
|
var rawSrc = cloneAndRemoveDataAttr(src[srcLength - i]);
|
||||||
|
var rawTar = cloneAndRemoveDataAttr(tar[tarLength - i]);
|
||||||
|
if (!rawSrc || !rawTar || rawSrc.outerHTML != rawTar.outerHTML) {
|
||||||
|
tarEnd = tar.length - i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//src end
|
||||||
|
for (var i = 1; i <= src.length; i++) {
|
||||||
|
var srcLength = src.length;
|
||||||
|
var tarLength = tar.length;
|
||||||
|
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-startline');
|
||||||
|
copyAttribute(src[srcLength - i], des[srcLength - i], 'data-endline');
|
||||||
|
var rawSrc = cloneAndRemoveDataAttr(src[srcLength - i]);
|
||||||
|
var rawTar = cloneAndRemoveDataAttr(tar[tarLength - i]);
|
||||||
|
if (!rawSrc || !rawTar || rawSrc.outerHTML != rawTar.outerHTML) {
|
||||||
|
srcEnd = src.length - i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//check if tar end overlap tar start
|
||||||
|
var overlap = 0;
|
||||||
|
for (var i = start; i >= 0; i--) {
|
||||||
|
var rawTarStart = cloneAndRemoveDataAttr(tar[i-1]);
|
||||||
|
var rawTarEnd = cloneAndRemoveDataAttr(tar[tarEnd+1+start-i]);
|
||||||
|
if(rawTarStart && rawTarEnd && rawTarStart.outerHTML == rawTarEnd.outerHTML)
|
||||||
|
overlap++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(debug)
|
||||||
|
console.log('overlap:' + overlap);
|
||||||
|
//show diff content
|
||||||
|
if(debug) {
|
||||||
|
console.log('start:' + start);
|
||||||
|
console.log('tarEnd:' + tarEnd);
|
||||||
|
console.log('srcEnd:' + srcEnd);
|
||||||
|
console.log('des[start]:' + des[start]);
|
||||||
|
}
|
||||||
|
tarEnd += overlap;
|
||||||
|
srcEnd += overlap;
|
||||||
|
//add new element
|
||||||
|
var newElements = "";
|
||||||
|
for (var j = start; j <= srcEnd; j++) {
|
||||||
|
if(debug)
|
||||||
|
srcChanged += src[j].outerHTML;
|
||||||
|
newElements += src[j].outerHTML;
|
||||||
|
}
|
||||||
|
if(newElements && des[start]) {
|
||||||
|
$(newElements).insertBefore(des[start]);
|
||||||
|
} else {
|
||||||
|
$(newElements).insertAfter(des[des.length-1]);
|
||||||
|
}
|
||||||
|
if(debug)
|
||||||
|
console.log(srcChanged);
|
||||||
|
//remove old element
|
||||||
|
if(debug)
|
||||||
|
var tarChanged = "";
|
||||||
|
for (var j = start; j <= tarEnd; j++) {
|
||||||
|
if(debug)
|
||||||
|
tarChanged += tar[j].outerHTML;
|
||||||
|
if(des[j])
|
||||||
|
des[j].remove();
|
||||||
|
}
|
||||||
|
if(debug) {
|
||||||
|
console.log(tarChanged);
|
||||||
|
var srcChanged = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloneAndRemoveDataAttr(el) {
|
||||||
|
if(!el) return;
|
||||||
|
var rawEl = $(el).clone(true)[0];
|
||||||
|
rawEl.removeAttribute('data-startline');
|
||||||
|
rawEl.removeAttribute('data-endline');
|
||||||
|
return rawEl;
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyAttribute(src, des, attr) {
|
||||||
|
if (src && src.getAttribute(attr) && des)
|
||||||
|
des.setAttribute(attr, src.getAttribute(attr));
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Inject line numbers for sync scroll. Notes:
|
||||||
|
//
|
||||||
|
// - We track only headings and paragraphs on first level. That's enougth.
|
||||||
|
// - Footnotes content causes jumps. Level limit filter it automatically.
|
||||||
|
//
|
||||||
|
md.renderer.rules.paragraph_open = function (tokens, idx) {
|
||||||
|
var line;
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<p class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
md.renderer.rules.heading_open = function (tokens, idx) {
|
||||||
|
var line;
|
||||||
|
if (tokens[idx].lines && tokens[idx].level === 0) {
|
||||||
|
var startline = tokens[idx].lines[0] + 1;
|
||||||
|
var endline = tokens[idx].lines[1];
|
||||||
|
return '<h' + tokens[idx].hLevel + ' class="part" data-startline="' + startline + '" data-endline="' + endline + '">';
|
||||||
|
}
|
||||||
|
return '<h' + tokens[idx].hLevel + '>';
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.on('scroll', _.debounce(syncScrollToView, syncScrollDelay));
|
||||||
|
//ui.area.view.on('scroll', _.debounce(syncScrollToEdit, 50));
|
||||||
|
var scrollMap;
|
||||||
|
// Build offsets for each line (lines can be wrapped)
|
||||||
|
// That's a bit dirty to process each line everytime, but ok for demo.
|
||||||
|
// Optimizations are required only for big texts.
|
||||||
|
function buildScrollMap() {
|
||||||
|
var i, offset, nonEmptyList, pos, a, b, lineHeightMap, linesCount,
|
||||||
|
acc, sourceLikeDiv, textarea = ui.area.codemirror,
|
||||||
|
_scrollMap;
|
||||||
|
|
||||||
|
sourceLikeDiv = $('<div />').css({
|
||||||
|
position: 'absolute',
|
||||||
|
visibility: 'hidden',
|
||||||
|
height: 'auto',
|
||||||
|
width: editor.getScrollInfo().clientWidth,
|
||||||
|
'font-size': textarea.css('font-size'),
|
||||||
|
'font-family': textarea.css('font-family'),
|
||||||
|
'line-height': textarea.css('line-height'),
|
||||||
|
'white-space': textarea.css('white-space')
|
||||||
|
}).appendTo('body');
|
||||||
|
|
||||||
|
offset = ui.area.view.scrollTop() - ui.area.view.offset().top;
|
||||||
|
_scrollMap = [];
|
||||||
|
nonEmptyList = [];
|
||||||
|
lineHeightMap = [];
|
||||||
|
|
||||||
|
acc = 0;
|
||||||
|
editor.getValue().split('\n').forEach(function (str) {
|
||||||
|
var h, lh;
|
||||||
|
|
||||||
|
lineHeightMap.push(acc);
|
||||||
|
|
||||||
|
if (str.length === 0) {
|
||||||
|
acc++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceLikeDiv.text(str);
|
||||||
|
h = parseFloat(sourceLikeDiv.css('height'));
|
||||||
|
lh = parseFloat(sourceLikeDiv.css('line-height'));
|
||||||
|
acc += Math.round(h / lh);
|
||||||
|
});
|
||||||
|
sourceLikeDiv.remove();
|
||||||
|
lineHeightMap.push(acc);
|
||||||
|
linesCount = acc;
|
||||||
|
|
||||||
|
for (i = 0; i < linesCount; i++) {
|
||||||
|
_scrollMap.push(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
nonEmptyList.push(0);
|
||||||
|
_scrollMap[0] = 0;
|
||||||
|
|
||||||
|
ui.area.markdown.find('.part').each(function (n, el) {
|
||||||
|
var $el = $(el),
|
||||||
|
t = $el.data('startline');
|
||||||
|
if (t === '') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
t = lineHeightMap[t];
|
||||||
|
if (t !== 0) {
|
||||||
|
nonEmptyList.push(t);
|
||||||
|
}
|
||||||
|
_scrollMap[t] = Math.round($el.offset().top + offset);
|
||||||
|
});
|
||||||
|
|
||||||
|
nonEmptyList.push(linesCount);
|
||||||
|
_scrollMap[linesCount] = ui.area.view[0].scrollHeight;
|
||||||
|
|
||||||
|
pos = 0;
|
||||||
|
for (i = 1; i < linesCount; i++) {
|
||||||
|
if (_scrollMap[i] !== -1) {
|
||||||
|
pos++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = nonEmptyList[pos];
|
||||||
|
b = nonEmptyList[pos + 1];
|
||||||
|
_scrollMap[i] = Math.round((_scrollMap[b] * (i - a) + _scrollMap[a] * (b - i)) / (b - a));
|
||||||
|
}
|
||||||
|
|
||||||
|
return _scrollMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncScrollToView() {
|
||||||
|
var lineNo, posTo;
|
||||||
|
var scrollInfo = editor.getScrollInfo();
|
||||||
|
if (!scrollMap) {
|
||||||
|
scrollMap = buildScrollMap();
|
||||||
|
}
|
||||||
|
lineNo = Math.floor(scrollInfo.top / editor.defaultTextHeight());
|
||||||
|
posTo = scrollMap[lineNo];
|
||||||
|
ui.area.view.stop(true).animate({scrollTop: posTo}, scrollAnimatePeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncScrollToEdit() {
|
||||||
|
var lineNo, posTo;
|
||||||
|
if (!scrollMap) {
|
||||||
|
scrollMap = buildScrollMap();
|
||||||
|
}
|
||||||
|
var top = ui.area.view.scrollTop();
|
||||||
|
lineNo = closestIndex(top, scrollMap);
|
||||||
|
posTo = lineNo * editor.defaultTextHeight();
|
||||||
|
editor.scrollTo(0, posTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
function closestIndex(num, arr) {
|
||||||
|
var curr = arr[0];
|
||||||
|
var index = 0;
|
||||||
|
var diff = Math.abs(num - curr);
|
||||||
|
for (var val = 0; val < arr.length; val++) {
|
||||||
|
var newdiff = Math.abs(num - arr[val]);
|
||||||
|
if (newdiff < diff) {
|
||||||
|
diff = newdiff;
|
||||||
|
curr = arr[val];
|
||||||
|
index = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
45
public/js/unused.js
Normal file
45
public/js/unused.js
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
|
||||||
|
//parse Youtube
|
||||||
|
result.find(".youtube").each(function (key, value) {
|
||||||
|
if (!$(value).attr('videoid')) return;
|
||||||
|
setSizebyAttr(this, this);
|
||||||
|
var icon = '<i class="icon fa fa-youtube-play fa-5x"></i>';
|
||||||
|
$(this).append(icon);
|
||||||
|
var videoid = $(value).attr('videoid');
|
||||||
|
var thumbnail_src = '//img.youtube.com/vi/' + videoid + '/hqdefault.jpg';
|
||||||
|
$(value).css('background-image', 'url(' + thumbnail_src + ')');
|
||||||
|
$(this).click(function () {
|
||||||
|
imgPlayiframe(this, '//www.youtube.com/embed/');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
//parse vimeo
|
||||||
|
result.find(".vimeo").each(function (key, value) {
|
||||||
|
if (!$(value).attr('videoid')) return;
|
||||||
|
setSizebyAttr(this, this);
|
||||||
|
var icon = '<i class="icon fa fa-vimeo-square fa-5x"></i>';
|
||||||
|
$(this).append(icon);
|
||||||
|
var videoid = $(value).attr('videoid');
|
||||||
|
$.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: 'http://vimeo.com/api/v2/video/' + videoid + '.json',
|
||||||
|
jsonp: 'callback',
|
||||||
|
dataType: 'jsonp',
|
||||||
|
success: function (data) {
|
||||||
|
var thumbnail_src = data[0].thumbnail_large;
|
||||||
|
$(value).css('background-image', 'url(' + thumbnail_src + ')');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$(this).click(function () {
|
||||||
|
imgPlayiframe(this, '//player.vimeo.com/video/');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
//todo list
|
||||||
|
var lis = result[0].getElementsByTagName('li');
|
||||||
|
for (var i = 0; i < lis.length; i++) {
|
||||||
|
var html = lis[i].innerHTML;
|
||||||
|
if (/^\s*\[[x ]\]\s*/.test(html)) {
|
||||||
|
lis[i].innerHTML = html.replace(/^\s*\[ \]\s*/, '<input type="checkbox" class="task-list-item-checkbox" disabled>')
|
||||||
|
.replace(/^\s*\[x\]\s*/, '<input type="checkbox" class="task-list-item-checkbox" checked disabled>');
|
||||||
|
lis[i].setAttribute('class', 'task-list-item');
|
||||||
|
}
|
||||||
|
}
|
2
public/vendor/FileSaver.min.js
vendored
Normal file
2
public/vendor/FileSaver.min.js
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
|
||||||
|
var saveAs=saveAs||"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator)||function(e){"use strict";if("undefined"==typeof navigator||!/MSIE [1-9]\./.test(navigator.userAgent)){var t=e.document,n=function(){return e.URL||e.webkitURL||e},o=t.createElementNS("http://www.w3.org/1999/xhtml","a"),r="download"in o,i=function(n){var o=t.createEvent("MouseEvents");o.initMouseEvent("click",!0,!1,e,0,0,0,0,0,!1,!1,!1,!1,0,null),n.dispatchEvent(o)},a=e.webkitRequestFileSystem,c=e.requestFileSystem||a||e.mozRequestFileSystem,s=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},u="application/octet-stream",f=0,d=500,l=function(t){var o=function(){"string"==typeof t?n().revokeObjectURL(t):t.remove()};e.chrome?o():setTimeout(o,d)},v=function(e,t,n){t=[].concat(t);for(var o=t.length;o--;){var r=e["on"+t[o]];if("function"==typeof r)try{r.call(e,n||e)}catch(i){s(i)}}},p=function(t,s){var d,p,w,y=this,m=t.type,S=!1,h=function(){v(y,"writestart progress write writeend".split(" "))},O=function(){if((S||!d)&&(d=n().createObjectURL(t)),p)p.location.href=d;else{var o=e.open(d,"_blank");void 0==o&&"undefined"!=typeof safari&&(e.location.href=d)}y.readyState=y.DONE,h(),l(d)},b=function(e){return function(){return y.readyState!==y.DONE?e.apply(this,arguments):void 0}},g={create:!0,exclusive:!1};return y.readyState=y.INIT,s||(s="download"),r?(d=n().createObjectURL(t),o.href=d,o.download=s,i(o),y.readyState=y.DONE,h(),void l(d)):(/^\s*(?:text\/(?:plain|xml)|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)&&(t=new Blob(["",t],{type:t.type})),e.chrome&&m&&m!==u&&(w=t.slice||t.webkitSlice,t=w.call(t,0,t.size,u),S=!0),a&&"download"!==s&&(s+=".download"),(m===u||a)&&(p=e),c?(f+=t.size,void c(e.TEMPORARY,f,b(function(e){e.root.getDirectory("saved",g,b(function(e){var n=function(){e.getFile(s,g,b(function(e){e.createWriter(b(function(n){n.onwriteend=function(t){p.location.href=e.toURL(),y.readyState=y.DONE,v(y,"writeend",t),l(e)},n.onerror=function(){var e=n.error;e.code!==e.ABORT_ERR&&O()},"writestart progress write abort".split(" ").forEach(function(e){n["on"+e]=y["on"+e]}),n.write(t),y.abort=function(){n.abort(),y.readyState=y.DONE},y.readyState=y.WRITING}),O)}),O)};e.getFile(s,{create:!1},b(function(e){e.remove(),n()}),b(function(e){e.code===e.NOT_FOUND_ERR?n():O()}))}),O)}),O)):void O())},w=p.prototype,y=function(e,t){return new p(e,t)};return w.abort=function(){var e=this;e.readyState=e.DONE,v(e,"abort")},w.readyState=w.INIT=0,w.WRITING=1,w.DONE=2,w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null,y}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);"undefined"!=typeof module&&module.exports?module.exports.saveAs=saveAs:"undefined"!=typeof define&&null!==define&&null!=define.amd&&define([],function(){return saveAs});
|
476
public/vendor/bootstrap/css/bootstrap-theme.css
vendored
Normal file
476
public/vendor/bootstrap/css/bootstrap-theme.css
vendored
Normal file
|
@ -0,0 +1,476 @@
|
||||||
|
/*!
|
||||||
|
* Bootstrap v3.3.2 (http://getbootstrap.com)
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
.btn-default,
|
||||||
|
.btn-primary,
|
||||||
|
.btn-success,
|
||||||
|
.btn-info,
|
||||||
|
.btn-warning,
|
||||||
|
.btn-danger {
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.btn-default:active,
|
||||||
|
.btn-primary:active,
|
||||||
|
.btn-success:active,
|
||||||
|
.btn-info:active,
|
||||||
|
.btn-warning:active,
|
||||||
|
.btn-danger:active,
|
||||||
|
.btn-default.active,
|
||||||
|
.btn-primary.active,
|
||||||
|
.btn-success.active,
|
||||||
|
.btn-info.active,
|
||||||
|
.btn-warning.active,
|
||||||
|
.btn-danger.active {
|
||||||
|
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
|
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
|
}
|
||||||
|
.btn-default .badge,
|
||||||
|
.btn-primary .badge,
|
||||||
|
.btn-success .badge,
|
||||||
|
.btn-info .badge,
|
||||||
|
.btn-warning .badge,
|
||||||
|
.btn-danger .badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.btn:active,
|
||||||
|
.btn.active {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-default {
|
||||||
|
text-shadow: 0 1px 0 #fff;
|
||||||
|
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
|
||||||
|
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dbdbdb;
|
||||||
|
border-color: #ccc;
|
||||||
|
}
|
||||||
|
.btn-default:hover,
|
||||||
|
.btn-default:focus {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-default:active,
|
||||||
|
.btn-default.active {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
border-color: #dbdbdb;
|
||||||
|
}
|
||||||
|
.btn-default.disabled,
|
||||||
|
.btn-default:disabled,
|
||||||
|
.btn-default[disabled] {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-primary {
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #245580;
|
||||||
|
}
|
||||||
|
.btn-primary:hover,
|
||||||
|
.btn-primary:focus {
|
||||||
|
background-color: #265a88;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-primary:active,
|
||||||
|
.btn-primary.active {
|
||||||
|
background-color: #265a88;
|
||||||
|
border-color: #245580;
|
||||||
|
}
|
||||||
|
.btn-primary.disabled,
|
||||||
|
.btn-primary:disabled,
|
||||||
|
.btn-primary[disabled] {
|
||||||
|
background-color: #265a88;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-success {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
|
||||||
|
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #3e8f3e;
|
||||||
|
}
|
||||||
|
.btn-success:hover,
|
||||||
|
.btn-success:focus {
|
||||||
|
background-color: #419641;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-success:active,
|
||||||
|
.btn-success.active {
|
||||||
|
background-color: #419641;
|
||||||
|
border-color: #3e8f3e;
|
||||||
|
}
|
||||||
|
.btn-success.disabled,
|
||||||
|
.btn-success:disabled,
|
||||||
|
.btn-success[disabled] {
|
||||||
|
background-color: #419641;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-info {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
|
||||||
|
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #28a4c9;
|
||||||
|
}
|
||||||
|
.btn-info:hover,
|
||||||
|
.btn-info:focus {
|
||||||
|
background-color: #2aabd2;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-info:active,
|
||||||
|
.btn-info.active {
|
||||||
|
background-color: #2aabd2;
|
||||||
|
border-color: #28a4c9;
|
||||||
|
}
|
||||||
|
.btn-info.disabled,
|
||||||
|
.btn-info:disabled,
|
||||||
|
.btn-info[disabled] {
|
||||||
|
background-color: #2aabd2;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-warning {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
|
||||||
|
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #e38d13;
|
||||||
|
}
|
||||||
|
.btn-warning:hover,
|
||||||
|
.btn-warning:focus {
|
||||||
|
background-color: #eb9316;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-warning:active,
|
||||||
|
.btn-warning.active {
|
||||||
|
background-color: #eb9316;
|
||||||
|
border-color: #e38d13;
|
||||||
|
}
|
||||||
|
.btn-warning.disabled,
|
||||||
|
.btn-warning:disabled,
|
||||||
|
.btn-warning[disabled] {
|
||||||
|
background-color: #eb9316;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-danger {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
|
||||||
|
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #b92c28;
|
||||||
|
}
|
||||||
|
.btn-danger:hover,
|
||||||
|
.btn-danger:focus {
|
||||||
|
background-color: #c12e2a;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-danger:active,
|
||||||
|
.btn-danger.active {
|
||||||
|
background-color: #c12e2a;
|
||||||
|
border-color: #b92c28;
|
||||||
|
}
|
||||||
|
.btn-danger.disabled,
|
||||||
|
.btn-danger:disabled,
|
||||||
|
.btn-danger[disabled] {
|
||||||
|
background-color: #c12e2a;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.thumbnail,
|
||||||
|
.img-thumbnail {
|
||||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.dropdown-menu > li > a:hover,
|
||||||
|
.dropdown-menu > li > a:focus {
|
||||||
|
background-color: #e8e8e8;
|
||||||
|
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
||||||
|
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.dropdown-menu > .active > a,
|
||||||
|
.dropdown-menu > .active > a:hover,
|
||||||
|
.dropdown-menu > .active > a:focus {
|
||||||
|
background-color: #2e6da4;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.navbar-default {
|
||||||
|
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
|
||||||
|
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.navbar-default .navbar-nav > .open > a,
|
||||||
|
.navbar-default .navbar-nav > .active > a {
|
||||||
|
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
|
||||||
|
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.navbar-brand,
|
||||||
|
.navbar-nav > li > a {
|
||||||
|
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
|
||||||
|
}
|
||||||
|
.navbar-inverse {
|
||||||
|
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
|
||||||
|
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.navbar-inverse .navbar-nav > .open > a,
|
||||||
|
.navbar-inverse .navbar-nav > .active > a {
|
||||||
|
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
|
||||||
|
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||||
|
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||||
|
}
|
||||||
|
.navbar-inverse .navbar-brand,
|
||||||
|
.navbar-inverse .navbar-nav > li > a {
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
|
||||||
|
}
|
||||||
|
.navbar-static-top,
|
||||||
|
.navbar-fixed-top,
|
||||||
|
.navbar-fixed-bottom {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a,
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
|
||||||
|
color: #fff;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.alert {
|
||||||
|
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
}
|
||||||
|
.alert-success {
|
||||||
|
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
|
||||||
|
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #b2dba1;
|
||||||
|
}
|
||||||
|
.alert-info {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
|
||||||
|
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #9acfea;
|
||||||
|
}
|
||||||
|
.alert-warning {
|
||||||
|
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
|
||||||
|
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #f5e79e;
|
||||||
|
}
|
||||||
|
.alert-danger {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
|
||||||
|
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dca7a7;
|
||||||
|
}
|
||||||
|
.progress {
|
||||||
|
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
|
||||||
|
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar {
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-success {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
|
||||||
|
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-info {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
|
||||||
|
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-warning {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
|
||||||
|
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-danger {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
|
||||||
|
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-striped {
|
||||||
|
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||||
|
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||||
|
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||||
|
}
|
||||||
|
.list-group {
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.list-group-item.active,
|
||||||
|
.list-group-item.active:hover,
|
||||||
|
.list-group-item.active:focus {
|
||||||
|
text-shadow: 0 -1px 0 #286090;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #2b669a;
|
||||||
|
}
|
||||||
|
.list-group-item.active .badge,
|
||||||
|
.list-group-item.active:hover .badge,
|
||||||
|
.list-group-item.active:focus .badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.panel {
|
||||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
}
|
||||||
|
.panel-default > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
||||||
|
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-primary > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-success > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
|
||||||
|
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-info > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
|
||||||
|
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-warning > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
|
||||||
|
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-danger > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
|
||||||
|
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.well {
|
||||||
|
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
|
||||||
|
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dcdcdc;
|
||||||
|
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
||||||
|
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=bootstrap-theme.css.map */
|
1
public/vendor/bootstrap/css/bootstrap-theme.css.map
vendored
Normal file
1
public/vendor/bootstrap/css/bootstrap-theme.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
5
public/vendor/bootstrap/css/bootstrap-theme.min.css
vendored
Normal file
5
public/vendor/bootstrap/css/bootstrap-theme.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6566
public/vendor/bootstrap/css/bootstrap.css
vendored
Normal file
6566
public/vendor/bootstrap/css/bootstrap.css
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
public/vendor/bootstrap/css/bootstrap.css.map
vendored
Normal file
1
public/vendor/bootstrap/css/bootstrap.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
5
public/vendor/bootstrap/css/bootstrap.min.css
vendored
Normal file
5
public/vendor/bootstrap/css/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot
vendored
Normal file
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot
vendored
Normal file
Binary file not shown.
288
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg
vendored
Normal file
288
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg
vendored
Normal file
|
@ -0,0 +1,288 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata></metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||||
|
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||||
|
<missing-glyph horiz-adv-x="500" />
|
||||||
|
<glyph horiz-adv-x="0" />
|
||||||
|
<glyph horiz-adv-x="400" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
|
||||||
|
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="650" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1300" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="650" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1300" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="433" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="325" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="216" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="216" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="162" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="72" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="325" />
|
||||||
|
<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
|
||||||
|
<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
|
||||||
|
<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
|
||||||
|
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||||
|
<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
|
||||||
|
<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
|
||||||
|
<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
|
||||||
|
<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
|
||||||
|
<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
|
||||||
|
<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
|
||||||
|
<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
|
||||||
|
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
|
||||||
|
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
|
||||||
|
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
|
||||||
|
<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
|
||||||
|
<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
|
||||||
|
<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
|
||||||
|
<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
|
||||||
|
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
|
||||||
|
<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
|
||||||
|
<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
|
||||||
|
<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
|
||||||
|
<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
|
||||||
|
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
|
||||||
|
<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||||
|
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
|
||||||
|
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
|
||||||
|
<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
|
||||||
|
<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
|
||||||
|
<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
|
||||||
|
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
|
||||||
|
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
|
||||||
|
<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
|
||||||
|
<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
|
||||||
|
<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
|
||||||
|
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||||
|
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||||
|
<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
|
||||||
|
<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
|
||||||
|
<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
|
||||||
|
<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
|
||||||
|
<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
|
||||||
|
<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
|
||||||
|
<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
|
||||||
|
<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
|
||||||
|
<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
|
||||||
|
<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
|
||||||
|
<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
|
||||||
|
<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
|
||||||
|
<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
|
||||||
|
<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
|
||||||
|
<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
|
||||||
|
<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
|
||||||
|
<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
|
||||||
|
<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||||
|
<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
|
||||||
|
<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
|
||||||
|
<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
|
||||||
|
<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
|
||||||
|
<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
|
||||||
|
<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
|
||||||
|
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
|
||||||
|
<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
|
||||||
|
<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
|
||||||
|
<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
|
||||||
|
<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
|
||||||
|
<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||||
|
<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||||
|
<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
|
||||||
|
<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
|
||||||
|
<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
|
||||||
|
<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
|
||||||
|
<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
|
||||||
|
<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
|
||||||
|
<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
|
||||||
|
<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
|
||||||
|
<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
|
||||||
|
<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
|
||||||
|
<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
|
||||||
|
<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
|
||||||
|
<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
|
||||||
|
<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
|
||||||
|
<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
|
||||||
|
<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
|
||||||
|
<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
|
||||||
|
<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
|
||||||
|
<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
|
||||||
|
<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
|
||||||
|
<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
|
||||||
|
<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
|
||||||
|
<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
|
||||||
|
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
|
||||||
|
<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
|
||||||
|
<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
|
||||||
|
<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
|
||||||
|
<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
|
||||||
|
<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
|
||||||
|
<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||||
|
<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||||
|
<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
|
||||||
|
<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
|
||||||
|
<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
|
||||||
|
<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
|
||||||
|
<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
|
||||||
|
<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
|
||||||
|
<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
|
||||||
|
<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
|
||||||
|
<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
|
||||||
|
<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
|
||||||
|
<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
|
||||||
|
<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
|
||||||
|
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
|
||||||
|
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
|
||||||
|
<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
|
||||||
|
<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
|
||||||
|
<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
|
||||||
|
<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
|
||||||
|
<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
|
||||||
|
<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
|
||||||
|
<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
|
||||||
|
<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
|
||||||
|
<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
|
||||||
|
<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
|
||||||
|
<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
|
||||||
|
<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
|
||||||
|
<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
|
||||||
|
<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
|
||||||
|
<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
|
||||||
|
<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
|
||||||
|
<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
|
||||||
|
<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
|
||||||
|
<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||||
|
<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||||
|
<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
|
||||||
|
<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
|
||||||
|
<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
|
||||||
|
<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
|
||||||
|
<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
|
||||||
|
<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||||
|
<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
|
||||||
|
<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
|
||||||
|
<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
|
||||||
|
<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
|
||||||
|
<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
|
||||||
|
<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
|
||||||
|
<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
|
||||||
|
<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
|
||||||
|
<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
|
||||||
|
<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
|
||||||
|
<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
|
||||||
|
<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
|
||||||
|
<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
|
||||||
|
<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
|
||||||
|
<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
|
||||||
|
<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
After Width: | Height: | Size: 106 KiB |
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf
vendored
Normal file
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf
vendored
Normal file
Binary file not shown.
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff
vendored
Normal file
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff
vendored
Normal file
Binary file not shown.
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2
vendored
Normal file
BIN
public/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2
vendored
Normal file
Binary file not shown.
2306
public/vendor/bootstrap/js/bootstrap.js
vendored
Normal file
2306
public/vendor/bootstrap/js/bootstrap.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
7
public/vendor/bootstrap/js/bootstrap.min.js
vendored
Normal file
7
public/vendor/bootstrap/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
13
public/vendor/bootstrap/js/npm.js
vendored
Normal file
13
public/vendor/bootstrap/js/npm.js
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
|
||||||
|
require('../../js/transition.js')
|
||||||
|
require('../../js/alert.js')
|
||||||
|
require('../../js/button.js')
|
||||||
|
require('../../js/carousel.js')
|
||||||
|
require('../../js/collapse.js')
|
||||||
|
require('../../js/dropdown.js')
|
||||||
|
require('../../js/modal.js')
|
||||||
|
require('../../js/tooltip.js')
|
||||||
|
require('../../js/popover.js')
|
||||||
|
require('../../js/scrollspy.js')
|
||||||
|
require('../../js/tab.js')
|
||||||
|
require('../../js/affix.js')
|
183
public/vendor/codemirror/addon/comment/comment.js
vendored
Executable file
183
public/vendor/codemirror/addon/comment/comment.js
vendored
Executable file
|
@ -0,0 +1,183 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var noOptions = {};
|
||||||
|
var nonWS = /[^\s\u00a0]/;
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
function firstNonWS(str) {
|
||||||
|
var found = str.search(nonWS);
|
||||||
|
return found == -1 ? 0 : found;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.commands.toggleComment = function(cm) {
|
||||||
|
var minLine = Infinity, ranges = cm.listSelections(), mode = null;
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--) {
|
||||||
|
var from = ranges[i].from(), to = ranges[i].to();
|
||||||
|
if (from.line >= minLine) continue;
|
||||||
|
if (to.line >= minLine) to = Pos(minLine, 0);
|
||||||
|
minLine = from.line;
|
||||||
|
if (mode == null) {
|
||||||
|
if (cm.uncomment(from, to)) mode = "un";
|
||||||
|
else { cm.lineComment(from, to); mode = "line"; }
|
||||||
|
} else if (mode == "un") {
|
||||||
|
cm.uncomment(from, to);
|
||||||
|
} else {
|
||||||
|
cm.lineComment(from, to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("lineComment", function(from, to, options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var self = this, mode = self.getModeAt(from);
|
||||||
|
var commentString = options.lineComment || mode.lineComment;
|
||||||
|
if (!commentString) {
|
||||||
|
if (options.blockCommentStart || mode.blockCommentStart) {
|
||||||
|
options.fullLines = true;
|
||||||
|
self.blockComment(from, to, options);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var firstLine = self.getLine(from.line);
|
||||||
|
if (firstLine == null) return;
|
||||||
|
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
|
||||||
|
var pad = options.padding == null ? " " : options.padding;
|
||||||
|
var blankLines = options.commentBlankLines || from.line == to.line;
|
||||||
|
|
||||||
|
self.operation(function() {
|
||||||
|
if (options.indent) {
|
||||||
|
var baseString = firstLine.slice(0, firstNonWS(firstLine));
|
||||||
|
for (var i = from.line; i < end; ++i) {
|
||||||
|
var line = self.getLine(i), cut = baseString.length;
|
||||||
|
if (!blankLines && !nonWS.test(line)) continue;
|
||||||
|
if (line.slice(0, cut) != baseString) cut = firstNonWS(line);
|
||||||
|
self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var i = from.line; i < end; ++i) {
|
||||||
|
if (blankLines || nonWS.test(self.getLine(i)))
|
||||||
|
self.replaceRange(commentString + pad, Pos(i, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("blockComment", function(from, to, options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var self = this, mode = self.getModeAt(from);
|
||||||
|
var startString = options.blockCommentStart || mode.blockCommentStart;
|
||||||
|
var endString = options.blockCommentEnd || mode.blockCommentEnd;
|
||||||
|
if (!startString || !endString) {
|
||||||
|
if ((options.lineComment || mode.lineComment) && options.fullLines != false)
|
||||||
|
self.lineComment(from, to, options);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var end = Math.min(to.line, self.lastLine());
|
||||||
|
if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end;
|
||||||
|
|
||||||
|
var pad = options.padding == null ? " " : options.padding;
|
||||||
|
if (from.line > end) return;
|
||||||
|
|
||||||
|
self.operation(function() {
|
||||||
|
if (options.fullLines != false) {
|
||||||
|
var lastLineHasText = nonWS.test(self.getLine(end));
|
||||||
|
self.replaceRange(pad + endString, Pos(end));
|
||||||
|
self.replaceRange(startString + pad, Pos(from.line, 0));
|
||||||
|
var lead = options.blockCommentLead || mode.blockCommentLead;
|
||||||
|
if (lead != null) for (var i = from.line + 1; i <= end; ++i)
|
||||||
|
if (i != end || lastLineHasText)
|
||||||
|
self.replaceRange(lead + pad, Pos(i, 0));
|
||||||
|
} else {
|
||||||
|
self.replaceRange(endString, to);
|
||||||
|
self.replaceRange(startString, from);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("uncomment", function(from, to, options) {
|
||||||
|
if (!options) options = noOptions;
|
||||||
|
var self = this, mode = self.getModeAt(from);
|
||||||
|
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);
|
||||||
|
|
||||||
|
// Try finding line comments
|
||||||
|
var lineString = options.lineComment || mode.lineComment, lines = [];
|
||||||
|
var pad = options.padding == null ? " " : options.padding, didSomething;
|
||||||
|
lineComment: {
|
||||||
|
if (!lineString) break lineComment;
|
||||||
|
for (var i = start; i <= end; ++i) {
|
||||||
|
var line = self.getLine(i);
|
||||||
|
var found = line.indexOf(lineString);
|
||||||
|
if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1;
|
||||||
|
if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment;
|
||||||
|
if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment;
|
||||||
|
lines.push(line);
|
||||||
|
}
|
||||||
|
self.operation(function() {
|
||||||
|
for (var i = start; i <= end; ++i) {
|
||||||
|
var line = lines[i - start];
|
||||||
|
var pos = line.indexOf(lineString), endPos = pos + lineString.length;
|
||||||
|
if (pos < 0) continue;
|
||||||
|
if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length;
|
||||||
|
didSomething = true;
|
||||||
|
self.replaceRange("", Pos(i, pos), Pos(i, endPos));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (didSomething) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try block comments
|
||||||
|
var startString = options.blockCommentStart || mode.blockCommentStart;
|
||||||
|
var endString = options.blockCommentEnd || mode.blockCommentEnd;
|
||||||
|
if (!startString || !endString) return false;
|
||||||
|
var lead = options.blockCommentLead || mode.blockCommentLead;
|
||||||
|
var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end);
|
||||||
|
var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString);
|
||||||
|
if (close == -1 && start != end) {
|
||||||
|
endLine = self.getLine(--end);
|
||||||
|
close = endLine.lastIndexOf(endString);
|
||||||
|
}
|
||||||
|
if (open == -1 || close == -1 ||
|
||||||
|
!/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) ||
|
||||||
|
!/comment/.test(self.getTokenTypeAt(Pos(end, close + 1))))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Avoid killing block comments completely outside the selection.
|
||||||
|
// Positions of the last startString before the start of the selection, and the first endString after it.
|
||||||
|
var lastStart = startLine.lastIndexOf(startString, from.ch);
|
||||||
|
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
|
||||||
|
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
|
||||||
|
// Positions of the first endString after the end of the selection, and the last startString before it.
|
||||||
|
firstEnd = endLine.indexOf(endString, to.ch);
|
||||||
|
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
|
||||||
|
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
|
||||||
|
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;
|
||||||
|
|
||||||
|
self.operation(function() {
|
||||||
|
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
|
||||||
|
Pos(end, close + endString.length));
|
||||||
|
var openEnd = open + startString.length;
|
||||||
|
if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length;
|
||||||
|
self.replaceRange("", Pos(start, open), Pos(start, openEnd));
|
||||||
|
if (lead) for (var i = start + 1; i <= end; ++i) {
|
||||||
|
var line = self.getLine(i), found = line.indexOf(lead);
|
||||||
|
if (found == -1 || nonWS.test(line.slice(0, found))) continue;
|
||||||
|
var foundEnd = found + lead.length;
|
||||||
|
if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length;
|
||||||
|
self.replaceRange("", Pos(i, found), Pos(i, foundEnd));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
});
|
85
public/vendor/codemirror/addon/comment/continuecomment.js
vendored
Executable file
85
public/vendor/codemirror/addon/comment/continuecomment.js
vendored
Executable file
|
@ -0,0 +1,85 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
var modes = ["clike", "css", "javascript"];
|
||||||
|
|
||||||
|
for (var i = 0; i < modes.length; ++i)
|
||||||
|
CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "});
|
||||||
|
|
||||||
|
function continueComment(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
var ranges = cm.listSelections(), mode, inserts = [];
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var pos = ranges[i].head, token = cm.getTokenAt(pos);
|
||||||
|
if (token.type != "comment") return CodeMirror.Pass;
|
||||||
|
var modeHere = CodeMirror.innerMode(cm.getMode(), token.state).mode;
|
||||||
|
if (!mode) mode = modeHere;
|
||||||
|
else if (mode != modeHere) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var insert = null;
|
||||||
|
if (mode.blockCommentStart && mode.blockCommentContinue) {
|
||||||
|
var end = token.string.indexOf(mode.blockCommentEnd);
|
||||||
|
var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found;
|
||||||
|
if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) {
|
||||||
|
// Comment ended, don't continue it
|
||||||
|
} else if (token.string.indexOf(mode.blockCommentStart) == 0) {
|
||||||
|
insert = full.slice(0, token.start);
|
||||||
|
if (!/^\s*$/.test(insert)) {
|
||||||
|
insert = "";
|
||||||
|
for (var j = 0; j < token.start; ++j) insert += " ";
|
||||||
|
}
|
||||||
|
} else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 &&
|
||||||
|
found + mode.blockCommentContinue.length > token.start &&
|
||||||
|
/^\s*$/.test(full.slice(0, found))) {
|
||||||
|
insert = full.slice(0, found);
|
||||||
|
}
|
||||||
|
if (insert != null) insert += mode.blockCommentContinue;
|
||||||
|
}
|
||||||
|
if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) {
|
||||||
|
var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment);
|
||||||
|
if (found > -1) {
|
||||||
|
insert = line.slice(0, found);
|
||||||
|
if (/\S/.test(insert)) insert = null;
|
||||||
|
else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (insert == null) return CodeMirror.Pass;
|
||||||
|
inserts[i] = "\n" + insert;
|
||||||
|
}
|
||||||
|
|
||||||
|
cm.operation(function() {
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--)
|
||||||
|
cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function continueLineCommentEnabled(cm) {
|
||||||
|
var opt = cm.getOption("continueComments");
|
||||||
|
if (opt && typeof opt == "object")
|
||||||
|
return opt.continueLineComment !== false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
|
||||||
|
if (prev && prev != CodeMirror.Init)
|
||||||
|
cm.removeKeyMap("continueComment");
|
||||||
|
if (val) {
|
||||||
|
var key = "Enter";
|
||||||
|
if (typeof val == "string")
|
||||||
|
key = val;
|
||||||
|
else if (typeof val == "object" && val.key)
|
||||||
|
key = val.key;
|
||||||
|
var map = {name: "continueComment"};
|
||||||
|
map[key] = continueComment;
|
||||||
|
cm.addKeyMap(map);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
32
public/vendor/codemirror/addon/dialog/dialog.css
vendored
Executable file
32
public/vendor/codemirror/addon/dialog/dialog.css
vendored
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
.CodeMirror-dialog {
|
||||||
|
position: absolute;
|
||||||
|
left: 0; right: 0;
|
||||||
|
background: white;
|
||||||
|
z-index: 15;
|
||||||
|
padding: .1em .8em;
|
||||||
|
overflow: hidden;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog-top {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog-bottom {
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog input {
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
background: transparent;
|
||||||
|
width: 20em;
|
||||||
|
color: inherit;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-dialog button {
|
||||||
|
font-size: 70%;
|
||||||
|
}
|
157
public/vendor/codemirror/addon/dialog/dialog.js
vendored
Executable file
157
public/vendor/codemirror/addon/dialog/dialog.js
vendored
Executable file
|
@ -0,0 +1,157 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// Open simple dialogs on top of an editor. Relies on dialog.css.
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
function dialogDiv(cm, template, bottom) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
var dialog;
|
||||||
|
dialog = wrap.appendChild(document.createElement("div"));
|
||||||
|
if (bottom)
|
||||||
|
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
|
||||||
|
else
|
||||||
|
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
|
||||||
|
|
||||||
|
if (typeof template == "string") {
|
||||||
|
dialog.innerHTML = template;
|
||||||
|
} else { // Assuming it's a detached DOM element.
|
||||||
|
dialog.appendChild(template);
|
||||||
|
}
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeNotification(cm, newVal) {
|
||||||
|
if (cm.state.currentNotificationClose)
|
||||||
|
cm.state.currentNotificationClose();
|
||||||
|
cm.state.currentNotificationClose = newVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("openDialog", function(template, callback, options) {
|
||||||
|
if (!options) options = {};
|
||||||
|
|
||||||
|
closeNotification(this, null);
|
||||||
|
|
||||||
|
var dialog = dialogDiv(this, template, options.bottom);
|
||||||
|
var closed = false, me = this;
|
||||||
|
function close(newVal) {
|
||||||
|
if (typeof newVal == 'string') {
|
||||||
|
inp.value = newVal;
|
||||||
|
} else {
|
||||||
|
if (closed) return;
|
||||||
|
closed = true;
|
||||||
|
dialog.parentNode.removeChild(dialog);
|
||||||
|
me.focus();
|
||||||
|
|
||||||
|
if (options.onClose) options.onClose(dialog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var inp = dialog.getElementsByTagName("input")[0], button;
|
||||||
|
if (inp) {
|
||||||
|
if (options.value) {
|
||||||
|
inp.value = options.value;
|
||||||
|
if (options.selectValueOnOpen !== false) {
|
||||||
|
inp.select();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.onInput)
|
||||||
|
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
|
||||||
|
if (options.onKeyUp)
|
||||||
|
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
|
||||||
|
|
||||||
|
CodeMirror.on(inp, "keydown", function(e) {
|
||||||
|
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
|
||||||
|
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
|
||||||
|
inp.blur();
|
||||||
|
CodeMirror.e_stop(e);
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
if (e.keyCode == 13) callback(inp.value, e);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);
|
||||||
|
|
||||||
|
inp.focus();
|
||||||
|
} else if (button = dialog.getElementsByTagName("button")[0]) {
|
||||||
|
CodeMirror.on(button, "click", function() {
|
||||||
|
close();
|
||||||
|
me.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);
|
||||||
|
|
||||||
|
button.focus();
|
||||||
|
}
|
||||||
|
return close;
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) {
|
||||||
|
closeNotification(this, null);
|
||||||
|
var dialog = dialogDiv(this, template, options && options.bottom);
|
||||||
|
var buttons = dialog.getElementsByTagName("button");
|
||||||
|
var closed = false, me = this, blurring = 1;
|
||||||
|
function close() {
|
||||||
|
if (closed) return;
|
||||||
|
closed = true;
|
||||||
|
dialog.parentNode.removeChild(dialog);
|
||||||
|
me.focus();
|
||||||
|
}
|
||||||
|
buttons[0].focus();
|
||||||
|
for (var i = 0; i < buttons.length; ++i) {
|
||||||
|
var b = buttons[i];
|
||||||
|
(function(callback) {
|
||||||
|
CodeMirror.on(b, "click", function(e) {
|
||||||
|
CodeMirror.e_preventDefault(e);
|
||||||
|
close();
|
||||||
|
if (callback) callback(me);
|
||||||
|
});
|
||||||
|
})(callbacks[i]);
|
||||||
|
CodeMirror.on(b, "blur", function() {
|
||||||
|
--blurring;
|
||||||
|
setTimeout(function() { if (blurring <= 0) close(); }, 200);
|
||||||
|
});
|
||||||
|
CodeMirror.on(b, "focus", function() { ++blurring; });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* openNotification
|
||||||
|
* Opens a notification, that can be closed with an optional timer
|
||||||
|
* (default 5000ms timer) and always closes on click.
|
||||||
|
*
|
||||||
|
* If a notification is opened while another is opened, it will close the
|
||||||
|
* currently opened one and open the new one immediately.
|
||||||
|
*/
|
||||||
|
CodeMirror.defineExtension("openNotification", function(template, options) {
|
||||||
|
closeNotification(this, close);
|
||||||
|
var dialog = dialogDiv(this, template, options && options.bottom);
|
||||||
|
var closed = false, doneTimer;
|
||||||
|
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000;
|
||||||
|
|
||||||
|
function close() {
|
||||||
|
if (closed) return;
|
||||||
|
closed = true;
|
||||||
|
clearTimeout(doneTimer);
|
||||||
|
dialog.parentNode.removeChild(dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.on(dialog, 'click', function(e) {
|
||||||
|
CodeMirror.e_preventDefault(e);
|
||||||
|
close();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (duration)
|
||||||
|
doneTimer = setTimeout(close, duration);
|
||||||
|
|
||||||
|
return close;
|
||||||
|
});
|
||||||
|
});
|
6
public/vendor/codemirror/addon/display/fullscreen.css
vendored
Executable file
6
public/vendor/codemirror/addon/display/fullscreen.css
vendored
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
.CodeMirror-fullscreen {
|
||||||
|
position: fixed;
|
||||||
|
top: 0; left: 0; right: 0; bottom: 0;
|
||||||
|
height: auto;
|
||||||
|
z-index: 9;
|
||||||
|
}
|
41
public/vendor/codemirror/addon/display/fullscreen.js
vendored
Executable file
41
public/vendor/codemirror/addon/display/fullscreen.js
vendored
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
|
||||||
|
if (old == CodeMirror.Init) old = false;
|
||||||
|
if (!old == !val) return;
|
||||||
|
if (val) setFullscreen(cm);
|
||||||
|
else setNormal(cm);
|
||||||
|
});
|
||||||
|
|
||||||
|
function setFullscreen(cm) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
|
||||||
|
width: wrap.style.width, height: wrap.style.height};
|
||||||
|
wrap.style.width = "";
|
||||||
|
wrap.style.height = "auto";
|
||||||
|
wrap.className += " CodeMirror-fullscreen";
|
||||||
|
document.documentElement.style.overflow = "hidden";
|
||||||
|
cm.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setNormal(cm) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
|
||||||
|
document.documentElement.style.overflow = "";
|
||||||
|
var info = cm.state.fullScreenRestore;
|
||||||
|
wrap.style.width = info.width; wrap.style.height = info.height;
|
||||||
|
window.scrollTo(info.scrollLeft, info.scrollTop);
|
||||||
|
cm.refresh();
|
||||||
|
}
|
||||||
|
});
|
112
public/vendor/codemirror/addon/display/panel.js
vendored
Executable file
112
public/vendor/codemirror/addon/display/panel.js
vendored
Executable file
|
@ -0,0 +1,112 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
CodeMirror.defineExtension("addPanel", function(node, options) {
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
if (!this.state.panels) initPanels(this);
|
||||||
|
|
||||||
|
var info = this.state.panels;
|
||||||
|
var wrapper = info.wrapper;
|
||||||
|
var cmWrapper = this.getWrapperElement();
|
||||||
|
|
||||||
|
if (options.after instanceof Panel && !options.after.cleared) {
|
||||||
|
wrapper.insertBefore(node, options.before.node.nextSibling);
|
||||||
|
} else if (options.before instanceof Panel && !options.before.cleared) {
|
||||||
|
wrapper.insertBefore(node, options.before.node);
|
||||||
|
} else if (options.replace instanceof Panel && !options.replace.cleared) {
|
||||||
|
wrapper.insertBefore(node, options.replace.node);
|
||||||
|
options.replace.clear();
|
||||||
|
} else if (options.position == "bottom") {
|
||||||
|
wrapper.appendChild(node);
|
||||||
|
} else if (options.position == "before-bottom") {
|
||||||
|
wrapper.insertBefore(node, cmWrapper.nextSibling);
|
||||||
|
} else if (options.position == "after-top") {
|
||||||
|
wrapper.insertBefore(node, cmWrapper);
|
||||||
|
} else {
|
||||||
|
wrapper.insertBefore(node, wrapper.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
var height = (options && options.height) || node.offsetHeight;
|
||||||
|
this._setSize(null, info.heightLeft -= height);
|
||||||
|
info.panels++;
|
||||||
|
return new Panel(this, node, options, height);
|
||||||
|
});
|
||||||
|
|
||||||
|
function Panel(cm, node, options, height) {
|
||||||
|
this.cm = cm;
|
||||||
|
this.node = node;
|
||||||
|
this.options = options;
|
||||||
|
this.height = height;
|
||||||
|
this.cleared = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Panel.prototype.clear = function() {
|
||||||
|
if (this.cleared) return;
|
||||||
|
this.cleared = true;
|
||||||
|
var info = this.cm.state.panels;
|
||||||
|
this.cm._setSize(null, info.heightLeft += this.height);
|
||||||
|
info.wrapper.removeChild(this.node);
|
||||||
|
if (--info.panels == 0) removePanels(this.cm);
|
||||||
|
};
|
||||||
|
|
||||||
|
Panel.prototype.changed = function(height) {
|
||||||
|
var newHeight = height == null ? this.node.offsetHeight : height;
|
||||||
|
var info = this.cm.state.panels;
|
||||||
|
this.cm._setSize(null, info.height += (newHeight - this.height));
|
||||||
|
this.height = newHeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
function initPanels(cm) {
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
|
||||||
|
var height = parseInt(style.height);
|
||||||
|
var info = cm.state.panels = {
|
||||||
|
setHeight: wrap.style.height,
|
||||||
|
heightLeft: height,
|
||||||
|
panels: 0,
|
||||||
|
wrapper: document.createElement("div")
|
||||||
|
};
|
||||||
|
wrap.parentNode.insertBefore(info.wrapper, wrap);
|
||||||
|
var hasFocus = cm.hasFocus();
|
||||||
|
info.wrapper.appendChild(wrap);
|
||||||
|
if (hasFocus) cm.focus();
|
||||||
|
|
||||||
|
cm._setSize = cm.setSize;
|
||||||
|
if (height != null) cm.setSize = function(width, newHeight) {
|
||||||
|
if (newHeight == null) return this._setSize(width, newHeight);
|
||||||
|
info.setHeight = newHeight;
|
||||||
|
if (typeof newHeight != "number") {
|
||||||
|
var px = /^(\d+\.?\d*)px$/.exec(newHeight);
|
||||||
|
if (px) {
|
||||||
|
newHeight = Number(px[1]);
|
||||||
|
} else {
|
||||||
|
info.wrapper.style.height = newHeight;
|
||||||
|
newHeight = info.wrapper.offsetHeight;
|
||||||
|
info.wrapper.style.height = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cm._setSize(width, info.heightLeft += (newHeight - height));
|
||||||
|
height = newHeight;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function removePanels(cm) {
|
||||||
|
var info = cm.state.panels;
|
||||||
|
cm.state.panels = null;
|
||||||
|
|
||||||
|
var wrap = cm.getWrapperElement();
|
||||||
|
info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
|
||||||
|
wrap.style.height = info.setHeight;
|
||||||
|
cm.setSize = cm._setSize;
|
||||||
|
cm.setSize();
|
||||||
|
}
|
||||||
|
});
|
58
public/vendor/codemirror/addon/display/placeholder.js
vendored
Executable file
58
public/vendor/codemirror/addon/display/placeholder.js
vendored
Executable file
|
@ -0,0 +1,58 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
CodeMirror.defineOption("placeholder", "", function(cm, val, old) {
|
||||||
|
var prev = old && old != CodeMirror.Init;
|
||||||
|
if (val && !prev) {
|
||||||
|
cm.on("blur", onBlur);
|
||||||
|
cm.on("change", onChange);
|
||||||
|
onChange(cm);
|
||||||
|
} else if (!val && prev) {
|
||||||
|
cm.off("blur", onBlur);
|
||||||
|
cm.off("change", onChange);
|
||||||
|
clearPlaceholder(cm);
|
||||||
|
var wrapper = cm.getWrapperElement();
|
||||||
|
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val && !cm.hasFocus()) onBlur(cm);
|
||||||
|
});
|
||||||
|
|
||||||
|
function clearPlaceholder(cm) {
|
||||||
|
if (cm.state.placeholder) {
|
||||||
|
cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);
|
||||||
|
cm.state.placeholder = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function setPlaceholder(cm) {
|
||||||
|
clearPlaceholder(cm);
|
||||||
|
var elt = cm.state.placeholder = document.createElement("pre");
|
||||||
|
elt.style.cssText = "height: 0; overflow: visible";
|
||||||
|
elt.className = "CodeMirror-placeholder";
|
||||||
|
elt.appendChild(document.createTextNode(cm.getOption("placeholder")));
|
||||||
|
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onBlur(cm) {
|
||||||
|
if (isEmpty(cm)) setPlaceholder(cm);
|
||||||
|
}
|
||||||
|
function onChange(cm) {
|
||||||
|
var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);
|
||||||
|
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");
|
||||||
|
|
||||||
|
if (empty) setPlaceholder(cm);
|
||||||
|
else clearPlaceholder(cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isEmpty(cm) {
|
||||||
|
return (cm.lineCount() === 1) && (cm.getLine(0) === "");
|
||||||
|
}
|
||||||
|
});
|
64
public/vendor/codemirror/addon/display/rulers.js
vendored
Executable file
64
public/vendor/codemirror/addon/display/rulers.js
vendored
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineOption("rulers", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init) {
|
||||||
|
clearRulers(cm);
|
||||||
|
cm.off("refresh", refreshRulers);
|
||||||
|
}
|
||||||
|
if (val && val.length) {
|
||||||
|
setRulers(cm);
|
||||||
|
cm.on("refresh", refreshRulers);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function clearRulers(cm) {
|
||||||
|
for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) {
|
||||||
|
var node = cm.display.lineSpace.childNodes[i];
|
||||||
|
if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className))
|
||||||
|
node.parentNode.removeChild(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setRulers(cm) {
|
||||||
|
var val = cm.getOption("rulers");
|
||||||
|
var cw = cm.defaultCharWidth();
|
||||||
|
var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left;
|
||||||
|
var minH = cm.display.scroller.offsetHeight + 30;
|
||||||
|
for (var i = 0; i < val.length; i++) {
|
||||||
|
var elt = document.createElement("div");
|
||||||
|
elt.className = "CodeMirror-ruler";
|
||||||
|
var col, cls = null, conf = val[i];
|
||||||
|
if (typeof conf == "number") {
|
||||||
|
col = conf;
|
||||||
|
} else {
|
||||||
|
col = conf.column;
|
||||||
|
if (conf.className) elt.className += " " + conf.className;
|
||||||
|
if (conf.color) elt.style.borderColor = conf.color;
|
||||||
|
if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle;
|
||||||
|
if (conf.width) elt.style.borderLeftWidth = conf.width;
|
||||||
|
cls = val[i].className;
|
||||||
|
}
|
||||||
|
elt.style.left = (left + col * cw) + "px";
|
||||||
|
elt.style.top = "-50px";
|
||||||
|
elt.style.bottom = "-20px";
|
||||||
|
elt.style.minHeight = minH + "px";
|
||||||
|
cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshRulers(cm) {
|
||||||
|
clearRulers(cm);
|
||||||
|
setRulers(cm);
|
||||||
|
}
|
||||||
|
});
|
184
public/vendor/codemirror/addon/edit/closebrackets.js
vendored
Executable file
184
public/vendor/codemirror/addon/edit/closebrackets.js
vendored
Executable file
|
@ -0,0 +1,184 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
var defaults = {
|
||||||
|
pairs: "()[]{}''\"\"",
|
||||||
|
triples: "",
|
||||||
|
explode: "[]{}"
|
||||||
|
};
|
||||||
|
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init) {
|
||||||
|
cm.removeKeyMap(keyMap);
|
||||||
|
cm.state.closeBrackets = null;
|
||||||
|
}
|
||||||
|
if (val) {
|
||||||
|
cm.state.closeBrackets = val;
|
||||||
|
cm.addKeyMap(keyMap);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function getOption(conf, name) {
|
||||||
|
if (name == "pairs" && typeof conf == "string") return conf;
|
||||||
|
if (typeof conf == "object" && conf[name] != null) return conf[name];
|
||||||
|
return defaults[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
var bind = defaults.pairs + "`";
|
||||||
|
var keyMap = {Backspace: handleBackspace, Enter: handleEnter};
|
||||||
|
for (var i = 0; i < bind.length; i++)
|
||||||
|
keyMap["'" + bind.charAt(i) + "'"] = handler(bind.charAt(i));
|
||||||
|
|
||||||
|
function handler(ch) {
|
||||||
|
return function(cm) { return handleChar(cm, ch); };
|
||||||
|
}
|
||||||
|
|
||||||
|
function getConfig(cm) {
|
||||||
|
var deflt = cm.state.closeBrackets;
|
||||||
|
if (!deflt) return null;
|
||||||
|
var mode = cm.getModeAt(cm.getCursor());
|
||||||
|
return mode.closeBrackets || deflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleBackspace(cm) {
|
||||||
|
var conf = getConfig(cm);
|
||||||
|
if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var pairs = getOption(conf, "pairs");
|
||||||
|
var ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var around = charsAround(cm, ranges[i].head);
|
||||||
|
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--) {
|
||||||
|
var cur = ranges[i].head;
|
||||||
|
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleEnter(cm) {
|
||||||
|
var conf = getConfig(cm);
|
||||||
|
var explode = conf && getOption(conf, "explode");
|
||||||
|
if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var around = charsAround(cm, ranges[i].head);
|
||||||
|
if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
cm.operation(function() {
|
||||||
|
cm.replaceSelection("\n\n", null);
|
||||||
|
cm.execCommand("goCharLeft");
|
||||||
|
ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var line = ranges[i].head.line;
|
||||||
|
cm.indentLine(line, null, true);
|
||||||
|
cm.indentLine(line + 1, null, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleChar(cm, ch) {
|
||||||
|
var conf = getConfig(cm);
|
||||||
|
if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var pairs = getOption(conf, "pairs");
|
||||||
|
var pos = pairs.indexOf(ch);
|
||||||
|
if (pos == -1) return CodeMirror.Pass;
|
||||||
|
var triples = getOption(conf, "triples");
|
||||||
|
|
||||||
|
var identical = pairs.charAt(pos + 1) == ch;
|
||||||
|
var ranges = cm.listSelections();
|
||||||
|
var opening = pos % 2 == 0;
|
||||||
|
|
||||||
|
var type, next;
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var range = ranges[i], cur = range.head, curType;
|
||||||
|
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
|
||||||
|
if (opening && !range.empty()) {
|
||||||
|
curType = "surround";
|
||||||
|
} else if ((identical || !opening) && next == ch) {
|
||||||
|
if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch)
|
||||||
|
curType = "skipThree";
|
||||||
|
else
|
||||||
|
curType = "skip";
|
||||||
|
} else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 &&
|
||||||
|
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch &&
|
||||||
|
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != ch)) {
|
||||||
|
curType = "addFour";
|
||||||
|
} else if (identical) {
|
||||||
|
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, ch)) curType = "both";
|
||||||
|
else return CodeMirror.Pass;
|
||||||
|
} else if (opening && (cm.getLine(cur.line).length == cur.ch ||
|
||||||
|
isClosingBracket(next, pairs) ||
|
||||||
|
/\s/.test(next))) {
|
||||||
|
curType = "both";
|
||||||
|
} else {
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
if (!type) type = curType;
|
||||||
|
else if (type != curType) return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
|
||||||
|
var left = pos % 2 ? pairs.charAt(pos - 1) : ch;
|
||||||
|
var right = pos % 2 ? ch : pairs.charAt(pos + 1);
|
||||||
|
cm.operation(function() {
|
||||||
|
if (type == "skip") {
|
||||||
|
cm.execCommand("goCharRight");
|
||||||
|
} else if (type == "skipThree") {
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
cm.execCommand("goCharRight");
|
||||||
|
} else if (type == "surround") {
|
||||||
|
var sels = cm.getSelections();
|
||||||
|
for (var i = 0; i < sels.length; i++)
|
||||||
|
sels[i] = left + sels[i] + right;
|
||||||
|
cm.replaceSelections(sels, "around");
|
||||||
|
} else if (type == "both") {
|
||||||
|
cm.replaceSelection(left + right, null);
|
||||||
|
cm.execCommand("goCharLeft");
|
||||||
|
} else if (type == "addFour") {
|
||||||
|
cm.replaceSelection(left + left + left + left, "before");
|
||||||
|
cm.execCommand("goCharRight");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function isClosingBracket(ch, pairs) {
|
||||||
|
var pos = pairs.lastIndexOf(ch);
|
||||||
|
return pos > -1 && pos % 2 == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function charsAround(cm, pos) {
|
||||||
|
var str = cm.getRange(Pos(pos.line, pos.ch - 1),
|
||||||
|
Pos(pos.line, pos.ch + 1));
|
||||||
|
return str.length == 2 ? str : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Project the token type that will exists after the given char is
|
||||||
|
// typed, and use it to determine whether it would cause the start
|
||||||
|
// of a string token.
|
||||||
|
function enteringString(cm, pos, ch) {
|
||||||
|
var line = cm.getLine(pos.line);
|
||||||
|
var token = cm.getTokenAt(pos);
|
||||||
|
if (/\bstring2?\b/.test(token.type)) return false;
|
||||||
|
var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4);
|
||||||
|
stream.pos = stream.start = token.start;
|
||||||
|
for (;;) {
|
||||||
|
var type1 = cm.getMode().token(stream, token.state);
|
||||||
|
if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1);
|
||||||
|
stream.start = stream.pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
166
public/vendor/codemirror/addon/edit/closetag.js
vendored
Executable file
166
public/vendor/codemirror/addon/edit/closetag.js
vendored
Executable file
|
@ -0,0 +1,166 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag-closer extension for CodeMirror.
|
||||||
|
*
|
||||||
|
* This extension adds an "autoCloseTags" option that can be set to
|
||||||
|
* either true to get the default behavior, or an object to further
|
||||||
|
* configure its behavior.
|
||||||
|
*
|
||||||
|
* These are supported options:
|
||||||
|
*
|
||||||
|
* `whenClosing` (default true)
|
||||||
|
* Whether to autoclose when the '/' of a closing tag is typed.
|
||||||
|
* `whenOpening` (default true)
|
||||||
|
* Whether to autoclose the tag when the final '>' of an opening
|
||||||
|
* tag is typed.
|
||||||
|
* `dontCloseTags` (default is empty tags for HTML, none for XML)
|
||||||
|
* An array of tag names that should not be autoclosed.
|
||||||
|
* `indentTags` (default is block tags for HTML, none for XML)
|
||||||
|
* An array of tag names that should, when opened, cause a
|
||||||
|
* blank line to be added inside the tag, and the blank line and
|
||||||
|
* closing line to be indented.
|
||||||
|
*
|
||||||
|
* See demos/closetag.html for a usage example.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "../fold/xml-fold"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) {
|
||||||
|
if (old != CodeMirror.Init && old)
|
||||||
|
cm.removeKeyMap("autoCloseTags");
|
||||||
|
if (!val) return;
|
||||||
|
var map = {name: "autoCloseTags"};
|
||||||
|
if (typeof val != "object" || val.whenClosing)
|
||||||
|
map["'/'"] = function(cm) { return autoCloseSlash(cm); };
|
||||||
|
if (typeof val != "object" || val.whenOpening)
|
||||||
|
map["'>'"] = function(cm) { return autoCloseGT(cm); };
|
||||||
|
cm.addKeyMap(map);
|
||||||
|
});
|
||||||
|
|
||||||
|
var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param",
|
||||||
|
"source", "track", "wbr"];
|
||||||
|
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
|
||||||
|
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
|
||||||
|
|
||||||
|
function autoCloseGT(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
var ranges = cm.listSelections(), replacements = [];
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var pos = ranges[i].head, tok = cm.getTokenAt(pos);
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
||||||
|
if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html";
|
||||||
|
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
|
||||||
|
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
|
||||||
|
|
||||||
|
var tagName = state.tagName;
|
||||||
|
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
|
||||||
|
var lowerTagName = tagName.toLowerCase();
|
||||||
|
// Don't process the '>' at the end of an end-tag or self-closing tag
|
||||||
|
if (!tagName ||
|
||||||
|
tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) ||
|
||||||
|
tok.type == "tag" && state.type == "closeTag" ||
|
||||||
|
tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName />
|
||||||
|
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 ||
|
||||||
|
closingTagExists(cm, tagName, pos, state, true))
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var indent = indentTags && indexOf(indentTags, lowerTagName) > -1;
|
||||||
|
replacements[i] = {indent: indent,
|
||||||
|
text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">",
|
||||||
|
newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = ranges.length - 1; i >= 0; i--) {
|
||||||
|
var info = replacements[i];
|
||||||
|
cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+input");
|
||||||
|
var sel = cm.listSelections().slice(0);
|
||||||
|
sel[i] = {head: info.newPos, anchor: info.newPos};
|
||||||
|
cm.setSelections(sel);
|
||||||
|
if (info.indent) {
|
||||||
|
cm.indentLine(info.newPos.line, null, true);
|
||||||
|
cm.indentLine(info.newPos.line + 1, null, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function autoCloseCurrent(cm, typingSlash) {
|
||||||
|
var ranges = cm.listSelections(), replacements = [];
|
||||||
|
var head = typingSlash ? "/" : "</";
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
if (!ranges[i].empty()) return CodeMirror.Pass;
|
||||||
|
var pos = ranges[i].head, tok = cm.getTokenAt(pos);
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
|
||||||
|
if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" ||
|
||||||
|
tok.start != pos.ch - 1))
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
// Kludge to get around the fact that we are not in XML mode
|
||||||
|
// when completing in JS/CSS snippet in htmlmixed mode. Does not
|
||||||
|
// work for other XML embedded languages (there is no general
|
||||||
|
// way to go from a mixed mode to its current XML state).
|
||||||
|
if (inner.mode.name != "xml") {
|
||||||
|
if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript")
|
||||||
|
replacements[i] = head + "script>";
|
||||||
|
else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css")
|
||||||
|
replacements[i] = head + "style>";
|
||||||
|
else
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
} else {
|
||||||
|
if (!state.context || !state.context.tagName ||
|
||||||
|
closingTagExists(cm, state.context.tagName, pos, state))
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
replacements[i] = head + state.context.tagName + ">";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cm.replaceSelections(replacements, null, '+input');
|
||||||
|
ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++)
|
||||||
|
if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
|
||||||
|
cm.indentLine(ranges[i].head.line);
|
||||||
|
}
|
||||||
|
|
||||||
|
function autoCloseSlash(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
return autoCloseCurrent(cm, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); };
|
||||||
|
|
||||||
|
function indexOf(collection, elt) {
|
||||||
|
if (collection.indexOf) return collection.indexOf(elt);
|
||||||
|
for (var i = 0, e = collection.length; i < e; ++i)
|
||||||
|
if (collection[i] == elt) return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If xml-fold is loaded, we use its functionality to try and verify
|
||||||
|
// whether a given tag is actually unclosed.
|
||||||
|
function closingTagExists(cm, tagName, pos, state, newTag) {
|
||||||
|
if (!CodeMirror.scanForClosingTag) return false;
|
||||||
|
var end = Math.min(cm.lastLine() + 1, pos.line + 500);
|
||||||
|
var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end);
|
||||||
|
if (!nextClose || nextClose.tag != tagName) return false;
|
||||||
|
var cx = state.context;
|
||||||
|
// If the immediate wrapping context contains onCx instances of
|
||||||
|
// the same tag, a closing tag only exists if there are at least
|
||||||
|
// that many closing tags of that type following.
|
||||||
|
for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx;
|
||||||
|
pos = nextClose.to;
|
||||||
|
for (var i = 1; i < onCx; i++) {
|
||||||
|
var next = CodeMirror.scanForClosingTag(cm, pos, null, end);
|
||||||
|
if (!next || next.tag != tagName) return false;
|
||||||
|
pos = next.to;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
52
public/vendor/codemirror/addon/edit/continuelist.js
vendored
Executable file
52
public/vendor/codemirror/addon/edit/continuelist.js
vendored
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/,
|
||||||
|
emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/,
|
||||||
|
unorderedListRE = /[*+-]\s/;
|
||||||
|
|
||||||
|
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
|
||||||
|
if (cm.getOption("disableInput")) return CodeMirror.Pass;
|
||||||
|
var ranges = cm.listSelections(), replacements = [];
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var pos = ranges[i].head;
|
||||||
|
var eolState = cm.getStateAfter(pos.line);
|
||||||
|
var inList = eolState.list !== false;
|
||||||
|
var inQuote = eolState.quote !== 0;
|
||||||
|
|
||||||
|
var line = cm.getLine(pos.line), match = listRE.exec(line);
|
||||||
|
if (!ranges[i].empty() || (!inList && !inQuote) || !match) {
|
||||||
|
cm.execCommand("newlineAndIndent");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (emptyListRE.test(line)) {
|
||||||
|
cm.replaceRange("", {
|
||||||
|
line: pos.line, ch: 0
|
||||||
|
}, {
|
||||||
|
line: pos.line, ch: pos.ch + 1
|
||||||
|
}, "+delete");
|
||||||
|
replacements[i] = "\n";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
var indent = match[1], after = match[4];
|
||||||
|
var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0
|
||||||
|
? match[2]
|
||||||
|
: (parseInt(match[3], 10) + 1) + ".";
|
||||||
|
|
||||||
|
replacements[i] = "\n" + indent + bullet + after;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cm.replaceSelections(replacements, null, "+input");
|
||||||
|
};
|
||||||
|
});
|
120
public/vendor/codemirror/addon/edit/matchbrackets.js
vendored
Executable file
120
public/vendor/codemirror/addon/edit/matchbrackets.js
vendored
Executable file
|
@ -0,0 +1,120 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
var ie_lt8 = /MSIE \d/.test(navigator.userAgent) &&
|
||||||
|
(document.documentMode == null || document.documentMode < 8);
|
||||||
|
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
|
||||||
|
|
||||||
|
function findMatchingBracket(cm, where, strict, config) {
|
||||||
|
var line = cm.getLineHandle(where.line), pos = where.ch - 1;
|
||||||
|
var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
|
||||||
|
if (!match) return null;
|
||||||
|
var dir = match.charAt(1) == ">" ? 1 : -1;
|
||||||
|
if (strict && (dir > 0) != (pos == where.ch)) return null;
|
||||||
|
var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));
|
||||||
|
|
||||||
|
var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);
|
||||||
|
if (found == null) return null;
|
||||||
|
return {from: Pos(where.line, pos), to: found && found.pos,
|
||||||
|
match: found && found.ch == match.charAt(0), forward: dir > 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
// bracketRegex is used to specify which type of bracket to scan
|
||||||
|
// should be a regexp, e.g. /[[\]]/
|
||||||
|
//
|
||||||
|
// Note: If "where" is on an open bracket, then this bracket is ignored.
|
||||||
|
//
|
||||||
|
// Returns false when no bracket was found, null when it reached
|
||||||
|
// maxScanLines and gave up
|
||||||
|
function scanForBracket(cm, where, dir, style, config) {
|
||||||
|
var maxScanLen = (config && config.maxScanLineLength) || 10000;
|
||||||
|
var maxScanLines = (config && config.maxScanLines) || 1000;
|
||||||
|
|
||||||
|
var stack = [];
|
||||||
|
var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/;
|
||||||
|
var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)
|
||||||
|
: Math.max(cm.firstLine() - 1, where.line - maxScanLines);
|
||||||
|
for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {
|
||||||
|
var line = cm.getLine(lineNo);
|
||||||
|
if (!line) continue;
|
||||||
|
var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;
|
||||||
|
if (line.length > maxScanLen) continue;
|
||||||
|
if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);
|
||||||
|
for (; pos != end; pos += dir) {
|
||||||
|
var ch = line.charAt(pos);
|
||||||
|
if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {
|
||||||
|
var match = matching[ch];
|
||||||
|
if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch);
|
||||||
|
else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};
|
||||||
|
else stack.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function matchBrackets(cm, autoclear, config) {
|
||||||
|
// Disable brace matching in long lines, since it'll cause hugely slow updates
|
||||||
|
var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;
|
||||||
|
var marks = [], ranges = cm.listSelections();
|
||||||
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
|
var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);
|
||||||
|
if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {
|
||||||
|
var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
|
||||||
|
marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));
|
||||||
|
if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)
|
||||||
|
marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (marks.length) {
|
||||||
|
// Kludge to work around the IE bug from issue #1193, where text
|
||||||
|
// input stops going to the textare whever this fires.
|
||||||
|
if (ie_lt8 && cm.state.focused) cm.focus();
|
||||||
|
|
||||||
|
var clear = function() {
|
||||||
|
cm.operation(function() {
|
||||||
|
for (var i = 0; i < marks.length; i++) marks[i].clear();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (autoclear) setTimeout(clear, 800);
|
||||||
|
else return clear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentlyHighlighted = null;
|
||||||
|
function doMatchBrackets(cm) {
|
||||||
|
cm.operation(function() {
|
||||||
|
if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}
|
||||||
|
currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init)
|
||||||
|
cm.off("cursorActivity", doMatchBrackets);
|
||||||
|
if (val) {
|
||||||
|
cm.state.matchBrackets = typeof val == "object" ? val : {};
|
||||||
|
cm.on("cursorActivity", doMatchBrackets);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);});
|
||||||
|
CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){
|
||||||
|
return findMatchingBracket(this, pos, strict, config);
|
||||||
|
});
|
||||||
|
CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){
|
||||||
|
return scanForBracket(this, pos, dir, style, config);
|
||||||
|
});
|
||||||
|
});
|
66
public/vendor/codemirror/addon/edit/matchtags.js
vendored
Executable file
66
public/vendor/codemirror/addon/edit/matchtags.js
vendored
Executable file
|
@ -0,0 +1,66 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("../fold/xml-fold"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "../fold/xml-fold"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineOption("matchTags", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init) {
|
||||||
|
cm.off("cursorActivity", doMatchTags);
|
||||||
|
cm.off("viewportChange", maybeUpdateMatch);
|
||||||
|
clear(cm);
|
||||||
|
}
|
||||||
|
if (val) {
|
||||||
|
cm.state.matchBothTags = typeof val == "object" && val.bothTags;
|
||||||
|
cm.on("cursorActivity", doMatchTags);
|
||||||
|
cm.on("viewportChange", maybeUpdateMatch);
|
||||||
|
doMatchTags(cm);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function clear(cm) {
|
||||||
|
if (cm.state.tagHit) cm.state.tagHit.clear();
|
||||||
|
if (cm.state.tagOther) cm.state.tagOther.clear();
|
||||||
|
cm.state.tagHit = cm.state.tagOther = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function doMatchTags(cm) {
|
||||||
|
cm.state.failedTagMatch = false;
|
||||||
|
cm.operation(function() {
|
||||||
|
clear(cm);
|
||||||
|
if (cm.somethingSelected()) return;
|
||||||
|
var cur = cm.getCursor(), range = cm.getViewport();
|
||||||
|
range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to);
|
||||||
|
var match = CodeMirror.findMatchingTag(cm, cur, range);
|
||||||
|
if (!match) return;
|
||||||
|
if (cm.state.matchBothTags) {
|
||||||
|
var hit = match.at == "open" ? match.open : match.close;
|
||||||
|
if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"});
|
||||||
|
}
|
||||||
|
var other = match.at == "close" ? match.open : match.close;
|
||||||
|
if (other)
|
||||||
|
cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"});
|
||||||
|
else
|
||||||
|
cm.state.failedTagMatch = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function maybeUpdateMatch(cm) {
|
||||||
|
if (cm.state.failedTagMatch) doMatchTags(cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.commands.toMatchingTag = function(cm) {
|
||||||
|
var found = CodeMirror.findMatchingTag(cm, cm.getCursor());
|
||||||
|
if (found) {
|
||||||
|
var other = found.at == "close" ? found.open : found.close;
|
||||||
|
if (other) cm.extendSelection(other.to, other.from);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
27
public/vendor/codemirror/addon/edit/trailingspace.js
vendored
Executable file
27
public/vendor/codemirror/addon/edit/trailingspace.js
vendored
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) {
|
||||||
|
if (prev == CodeMirror.Init) prev = false;
|
||||||
|
if (prev && !val)
|
||||||
|
cm.removeOverlay("trailingspace");
|
||||||
|
else if (!prev && val)
|
||||||
|
cm.addOverlay({
|
||||||
|
token: function(stream) {
|
||||||
|
for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {}
|
||||||
|
if (i > stream.pos) { stream.pos = i; return null; }
|
||||||
|
stream.pos = l;
|
||||||
|
return "trailingspace";
|
||||||
|
},
|
||||||
|
name: "trailingspace"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
105
public/vendor/codemirror/addon/fold/brace-fold.js
vendored
Executable file
105
public/vendor/codemirror/addon/fold/brace-fold.js
vendored
Executable file
|
@ -0,0 +1,105 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "brace", function(cm, start) {
|
||||||
|
var line = start.line, lineText = cm.getLine(line);
|
||||||
|
var startCh, tokenType;
|
||||||
|
|
||||||
|
function findOpening(openCh) {
|
||||||
|
for (var at = start.ch, pass = 0;;) {
|
||||||
|
var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
|
||||||
|
if (found == -1) {
|
||||||
|
if (pass == 1) break;
|
||||||
|
pass = 1;
|
||||||
|
at = lineText.length;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pass == 1 && found < start.ch) break;
|
||||||
|
tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
|
||||||
|
if (!/^(comment|string)/.test(tokenType)) return found + 1;
|
||||||
|
at = found - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var startToken = "{", endToken = "}", startCh = findOpening("{");
|
||||||
|
if (startCh == null) {
|
||||||
|
startToken = "[", endToken = "]";
|
||||||
|
startCh = findOpening("[");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startCh == null) return;
|
||||||
|
var count = 1, lastLine = cm.lastLine(), end, endCh;
|
||||||
|
outer: for (var i = line; i <= lastLine; ++i) {
|
||||||
|
var text = cm.getLine(i), pos = i == line ? startCh : 0;
|
||||||
|
for (;;) {
|
||||||
|
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
|
||||||
|
if (nextOpen < 0) nextOpen = text.length;
|
||||||
|
if (nextClose < 0) nextClose = text.length;
|
||||||
|
pos = Math.min(nextOpen, nextClose);
|
||||||
|
if (pos == text.length) break;
|
||||||
|
if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
|
||||||
|
if (pos == nextOpen) ++count;
|
||||||
|
else if (!--count) { end = i; endCh = pos; break outer; }
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (end == null || line == end && endCh == startCh) return;
|
||||||
|
return {from: CodeMirror.Pos(line, startCh),
|
||||||
|
to: CodeMirror.Pos(end, endCh)};
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "import", function(cm, start) {
|
||||||
|
function hasImport(line) {
|
||||||
|
if (line < cm.firstLine() || line > cm.lastLine()) return null;
|
||||||
|
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
|
||||||
|
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
|
||||||
|
if (start.type != "keyword" || start.string != "import") return null;
|
||||||
|
// Now find closing semicolon, return its position
|
||||||
|
for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) {
|
||||||
|
var text = cm.getLine(i), semi = text.indexOf(";");
|
||||||
|
if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = start.line, has = hasImport(start), prev;
|
||||||
|
if (!has || hasImport(start - 1) || ((prev = hasImport(start - 2)) && prev.end.line == start - 1))
|
||||||
|
return null;
|
||||||
|
for (var end = has.end;;) {
|
||||||
|
var next = hasImport(end.line + 1);
|
||||||
|
if (next == null) break;
|
||||||
|
end = next.end;
|
||||||
|
}
|
||||||
|
return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end};
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "include", function(cm, start) {
|
||||||
|
function hasInclude(line) {
|
||||||
|
if (line < cm.firstLine() || line > cm.lastLine()) return null;
|
||||||
|
var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
|
||||||
|
if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1));
|
||||||
|
if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = start.line, has = hasInclude(start);
|
||||||
|
if (has == null || hasInclude(start - 1) != null) return null;
|
||||||
|
for (var end = start;;) {
|
||||||
|
var next = hasInclude(end + 1);
|
||||||
|
if (next == null) break;
|
||||||
|
++end;
|
||||||
|
}
|
||||||
|
return {from: CodeMirror.Pos(start, has + 1),
|
||||||
|
to: cm.clipPos(CodeMirror.Pos(end))};
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
57
public/vendor/codemirror/addon/fold/comment-fold.js
vendored
Executable file
57
public/vendor/codemirror/addon/fold/comment-fold.js
vendored
Executable file
|
@ -0,0 +1,57 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerGlobalHelper("fold", "comment", function(mode) {
|
||||||
|
return mode.blockCommentStart && mode.blockCommentEnd;
|
||||||
|
}, function(cm, start) {
|
||||||
|
var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd;
|
||||||
|
if (!startToken || !endToken) return;
|
||||||
|
var line = start.line, lineText = cm.getLine(line);
|
||||||
|
|
||||||
|
var startCh;
|
||||||
|
for (var at = start.ch, pass = 0;;) {
|
||||||
|
var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1);
|
||||||
|
if (found == -1) {
|
||||||
|
if (pass == 1) return;
|
||||||
|
pass = 1;
|
||||||
|
at = lineText.length;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pass == 1 && found < start.ch) return;
|
||||||
|
if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)))) {
|
||||||
|
startCh = found + startToken.length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
at = found - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var depth = 1, lastLine = cm.lastLine(), end, endCh;
|
||||||
|
outer: for (var i = line; i <= lastLine; ++i) {
|
||||||
|
var text = cm.getLine(i), pos = i == line ? startCh : 0;
|
||||||
|
for (;;) {
|
||||||
|
var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos);
|
||||||
|
if (nextOpen < 0) nextOpen = text.length;
|
||||||
|
if (nextClose < 0) nextClose = text.length;
|
||||||
|
pos = Math.min(nextOpen, nextClose);
|
||||||
|
if (pos == text.length) break;
|
||||||
|
if (pos == nextOpen) ++depth;
|
||||||
|
else if (!--depth) { end = i; endCh = pos; break outer; }
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (end == null || line == end && endCh == startCh) return;
|
||||||
|
return {from: CodeMirror.Pos(line, startCh),
|
||||||
|
to: CodeMirror.Pos(end, endCh)};
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
149
public/vendor/codemirror/addon/fold/foldcode.js
vendored
Executable file
149
public/vendor/codemirror/addon/fold/foldcode.js
vendored
Executable file
|
@ -0,0 +1,149 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function doFold(cm, pos, options, force) {
|
||||||
|
if (options && options.call) {
|
||||||
|
var finder = options;
|
||||||
|
options = null;
|
||||||
|
} else {
|
||||||
|
var finder = getOption(cm, options, "rangeFinder");
|
||||||
|
}
|
||||||
|
if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
|
||||||
|
var minSize = getOption(cm, options, "minFoldSize");
|
||||||
|
|
||||||
|
function getRange(allowFolded) {
|
||||||
|
var range = finder(cm, pos);
|
||||||
|
if (!range || range.to.line - range.from.line < minSize) return null;
|
||||||
|
var marks = cm.findMarksAt(range.from);
|
||||||
|
for (var i = 0; i < marks.length; ++i) {
|
||||||
|
if (marks[i].__isFold && force !== "fold") {
|
||||||
|
if (!allowFolded) return null;
|
||||||
|
range.cleared = true;
|
||||||
|
marks[i].clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
var range = getRange(true);
|
||||||
|
if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) {
|
||||||
|
pos = CodeMirror.Pos(pos.line - 1, 0);
|
||||||
|
range = getRange(false);
|
||||||
|
}
|
||||||
|
if (!range || range.cleared || force === "unfold") return;
|
||||||
|
|
||||||
|
var myWidget = makeWidget(cm, options);
|
||||||
|
CodeMirror.on(myWidget, "mousedown", function(e) {
|
||||||
|
myRange.clear();
|
||||||
|
CodeMirror.e_preventDefault(e);
|
||||||
|
});
|
||||||
|
var myRange = cm.markText(range.from, range.to, {
|
||||||
|
replacedWith: myWidget,
|
||||||
|
clearOnEnter: true,
|
||||||
|
__isFold: true
|
||||||
|
});
|
||||||
|
myRange.on("clear", function(from, to) {
|
||||||
|
CodeMirror.signal(cm, "unfold", cm, from, to);
|
||||||
|
});
|
||||||
|
CodeMirror.signal(cm, "fold", cm, range.from, range.to);
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeWidget(cm, options) {
|
||||||
|
var widget = getOption(cm, options, "widget");
|
||||||
|
if (typeof widget == "string") {
|
||||||
|
var text = document.createTextNode(widget);
|
||||||
|
widget = document.createElement("span");
|
||||||
|
widget.appendChild(text);
|
||||||
|
widget.className = "CodeMirror-foldmarker";
|
||||||
|
}
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clumsy backwards-compatible interface
|
||||||
|
CodeMirror.newFoldFunction = function(rangeFinder, widget) {
|
||||||
|
return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
|
||||||
|
};
|
||||||
|
|
||||||
|
// New-style interface
|
||||||
|
CodeMirror.defineExtension("foldCode", function(pos, options, force) {
|
||||||
|
doFold(this, pos, options, force);
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("isFolded", function(pos) {
|
||||||
|
var marks = this.findMarksAt(pos);
|
||||||
|
for (var i = 0; i < marks.length; ++i)
|
||||||
|
if (marks[i].__isFold) return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.commands.toggleFold = function(cm) {
|
||||||
|
cm.foldCode(cm.getCursor());
|
||||||
|
};
|
||||||
|
CodeMirror.commands.fold = function(cm) {
|
||||||
|
cm.foldCode(cm.getCursor(), null, "fold");
|
||||||
|
};
|
||||||
|
CodeMirror.commands.unfold = function(cm) {
|
||||||
|
cm.foldCode(cm.getCursor(), null, "unfold");
|
||||||
|
};
|
||||||
|
CodeMirror.commands.foldAll = function(cm) {
|
||||||
|
cm.operation(function() {
|
||||||
|
for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
|
||||||
|
cm.foldCode(CodeMirror.Pos(i, 0), null, "fold");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
CodeMirror.commands.unfoldAll = function(cm) {
|
||||||
|
cm.operation(function() {
|
||||||
|
for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++)
|
||||||
|
cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "combine", function() {
|
||||||
|
var funcs = Array.prototype.slice.call(arguments, 0);
|
||||||
|
return function(cm, start) {
|
||||||
|
for (var i = 0; i < funcs.length; ++i) {
|
||||||
|
var found = funcs[i](cm, start);
|
||||||
|
if (found) return found;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "auto", function(cm, start) {
|
||||||
|
var helpers = cm.getHelpers(start, "fold");
|
||||||
|
for (var i = 0; i < helpers.length; i++) {
|
||||||
|
var cur = helpers[i](cm, start);
|
||||||
|
if (cur) return cur;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var defaultOptions = {
|
||||||
|
rangeFinder: CodeMirror.fold.auto,
|
||||||
|
widget: "\u2194",
|
||||||
|
minFoldSize: 0,
|
||||||
|
scanUp: false
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.defineOption("foldOptions", null);
|
||||||
|
|
||||||
|
function getOption(cm, options, name) {
|
||||||
|
if (options && options[name] !== undefined)
|
||||||
|
return options[name];
|
||||||
|
var editorOptions = cm.options.foldOptions;
|
||||||
|
if (editorOptions && editorOptions[name] !== undefined)
|
||||||
|
return editorOptions[name];
|
||||||
|
return defaultOptions[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("foldOption", function(options, name) {
|
||||||
|
return getOption(this, options, name);
|
||||||
|
});
|
||||||
|
});
|
20
public/vendor/codemirror/addon/fold/foldgutter.css
vendored
Executable file
20
public/vendor/codemirror/addon/fold/foldgutter.css
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
.CodeMirror-foldmarker {
|
||||||
|
color: blue;
|
||||||
|
text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
|
||||||
|
font-family: arial;
|
||||||
|
line-height: .3;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.CodeMirror-foldgutter {
|
||||||
|
width: .7em;
|
||||||
|
}
|
||||||
|
.CodeMirror-foldgutter-open,
|
||||||
|
.CodeMirror-foldgutter-folded {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.CodeMirror-foldgutter-open:after {
|
||||||
|
content: "\25BE";
|
||||||
|
}
|
||||||
|
.CodeMirror-foldgutter-folded:after {
|
||||||
|
content: "\25B8";
|
||||||
|
}
|
146
public/vendor/codemirror/addon/fold/foldgutter.js
vendored
Executable file
146
public/vendor/codemirror/addon/fold/foldgutter.js
vendored
Executable file
|
@ -0,0 +1,146 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("./foldcode"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "./foldcode"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init) {
|
||||||
|
cm.clearGutter(cm.state.foldGutter.options.gutter);
|
||||||
|
cm.state.foldGutter = null;
|
||||||
|
cm.off("gutterClick", onGutterClick);
|
||||||
|
cm.off("change", onChange);
|
||||||
|
cm.off("viewportChange", onViewportChange);
|
||||||
|
cm.off("fold", onFold);
|
||||||
|
cm.off("unfold", onFold);
|
||||||
|
cm.off("swapDoc", updateInViewport);
|
||||||
|
}
|
||||||
|
if (val) {
|
||||||
|
cm.state.foldGutter = new State(parseOptions(val));
|
||||||
|
updateInViewport(cm);
|
||||||
|
cm.on("gutterClick", onGutterClick);
|
||||||
|
cm.on("change", onChange);
|
||||||
|
cm.on("viewportChange", onViewportChange);
|
||||||
|
cm.on("fold", onFold);
|
||||||
|
cm.on("unfold", onFold);
|
||||||
|
cm.on("swapDoc", updateInViewport);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
function State(options) {
|
||||||
|
this.options = options;
|
||||||
|
this.from = this.to = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseOptions(opts) {
|
||||||
|
if (opts === true) opts = {};
|
||||||
|
if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";
|
||||||
|
if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";
|
||||||
|
if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";
|
||||||
|
return opts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isFolded(cm, line) {
|
||||||
|
var marks = cm.findMarksAt(Pos(line));
|
||||||
|
for (var i = 0; i < marks.length; ++i)
|
||||||
|
if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
function marker(spec) {
|
||||||
|
if (typeof spec == "string") {
|
||||||
|
var elt = document.createElement("div");
|
||||||
|
elt.className = spec + " CodeMirror-guttermarker-subtle";
|
||||||
|
return elt;
|
||||||
|
} else {
|
||||||
|
return spec.cloneNode(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateFoldInfo(cm, from, to) {
|
||||||
|
var opts = cm.state.foldGutter.options, cur = from;
|
||||||
|
var minSize = cm.foldOption(opts, "minFoldSize");
|
||||||
|
var func = cm.foldOption(opts, "rangeFinder");
|
||||||
|
cm.eachLine(from, to, function(line) {
|
||||||
|
var mark = null;
|
||||||
|
if (isFolded(cm, cur)) {
|
||||||
|
mark = marker(opts.indicatorFolded);
|
||||||
|
} else {
|
||||||
|
var pos = Pos(cur, 0);
|
||||||
|
var range = func && func(cm, pos);
|
||||||
|
if (range && range.to.line - range.from.line >= minSize)
|
||||||
|
mark = marker(opts.indicatorOpen);
|
||||||
|
}
|
||||||
|
cm.setGutterMarker(line, opts.gutter, mark);
|
||||||
|
++cur;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateInViewport(cm) {
|
||||||
|
var vp = cm.getViewport(), state = cm.state.foldGutter;
|
||||||
|
if (!state) return;
|
||||||
|
cm.operation(function() {
|
||||||
|
updateFoldInfo(cm, vp.from, vp.to);
|
||||||
|
});
|
||||||
|
state.from = vp.from; state.to = vp.to;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onGutterClick(cm, line, gutter) {
|
||||||
|
var state = cm.state.foldGutter;
|
||||||
|
if (!state) return;
|
||||||
|
var opts = state.options;
|
||||||
|
if (gutter != opts.gutter) return;
|
||||||
|
var folded = isFolded(cm, line);
|
||||||
|
if (folded) folded.clear();
|
||||||
|
else cm.foldCode(Pos(line, 0), opts.rangeFinder);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onChange(cm) {
|
||||||
|
var state = cm.state.foldGutter;
|
||||||
|
if (!state) return;
|
||||||
|
var opts = state.options;
|
||||||
|
state.from = state.to = 0;
|
||||||
|
clearTimeout(state.changeUpdate);
|
||||||
|
state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onViewportChange(cm) {
|
||||||
|
var state = cm.state.foldGutter;
|
||||||
|
if (!state) return;
|
||||||
|
var opts = state.options;
|
||||||
|
clearTimeout(state.changeUpdate);
|
||||||
|
state.changeUpdate = setTimeout(function() {
|
||||||
|
var vp = cm.getViewport();
|
||||||
|
if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
|
||||||
|
updateInViewport(cm);
|
||||||
|
} else {
|
||||||
|
cm.operation(function() {
|
||||||
|
if (vp.from < state.from) {
|
||||||
|
updateFoldInfo(cm, vp.from, state.from);
|
||||||
|
state.from = vp.from;
|
||||||
|
}
|
||||||
|
if (vp.to > state.to) {
|
||||||
|
updateFoldInfo(cm, state.to, vp.to);
|
||||||
|
state.to = vp.to;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, opts.updateViewportTimeSpan || 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onFold(cm, from) {
|
||||||
|
var state = cm.state.foldGutter;
|
||||||
|
if (!state) return;
|
||||||
|
var line = from.line;
|
||||||
|
if (line >= state.from && line < state.to)
|
||||||
|
updateFoldInfo(cm, line, line + 1);
|
||||||
|
}
|
||||||
|
});
|
44
public/vendor/codemirror/addon/fold/indent-fold.js
vendored
Executable file
44
public/vendor/codemirror/addon/fold/indent-fold.js
vendored
Executable file
|
@ -0,0 +1,44 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "indent", function(cm, start) {
|
||||||
|
var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line);
|
||||||
|
if (!/\S/.test(firstLine)) return;
|
||||||
|
var getIndent = function(line) {
|
||||||
|
return CodeMirror.countColumn(line, null, tabSize);
|
||||||
|
};
|
||||||
|
var myIndent = getIndent(firstLine);
|
||||||
|
var lastLineInFold = null;
|
||||||
|
// Go through lines until we find a line that definitely doesn't belong in
|
||||||
|
// the block we're folding, or to the end.
|
||||||
|
for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {
|
||||||
|
var curLine = cm.getLine(i);
|
||||||
|
var curIndent = getIndent(curLine);
|
||||||
|
if (curIndent > myIndent) {
|
||||||
|
// Lines with a greater indent are considered part of the block.
|
||||||
|
lastLineInFold = i;
|
||||||
|
} else if (!/\S/.test(curLine)) {
|
||||||
|
// Empty lines might be breaks within the block we're trying to fold.
|
||||||
|
} else {
|
||||||
|
// A non-empty line at an indent equal to or less than ours marks the
|
||||||
|
// start of another block.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lastLineInFold) return {
|
||||||
|
from: CodeMirror.Pos(start.line, firstLine.length),
|
||||||
|
to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
49
public/vendor/codemirror/addon/fold/markdown-fold.js
vendored
Executable file
49
public/vendor/codemirror/addon/fold/markdown-fold.js
vendored
Executable file
|
@ -0,0 +1,49 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "markdown", function(cm, start) {
|
||||||
|
var maxDepth = 100;
|
||||||
|
|
||||||
|
function isHeader(lineNo) {
|
||||||
|
var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0));
|
||||||
|
return tokentype && /\bheader\b/.test(tokentype);
|
||||||
|
}
|
||||||
|
|
||||||
|
function headerLevel(lineNo, line, nextLine) {
|
||||||
|
var match = line && line.match(/^#+/);
|
||||||
|
if (match && isHeader(lineNo)) return match[0].length;
|
||||||
|
match = nextLine && nextLine.match(/^[=\-]+\s*$/);
|
||||||
|
if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2;
|
||||||
|
return maxDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1);
|
||||||
|
var level = headerLevel(start.line, firstLine, nextLine);
|
||||||
|
if (level === maxDepth) return undefined;
|
||||||
|
|
||||||
|
var lastLineNo = cm.lastLine();
|
||||||
|
var end = start.line, nextNextLine = cm.getLine(end + 2);
|
||||||
|
while (end < lastLineNo) {
|
||||||
|
if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break;
|
||||||
|
++end;
|
||||||
|
nextLine = nextNextLine;
|
||||||
|
nextNextLine = cm.getLine(end + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
from: CodeMirror.Pos(start.line, firstLine.length),
|
||||||
|
to: CodeMirror.Pos(end, cm.getLine(end).length)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
182
public/vendor/codemirror/addon/fold/xml-fold.js
vendored
Executable file
182
public/vendor/codemirror/addon/fold/xml-fold.js
vendored
Executable file
|
@ -0,0 +1,182 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }
|
||||||
|
|
||||||
|
var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
|
||||||
|
var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
|
||||||
|
var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g");
|
||||||
|
|
||||||
|
function Iter(cm, line, ch, range) {
|
||||||
|
this.line = line; this.ch = ch;
|
||||||
|
this.cm = cm; this.text = cm.getLine(line);
|
||||||
|
this.min = range ? range.from : cm.firstLine();
|
||||||
|
this.max = range ? range.to - 1 : cm.lastLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
function tagAt(iter, ch) {
|
||||||
|
var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch));
|
||||||
|
return type && /\btag\b/.test(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nextLine(iter) {
|
||||||
|
if (iter.line >= iter.max) return;
|
||||||
|
iter.ch = 0;
|
||||||
|
iter.text = iter.cm.getLine(++iter.line);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function prevLine(iter) {
|
||||||
|
if (iter.line <= iter.min) return;
|
||||||
|
iter.text = iter.cm.getLine(--iter.line);
|
||||||
|
iter.ch = iter.text.length;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toTagEnd(iter) {
|
||||||
|
for (;;) {
|
||||||
|
var gt = iter.text.indexOf(">", iter.ch);
|
||||||
|
if (gt == -1) { if (nextLine(iter)) continue; else return; }
|
||||||
|
if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; }
|
||||||
|
var lastSlash = iter.text.lastIndexOf("/", gt);
|
||||||
|
var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
|
||||||
|
iter.ch = gt + 1;
|
||||||
|
return selfClose ? "selfClose" : "regular";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function toTagStart(iter) {
|
||||||
|
for (;;) {
|
||||||
|
var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1;
|
||||||
|
if (lt == -1) { if (prevLine(iter)) continue; else return; }
|
||||||
|
if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }
|
||||||
|
xmlTagStart.lastIndex = lt;
|
||||||
|
iter.ch = lt;
|
||||||
|
var match = xmlTagStart.exec(iter.text);
|
||||||
|
if (match && match.index == lt) return match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toNextTag(iter) {
|
||||||
|
for (;;) {
|
||||||
|
xmlTagStart.lastIndex = iter.ch;
|
||||||
|
var found = xmlTagStart.exec(iter.text);
|
||||||
|
if (!found) { if (nextLine(iter)) continue; else return; }
|
||||||
|
if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; }
|
||||||
|
iter.ch = found.index + found[0].length;
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function toPrevTag(iter) {
|
||||||
|
for (;;) {
|
||||||
|
var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1;
|
||||||
|
if (gt == -1) { if (prevLine(iter)) continue; else return; }
|
||||||
|
if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }
|
||||||
|
var lastSlash = iter.text.lastIndexOf("/", gt);
|
||||||
|
var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt));
|
||||||
|
iter.ch = gt + 1;
|
||||||
|
return selfClose ? "selfClose" : "regular";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findMatchingClose(iter, tag) {
|
||||||
|
var stack = [];
|
||||||
|
for (;;) {
|
||||||
|
var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0);
|
||||||
|
if (!next || !(end = toTagEnd(iter))) return;
|
||||||
|
if (end == "selfClose") continue;
|
||||||
|
if (next[1]) { // closing tag
|
||||||
|
for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) {
|
||||||
|
stack.length = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i < 0 && (!tag || tag == next[2])) return {
|
||||||
|
tag: next[2],
|
||||||
|
from: Pos(startLine, startCh),
|
||||||
|
to: Pos(iter.line, iter.ch)
|
||||||
|
};
|
||||||
|
} else { // opening tag
|
||||||
|
stack.push(next[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function findMatchingOpen(iter, tag) {
|
||||||
|
var stack = [];
|
||||||
|
for (;;) {
|
||||||
|
var prev = toPrevTag(iter);
|
||||||
|
if (!prev) return;
|
||||||
|
if (prev == "selfClose") { toTagStart(iter); continue; }
|
||||||
|
var endLine = iter.line, endCh = iter.ch;
|
||||||
|
var start = toTagStart(iter);
|
||||||
|
if (!start) return;
|
||||||
|
if (start[1]) { // closing tag
|
||||||
|
stack.push(start[2]);
|
||||||
|
} else { // opening tag
|
||||||
|
for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) {
|
||||||
|
stack.length = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i < 0 && (!tag || tag == start[2])) return {
|
||||||
|
tag: start[2],
|
||||||
|
from: Pos(iter.line, iter.ch),
|
||||||
|
to: Pos(endLine, endCh)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("fold", "xml", function(cm, start) {
|
||||||
|
var iter = new Iter(cm, start.line, 0);
|
||||||
|
for (;;) {
|
||||||
|
var openTag = toNextTag(iter), end;
|
||||||
|
if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;
|
||||||
|
if (!openTag[1] && end != "selfClose") {
|
||||||
|
var start = Pos(iter.line, iter.ch);
|
||||||
|
var close = findMatchingClose(iter, openTag[2]);
|
||||||
|
return close && {from: start, to: close.from};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
CodeMirror.findMatchingTag = function(cm, pos, range) {
|
||||||
|
var iter = new Iter(cm, pos.line, pos.ch, range);
|
||||||
|
if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
|
||||||
|
var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
|
||||||
|
var start = end && toTagStart(iter);
|
||||||
|
if (!end || !start || cmp(iter, pos) > 0) return;
|
||||||
|
var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
|
||||||
|
if (end == "selfClose") return {open: here, close: null, at: "open"};
|
||||||
|
|
||||||
|
if (start[1]) { // closing tag
|
||||||
|
return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
|
||||||
|
} else { // opening tag
|
||||||
|
iter = new Iter(cm, to.line, to.ch, range);
|
||||||
|
return {open: here, close: findMatchingClose(iter, start[2]), at: "open"};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.findEnclosingTag = function(cm, pos, range) {
|
||||||
|
var iter = new Iter(cm, pos.line, pos.ch, range);
|
||||||
|
for (;;) {
|
||||||
|
var open = findMatchingOpen(iter);
|
||||||
|
if (!open) break;
|
||||||
|
var forward = new Iter(cm, pos.line, pos.ch, range);
|
||||||
|
var close = findMatchingClose(forward, open.tag);
|
||||||
|
if (close) return {open: open, close: close};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Used by addon/edit/closetag.js
|
||||||
|
CodeMirror.scanForClosingTag = function(cm, pos, name, end) {
|
||||||
|
var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null);
|
||||||
|
return findMatchingClose(iter, name);
|
||||||
|
};
|
||||||
|
});
|
41
public/vendor/codemirror/addon/hint/anyword-hint.js
vendored
Executable file
41
public/vendor/codemirror/addon/hint/anyword-hint.js
vendored
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var WORD = /[\w$]+/, RANGE = 500;
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("hint", "anyword", function(editor, options) {
|
||||||
|
var word = options && options.word || WORD;
|
||||||
|
var range = options && options.range || RANGE;
|
||||||
|
var cur = editor.getCursor(), curLine = editor.getLine(cur.line);
|
||||||
|
var end = cur.ch, start = end;
|
||||||
|
while (start && word.test(curLine.charAt(start - 1))) --start;
|
||||||
|
var curWord = start != end && curLine.slice(start, end);
|
||||||
|
|
||||||
|
var list = [], seen = {};
|
||||||
|
var re = new RegExp(word.source, "g");
|
||||||
|
for (var dir = -1; dir <= 1; dir += 2) {
|
||||||
|
var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;
|
||||||
|
for (; line != endLine; line += dir) {
|
||||||
|
var text = editor.getLine(line), m;
|
||||||
|
while (m = re.exec(text)) {
|
||||||
|
if (line == cur.line && m[0] === curWord) continue;
|
||||||
|
if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {
|
||||||
|
seen[m[0]] = true;
|
||||||
|
list.push(m[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};
|
||||||
|
});
|
||||||
|
});
|
60
public/vendor/codemirror/addon/hint/css-hint.js
vendored
Executable file
60
public/vendor/codemirror/addon/hint/css-hint.js
vendored
Executable file
|
@ -0,0 +1,60 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("../../mode/css/css"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "../../mode/css/css"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var pseudoClasses = {link: 1, visited: 1, active: 1, hover: 1, focus: 1,
|
||||||
|
"first-letter": 1, "first-line": 1, "first-child": 1,
|
||||||
|
before: 1, after: 1, lang: 1};
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("hint", "css", function(cm) {
|
||||||
|
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), token.state);
|
||||||
|
if (inner.mode.name != "css") return;
|
||||||
|
|
||||||
|
if (token.type == "keyword" && "!important".indexOf(token.string) == 0)
|
||||||
|
return {list: ["!important"], from: CodeMirror.Pos(cur.line, token.start),
|
||||||
|
to: CodeMirror.Pos(cur.line, token.end)};
|
||||||
|
|
||||||
|
var start = token.start, end = cur.ch, word = token.string.slice(0, end - start);
|
||||||
|
if (/[^\w$_-]/.test(word)) {
|
||||||
|
word = ""; start = end = cur.ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
var spec = CodeMirror.resolveMode("text/css");
|
||||||
|
|
||||||
|
var result = [];
|
||||||
|
function add(keywords) {
|
||||||
|
for (var name in keywords)
|
||||||
|
if (!word || name.lastIndexOf(word, 0) == 0)
|
||||||
|
result.push(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
var st = inner.state.state;
|
||||||
|
if (st == "pseudo" || token.type == "variable-3") {
|
||||||
|
add(pseudoClasses);
|
||||||
|
} else if (st == "block" || st == "maybeprop") {
|
||||||
|
add(spec.propertyKeywords);
|
||||||
|
} else if (st == "prop" || st == "parens" || st == "at" || st == "params") {
|
||||||
|
add(spec.valueKeywords);
|
||||||
|
add(spec.colorKeywords);
|
||||||
|
} else if (st == "media" || st == "media_parens") {
|
||||||
|
add(spec.mediaTypes);
|
||||||
|
add(spec.mediaFeatures);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.length) return {
|
||||||
|
list: result,
|
||||||
|
from: CodeMirror.Pos(cur.line, start),
|
||||||
|
to: CodeMirror.Pos(cur.line, end)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
348
public/vendor/codemirror/addon/hint/html-hint.js
vendored
Executable file
348
public/vendor/codemirror/addon/hint/html-hint.js
vendored
Executable file
|
@ -0,0 +1,348 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("./xml-hint"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "./xml-hint"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" ");
|
||||||
|
var targets = ["_blank", "_self", "_top", "_parent"];
|
||||||
|
var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"];
|
||||||
|
var methods = ["get", "post", "put", "delete"];
|
||||||
|
var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"];
|
||||||
|
var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech",
|
||||||
|
"3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait",
|
||||||
|
"orientation:landscape", "device-height: [X]", "device-width: [X]"];
|
||||||
|
var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags
|
||||||
|
|
||||||
|
var data = {
|
||||||
|
a: {
|
||||||
|
attrs: {
|
||||||
|
href: null, ping: null, type: null,
|
||||||
|
media: media,
|
||||||
|
target: targets,
|
||||||
|
hreflang: langs
|
||||||
|
}
|
||||||
|
},
|
||||||
|
abbr: s,
|
||||||
|
acronym: s,
|
||||||
|
address: s,
|
||||||
|
applet: s,
|
||||||
|
area: {
|
||||||
|
attrs: {
|
||||||
|
alt: null, coords: null, href: null, target: null, ping: null,
|
||||||
|
media: media, hreflang: langs, type: null,
|
||||||
|
shape: ["default", "rect", "circle", "poly"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
article: s,
|
||||||
|
aside: s,
|
||||||
|
audio: {
|
||||||
|
attrs: {
|
||||||
|
src: null, mediagroup: null,
|
||||||
|
crossorigin: ["anonymous", "use-credentials"],
|
||||||
|
preload: ["none", "metadata", "auto"],
|
||||||
|
autoplay: ["", "autoplay"],
|
||||||
|
loop: ["", "loop"],
|
||||||
|
controls: ["", "controls"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
b: s,
|
||||||
|
base: { attrs: { href: null, target: targets } },
|
||||||
|
basefont: s,
|
||||||
|
bdi: s,
|
||||||
|
bdo: s,
|
||||||
|
big: s,
|
||||||
|
blockquote: { attrs: { cite: null } },
|
||||||
|
body: s,
|
||||||
|
br: s,
|
||||||
|
button: {
|
||||||
|
attrs: {
|
||||||
|
form: null, formaction: null, name: null, value: null,
|
||||||
|
autofocus: ["", "autofocus"],
|
||||||
|
disabled: ["", "autofocus"],
|
||||||
|
formenctype: encs,
|
||||||
|
formmethod: methods,
|
||||||
|
formnovalidate: ["", "novalidate"],
|
||||||
|
formtarget: targets,
|
||||||
|
type: ["submit", "reset", "button"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
canvas: { attrs: { width: null, height: null } },
|
||||||
|
caption: s,
|
||||||
|
center: s,
|
||||||
|
cite: s,
|
||||||
|
code: s,
|
||||||
|
col: { attrs: { span: null } },
|
||||||
|
colgroup: { attrs: { span: null } },
|
||||||
|
command: {
|
||||||
|
attrs: {
|
||||||
|
type: ["command", "checkbox", "radio"],
|
||||||
|
label: null, icon: null, radiogroup: null, command: null, title: null,
|
||||||
|
disabled: ["", "disabled"],
|
||||||
|
checked: ["", "checked"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: { attrs: { value: null } },
|
||||||
|
datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } },
|
||||||
|
datalist: { attrs: { data: null } },
|
||||||
|
dd: s,
|
||||||
|
del: { attrs: { cite: null, datetime: null } },
|
||||||
|
details: { attrs: { open: ["", "open"] } },
|
||||||
|
dfn: s,
|
||||||
|
dir: s,
|
||||||
|
div: s,
|
||||||
|
dl: s,
|
||||||
|
dt: s,
|
||||||
|
em: s,
|
||||||
|
embed: { attrs: { src: null, type: null, width: null, height: null } },
|
||||||
|
eventsource: { attrs: { src: null } },
|
||||||
|
fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } },
|
||||||
|
figcaption: s,
|
||||||
|
figure: s,
|
||||||
|
font: s,
|
||||||
|
footer: s,
|
||||||
|
form: {
|
||||||
|
attrs: {
|
||||||
|
action: null, name: null,
|
||||||
|
"accept-charset": charsets,
|
||||||
|
autocomplete: ["on", "off"],
|
||||||
|
enctype: encs,
|
||||||
|
method: methods,
|
||||||
|
novalidate: ["", "novalidate"],
|
||||||
|
target: targets
|
||||||
|
}
|
||||||
|
},
|
||||||
|
frame: s,
|
||||||
|
frameset: s,
|
||||||
|
h1: s, h2: s, h3: s, h4: s, h5: s, h6: s,
|
||||||
|
head: {
|
||||||
|
attrs: {},
|
||||||
|
children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"]
|
||||||
|
},
|
||||||
|
header: s,
|
||||||
|
hgroup: s,
|
||||||
|
hr: s,
|
||||||
|
html: {
|
||||||
|
attrs: { manifest: null },
|
||||||
|
children: ["head", "body"]
|
||||||
|
},
|
||||||
|
i: s,
|
||||||
|
iframe: {
|
||||||
|
attrs: {
|
||||||
|
src: null, srcdoc: null, name: null, width: null, height: null,
|
||||||
|
sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"],
|
||||||
|
seamless: ["", "seamless"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
img: {
|
||||||
|
attrs: {
|
||||||
|
alt: null, src: null, ismap: null, usemap: null, width: null, height: null,
|
||||||
|
crossorigin: ["anonymous", "use-credentials"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
input: {
|
||||||
|
attrs: {
|
||||||
|
alt: null, dirname: null, form: null, formaction: null,
|
||||||
|
height: null, list: null, max: null, maxlength: null, min: null,
|
||||||
|
name: null, pattern: null, placeholder: null, size: null, src: null,
|
||||||
|
step: null, value: null, width: null,
|
||||||
|
accept: ["audio/*", "video/*", "image/*"],
|
||||||
|
autocomplete: ["on", "off"],
|
||||||
|
autofocus: ["", "autofocus"],
|
||||||
|
checked: ["", "checked"],
|
||||||
|
disabled: ["", "disabled"],
|
||||||
|
formenctype: encs,
|
||||||
|
formmethod: methods,
|
||||||
|
formnovalidate: ["", "novalidate"],
|
||||||
|
formtarget: targets,
|
||||||
|
multiple: ["", "multiple"],
|
||||||
|
readonly: ["", "readonly"],
|
||||||
|
required: ["", "required"],
|
||||||
|
type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month",
|
||||||
|
"week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio",
|
||||||
|
"file", "submit", "image", "reset", "button"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ins: { attrs: { cite: null, datetime: null } },
|
||||||
|
kbd: s,
|
||||||
|
keygen: {
|
||||||
|
attrs: {
|
||||||
|
challenge: null, form: null, name: null,
|
||||||
|
autofocus: ["", "autofocus"],
|
||||||
|
disabled: ["", "disabled"],
|
||||||
|
keytype: ["RSA"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
label: { attrs: { "for": null, form: null } },
|
||||||
|
legend: s,
|
||||||
|
li: { attrs: { value: null } },
|
||||||
|
link: {
|
||||||
|
attrs: {
|
||||||
|
href: null, type: null,
|
||||||
|
hreflang: langs,
|
||||||
|
media: media,
|
||||||
|
sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
map: { attrs: { name: null } },
|
||||||
|
mark: s,
|
||||||
|
menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } },
|
||||||
|
meta: {
|
||||||
|
attrs: {
|
||||||
|
content: null,
|
||||||
|
charset: charsets,
|
||||||
|
name: ["viewport", "application-name", "author", "description", "generator", "keywords"],
|
||||||
|
"http-equiv": ["content-language", "content-type", "default-style", "refresh"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } },
|
||||||
|
nav: s,
|
||||||
|
noframes: s,
|
||||||
|
noscript: s,
|
||||||
|
object: {
|
||||||
|
attrs: {
|
||||||
|
data: null, type: null, name: null, usemap: null, form: null, width: null, height: null,
|
||||||
|
typemustmatch: ["", "typemustmatch"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } },
|
||||||
|
optgroup: { attrs: { disabled: ["", "disabled"], label: null } },
|
||||||
|
option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } },
|
||||||
|
output: { attrs: { "for": null, form: null, name: null } },
|
||||||
|
p: s,
|
||||||
|
param: { attrs: { name: null, value: null } },
|
||||||
|
pre: s,
|
||||||
|
progress: { attrs: { value: null, max: null } },
|
||||||
|
q: { attrs: { cite: null } },
|
||||||
|
rp: s,
|
||||||
|
rt: s,
|
||||||
|
ruby: s,
|
||||||
|
s: s,
|
||||||
|
samp: s,
|
||||||
|
script: {
|
||||||
|
attrs: {
|
||||||
|
type: ["text/javascript"],
|
||||||
|
src: null,
|
||||||
|
async: ["", "async"],
|
||||||
|
defer: ["", "defer"],
|
||||||
|
charset: charsets
|
||||||
|
}
|
||||||
|
},
|
||||||
|
section: s,
|
||||||
|
select: {
|
||||||
|
attrs: {
|
||||||
|
form: null, name: null, size: null,
|
||||||
|
autofocus: ["", "autofocus"],
|
||||||
|
disabled: ["", "disabled"],
|
||||||
|
multiple: ["", "multiple"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
small: s,
|
||||||
|
source: { attrs: { src: null, type: null, media: null } },
|
||||||
|
span: s,
|
||||||
|
strike: s,
|
||||||
|
strong: s,
|
||||||
|
style: {
|
||||||
|
attrs: {
|
||||||
|
type: ["text/css"],
|
||||||
|
media: media,
|
||||||
|
scoped: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sub: s,
|
||||||
|
summary: s,
|
||||||
|
sup: s,
|
||||||
|
table: s,
|
||||||
|
tbody: s,
|
||||||
|
td: { attrs: { colspan: null, rowspan: null, headers: null } },
|
||||||
|
textarea: {
|
||||||
|
attrs: {
|
||||||
|
dirname: null, form: null, maxlength: null, name: null, placeholder: null,
|
||||||
|
rows: null, cols: null,
|
||||||
|
autofocus: ["", "autofocus"],
|
||||||
|
disabled: ["", "disabled"],
|
||||||
|
readonly: ["", "readonly"],
|
||||||
|
required: ["", "required"],
|
||||||
|
wrap: ["soft", "hard"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tfoot: s,
|
||||||
|
th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } },
|
||||||
|
thead: s,
|
||||||
|
time: { attrs: { datetime: null } },
|
||||||
|
title: s,
|
||||||
|
tr: s,
|
||||||
|
track: {
|
||||||
|
attrs: {
|
||||||
|
src: null, label: null, "default": null,
|
||||||
|
kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"],
|
||||||
|
srclang: langs
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tt: s,
|
||||||
|
u: s,
|
||||||
|
ul: s,
|
||||||
|
"var": s,
|
||||||
|
video: {
|
||||||
|
attrs: {
|
||||||
|
src: null, poster: null, width: null, height: null,
|
||||||
|
crossorigin: ["anonymous", "use-credentials"],
|
||||||
|
preload: ["auto", "metadata", "none"],
|
||||||
|
autoplay: ["", "autoplay"],
|
||||||
|
mediagroup: ["movie"],
|
||||||
|
muted: ["", "muted"],
|
||||||
|
controls: ["", "controls"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
wbr: s
|
||||||
|
};
|
||||||
|
|
||||||
|
var globalAttrs = {
|
||||||
|
accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
|
||||||
|
"class": null,
|
||||||
|
contenteditable: ["true", "false"],
|
||||||
|
contextmenu: null,
|
||||||
|
dir: ["ltr", "rtl", "auto"],
|
||||||
|
draggable: ["true", "false", "auto"],
|
||||||
|
dropzone: ["copy", "move", "link", "string:", "file:"],
|
||||||
|
hidden: ["hidden"],
|
||||||
|
id: null,
|
||||||
|
inert: ["inert"],
|
||||||
|
itemid: null,
|
||||||
|
itemprop: null,
|
||||||
|
itemref: null,
|
||||||
|
itemscope: ["itemscope"],
|
||||||
|
itemtype: null,
|
||||||
|
lang: ["en", "es"],
|
||||||
|
spellcheck: ["true", "false"],
|
||||||
|
style: null,
|
||||||
|
tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"],
|
||||||
|
title: null,
|
||||||
|
translate: ["yes", "no"],
|
||||||
|
onclick: null,
|
||||||
|
rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"]
|
||||||
|
};
|
||||||
|
function populate(obj) {
|
||||||
|
for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr))
|
||||||
|
obj.attrs[attr] = globalAttrs[attr];
|
||||||
|
}
|
||||||
|
|
||||||
|
populate(s);
|
||||||
|
for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s)
|
||||||
|
populate(data[tag]);
|
||||||
|
|
||||||
|
CodeMirror.htmlSchema = data;
|
||||||
|
function htmlHint(cm, options) {
|
||||||
|
var local = {schemaInfo: data};
|
||||||
|
if (options) for (var opt in options) local[opt] = options[opt];
|
||||||
|
return CodeMirror.hint.xml(cm, local);
|
||||||
|
}
|
||||||
|
CodeMirror.registerHelper("hint", "html", htmlHint);
|
||||||
|
});
|
146
public/vendor/codemirror/addon/hint/javascript-hint.js
vendored
Executable file
146
public/vendor/codemirror/addon/hint/javascript-hint.js
vendored
Executable file
|
@ -0,0 +1,146 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
function forEach(arr, f) {
|
||||||
|
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function arrayContains(arr, item) {
|
||||||
|
if (!Array.prototype.indexOf) {
|
||||||
|
var i = arr.length;
|
||||||
|
while (i--) {
|
||||||
|
if (arr[i] === item) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return arr.indexOf(item) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function scriptHint(editor, keywords, getToken, options) {
|
||||||
|
// Find the token at the cursor
|
||||||
|
var cur = editor.getCursor(), token = getToken(editor, cur);
|
||||||
|
if (/\b(?:string|comment)\b/.test(token.type)) return;
|
||||||
|
token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;
|
||||||
|
|
||||||
|
// If it's not a 'word-style' token, ignore the token.
|
||||||
|
if (!/^[\w$_]*$/.test(token.string)) {
|
||||||
|
token = {start: cur.ch, end: cur.ch, string: "", state: token.state,
|
||||||
|
type: token.string == "." ? "property" : null};
|
||||||
|
} else if (token.end > cur.ch) {
|
||||||
|
token.end = cur.ch;
|
||||||
|
token.string = token.string.slice(0, cur.ch - token.start);
|
||||||
|
}
|
||||||
|
|
||||||
|
var tprop = token;
|
||||||
|
// If it is a property, find out what it is a property of.
|
||||||
|
while (tprop.type == "property") {
|
||||||
|
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
||||||
|
if (tprop.string != ".") return;
|
||||||
|
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
||||||
|
if (!context) var context = [];
|
||||||
|
context.push(tprop);
|
||||||
|
}
|
||||||
|
return {list: getCompletions(token, context, keywords, options),
|
||||||
|
from: Pos(cur.line, token.start),
|
||||||
|
to: Pos(cur.line, token.end)};
|
||||||
|
}
|
||||||
|
|
||||||
|
function javascriptHint(editor, options) {
|
||||||
|
return scriptHint(editor, javascriptKeywords,
|
||||||
|
function (e, cur) {return e.getTokenAt(cur);},
|
||||||
|
options);
|
||||||
|
};
|
||||||
|
CodeMirror.registerHelper("hint", "javascript", javascriptHint);
|
||||||
|
|
||||||
|
function getCoffeeScriptToken(editor, cur) {
|
||||||
|
// This getToken, it is for coffeescript, imitates the behavior of
|
||||||
|
// getTokenAt method in javascript.js, that is, returning "property"
|
||||||
|
// type and treat "." as indepenent token.
|
||||||
|
var token = editor.getTokenAt(cur);
|
||||||
|
if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
|
||||||
|
token.end = token.start;
|
||||||
|
token.string = '.';
|
||||||
|
token.type = "property";
|
||||||
|
}
|
||||||
|
else if (/^\.[\w$_]*$/.test(token.string)) {
|
||||||
|
token.type = "property";
|
||||||
|
token.start++;
|
||||||
|
token.string = token.string.replace(/\./, '');
|
||||||
|
}
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
|
function coffeescriptHint(editor, options) {
|
||||||
|
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
|
||||||
|
}
|
||||||
|
CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
|
||||||
|
|
||||||
|
var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
|
||||||
|
"toUpperCase toLowerCase split concat match replace search").split(" ");
|
||||||
|
var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " +
|
||||||
|
"lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
|
||||||
|
var funcProps = "prototype apply call bind".split(" ");
|
||||||
|
var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " +
|
||||||
|
"if in instanceof new null return switch throw true try typeof var void while with").split(" ");
|
||||||
|
var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
|
||||||
|
"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
|
||||||
|
|
||||||
|
function getCompletions(token, context, keywords, options) {
|
||||||
|
var found = [], start = token.string, global = options && options.globalScope || window;
|
||||||
|
function maybeAdd(str) {
|
||||||
|
if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
|
||||||
|
}
|
||||||
|
function gatherCompletions(obj) {
|
||||||
|
if (typeof obj == "string") forEach(stringProps, maybeAdd);
|
||||||
|
else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
|
||||||
|
else if (obj instanceof Function) forEach(funcProps, maybeAdd);
|
||||||
|
for (var name in obj) maybeAdd(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context && context.length) {
|
||||||
|
// If this is a property, see if it belongs to some object we can
|
||||||
|
// find in the current environment.
|
||||||
|
var obj = context.pop(), base;
|
||||||
|
if (obj.type && obj.type.indexOf("variable") === 0) {
|
||||||
|
if (options && options.additionalContext)
|
||||||
|
base = options.additionalContext[obj.string];
|
||||||
|
if (!options || options.useGlobalScope !== false)
|
||||||
|
base = base || global[obj.string];
|
||||||
|
} else if (obj.type == "string") {
|
||||||
|
base = "";
|
||||||
|
} else if (obj.type == "atom") {
|
||||||
|
base = 1;
|
||||||
|
} else if (obj.type == "function") {
|
||||||
|
if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
|
||||||
|
(typeof global.jQuery == 'function'))
|
||||||
|
base = global.jQuery();
|
||||||
|
else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))
|
||||||
|
base = global._();
|
||||||
|
}
|
||||||
|
while (base != null && context.length)
|
||||||
|
base = base[context.pop().string];
|
||||||
|
if (base != null) gatherCompletions(base);
|
||||||
|
} else {
|
||||||
|
// If not, just look in the global object and any local scope
|
||||||
|
// (reading into JS mode internals to get at the local and global variables)
|
||||||
|
for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
|
||||||
|
for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
|
||||||
|
if (!options || options.useGlobalScope !== false)
|
||||||
|
gatherCompletions(global);
|
||||||
|
forEach(keywords, maybeAdd);
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
});
|
38
public/vendor/codemirror/addon/hint/show-hint.css
vendored
Executable file
38
public/vendor/codemirror/addon/hint/show-hint.css
vendored
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
.CodeMirror-hints {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 10;
|
||||||
|
overflow: hidden;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
margin: 0;
|
||||||
|
padding: 2px;
|
||||||
|
|
||||||
|
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
|
||||||
|
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
|
||||||
|
box-shadow: 2px 3px 5px rgba(0,0,0,.2);
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid silver;
|
||||||
|
|
||||||
|
background: white;
|
||||||
|
font-size: 90%;
|
||||||
|
font-family: monospace;
|
||||||
|
|
||||||
|
max-height: 20em;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-hint {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
max-width: 19em;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: pre;
|
||||||
|
color: black;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.CodeMirror-hint-active {
|
||||||
|
background: #08f;
|
||||||
|
color: white;
|
||||||
|
}
|
392
public/vendor/codemirror/addon/hint/show-hint.js
vendored
Executable file
392
public/vendor/codemirror/addon/hint/show-hint.js
vendored
Executable file
|
@ -0,0 +1,392 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var HINT_ELEMENT_CLASS = "CodeMirror-hint";
|
||||||
|
var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active";
|
||||||
|
|
||||||
|
// This is the old interface, kept around for now to stay
|
||||||
|
// backwards-compatible.
|
||||||
|
CodeMirror.showHint = function(cm, getHints, options) {
|
||||||
|
if (!getHints) return cm.showHint(options);
|
||||||
|
if (options && options.async) getHints.async = true;
|
||||||
|
var newOpts = {hint: getHints};
|
||||||
|
if (options) for (var prop in options) newOpts[prop] = options[prop];
|
||||||
|
return cm.showHint(newOpts);
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.defineExtension("showHint", function(options) {
|
||||||
|
// We want a single cursor position.
|
||||||
|
if (this.listSelections().length > 1 || this.somethingSelected()) return;
|
||||||
|
|
||||||
|
if (this.state.completionActive) this.state.completionActive.close();
|
||||||
|
var completion = this.state.completionActive = new Completion(this, options);
|
||||||
|
if (!completion.options.hint) return;
|
||||||
|
|
||||||
|
CodeMirror.signal(this, "startCompletion", this);
|
||||||
|
completion.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
function Completion(cm, options) {
|
||||||
|
this.cm = cm;
|
||||||
|
this.options = this.buildOptions(options);
|
||||||
|
this.widget = null;
|
||||||
|
this.debounce = 0;
|
||||||
|
this.tick = 0;
|
||||||
|
this.startPos = this.cm.getCursor();
|
||||||
|
this.startLen = this.cm.getLine(this.startPos.line).length;
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
|
||||||
|
return setTimeout(fn, 1000/60);
|
||||||
|
};
|
||||||
|
var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
|
||||||
|
|
||||||
|
Completion.prototype = {
|
||||||
|
close: function() {
|
||||||
|
if (!this.active()) return;
|
||||||
|
this.cm.state.completionActive = null;
|
||||||
|
this.tick = null;
|
||||||
|
this.cm.off("cursorActivity", this.activityFunc);
|
||||||
|
|
||||||
|
if (this.widget) this.widget.close();
|
||||||
|
CodeMirror.signal(this.cm, "endCompletion", this.cm);
|
||||||
|
},
|
||||||
|
|
||||||
|
active: function() {
|
||||||
|
return this.cm.state.completionActive == this;
|
||||||
|
},
|
||||||
|
|
||||||
|
pick: function(data, i) {
|
||||||
|
var completion = data.list[i];
|
||||||
|
if (completion.hint) completion.hint(this.cm, data, completion);
|
||||||
|
else this.cm.replaceRange(getText(completion), completion.from || data.from,
|
||||||
|
completion.to || data.to, "complete");
|
||||||
|
CodeMirror.signal(data, "pick", completion);
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
|
||||||
|
showHints: function(data) {
|
||||||
|
if (!data || !data.list.length || !this.active()) return this.close();
|
||||||
|
|
||||||
|
if (this.options.completeSingle && data.list.length == 1)
|
||||||
|
this.pick(data, 0);
|
||||||
|
else
|
||||||
|
this.showWidget(data);
|
||||||
|
},
|
||||||
|
|
||||||
|
cursorActivity: function() {
|
||||||
|
if (this.debounce) {
|
||||||
|
cancelAnimationFrame(this.debounce);
|
||||||
|
this.debounce = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);
|
||||||
|
if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
|
||||||
|
pos.ch < this.startPos.ch || this.cm.somethingSelected() ||
|
||||||
|
(pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
|
||||||
|
this.close();
|
||||||
|
} else {
|
||||||
|
var self = this;
|
||||||
|
this.debounce = requestAnimationFrame(function() {self.update();});
|
||||||
|
if (this.widget) this.widget.disable();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function() {
|
||||||
|
if (this.tick == null) return;
|
||||||
|
if (this.data) CodeMirror.signal(this.data, "update");
|
||||||
|
if (!this.options.hint.async) {
|
||||||
|
this.finishUpdate(this.options.hint(this.cm, this.options), myTick);
|
||||||
|
} else {
|
||||||
|
var myTick = ++this.tick, self = this;
|
||||||
|
this.options.hint(this.cm, function(data) {
|
||||||
|
if (self.tick == myTick) self.finishUpdate(data);
|
||||||
|
}, this.options);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
finishUpdate: function(data) {
|
||||||
|
this.data = data;
|
||||||
|
var picked = this.widget && this.widget.picked;
|
||||||
|
if (this.widget) this.widget.close();
|
||||||
|
if (data && data.list.length) {
|
||||||
|
if (picked && data.list.length == 1) this.pick(data, 0);
|
||||||
|
else this.widget = new Widget(this, data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
showWidget: function(data) {
|
||||||
|
this.data = data;
|
||||||
|
this.widget = new Widget(this, data);
|
||||||
|
CodeMirror.signal(data, "shown");
|
||||||
|
},
|
||||||
|
|
||||||
|
buildOptions: function(options) {
|
||||||
|
var editor = this.cm.options.hintOptions;
|
||||||
|
var out = {};
|
||||||
|
for (var prop in defaultOptions) out[prop] = defaultOptions[prop];
|
||||||
|
if (editor) for (var prop in editor)
|
||||||
|
if (editor[prop] !== undefined) out[prop] = editor[prop];
|
||||||
|
if (options) for (var prop in options)
|
||||||
|
if (options[prop] !== undefined) out[prop] = options[prop];
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function getText(completion) {
|
||||||
|
if (typeof completion == "string") return completion;
|
||||||
|
else return completion.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildKeyMap(completion, handle) {
|
||||||
|
var baseMap = {
|
||||||
|
Up: function() {handle.moveFocus(-1);},
|
||||||
|
Down: function() {handle.moveFocus(1);},
|
||||||
|
PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},
|
||||||
|
PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},
|
||||||
|
Home: function() {handle.setFocus(0);},
|
||||||
|
End: function() {handle.setFocus(handle.length - 1);},
|
||||||
|
Enter: handle.pick,
|
||||||
|
Tab: handle.pick,
|
||||||
|
Esc: handle.close
|
||||||
|
};
|
||||||
|
var custom = completion.options.customKeys;
|
||||||
|
var ourMap = custom ? {} : baseMap;
|
||||||
|
function addBinding(key, val) {
|
||||||
|
var bound;
|
||||||
|
if (typeof val != "string")
|
||||||
|
bound = function(cm) { return val(cm, handle); };
|
||||||
|
// This mechanism is deprecated
|
||||||
|
else if (baseMap.hasOwnProperty(val))
|
||||||
|
bound = baseMap[val];
|
||||||
|
else
|
||||||
|
bound = val;
|
||||||
|
ourMap[key] = bound;
|
||||||
|
}
|
||||||
|
if (custom)
|
||||||
|
for (var key in custom) if (custom.hasOwnProperty(key))
|
||||||
|
addBinding(key, custom[key]);
|
||||||
|
var extra = completion.options.extraKeys;
|
||||||
|
if (extra)
|
||||||
|
for (var key in extra) if (extra.hasOwnProperty(key))
|
||||||
|
addBinding(key, extra[key]);
|
||||||
|
return ourMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHintElement(hintsElement, el) {
|
||||||
|
while (el && el != hintsElement) {
|
||||||
|
if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el;
|
||||||
|
el = el.parentNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Widget(completion, data) {
|
||||||
|
this.completion = completion;
|
||||||
|
this.data = data;
|
||||||
|
this.picked = false;
|
||||||
|
var widget = this, cm = completion.cm;
|
||||||
|
|
||||||
|
var hints = this.hints = document.createElement("ul");
|
||||||
|
hints.className = "CodeMirror-hints";
|
||||||
|
this.selectedHint = data.selectedHint || 0;
|
||||||
|
|
||||||
|
var completions = data.list;
|
||||||
|
for (var i = 0; i < completions.length; ++i) {
|
||||||
|
var elt = hints.appendChild(document.createElement("li")), cur = completions[i];
|
||||||
|
var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS);
|
||||||
|
if (cur.className != null) className = cur.className + " " + className;
|
||||||
|
elt.className = className;
|
||||||
|
if (cur.render) cur.render(elt, data, cur);
|
||||||
|
else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));
|
||||||
|
elt.hintId = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);
|
||||||
|
var left = pos.left, top = pos.bottom, below = true;
|
||||||
|
hints.style.left = left + "px";
|
||||||
|
hints.style.top = top + "px";
|
||||||
|
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
|
||||||
|
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
|
||||||
|
var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
|
||||||
|
(completion.options.container || document.body).appendChild(hints);
|
||||||
|
var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH;
|
||||||
|
if (overlapY > 0) {
|
||||||
|
var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);
|
||||||
|
if (curTop - height > 0) { // Fits above cursor
|
||||||
|
hints.style.top = (top = pos.top - height) + "px";
|
||||||
|
below = false;
|
||||||
|
} else if (height > winH) {
|
||||||
|
hints.style.height = (winH - 5) + "px";
|
||||||
|
hints.style.top = (top = pos.bottom - box.top) + "px";
|
||||||
|
var cursor = cm.getCursor();
|
||||||
|
if (data.from.ch != cursor.ch) {
|
||||||
|
pos = cm.cursorCoords(cursor);
|
||||||
|
hints.style.left = (left = pos.left) + "px";
|
||||||
|
box = hints.getBoundingClientRect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var overlapX = box.right - winW;
|
||||||
|
if (overlapX > 0) {
|
||||||
|
if (box.right - box.left > winW) {
|
||||||
|
hints.style.width = (winW - 5) + "px";
|
||||||
|
overlapX -= (box.right - box.left) - winW;
|
||||||
|
}
|
||||||
|
hints.style.left = (left = pos.left - overlapX) + "px";
|
||||||
|
}
|
||||||
|
|
||||||
|
cm.addKeyMap(this.keyMap = buildKeyMap(completion, {
|
||||||
|
moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },
|
||||||
|
setFocus: function(n) { widget.changeActive(n); },
|
||||||
|
menuSize: function() { return widget.screenAmount(); },
|
||||||
|
length: completions.length,
|
||||||
|
close: function() { completion.close(); },
|
||||||
|
pick: function() { widget.pick(); },
|
||||||
|
data: data
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (completion.options.closeOnUnfocus) {
|
||||||
|
var closingOnBlur;
|
||||||
|
cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });
|
||||||
|
cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); });
|
||||||
|
}
|
||||||
|
|
||||||
|
var startScroll = cm.getScrollInfo();
|
||||||
|
cm.on("scroll", this.onScroll = function() {
|
||||||
|
var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();
|
||||||
|
var newTop = top + startScroll.top - curScroll.top;
|
||||||
|
var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);
|
||||||
|
if (!below) point += hints.offsetHeight;
|
||||||
|
if (point <= editor.top || point >= editor.bottom) return completion.close();
|
||||||
|
hints.style.top = newTop + "px";
|
||||||
|
hints.style.left = (left + startScroll.left - curScroll.left) + "px";
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.on(hints, "dblclick", function(e) {
|
||||||
|
var t = getHintElement(hints, e.target || e.srcElement);
|
||||||
|
if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.on(hints, "click", function(e) {
|
||||||
|
var t = getHintElement(hints, e.target || e.srcElement);
|
||||||
|
if (t && t.hintId != null) {
|
||||||
|
widget.changeActive(t.hintId);
|
||||||
|
if (completion.options.completeOnSingleClick) widget.pick();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.on(hints, "mousedown", function() {
|
||||||
|
setTimeout(function(){cm.focus();}, 20);
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.signal(data, "select", completions[0], hints.firstChild);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget.prototype = {
|
||||||
|
close: function() {
|
||||||
|
if (this.completion.widget != this) return;
|
||||||
|
this.completion.widget = null;
|
||||||
|
this.hints.parentNode.removeChild(this.hints);
|
||||||
|
this.completion.cm.removeKeyMap(this.keyMap);
|
||||||
|
|
||||||
|
var cm = this.completion.cm;
|
||||||
|
if (this.completion.options.closeOnUnfocus) {
|
||||||
|
cm.off("blur", this.onBlur);
|
||||||
|
cm.off("focus", this.onFocus);
|
||||||
|
}
|
||||||
|
cm.off("scroll", this.onScroll);
|
||||||
|
},
|
||||||
|
|
||||||
|
disable: function() {
|
||||||
|
this.completion.cm.removeKeyMap(this.keyMap);
|
||||||
|
var widget = this;
|
||||||
|
this.keyMap = {Enter: function() { widget.picked = true; }};
|
||||||
|
this.completion.cm.addKeyMap(this.keyMap);
|
||||||
|
},
|
||||||
|
|
||||||
|
pick: function() {
|
||||||
|
this.completion.pick(this.data, this.selectedHint);
|
||||||
|
},
|
||||||
|
|
||||||
|
changeActive: function(i, avoidWrap) {
|
||||||
|
if (i >= this.data.list.length)
|
||||||
|
i = avoidWrap ? this.data.list.length - 1 : 0;
|
||||||
|
else if (i < 0)
|
||||||
|
i = avoidWrap ? 0 : this.data.list.length - 1;
|
||||||
|
if (this.selectedHint == i) return;
|
||||||
|
var node = this.hints.childNodes[this.selectedHint];
|
||||||
|
node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, "");
|
||||||
|
node = this.hints.childNodes[this.selectedHint = i];
|
||||||
|
node.className += " " + ACTIVE_HINT_ELEMENT_CLASS;
|
||||||
|
if (node.offsetTop < this.hints.scrollTop)
|
||||||
|
this.hints.scrollTop = node.offsetTop - 3;
|
||||||
|
else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
|
||||||
|
this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;
|
||||||
|
CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
|
||||||
|
},
|
||||||
|
|
||||||
|
screenAmount: function() {
|
||||||
|
return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("hint", "auto", function(cm, options) {
|
||||||
|
var helpers = cm.getHelpers(cm.getCursor(), "hint"), words;
|
||||||
|
if (helpers.length) {
|
||||||
|
for (var i = 0; i < helpers.length; i++) {
|
||||||
|
var cur = helpers[i](cm, options);
|
||||||
|
if (cur && cur.list.length) return cur;
|
||||||
|
}
|
||||||
|
} else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
|
||||||
|
if (words) return CodeMirror.hint.fromList(cm, {words: words});
|
||||||
|
} else if (CodeMirror.hint.anyword) {
|
||||||
|
return CodeMirror.hint.anyword(cm, options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("hint", "fromList", function(cm, options) {
|
||||||
|
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
|
||||||
|
var found = [];
|
||||||
|
for (var i = 0; i < options.words.length; i++) {
|
||||||
|
var word = options.words[i];
|
||||||
|
if (word.slice(0, token.string.length) == token.string)
|
||||||
|
found.push(word);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found.length) return {
|
||||||
|
list: found,
|
||||||
|
from: CodeMirror.Pos(cur.line, token.start),
|
||||||
|
to: CodeMirror.Pos(cur.line, token.end)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
CodeMirror.commands.autocomplete = CodeMirror.showHint;
|
||||||
|
|
||||||
|
var defaultOptions = {
|
||||||
|
hint: CodeMirror.hint.auto,
|
||||||
|
completeSingle: true,
|
||||||
|
alignWithWord: true,
|
||||||
|
closeCharacters: /[\s()\[\]{};:>,]/,
|
||||||
|
closeOnUnfocus: true,
|
||||||
|
completeOnSingleClick: false,
|
||||||
|
container: null,
|
||||||
|
customKeys: null,
|
||||||
|
extraKeys: null
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.defineOption("hintOptions", null);
|
||||||
|
});
|
245
public/vendor/codemirror/addon/hint/sql-hint.js
vendored
Executable file
245
public/vendor/codemirror/addon/hint/sql-hint.js
vendored
Executable file
|
@ -0,0 +1,245 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("../../mode/sql/sql"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "../../mode/sql/sql"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var tables;
|
||||||
|
var defaultTable;
|
||||||
|
var keywords;
|
||||||
|
var CONS = {
|
||||||
|
QUERY_DIV: ";",
|
||||||
|
ALIAS_KEYWORD: "AS"
|
||||||
|
};
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
function getKeywords(editor) {
|
||||||
|
var mode = editor.doc.modeOption;
|
||||||
|
if (mode === "sql") mode = "text/x-sql";
|
||||||
|
return CodeMirror.resolveMode(mode).keywords;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getText(item) {
|
||||||
|
return typeof item == "string" ? item : item.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getItem(list, item) {
|
||||||
|
if (!list.slice) return list[item];
|
||||||
|
for (var i = list.length - 1; i >= 0; i--) if (getText(list[i]) == item)
|
||||||
|
return list[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
function shallowClone(object) {
|
||||||
|
var result = {};
|
||||||
|
for (var key in object) if (object.hasOwnProperty(key))
|
||||||
|
result[key] = object[key];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function match(string, word) {
|
||||||
|
var len = string.length;
|
||||||
|
var sub = getText(word).substr(0, len);
|
||||||
|
return string.toUpperCase() === sub.toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function addMatches(result, search, wordlist, formatter) {
|
||||||
|
for (var word in wordlist) {
|
||||||
|
if (!wordlist.hasOwnProperty(word)) continue;
|
||||||
|
if (wordlist.slice) word = wordlist[word];
|
||||||
|
|
||||||
|
if (match(search, word)) result.push(formatter(word));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanName(name) {
|
||||||
|
// Get rid name from backticks(`) and preceding dot(.)
|
||||||
|
if (name.charAt(0) == ".") {
|
||||||
|
name = name.substr(1);
|
||||||
|
}
|
||||||
|
return name.replace(/`/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function insertBackticks(name) {
|
||||||
|
var nameParts = getText(name).split(".");
|
||||||
|
for (var i = 0; i < nameParts.length; i++)
|
||||||
|
nameParts[i] = "`" + nameParts[i] + "`";
|
||||||
|
var escaped = nameParts.join(".");
|
||||||
|
if (typeof name == "string") return escaped;
|
||||||
|
name = shallowClone(name);
|
||||||
|
name.text = escaped;
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
function nameCompletion(cur, token, result, editor) {
|
||||||
|
// Try to complete table, colunm names and return start position of completion
|
||||||
|
var useBacktick = false;
|
||||||
|
var nameParts = [];
|
||||||
|
var start = token.start;
|
||||||
|
var cont = true;
|
||||||
|
while (cont) {
|
||||||
|
cont = (token.string.charAt(0) == ".");
|
||||||
|
useBacktick = useBacktick || (token.string.charAt(0) == "`");
|
||||||
|
|
||||||
|
start = token.start;
|
||||||
|
nameParts.unshift(cleanName(token.string));
|
||||||
|
|
||||||
|
token = editor.getTokenAt(Pos(cur.line, token.start));
|
||||||
|
if (token.string == ".") {
|
||||||
|
cont = true;
|
||||||
|
token = editor.getTokenAt(Pos(cur.line, token.start));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to complete table names
|
||||||
|
var string = nameParts.join(".");
|
||||||
|
addMatches(result, string, tables, function(w) {
|
||||||
|
return useBacktick ? insertBackticks(w) : w;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Try to complete columns from defaultTable
|
||||||
|
addMatches(result, string, defaultTable, function(w) {
|
||||||
|
return useBacktick ? insertBackticks(w) : w;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Try to complete columns
|
||||||
|
string = nameParts.pop();
|
||||||
|
var table = nameParts.join(".");
|
||||||
|
|
||||||
|
// Check if table is available. If not, find table by Alias
|
||||||
|
if (!getItem(tables, table))
|
||||||
|
table = findTableByAlias(table, editor);
|
||||||
|
|
||||||
|
var columns = getItem(tables, table);
|
||||||
|
if (columns && columns.columns)
|
||||||
|
columns = columns.columns;
|
||||||
|
|
||||||
|
if (columns) {
|
||||||
|
addMatches(result, string, columns, function(w) {
|
||||||
|
if (typeof w == "string") {
|
||||||
|
w = table + "." + w;
|
||||||
|
} else {
|
||||||
|
w = shallowClone(w);
|
||||||
|
w.text = table + "." + w.text;
|
||||||
|
}
|
||||||
|
return useBacktick ? insertBackticks(w) : w;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
function eachWord(lineText, f) {
|
||||||
|
if (!lineText) return;
|
||||||
|
var excepted = /[,;]/g;
|
||||||
|
var words = lineText.split(" ");
|
||||||
|
for (var i = 0; i < words.length; i++) {
|
||||||
|
f(words[i]?words[i].replace(excepted, '') : '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertCurToNumber(cur) {
|
||||||
|
// max characters of a line is 999,999.
|
||||||
|
return cur.line + cur.ch / Math.pow(10, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertNumberToCur(num) {
|
||||||
|
return Pos(Math.floor(num), +num.toString().split('.').pop());
|
||||||
|
}
|
||||||
|
|
||||||
|
function findTableByAlias(alias, editor) {
|
||||||
|
var doc = editor.doc;
|
||||||
|
var fullQuery = doc.getValue();
|
||||||
|
var aliasUpperCase = alias.toUpperCase();
|
||||||
|
var previousWord = "";
|
||||||
|
var table = "";
|
||||||
|
var separator = [];
|
||||||
|
var validRange = {
|
||||||
|
start: Pos(0, 0),
|
||||||
|
end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
|
||||||
|
};
|
||||||
|
|
||||||
|
//add separator
|
||||||
|
var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
|
||||||
|
while(indexOfSeparator != -1) {
|
||||||
|
separator.push(doc.posFromIndex(indexOfSeparator));
|
||||||
|
indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);
|
||||||
|
}
|
||||||
|
separator.unshift(Pos(0, 0));
|
||||||
|
separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));
|
||||||
|
|
||||||
|
//find valid range
|
||||||
|
var prevItem = 0;
|
||||||
|
var current = convertCurToNumber(editor.getCursor());
|
||||||
|
for (var i=0; i< separator.length; i++) {
|
||||||
|
var _v = convertCurToNumber(separator[i]);
|
||||||
|
if (current > prevItem && current <= _v) {
|
||||||
|
validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) };
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
prevItem = _v;
|
||||||
|
}
|
||||||
|
|
||||||
|
var query = doc.getRange(validRange.start, validRange.end, false);
|
||||||
|
|
||||||
|
for (var i = 0; i < query.length; i++) {
|
||||||
|
var lineText = query[i];
|
||||||
|
eachWord(lineText, function(word) {
|
||||||
|
var wordUpperCase = word.toUpperCase();
|
||||||
|
if (wordUpperCase === aliasUpperCase && getItem(tables, previousWord))
|
||||||
|
table = previousWord;
|
||||||
|
if (wordUpperCase !== CONS.ALIAS_KEYWORD)
|
||||||
|
previousWord = word;
|
||||||
|
});
|
||||||
|
if (table) break;
|
||||||
|
}
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("hint", "sql", function(editor, options) {
|
||||||
|
tables = (options && options.tables) || {};
|
||||||
|
var defaultTableName = options && options.defaultTable;
|
||||||
|
defaultTable = defaultTableName && getItem(tables, defaultTableName);
|
||||||
|
keywords = keywords || getKeywords(editor);
|
||||||
|
|
||||||
|
if (defaultTableName && !defaultTable)
|
||||||
|
defaultTable = findTableByAlias(defaultTableName, editor);
|
||||||
|
|
||||||
|
defaultTable = defaultTable || [];
|
||||||
|
|
||||||
|
if (defaultTable.columns)
|
||||||
|
defaultTable = defaultTable.columns;
|
||||||
|
|
||||||
|
var cur = editor.getCursor();
|
||||||
|
var result = [];
|
||||||
|
var token = editor.getTokenAt(cur), start, end, search;
|
||||||
|
if (token.end > cur.ch) {
|
||||||
|
token.end = cur.ch;
|
||||||
|
token.string = token.string.slice(0, cur.ch - token.start);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token.string.match(/^[.`\w@]\w*$/)) {
|
||||||
|
search = token.string;
|
||||||
|
start = token.start;
|
||||||
|
end = token.end;
|
||||||
|
} else {
|
||||||
|
start = end = cur.ch;
|
||||||
|
search = "";
|
||||||
|
}
|
||||||
|
if (search.charAt(0) == "." || search.charAt(0) == "`") {
|
||||||
|
start = nameCompletion(cur, token, result, editor);
|
||||||
|
} else {
|
||||||
|
addMatches(result, search, tables, function(w) {return w;});
|
||||||
|
addMatches(result, search, defaultTable, function(w) {return w;});
|
||||||
|
addMatches(result, search, keywords, function(w) {return w.toUpperCase();});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};
|
||||||
|
});
|
||||||
|
});
|
110
public/vendor/codemirror/addon/hint/xml-hint.js
vendored
Executable file
110
public/vendor/codemirror/addon/hint/xml-hint.js
vendored
Executable file
|
@ -0,0 +1,110 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
|
||||||
|
function getHints(cm, options) {
|
||||||
|
var tags = options && options.schemaInfo;
|
||||||
|
var quote = (options && options.quoteChar) || '"';
|
||||||
|
if (!tags) return;
|
||||||
|
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
|
||||||
|
if (token.end > cur.ch) {
|
||||||
|
token.end = cur.ch;
|
||||||
|
token.string = token.string.slice(0, cur.ch - token.start);
|
||||||
|
}
|
||||||
|
var inner = CodeMirror.innerMode(cm.getMode(), token.state);
|
||||||
|
if (inner.mode.name != "xml") return;
|
||||||
|
var result = [], replaceToken = false, prefix;
|
||||||
|
var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string);
|
||||||
|
var tagName = tag && /^\w/.test(token.string), tagStart;
|
||||||
|
|
||||||
|
if (tagName) {
|
||||||
|
var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start);
|
||||||
|
var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null;
|
||||||
|
if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1);
|
||||||
|
} else if (tag && token.string == "<") {
|
||||||
|
tagType = "open";
|
||||||
|
} else if (tag && token.string == "</") {
|
||||||
|
tagType = "close";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tag && !inner.state.tagName || tagType) {
|
||||||
|
if (tagName)
|
||||||
|
prefix = token.string;
|
||||||
|
replaceToken = tagType;
|
||||||
|
var cx = inner.state.context, curTag = cx && tags[cx.tagName];
|
||||||
|
var childList = cx ? curTag && curTag.children : tags["!top"];
|
||||||
|
if (childList && tagType != "close") {
|
||||||
|
for (var i = 0; i < childList.length; ++i) if (!prefix || childList[i].lastIndexOf(prefix, 0) == 0)
|
||||||
|
result.push("<" + childList[i]);
|
||||||
|
} else if (tagType != "close") {
|
||||||
|
for (var name in tags)
|
||||||
|
if (tags.hasOwnProperty(name) && name != "!top" && name != "!attrs" && (!prefix || name.lastIndexOf(prefix, 0) == 0))
|
||||||
|
result.push("<" + name);
|
||||||
|
}
|
||||||
|
if (cx && (!prefix || tagType == "close" && cx.tagName.lastIndexOf(prefix, 0) == 0))
|
||||||
|
result.push("</" + cx.tagName + ">");
|
||||||
|
} else {
|
||||||
|
// Attribute completion
|
||||||
|
var curTag = tags[inner.state.tagName], attrs = curTag && curTag.attrs;
|
||||||
|
var globalAttrs = tags["!attrs"];
|
||||||
|
if (!attrs && !globalAttrs) return;
|
||||||
|
if (!attrs) {
|
||||||
|
attrs = globalAttrs;
|
||||||
|
} else if (globalAttrs) { // Combine tag-local and global attributes
|
||||||
|
var set = {};
|
||||||
|
for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm];
|
||||||
|
for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm];
|
||||||
|
attrs = set;
|
||||||
|
}
|
||||||
|
if (token.type == "string" || token.string == "=") { // A value
|
||||||
|
var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)),
|
||||||
|
Pos(cur.line, token.type == "string" ? token.start : token.end));
|
||||||
|
var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues;
|
||||||
|
if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return;
|
||||||
|
if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget
|
||||||
|
if (token.type == "string") {
|
||||||
|
prefix = token.string;
|
||||||
|
var n = 0;
|
||||||
|
if (/['"]/.test(token.string.charAt(0))) {
|
||||||
|
quote = token.string.charAt(0);
|
||||||
|
prefix = token.string.slice(1);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
var len = token.string.length;
|
||||||
|
if (/['"]/.test(token.string.charAt(len - 1))) {
|
||||||
|
quote = token.string.charAt(len - 1);
|
||||||
|
prefix = token.string.substr(n, len - 2);
|
||||||
|
}
|
||||||
|
replaceToken = true;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < atValues.length; ++i) if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0)
|
||||||
|
result.push(quote + atValues[i] + quote);
|
||||||
|
} else { // An attribute name
|
||||||
|
if (token.type == "attribute") {
|
||||||
|
prefix = token.string;
|
||||||
|
replaceToken = true;
|
||||||
|
}
|
||||||
|
for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0))
|
||||||
|
result.push(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
list: result,
|
||||||
|
from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur,
|
||||||
|
to: replaceToken ? Pos(cur.line, token.end) : cur
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("hint", "xml", getHints);
|
||||||
|
});
|
41
public/vendor/codemirror/addon/lint/coffeescript-lint.js
vendored
Executable file
41
public/vendor/codemirror/addon/lint/coffeescript-lint.js
vendored
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js
|
||||||
|
|
||||||
|
// declare global: coffeelint
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("lint", "coffeescript", function(text) {
|
||||||
|
var found = [];
|
||||||
|
var parseError = function(err) {
|
||||||
|
var loc = err.lineNumber;
|
||||||
|
found.push({from: CodeMirror.Pos(loc-1, 0),
|
||||||
|
to: CodeMirror.Pos(loc, 0),
|
||||||
|
severity: err.level,
|
||||||
|
message: err.message});
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
var res = coffeelint.lint(text);
|
||||||
|
for(var i = 0; i < res.length; i++) {
|
||||||
|
parseError(res[i]);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
found.push({from: CodeMirror.Pos(e.location.first_line, 0),
|
||||||
|
to: CodeMirror.Pos(e.location.last_line, e.location.last_column),
|
||||||
|
severity: 'error',
|
||||||
|
message: e.message});
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
35
public/vendor/codemirror/addon/lint/css-lint.js
vendored
Executable file
35
public/vendor/codemirror/addon/lint/css-lint.js
vendored
Executable file
|
@ -0,0 +1,35 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// Depends on csslint.js from https://github.com/stubbornella/csslint
|
||||||
|
|
||||||
|
// declare global: CSSLint
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("lint", "css", function(text) {
|
||||||
|
var found = [];
|
||||||
|
if (!window.CSSLint) return found;
|
||||||
|
var results = CSSLint.verify(text), messages = results.messages, message = null;
|
||||||
|
for ( var i = 0; i < messages.length; i++) {
|
||||||
|
message = messages[i];
|
||||||
|
var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col;
|
||||||
|
found.push({
|
||||||
|
from: CodeMirror.Pos(startLine, startCol),
|
||||||
|
to: CodeMirror.Pos(endLine, endCol),
|
||||||
|
message: message.message,
|
||||||
|
severity : message.type
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
136
public/vendor/codemirror/addon/lint/javascript-lint.js
vendored
Executable file
136
public/vendor/codemirror/addon/lint/javascript-lint.js
vendored
Executable file
|
@ -0,0 +1,136 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
// declare global: JSHINT
|
||||||
|
|
||||||
|
var bogus = [ "Dangerous comment" ];
|
||||||
|
|
||||||
|
var warnings = [ [ "Expected '{'",
|
||||||
|
"Statement body should be inside '{ }' braces." ] ];
|
||||||
|
|
||||||
|
var errors = [ "Missing semicolon", "Extra comma", "Missing property name",
|
||||||
|
"Unmatched ", " and instead saw", " is not defined",
|
||||||
|
"Unclosed string", "Stopping, unable to continue" ];
|
||||||
|
|
||||||
|
function validator(text, options) {
|
||||||
|
if (!window.JSHINT) return [];
|
||||||
|
JSHINT(text, options, options.globals);
|
||||||
|
var errors = JSHINT.data().errors, result = [];
|
||||||
|
if (errors) parseErrors(errors, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("lint", "javascript", validator);
|
||||||
|
|
||||||
|
function cleanup(error) {
|
||||||
|
// All problems are warnings by default
|
||||||
|
fixWith(error, warnings, "warning", true);
|
||||||
|
fixWith(error, errors, "error");
|
||||||
|
|
||||||
|
return isBogus(error) ? null : error;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fixWith(error, fixes, severity, force) {
|
||||||
|
var description, fix, find, replace, found;
|
||||||
|
|
||||||
|
description = error.description;
|
||||||
|
|
||||||
|
for ( var i = 0; i < fixes.length; i++) {
|
||||||
|
fix = fixes[i];
|
||||||
|
find = (typeof fix === "string" ? fix : fix[0]);
|
||||||
|
replace = (typeof fix === "string" ? null : fix[1]);
|
||||||
|
found = description.indexOf(find) !== -1;
|
||||||
|
|
||||||
|
if (force || found) {
|
||||||
|
error.severity = severity;
|
||||||
|
}
|
||||||
|
if (found && replace) {
|
||||||
|
error.description = replace;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isBogus(error) {
|
||||||
|
var description = error.description;
|
||||||
|
for ( var i = 0; i < bogus.length; i++) {
|
||||||
|
if (description.indexOf(bogus[i]) !== -1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseErrors(errors, output) {
|
||||||
|
for ( var i = 0; i < errors.length; i++) {
|
||||||
|
var error = errors[i];
|
||||||
|
if (error) {
|
||||||
|
var linetabpositions, index;
|
||||||
|
|
||||||
|
linetabpositions = [];
|
||||||
|
|
||||||
|
// This next block is to fix a problem in jshint. Jshint
|
||||||
|
// replaces
|
||||||
|
// all tabs with spaces then performs some checks. The error
|
||||||
|
// positions (character/space) are then reported incorrectly,
|
||||||
|
// not taking the replacement step into account. Here we look
|
||||||
|
// at the evidence line and try to adjust the character position
|
||||||
|
// to the correct value.
|
||||||
|
if (error.evidence) {
|
||||||
|
// Tab positions are computed once per line and cached
|
||||||
|
var tabpositions = linetabpositions[error.line];
|
||||||
|
if (!tabpositions) {
|
||||||
|
var evidence = error.evidence;
|
||||||
|
tabpositions = [];
|
||||||
|
// ugggh phantomjs does not like this
|
||||||
|
// forEachChar(evidence, function(item, index) {
|
||||||
|
Array.prototype.forEach.call(evidence, function(item,
|
||||||
|
index) {
|
||||||
|
if (item === '\t') {
|
||||||
|
// First col is 1 (not 0) to match error
|
||||||
|
// positions
|
||||||
|
tabpositions.push(index + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
linetabpositions[error.line] = tabpositions;
|
||||||
|
}
|
||||||
|
if (tabpositions.length > 0) {
|
||||||
|
var pos = error.character;
|
||||||
|
tabpositions.forEach(function(tabposition) {
|
||||||
|
if (pos > tabposition) pos -= 1;
|
||||||
|
});
|
||||||
|
error.character = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = error.character - 1, end = start + 1;
|
||||||
|
if (error.evidence) {
|
||||||
|
index = error.evidence.substring(start).search(/.\b/);
|
||||||
|
if (index > -1) {
|
||||||
|
end += index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert to format expected by validation service
|
||||||
|
error.description = error.reason;// + "(jshint)";
|
||||||
|
error.start = error.character;
|
||||||
|
error.end = end;
|
||||||
|
error = cleanup(error);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
output.push({message: error.description,
|
||||||
|
severity: error.severity,
|
||||||
|
from: CodeMirror.Pos(error.line - 1, start),
|
||||||
|
to: CodeMirror.Pos(error.line - 1, end)});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
31
public/vendor/codemirror/addon/lint/json-lint.js
vendored
Executable file
31
public/vendor/codemirror/addon/lint/json-lint.js
vendored
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// Depends on jsonlint.js from https://github.com/zaach/jsonlint
|
||||||
|
|
||||||
|
// declare global: jsonlint
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("lint", "json", function(text) {
|
||||||
|
var found = [];
|
||||||
|
jsonlint.parseError = function(str, hash) {
|
||||||
|
var loc = hash.loc;
|
||||||
|
found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
|
||||||
|
to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
|
||||||
|
message: str});
|
||||||
|
};
|
||||||
|
try { jsonlint.parse(text); }
|
||||||
|
catch(e) {}
|
||||||
|
return found;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
73
public/vendor/codemirror/addon/lint/lint.css
vendored
Executable file
73
public/vendor/codemirror/addon/lint/lint.css
vendored
Executable file
|
@ -0,0 +1,73 @@
|
||||||
|
/* The lint marker gutter */
|
||||||
|
.CodeMirror-lint-markers {
|
||||||
|
width: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-tooltip {
|
||||||
|
background-color: infobackground;
|
||||||
|
border: 1px solid black;
|
||||||
|
border-radius: 4px 4px 4px 4px;
|
||||||
|
color: infotext;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 10pt;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 2px 5px;
|
||||||
|
position: fixed;
|
||||||
|
white-space: pre;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
z-index: 100;
|
||||||
|
max-width: 600px;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity .4s;
|
||||||
|
-moz-transition: opacity .4s;
|
||||||
|
-webkit-transition: opacity .4s;
|
||||||
|
-o-transition: opacity .4s;
|
||||||
|
-ms-transition: opacity .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
|
||||||
|
background-position: left bottom;
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-mark-error {
|
||||||
|
background-image:
|
||||||
|
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-mark-warning {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
vertical-align: middle;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
|
||||||
|
padding-left: 18px;
|
||||||
|
background-position: top left;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-multiple {
|
||||||
|
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right bottom;
|
||||||
|
width: 100%; height: 100%;
|
||||||
|
}
|
207
public/vendor/codemirror/addon/lint/lint.js
vendored
Executable file
207
public/vendor/codemirror/addon/lint/lint.js
vendored
Executable file
|
@ -0,0 +1,207 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
var GUTTER_ID = "CodeMirror-lint-markers";
|
||||||
|
|
||||||
|
function showTooltip(e, content) {
|
||||||
|
var tt = document.createElement("div");
|
||||||
|
tt.className = "CodeMirror-lint-tooltip";
|
||||||
|
tt.appendChild(content.cloneNode(true));
|
||||||
|
document.body.appendChild(tt);
|
||||||
|
|
||||||
|
function position(e) {
|
||||||
|
if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
|
||||||
|
tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
|
||||||
|
tt.style.left = (e.clientX + 5) + "px";
|
||||||
|
}
|
||||||
|
CodeMirror.on(document, "mousemove", position);
|
||||||
|
position(e);
|
||||||
|
if (tt.style.opacity != null) tt.style.opacity = 1;
|
||||||
|
return tt;
|
||||||
|
}
|
||||||
|
function rm(elt) {
|
||||||
|
if (elt.parentNode) elt.parentNode.removeChild(elt);
|
||||||
|
}
|
||||||
|
function hideTooltip(tt) {
|
||||||
|
if (!tt.parentNode) return;
|
||||||
|
if (tt.style.opacity == null) rm(tt);
|
||||||
|
tt.style.opacity = 0;
|
||||||
|
setTimeout(function() { rm(tt); }, 600);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showTooltipFor(e, content, node) {
|
||||||
|
var tooltip = showTooltip(e, content);
|
||||||
|
function hide() {
|
||||||
|
CodeMirror.off(node, "mouseout", hide);
|
||||||
|
if (tooltip) { hideTooltip(tooltip); tooltip = null; }
|
||||||
|
}
|
||||||
|
var poll = setInterval(function() {
|
||||||
|
if (tooltip) for (var n = node;; n = n.parentNode) {
|
||||||
|
if (n && n.nodeType == 11) n = n.host;
|
||||||
|
if (n == document.body) return;
|
||||||
|
if (!n) { hide(); break; }
|
||||||
|
}
|
||||||
|
if (!tooltip) return clearInterval(poll);
|
||||||
|
}, 400);
|
||||||
|
CodeMirror.on(node, "mouseout", hide);
|
||||||
|
}
|
||||||
|
|
||||||
|
function LintState(cm, options, hasGutter) {
|
||||||
|
this.marked = [];
|
||||||
|
this.options = options;
|
||||||
|
this.timeout = null;
|
||||||
|
this.hasGutter = hasGutter;
|
||||||
|
this.onMouseOver = function(e) { onMouseOver(cm, e); };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseOptions(cm, options) {
|
||||||
|
if (options instanceof Function) return {getAnnotations: options};
|
||||||
|
if (!options || options === true) options = {};
|
||||||
|
if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint");
|
||||||
|
if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearMarks(cm) {
|
||||||
|
var state = cm.state.lint;
|
||||||
|
if (state.hasGutter) cm.clearGutter(GUTTER_ID);
|
||||||
|
for (var i = 0; i < state.marked.length; ++i)
|
||||||
|
state.marked[i].clear();
|
||||||
|
state.marked.length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeMarker(labels, severity, multiple, tooltips) {
|
||||||
|
var marker = document.createElement("div"), inner = marker;
|
||||||
|
marker.className = "CodeMirror-lint-marker-" + severity;
|
||||||
|
if (multiple) {
|
||||||
|
inner = marker.appendChild(document.createElement("div"));
|
||||||
|
inner.className = "CodeMirror-lint-marker-multiple";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
|
||||||
|
showTooltipFor(e, labels, inner);
|
||||||
|
});
|
||||||
|
|
||||||
|
return marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMaxSeverity(a, b) {
|
||||||
|
if (a == "error") return a;
|
||||||
|
else return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupByLine(annotations) {
|
||||||
|
var lines = [];
|
||||||
|
for (var i = 0; i < annotations.length; ++i) {
|
||||||
|
var ann = annotations[i], line = ann.from.line;
|
||||||
|
(lines[line] || (lines[line] = [])).push(ann);
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
function annotationTooltip(ann) {
|
||||||
|
var severity = ann.severity;
|
||||||
|
if (!severity) severity = "error";
|
||||||
|
var tip = document.createElement("div");
|
||||||
|
tip.className = "CodeMirror-lint-message-" + severity;
|
||||||
|
tip.appendChild(document.createTextNode(ann.message));
|
||||||
|
return tip;
|
||||||
|
}
|
||||||
|
|
||||||
|
function startLinting(cm) {
|
||||||
|
var state = cm.state.lint, options = state.options;
|
||||||
|
var passOptions = options.options || options; // Support deprecated passing of `options` property in options
|
||||||
|
if (options.async || options.getAnnotations.async)
|
||||||
|
options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm);
|
||||||
|
else
|
||||||
|
updateLinting(cm, options.getAnnotations(cm.getValue(), passOptions, cm));
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLinting(cm, annotationsNotSorted) {
|
||||||
|
clearMarks(cm);
|
||||||
|
var state = cm.state.lint, options = state.options;
|
||||||
|
|
||||||
|
var annotations = groupByLine(annotationsNotSorted);
|
||||||
|
|
||||||
|
for (var line = 0; line < annotations.length; ++line) {
|
||||||
|
var anns = annotations[line];
|
||||||
|
if (!anns) continue;
|
||||||
|
|
||||||
|
var maxSeverity = null;
|
||||||
|
var tipLabel = state.hasGutter && document.createDocumentFragment();
|
||||||
|
|
||||||
|
for (var i = 0; i < anns.length; ++i) {
|
||||||
|
var ann = anns[i];
|
||||||
|
var severity = ann.severity;
|
||||||
|
if (!severity) severity = "error";
|
||||||
|
maxSeverity = getMaxSeverity(maxSeverity, severity);
|
||||||
|
|
||||||
|
if (options.formatAnnotation) ann = options.formatAnnotation(ann);
|
||||||
|
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
|
||||||
|
|
||||||
|
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
|
||||||
|
className: "CodeMirror-lint-mark-" + severity,
|
||||||
|
__annotation: ann
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.hasGutter)
|
||||||
|
cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1,
|
||||||
|
state.options.tooltips));
|
||||||
|
}
|
||||||
|
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onChange(cm) {
|
||||||
|
var state = cm.state.lint;
|
||||||
|
if (!state) return;
|
||||||
|
clearTimeout(state.timeout);
|
||||||
|
state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
function popupSpanTooltip(ann, e) {
|
||||||
|
var target = e.target || e.srcElement;
|
||||||
|
showTooltipFor(e, annotationTooltip(ann), target);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMouseOver(cm, e) {
|
||||||
|
var target = e.target || e.srcElement;
|
||||||
|
if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
|
||||||
|
var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
|
||||||
|
var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
|
||||||
|
for (var i = 0; i < spans.length; ++i) {
|
||||||
|
var ann = spans[i].__annotation;
|
||||||
|
if (ann) return popupSpanTooltip(ann, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.defineOption("lint", false, function(cm, val, old) {
|
||||||
|
if (old && old != CodeMirror.Init) {
|
||||||
|
clearMarks(cm);
|
||||||
|
cm.off("change", onChange);
|
||||||
|
CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
|
||||||
|
clearTimeout(cm.state.lint.timeout);
|
||||||
|
delete cm.state.lint;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val) {
|
||||||
|
var gutters = cm.getOption("gutters"), hasLintGutter = false;
|
||||||
|
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
|
||||||
|
var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
|
||||||
|
cm.on("change", onChange);
|
||||||
|
if (state.options.tooltips != false)
|
||||||
|
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
|
||||||
|
|
||||||
|
startLinting(cm);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
28
public/vendor/codemirror/addon/lint/yaml-lint.js
vendored
Executable file
28
public/vendor/codemirror/addon/lint/yaml-lint.js
vendored
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Depends on js-yaml.js from https://github.com/nodeca/js-yaml
|
||||||
|
|
||||||
|
// declare global: jsyaml
|
||||||
|
|
||||||
|
CodeMirror.registerHelper("lint", "yaml", function(text) {
|
||||||
|
var found = [];
|
||||||
|
try { jsyaml.load(text); }
|
||||||
|
catch(e) {
|
||||||
|
var loc = e.mark;
|
||||||
|
found.push({ from: CodeMirror.Pos(loc.line, loc.column), to: CodeMirror.Pos(loc.line, loc.column), message: e.message });
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
112
public/vendor/codemirror/addon/merge/merge.css
vendored
Executable file
112
public/vendor/codemirror/addon/merge/merge.css
vendored
Executable file
|
@ -0,0 +1,112 @@
|
||||||
|
.CodeMirror-merge {
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge, .CodeMirror-merge .CodeMirror {
|
||||||
|
height: 350px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; }
|
||||||
|
.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; }
|
||||||
|
.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }
|
||||||
|
.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }
|
||||||
|
|
||||||
|
.CodeMirror-merge-pane {
|
||||||
|
display: inline-block;
|
||||||
|
white-space: normal;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.CodeMirror-merge-pane-rightmost {
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-gap {
|
||||||
|
z-index: 2;
|
||||||
|
display: inline-block;
|
||||||
|
height: 100%;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
border-left: 1px solid #ddd;
|
||||||
|
border-right: 1px solid #ddd;
|
||||||
|
position: relative;
|
||||||
|
background: #f8f8f8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-scrolllock-wrap {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0; left: 50%;
|
||||||
|
}
|
||||||
|
.CodeMirror-merge-scrolllock {
|
||||||
|
position: relative;
|
||||||
|
left: -50%;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #555;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {
|
||||||
|
position: absolute;
|
||||||
|
left: 0; top: 0;
|
||||||
|
right: 0; bottom: 0;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-copy {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #44c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-copy-reverse {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #44c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
|
||||||
|
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }
|
||||||
|
|
||||||
|
.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);
|
||||||
|
background-position: bottom left;
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);
|
||||||
|
background-position: bottom left;
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-merge-r-chunk { background: #ffffe0; }
|
||||||
|
.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; }
|
||||||
|
.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; }
|
||||||
|
.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; }
|
||||||
|
|
||||||
|
.CodeMirror-merge-l-chunk { background: #eef; }
|
||||||
|
.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }
|
||||||
|
.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }
|
||||||
|
.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }
|
||||||
|
|
||||||
|
.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }
|
||||||
|
.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }
|
||||||
|
.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }
|
||||||
|
|
||||||
|
.CodeMirror-merge-collapsed-widget:before {
|
||||||
|
content: "(...)";
|
||||||
|
}
|
||||||
|
.CodeMirror-merge-collapsed-widget {
|
||||||
|
cursor: pointer;
|
||||||
|
color: #88b;
|
||||||
|
background: #eef;
|
||||||
|
border: 1px solid #ddf;
|
||||||
|
font-size: 90%;
|
||||||
|
padding: 0 3px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; }
|
775
public/vendor/codemirror/addon/merge/merge.js
vendored
Executable file
775
public/vendor/codemirror/addon/merge/merge.js
vendored
Executable file
|
@ -0,0 +1,775 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), require("diff_match_patch"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror", "diff_match_patch"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror, diff_match_patch);
|
||||||
|
})(function(CodeMirror, diff_match_patch) {
|
||||||
|
"use strict";
|
||||||
|
var Pos = CodeMirror.Pos;
|
||||||
|
var svgNS = "http://www.w3.org/2000/svg";
|
||||||
|
|
||||||
|
function DiffView(mv, type) {
|
||||||
|
this.mv = mv;
|
||||||
|
this.type = type;
|
||||||
|
this.classes = type == "left"
|
||||||
|
? {chunk: "CodeMirror-merge-l-chunk",
|
||||||
|
start: "CodeMirror-merge-l-chunk-start",
|
||||||
|
end: "CodeMirror-merge-l-chunk-end",
|
||||||
|
insert: "CodeMirror-merge-l-inserted",
|
||||||
|
del: "CodeMirror-merge-l-deleted",
|
||||||
|
connect: "CodeMirror-merge-l-connect"}
|
||||||
|
: {chunk: "CodeMirror-merge-r-chunk",
|
||||||
|
start: "CodeMirror-merge-r-chunk-start",
|
||||||
|
end: "CodeMirror-merge-r-chunk-end",
|
||||||
|
insert: "CodeMirror-merge-r-inserted",
|
||||||
|
del: "CodeMirror-merge-r-deleted",
|
||||||
|
connect: "CodeMirror-merge-r-connect"};
|
||||||
|
}
|
||||||
|
|
||||||
|
DiffView.prototype = {
|
||||||
|
constructor: DiffView,
|
||||||
|
init: function(pane, orig, options) {
|
||||||
|
this.edit = this.mv.edit;
|
||||||
|
(this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this);
|
||||||
|
this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options)));
|
||||||
|
this.orig.state.diffViews = [this];
|
||||||
|
|
||||||
|
this.diff = getDiff(asString(orig), asString(options.value));
|
||||||
|
this.chunks = getChunks(this.diff);
|
||||||
|
this.diffOutOfDate = this.dealigned = false;
|
||||||
|
|
||||||
|
this.showDifferences = options.showDifferences !== false;
|
||||||
|
this.forceUpdate = registerUpdate(this);
|
||||||
|
setScrollLock(this, true, false);
|
||||||
|
registerScroll(this);
|
||||||
|
},
|
||||||
|
setShowDifferences: function(val) {
|
||||||
|
val = val !== false;
|
||||||
|
if (val != this.showDifferences) {
|
||||||
|
this.showDifferences = val;
|
||||||
|
this.forceUpdate("full");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function ensureDiff(dv) {
|
||||||
|
if (dv.diffOutOfDate) {
|
||||||
|
dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue());
|
||||||
|
dv.chunks = getChunks(dv.diff);
|
||||||
|
dv.diffOutOfDate = false;
|
||||||
|
CodeMirror.signal(dv.edit, "updateDiff", dv.diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var updating = false;
|
||||||
|
function registerUpdate(dv) {
|
||||||
|
var edit = {from: 0, to: 0, marked: []};
|
||||||
|
var orig = {from: 0, to: 0, marked: []};
|
||||||
|
var debounceChange, updatingFast = false;
|
||||||
|
function update(mode) {
|
||||||
|
updating = true;
|
||||||
|
updatingFast = false;
|
||||||
|
if (mode == "full") {
|
||||||
|
if (dv.svg) clear(dv.svg);
|
||||||
|
if (dv.copyButtons) clear(dv.copyButtons);
|
||||||
|
clearMarks(dv.edit, edit.marked, dv.classes);
|
||||||
|
clearMarks(dv.orig, orig.marked, dv.classes);
|
||||||
|
edit.from = edit.to = orig.from = orig.to = 0;
|
||||||
|
}
|
||||||
|
ensureDiff(dv);
|
||||||
|
if (dv.showDifferences) {
|
||||||
|
updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);
|
||||||
|
updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);
|
||||||
|
}
|
||||||
|
makeConnections(dv);
|
||||||
|
|
||||||
|
if (dv.mv.options.connect == "align")
|
||||||
|
alignChunks(dv);
|
||||||
|
updating = false;
|
||||||
|
}
|
||||||
|
function setDealign(fast) {
|
||||||
|
if (updating) return;
|
||||||
|
dv.dealigned = true;
|
||||||
|
set(fast);
|
||||||
|
}
|
||||||
|
function set(fast) {
|
||||||
|
if (updating || updatingFast) return;
|
||||||
|
clearTimeout(debounceChange);
|
||||||
|
if (fast === true) updatingFast = true;
|
||||||
|
debounceChange = setTimeout(update, fast === true ? 20 : 250);
|
||||||
|
}
|
||||||
|
function change(_cm, change) {
|
||||||
|
if (!dv.diffOutOfDate) {
|
||||||
|
dv.diffOutOfDate = true;
|
||||||
|
edit.from = edit.to = orig.from = orig.to = 0;
|
||||||
|
}
|
||||||
|
// Update faster when a line was added/removed
|
||||||
|
setDealign(change.text.length - 1 != change.to.line - change.from.line);
|
||||||
|
}
|
||||||
|
dv.edit.on("change", change);
|
||||||
|
dv.orig.on("change", change);
|
||||||
|
dv.edit.on("markerAdded", setDealign);
|
||||||
|
dv.edit.on("markerCleared", setDealign);
|
||||||
|
dv.orig.on("markerAdded", setDealign);
|
||||||
|
dv.orig.on("markerCleared", setDealign);
|
||||||
|
dv.edit.on("viewportChange", function() { set(false); });
|
||||||
|
dv.orig.on("viewportChange", function() { set(false); });
|
||||||
|
update();
|
||||||
|
return update;
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerScroll(dv) {
|
||||||
|
dv.edit.on("scroll", function() {
|
||||||
|
syncScroll(dv, DIFF_INSERT) && makeConnections(dv);
|
||||||
|
});
|
||||||
|
dv.orig.on("scroll", function() {
|
||||||
|
syncScroll(dv, DIFF_DELETE) && makeConnections(dv);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncScroll(dv, type) {
|
||||||
|
// Change handler will do a refresh after a timeout when diff is out of date
|
||||||
|
if (dv.diffOutOfDate) return false;
|
||||||
|
if (!dv.lockScroll) return true;
|
||||||
|
var editor, other, now = +new Date;
|
||||||
|
if (type == DIFF_INSERT) { editor = dv.edit; other = dv.orig; }
|
||||||
|
else { editor = dv.orig; other = dv.edit; }
|
||||||
|
// Don't take action if the position of this editor was recently set
|
||||||
|
// (to prevent feedback loops)
|
||||||
|
if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 50 > now) return false;
|
||||||
|
|
||||||
|
var sInfo = editor.getScrollInfo();
|
||||||
|
if (dv.mv.options.connect == "align") {
|
||||||
|
targetPos = sInfo.top;
|
||||||
|
} else {
|
||||||
|
var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen;
|
||||||
|
var mid = editor.lineAtHeight(midY, "local");
|
||||||
|
var around = chunkBoundariesAround(dv.chunks, mid, type == DIFF_INSERT);
|
||||||
|
var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig);
|
||||||
|
var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit);
|
||||||
|
var ratio = (midY - off.top) / (off.bot - off.top);
|
||||||
|
var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);
|
||||||
|
|
||||||
|
var botDist, mix;
|
||||||
|
// Some careful tweaking to make sure no space is left out of view
|
||||||
|
// when scrolling to top or bottom.
|
||||||
|
if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {
|
||||||
|
targetPos = targetPos * mix + sInfo.top * (1 - mix);
|
||||||
|
} else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {
|
||||||
|
var otherInfo = other.getScrollInfo();
|
||||||
|
var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;
|
||||||
|
if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)
|
||||||
|
targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
other.scrollTo(sInfo.left, targetPos);
|
||||||
|
other.state.scrollSetAt = now;
|
||||||
|
other.state.scrollSetBy = dv;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOffsets(editor, around) {
|
||||||
|
var bot = around.after;
|
||||||
|
if (bot == null) bot = editor.lastLine() + 1;
|
||||||
|
return {top: editor.heightAtLine(around.before || 0, "local"),
|
||||||
|
bot: editor.heightAtLine(bot, "local")};
|
||||||
|
}
|
||||||
|
|
||||||
|
function setScrollLock(dv, val, action) {
|
||||||
|
dv.lockScroll = val;
|
||||||
|
if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv);
|
||||||
|
dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db \u21da";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updating the marks for editor content
|
||||||
|
|
||||||
|
function clearMarks(editor, arr, classes) {
|
||||||
|
for (var i = 0; i < arr.length; ++i) {
|
||||||
|
var mark = arr[i];
|
||||||
|
if (mark instanceof CodeMirror.TextMarker) {
|
||||||
|
mark.clear();
|
||||||
|
} else if (mark.parent) {
|
||||||
|
editor.removeLineClass(mark, "background", classes.chunk);
|
||||||
|
editor.removeLineClass(mark, "background", classes.start);
|
||||||
|
editor.removeLineClass(mark, "background", classes.end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arr.length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME maybe add a margin around viewport to prevent too many updates
|
||||||
|
function updateMarks(editor, diff, state, type, classes) {
|
||||||
|
var vp = editor.getViewport();
|
||||||
|
editor.operation(function() {
|
||||||
|
if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {
|
||||||
|
clearMarks(editor, state.marked, classes);
|
||||||
|
markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes);
|
||||||
|
state.from = vp.from; state.to = vp.to;
|
||||||
|
} else {
|
||||||
|
if (vp.from < state.from) {
|
||||||
|
markChanges(editor, diff, type, state.marked, vp.from, state.from, classes);
|
||||||
|
state.from = vp.from;
|
||||||
|
}
|
||||||
|
if (vp.to > state.to) {
|
||||||
|
markChanges(editor, diff, type, state.marked, state.to, vp.to, classes);
|
||||||
|
state.to = vp.to;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function markChanges(editor, diff, type, marks, from, to, classes) {
|
||||||
|
var pos = Pos(0, 0);
|
||||||
|
var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1));
|
||||||
|
var cls = type == DIFF_DELETE ? classes.del : classes.insert;
|
||||||
|
function markChunk(start, end) {
|
||||||
|
var bfrom = Math.max(from, start), bto = Math.min(to, end);
|
||||||
|
for (var i = bfrom; i < bto; ++i) {
|
||||||
|
var line = editor.addLineClass(i, "background", classes.chunk);
|
||||||
|
if (i == start) editor.addLineClass(line, "background", classes.start);
|
||||||
|
if (i == end - 1) editor.addLineClass(line, "background", classes.end);
|
||||||
|
marks.push(line);
|
||||||
|
}
|
||||||
|
// When the chunk is empty, make sure a horizontal line shows up
|
||||||
|
if (start == end && bfrom == end && bto == end) {
|
||||||
|
if (bfrom)
|
||||||
|
marks.push(editor.addLineClass(bfrom - 1, "background", classes.end));
|
||||||
|
else
|
||||||
|
marks.push(editor.addLineClass(bfrom, "background", classes.start));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var chunkStart = 0;
|
||||||
|
for (var i = 0; i < diff.length; ++i) {
|
||||||
|
var part = diff[i], tp = part[0], str = part[1];
|
||||||
|
if (tp == DIFF_EQUAL) {
|
||||||
|
var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1);
|
||||||
|
moveOver(pos, str);
|
||||||
|
var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0);
|
||||||
|
if (cleanTo > cleanFrom) {
|
||||||
|
if (i) markChunk(chunkStart, cleanFrom);
|
||||||
|
chunkStart = cleanTo;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tp == type) {
|
||||||
|
var end = moveOver(pos, str, true);
|
||||||
|
var a = posMax(top, pos), b = posMin(bot, end);
|
||||||
|
if (!posEq(a, b))
|
||||||
|
marks.push(editor.markText(a, b, {className: cls}));
|
||||||
|
pos = end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (chunkStart <= pos.line) markChunk(chunkStart, pos.line + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updating the gap between editor and original
|
||||||
|
|
||||||
|
function makeConnections(dv) {
|
||||||
|
if (!dv.showDifferences) return;
|
||||||
|
|
||||||
|
if (dv.svg) {
|
||||||
|
clear(dv.svg);
|
||||||
|
var w = dv.gap.offsetWidth;
|
||||||
|
attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight);
|
||||||
|
}
|
||||||
|
if (dv.copyButtons) clear(dv.copyButtons);
|
||||||
|
|
||||||
|
var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();
|
||||||
|
var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top;
|
||||||
|
for (var i = 0; i < dv.chunks.length; i++) {
|
||||||
|
var ch = dv.chunks[i];
|
||||||
|
if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from &&
|
||||||
|
ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from)
|
||||||
|
drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMatchingOrigLine(editLine, chunks) {
|
||||||
|
var editStart = 0, origStart = 0;
|
||||||
|
for (var i = 0; i < chunks.length; i++) {
|
||||||
|
var chunk = chunks[i];
|
||||||
|
if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null;
|
||||||
|
if (chunk.editFrom > editLine) break;
|
||||||
|
editStart = chunk.editTo;
|
||||||
|
origStart = chunk.origTo;
|
||||||
|
}
|
||||||
|
return origStart + (editLine - editStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findAlignedLines(dv, other) {
|
||||||
|
var linesToAlign = [];
|
||||||
|
for (var i = 0; i < dv.chunks.length; i++) {
|
||||||
|
var chunk = dv.chunks[i];
|
||||||
|
linesToAlign.push([chunk.origTo, chunk.editTo, other ? getMatchingOrigLine(chunk.editTo, other.chunks) : null]);
|
||||||
|
}
|
||||||
|
if (other) {
|
||||||
|
for (var i = 0; i < other.chunks.length; i++) {
|
||||||
|
var chunk = other.chunks[i];
|
||||||
|
for (var j = 0; j < linesToAlign.length; j++) {
|
||||||
|
var align = linesToAlign[j];
|
||||||
|
if (align[1] == chunk.editTo) {
|
||||||
|
j = -1;
|
||||||
|
break;
|
||||||
|
} else if (align[1] > chunk.editTo) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j > -1)
|
||||||
|
linesToAlign.splice(j - 1, 0, [getMatchingOrigLine(chunk.editTo, dv.chunks), chunk.editTo, chunk.origTo]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return linesToAlign;
|
||||||
|
}
|
||||||
|
|
||||||
|
function alignChunks(dv, force) {
|
||||||
|
if (!dv.dealigned && !force) return;
|
||||||
|
if (!dv.orig.curOp) return dv.orig.operation(function() {
|
||||||
|
alignChunks(dv, force);
|
||||||
|
});
|
||||||
|
|
||||||
|
dv.dealigned = false;
|
||||||
|
var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left;
|
||||||
|
if (other) {
|
||||||
|
ensureDiff(other);
|
||||||
|
other.dealigned = false;
|
||||||
|
}
|
||||||
|
var linesToAlign = findAlignedLines(dv, other);
|
||||||
|
|
||||||
|
// Clear old aligners
|
||||||
|
var aligners = dv.mv.aligners;
|
||||||
|
for (var i = 0; i < aligners.length; i++)
|
||||||
|
aligners[i].clear();
|
||||||
|
aligners.length = 0;
|
||||||
|
|
||||||
|
var cm = [dv.orig, dv.edit], scroll = [];
|
||||||
|
if (other) cm.push(other.orig);
|
||||||
|
for (var i = 0; i < cm.length; i++)
|
||||||
|
scroll.push(cm[i].getScrollInfo().top);
|
||||||
|
|
||||||
|
for (var ln = 0; ln < linesToAlign.length; ln++)
|
||||||
|
alignLines(cm, linesToAlign[ln], aligners);
|
||||||
|
|
||||||
|
for (var i = 0; i < cm.length; i++)
|
||||||
|
cm[i].scrollTo(null, scroll[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function alignLines(cm, lines, aligners) {
|
||||||
|
var maxOffset = 0, offset = [];
|
||||||
|
for (var i = 0; i < cm.length; i++) if (lines[i] != null) {
|
||||||
|
var off = cm[i].heightAtLine(lines[i], "local");
|
||||||
|
offset[i] = off;
|
||||||
|
maxOffset = Math.max(maxOffset, off);
|
||||||
|
}
|
||||||
|
for (var i = 0; i < cm.length; i++) if (lines[i] != null) {
|
||||||
|
var diff = maxOffset - offset[i];
|
||||||
|
if (diff > 1)
|
||||||
|
aligners.push(padAbove(cm[i], lines[i], diff));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function padAbove(cm, line, size) {
|
||||||
|
var above = true;
|
||||||
|
if (line > cm.lastLine()) {
|
||||||
|
line--;
|
||||||
|
above = false;
|
||||||
|
}
|
||||||
|
var elt = document.createElement("div");
|
||||||
|
elt.className = "CodeMirror-merge-spacer";
|
||||||
|
elt.style.height = size + "px"; elt.style.minWidth = "1px";
|
||||||
|
return cm.addLineWidget(line, elt, {height: size, above: above});
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) {
|
||||||
|
var flip = dv.type == "left";
|
||||||
|
var top = dv.orig.heightAtLine(chunk.origFrom, "local") - sTopOrig;
|
||||||
|
if (dv.svg) {
|
||||||
|
var topLpx = top;
|
||||||
|
var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit;
|
||||||
|
if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; }
|
||||||
|
var botLpx = dv.orig.heightAtLine(chunk.origTo, "local") - sTopOrig;
|
||||||
|
var botRpx = dv.edit.heightAtLine(chunk.editTo, "local") - sTopEdit;
|
||||||
|
if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; }
|
||||||
|
var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx;
|
||||||
|
var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx;
|
||||||
|
attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")),
|
||||||
|
"d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z",
|
||||||
|
"class", dv.classes.connect);
|
||||||
|
}
|
||||||
|
if (dv.copyButtons) {
|
||||||
|
var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc",
|
||||||
|
"CodeMirror-merge-copy"));
|
||||||
|
var editOriginals = dv.mv.options.allowEditingOriginals;
|
||||||
|
copy.title = editOriginals ? "Push to left" : "Revert chunk";
|
||||||
|
copy.chunk = chunk;
|
||||||
|
copy.style.top = top + "px";
|
||||||
|
|
||||||
|
if (editOriginals) {
|
||||||
|
var topReverse = dv.orig.heightAtLine(chunk.editFrom, "local") - sTopEdit;
|
||||||
|
var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc",
|
||||||
|
"CodeMirror-merge-copy-reverse"));
|
||||||
|
copyReverse.title = "Push to right";
|
||||||
|
copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo,
|
||||||
|
origFrom: chunk.editFrom, origTo: chunk.editTo};
|
||||||
|
copyReverse.style.top = topReverse + "px";
|
||||||
|
dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyChunk(dv, to, from, chunk) {
|
||||||
|
if (dv.diffOutOfDate) return;
|
||||||
|
to.replaceRange(from.getRange(Pos(chunk.origFrom, 0), Pos(chunk.origTo, 0)),
|
||||||
|
Pos(chunk.editFrom, 0), Pos(chunk.editTo, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge view, containing 0, 1, or 2 diff views.
|
||||||
|
|
||||||
|
var MergeView = CodeMirror.MergeView = function(node, options) {
|
||||||
|
if (!(this instanceof MergeView)) return new MergeView(node, options);
|
||||||
|
|
||||||
|
this.options = options;
|
||||||
|
var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight;
|
||||||
|
|
||||||
|
var hasLeft = origLeft != null, hasRight = origRight != null;
|
||||||
|
var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0);
|
||||||
|
var wrap = [], left = this.left = null, right = this.right = null;
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if (hasLeft) {
|
||||||
|
left = this.left = new DiffView(this, "left");
|
||||||
|
var leftPane = elt("div", null, "CodeMirror-merge-pane");
|
||||||
|
wrap.push(leftPane);
|
||||||
|
wrap.push(buildGap(left));
|
||||||
|
}
|
||||||
|
|
||||||
|
var editPane = elt("div", null, "CodeMirror-merge-pane");
|
||||||
|
wrap.push(editPane);
|
||||||
|
|
||||||
|
if (hasRight) {
|
||||||
|
right = this.right = new DiffView(this, "right");
|
||||||
|
wrap.push(buildGap(right));
|
||||||
|
var rightPane = elt("div", null, "CodeMirror-merge-pane");
|
||||||
|
wrap.push(rightPane);
|
||||||
|
}
|
||||||
|
|
||||||
|
(hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost";
|
||||||
|
|
||||||
|
wrap.push(elt("div", null, null, "height: 0; clear: both;"));
|
||||||
|
|
||||||
|
var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane"));
|
||||||
|
this.edit = CodeMirror(editPane, copyObj(options));
|
||||||
|
|
||||||
|
if (left) left.init(leftPane, origLeft, options);
|
||||||
|
if (right) right.init(rightPane, origRight, options);
|
||||||
|
|
||||||
|
if (options.collapseIdentical) {
|
||||||
|
updating = true;
|
||||||
|
this.editor().operation(function() {
|
||||||
|
collapseIdenticalStretches(self, options.collapseIdentical);
|
||||||
|
});
|
||||||
|
updating = false;
|
||||||
|
}
|
||||||
|
if (options.connect == "align") {
|
||||||
|
this.aligners = [];
|
||||||
|
alignChunks(this.left || this.right, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
var onResize = function() {
|
||||||
|
if (left) makeConnections(left);
|
||||||
|
if (right) makeConnections(right);
|
||||||
|
};
|
||||||
|
CodeMirror.on(window, "resize", onResize);
|
||||||
|
var resizeInterval = setInterval(function() {
|
||||||
|
for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {}
|
||||||
|
if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); }
|
||||||
|
}, 5000);
|
||||||
|
};
|
||||||
|
|
||||||
|
function buildGap(dv) {
|
||||||
|
var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock");
|
||||||
|
lock.title = "Toggle locked scrolling";
|
||||||
|
var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap");
|
||||||
|
CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); });
|
||||||
|
var gapElts = [lockWrap];
|
||||||
|
if (dv.mv.options.revertButtons !== false) {
|
||||||
|
dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type);
|
||||||
|
CodeMirror.on(dv.copyButtons, "click", function(e) {
|
||||||
|
var node = e.target || e.srcElement;
|
||||||
|
if (!node.chunk) return;
|
||||||
|
if (node.className == "CodeMirror-merge-copy-reverse") {
|
||||||
|
copyChunk(dv, dv.orig, dv.edit, node.chunk);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
copyChunk(dv, dv.edit, dv.orig, node.chunk);
|
||||||
|
});
|
||||||
|
gapElts.unshift(dv.copyButtons);
|
||||||
|
}
|
||||||
|
if (dv.mv.options.connect != "align") {
|
||||||
|
var svg = document.createElementNS && document.createElementNS(svgNS, "svg");
|
||||||
|
if (svg && !svg.createSVGRect) svg = null;
|
||||||
|
dv.svg = svg;
|
||||||
|
if (svg) gapElts.push(svg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap");
|
||||||
|
}
|
||||||
|
|
||||||
|
MergeView.prototype = {
|
||||||
|
constuctor: MergeView,
|
||||||
|
editor: function() { return this.edit; },
|
||||||
|
rightOriginal: function() { return this.right && this.right.orig; },
|
||||||
|
leftOriginal: function() { return this.left && this.left.orig; },
|
||||||
|
setShowDifferences: function(val) {
|
||||||
|
if (this.right) this.right.setShowDifferences(val);
|
||||||
|
if (this.left) this.left.setShowDifferences(val);
|
||||||
|
},
|
||||||
|
rightChunks: function() {
|
||||||
|
if (this.right) { ensureDiff(this.right); return this.right.chunks; }
|
||||||
|
},
|
||||||
|
leftChunks: function() {
|
||||||
|
if (this.left) { ensureDiff(this.left); return this.left.chunks; }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function asString(obj) {
|
||||||
|
if (typeof obj == "string") return obj;
|
||||||
|
else return obj.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operations on diffs
|
||||||
|
|
||||||
|
var dmp = new diff_match_patch();
|
||||||
|
function getDiff(a, b) {
|
||||||
|
var diff = dmp.diff_main(a, b);
|
||||||
|
dmp.diff_cleanupSemantic(diff);
|
||||||
|
// The library sometimes leaves in empty parts, which confuse the algorithm
|
||||||
|
for (var i = 0; i < diff.length; ++i) {
|
||||||
|
var part = diff[i];
|
||||||
|
if (!part[1]) {
|
||||||
|
diff.splice(i--, 1);
|
||||||
|
} else if (i && diff[i - 1][0] == part[0]) {
|
||||||
|
diff.splice(i--, 1);
|
||||||
|
diff[i][1] += part[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getChunks(diff) {
|
||||||
|
var chunks = [];
|
||||||
|
var startEdit = 0, startOrig = 0;
|
||||||
|
var edit = Pos(0, 0), orig = Pos(0, 0);
|
||||||
|
for (var i = 0; i < diff.length; ++i) {
|
||||||
|
var part = diff[i], tp = part[0];
|
||||||
|
if (tp == DIFF_EQUAL) {
|
||||||
|
var startOff = startOfLineClean(diff, i) ? 0 : 1;
|
||||||
|
var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff;
|
||||||
|
moveOver(edit, part[1], null, orig);
|
||||||
|
var endOff = endOfLineClean(diff, i) ? 1 : 0;
|
||||||
|
var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff;
|
||||||
|
if (cleanToEdit > cleanFromEdit) {
|
||||||
|
if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig,
|
||||||
|
editFrom: startEdit, editTo: cleanFromEdit});
|
||||||
|
startEdit = cleanToEdit; startOrig = cleanToOrig;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
moveOver(tp == DIFF_INSERT ? edit : orig, part[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (startEdit <= edit.line || startOrig <= orig.line)
|
||||||
|
chunks.push({origFrom: startOrig, origTo: orig.line + 1,
|
||||||
|
editFrom: startEdit, editTo: edit.line + 1});
|
||||||
|
return chunks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function endOfLineClean(diff, i) {
|
||||||
|
if (i == diff.length - 1) return true;
|
||||||
|
var next = diff[i + 1][1];
|
||||||
|
if (next.length == 1 || next.charCodeAt(0) != 10) return false;
|
||||||
|
if (i == diff.length - 2) return true;
|
||||||
|
next = diff[i + 2][1];
|
||||||
|
return next.length > 1 && next.charCodeAt(0) == 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
function startOfLineClean(diff, i) {
|
||||||
|
if (i == 0) return true;
|
||||||
|
var last = diff[i - 1][1];
|
||||||
|
if (last.charCodeAt(last.length - 1) != 10) return false;
|
||||||
|
if (i == 1) return true;
|
||||||
|
last = diff[i - 2][1];
|
||||||
|
return last.charCodeAt(last.length - 1) == 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
function chunkBoundariesAround(chunks, n, nInEdit) {
|
||||||
|
var beforeE, afterE, beforeO, afterO;
|
||||||
|
for (var i = 0; i < chunks.length; i++) {
|
||||||
|
var chunk = chunks[i];
|
||||||
|
var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom;
|
||||||
|
var toLocal = nInEdit ? chunk.editTo : chunk.origTo;
|
||||||
|
if (afterE == null) {
|
||||||
|
if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; }
|
||||||
|
else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; }
|
||||||
|
}
|
||||||
|
if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; }
|
||||||
|
else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; }
|
||||||
|
}
|
||||||
|
return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}};
|
||||||
|
}
|
||||||
|
|
||||||
|
function collapseSingle(cm, from, to) {
|
||||||
|
cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line");
|
||||||
|
var widget = document.createElement("span");
|
||||||
|
widget.className = "CodeMirror-merge-collapsed-widget";
|
||||||
|
widget.title = "Identical text collapsed. Click to expand.";
|
||||||
|
var mark = cm.markText(Pos(from, 0), Pos(to - 1), {
|
||||||
|
inclusiveLeft: true,
|
||||||
|
inclusiveRight: true,
|
||||||
|
replacedWith: widget,
|
||||||
|
clearOnEnter: true
|
||||||
|
});
|
||||||
|
function clear() {
|
||||||
|
mark.clear();
|
||||||
|
cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line");
|
||||||
|
}
|
||||||
|
widget.addEventListener("click", clear);
|
||||||
|
return {mark: mark, clear: clear};
|
||||||
|
}
|
||||||
|
|
||||||
|
function collapseStretch(size, editors) {
|
||||||
|
var marks = [];
|
||||||
|
function clear() {
|
||||||
|
for (var i = 0; i < marks.length; i++) marks[i].clear();
|
||||||
|
}
|
||||||
|
for (var i = 0; i < editors.length; i++) {
|
||||||
|
var editor = editors[i];
|
||||||
|
var mark = collapseSingle(editor.cm, editor.line, editor.line + size);
|
||||||
|
marks.push(mark);
|
||||||
|
mark.mark.on("clear", clear);
|
||||||
|
}
|
||||||
|
return marks[0].mark;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unclearNearChunks(dv, margin, off, clear) {
|
||||||
|
for (var i = 0; i < dv.chunks.length; i++) {
|
||||||
|
var chunk = dv.chunks[i];
|
||||||
|
for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) {
|
||||||
|
var pos = l + off;
|
||||||
|
if (pos >= 0 && pos < clear.length) clear[pos] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function collapseIdenticalStretches(mv, margin) {
|
||||||
|
if (typeof margin != "number") margin = 2;
|
||||||
|
var clear = [], edit = mv.editor(), off = edit.firstLine();
|
||||||
|
for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true);
|
||||||
|
if (mv.left) unclearNearChunks(mv.left, margin, off, clear);
|
||||||
|
if (mv.right) unclearNearChunks(mv.right, margin, off, clear);
|
||||||
|
|
||||||
|
for (var i = 0; i < clear.length; i++) {
|
||||||
|
if (clear[i]) {
|
||||||
|
var line = i + off;
|
||||||
|
for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {}
|
||||||
|
if (size > margin) {
|
||||||
|
var editors = [{line: line, cm: edit}];
|
||||||
|
if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig});
|
||||||
|
if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig});
|
||||||
|
var mark = collapseStretch(size, editors);
|
||||||
|
if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// General utilities
|
||||||
|
|
||||||
|
function elt(tag, content, className, style) {
|
||||||
|
var e = document.createElement(tag);
|
||||||
|
if (className) e.className = className;
|
||||||
|
if (style) e.style.cssText = style;
|
||||||
|
if (typeof content == "string") e.appendChild(document.createTextNode(content));
|
||||||
|
else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear(node) {
|
||||||
|
for (var count = node.childNodes.length; count > 0; --count)
|
||||||
|
node.removeChild(node.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
function attrs(elt) {
|
||||||
|
for (var i = 1; i < arguments.length; i += 2)
|
||||||
|
elt.setAttribute(arguments[i], arguments[i+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyObj(obj, target) {
|
||||||
|
if (!target) target = {};
|
||||||
|
for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveOver(pos, str, copy, other) {
|
||||||
|
var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0;
|
||||||
|
for (;;) {
|
||||||
|
var nl = str.indexOf("\n", at);
|
||||||
|
if (nl == -1) break;
|
||||||
|
++out.line;
|
||||||
|
if (other) ++other.line;
|
||||||
|
at = nl + 1;
|
||||||
|
}
|
||||||
|
out.ch = (at ? 0 : out.ch) + (str.length - at);
|
||||||
|
if (other) other.ch = (at ? 0 : other.ch) + (str.length - at);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; }
|
||||||
|
function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; }
|
||||||
|
function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }
|
||||||
|
|
||||||
|
function findPrevDiff(chunks, start, isOrig) {
|
||||||
|
for (var i = chunks.length - 1; i >= 0; i--) {
|
||||||
|
var chunk = chunks[i];
|
||||||
|
var to = (isOrig ? chunk.origTo : chunk.editTo) - 1;
|
||||||
|
if (to < start) return to;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNextDiff(chunks, start, isOrig) {
|
||||||
|
for (var i = 0; i < chunks.length; i++) {
|
||||||
|
var chunk = chunks[i];
|
||||||
|
var from = (isOrig ? chunk.origFrom : chunk.editFrom);
|
||||||
|
if (from > start) return from;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function goNearbyDiff(cm, dir) {
|
||||||
|
var found = null, views = cm.state.diffViews, line = cm.getCursor().line;
|
||||||
|
if (views) for (var i = 0; i < views.length; i++) {
|
||||||
|
var dv = views[i], isOrig = cm == dv.orig;
|
||||||
|
ensureDiff(dv);
|
||||||
|
var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig);
|
||||||
|
if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found)))
|
||||||
|
found = pos;
|
||||||
|
}
|
||||||
|
if (found != null)
|
||||||
|
cm.setCursor(found, 0);
|
||||||
|
else
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.commands.goNextDiff = function(cm) {
|
||||||
|
return goNearbyDiff(cm, 1);
|
||||||
|
};
|
||||||
|
CodeMirror.commands.goPrevDiff = function(cm) {
|
||||||
|
return goNearbyDiff(cm, -1);
|
||||||
|
};
|
||||||
|
});
|
64
public/vendor/codemirror/addon/mode/loadmode.js
vendored
Executable file
64
public/vendor/codemirror/addon/mode/loadmode.js
vendored
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"), "cjs");
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); });
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror, "plain");
|
||||||
|
})(function(CodeMirror, env) {
|
||||||
|
if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js";
|
||||||
|
|
||||||
|
var loading = {};
|
||||||
|
function splitCallback(cont, n) {
|
||||||
|
var countDown = n;
|
||||||
|
return function() { if (--countDown == 0) cont(); };
|
||||||
|
}
|
||||||
|
function ensureDeps(mode, cont) {
|
||||||
|
var deps = CodeMirror.modes[mode].dependencies;
|
||||||
|
if (!deps) return cont();
|
||||||
|
var missing = [];
|
||||||
|
for (var i = 0; i < deps.length; ++i) {
|
||||||
|
if (!CodeMirror.modes.hasOwnProperty(deps[i]))
|
||||||
|
missing.push(deps[i]);
|
||||||
|
}
|
||||||
|
if (!missing.length) return cont();
|
||||||
|
var split = splitCallback(cont, missing.length);
|
||||||
|
for (var i = 0; i < missing.length; ++i)
|
||||||
|
CodeMirror.requireMode(missing[i], split);
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.requireMode = function(mode, cont) {
|
||||||
|
if (typeof mode != "string") mode = mode.name;
|
||||||
|
if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont);
|
||||||
|
if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);
|
||||||
|
|
||||||
|
var file = CodeMirror.modeURL.replace(/%N/g, mode);
|
||||||
|
if (env == "plain") {
|
||||||
|
var script = document.createElement("script");
|
||||||
|
script.src = file;
|
||||||
|
var others = document.getElementsByTagName("script")[0];
|
||||||
|
var list = loading[mode] = [cont];
|
||||||
|
CodeMirror.on(script, "load", function() {
|
||||||
|
ensureDeps(mode, function() {
|
||||||
|
for (var i = 0; i < list.length; ++i) list[i]();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
others.parentNode.insertBefore(script, others);
|
||||||
|
} else if (env == "cjs") {
|
||||||
|
require(file);
|
||||||
|
cont();
|
||||||
|
} else if (env == "amd") {
|
||||||
|
requirejs([file], cont);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.autoLoadMode = function(instance, mode) {
|
||||||
|
if (!CodeMirror.modes.hasOwnProperty(mode))
|
||||||
|
CodeMirror.requireMode(mode, function() {
|
||||||
|
instance.setOption("mode", instance.getOption("mode"));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
123
public/vendor/codemirror/addon/mode/multiplex.js
vendored
Executable file
123
public/vendor/codemirror/addon/mode/multiplex.js
vendored
Executable file
|
@ -0,0 +1,123 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.multiplexingMode = function(outer /*, others */) {
|
||||||
|
// Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects
|
||||||
|
var others = Array.prototype.slice.call(arguments, 1);
|
||||||
|
|
||||||
|
function indexOf(string, pattern, from, returnEnd) {
|
||||||
|
if (typeof pattern == "string") {
|
||||||
|
var found = string.indexOf(pattern, from);
|
||||||
|
return returnEnd && found > -1 ? found + pattern.length : found;
|
||||||
|
}
|
||||||
|
var m = pattern.exec(from ? string.slice(from) : string);
|
||||||
|
return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
startState: function() {
|
||||||
|
return {
|
||||||
|
outer: CodeMirror.startState(outer),
|
||||||
|
innerActive: null,
|
||||||
|
inner: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
copyState: function(state) {
|
||||||
|
return {
|
||||||
|
outer: CodeMirror.copyState(outer, state.outer),
|
||||||
|
innerActive: state.innerActive,
|
||||||
|
inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
token: function(stream, state) {
|
||||||
|
if (!state.innerActive) {
|
||||||
|
var cutOff = Infinity, oldContent = stream.string;
|
||||||
|
for (var i = 0; i < others.length; ++i) {
|
||||||
|
var other = others[i];
|
||||||
|
var found = indexOf(oldContent, other.open, stream.pos);
|
||||||
|
if (found == stream.pos) {
|
||||||
|
if (!other.parseDelimiters) stream.match(other.open);
|
||||||
|
state.innerActive = other;
|
||||||
|
state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0);
|
||||||
|
return other.delimStyle;
|
||||||
|
} else if (found != -1 && found < cutOff) {
|
||||||
|
cutOff = found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff);
|
||||||
|
var outerToken = outer.token(stream, state.outer);
|
||||||
|
if (cutOff != Infinity) stream.string = oldContent;
|
||||||
|
return outerToken;
|
||||||
|
} else {
|
||||||
|
var curInner = state.innerActive, oldContent = stream.string;
|
||||||
|
if (!curInner.close && stream.sol()) {
|
||||||
|
state.innerActive = state.inner = null;
|
||||||
|
return this.token(stream, state);
|
||||||
|
}
|
||||||
|
var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1;
|
||||||
|
if (found == stream.pos && !curInner.parseDelimiters) {
|
||||||
|
stream.match(curInner.close);
|
||||||
|
state.innerActive = state.inner = null;
|
||||||
|
return curInner.delimStyle;
|
||||||
|
}
|
||||||
|
if (found > -1) stream.string = oldContent.slice(0, found);
|
||||||
|
var innerToken = curInner.mode.token(stream, state.inner);
|
||||||
|
if (found > -1) stream.string = oldContent;
|
||||||
|
|
||||||
|
if (found == stream.pos && curInner.parseDelimiters)
|
||||||
|
state.innerActive = state.inner = null;
|
||||||
|
|
||||||
|
if (curInner.innerStyle) {
|
||||||
|
if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle;
|
||||||
|
else innerToken = curInner.innerStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
return innerToken;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
indent: function(state, textAfter) {
|
||||||
|
var mode = state.innerActive ? state.innerActive.mode : outer;
|
||||||
|
if (!mode.indent) return CodeMirror.Pass;
|
||||||
|
return mode.indent(state.innerActive ? state.inner : state.outer, textAfter);
|
||||||
|
},
|
||||||
|
|
||||||
|
blankLine: function(state) {
|
||||||
|
var mode = state.innerActive ? state.innerActive.mode : outer;
|
||||||
|
if (mode.blankLine) {
|
||||||
|
mode.blankLine(state.innerActive ? state.inner : state.outer);
|
||||||
|
}
|
||||||
|
if (!state.innerActive) {
|
||||||
|
for (var i = 0; i < others.length; ++i) {
|
||||||
|
var other = others[i];
|
||||||
|
if (other.open === "\n") {
|
||||||
|
state.innerActive = other;
|
||||||
|
state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (state.innerActive.close === "\n") {
|
||||||
|
state.innerActive = state.inner = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
electricChars: outer.electricChars,
|
||||||
|
|
||||||
|
innerMode: function(state) {
|
||||||
|
return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
33
public/vendor/codemirror/addon/mode/multiplex_test.js
vendored
Executable file
33
public/vendor/codemirror/addon/mode/multiplex_test.js
vendored
Executable file
|
@ -0,0 +1,33 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
CodeMirror.defineMode("markdown_with_stex", function(){
|
||||||
|
var inner = CodeMirror.getMode({}, "stex");
|
||||||
|
var outer = CodeMirror.getMode({}, "markdown");
|
||||||
|
|
||||||
|
var innerOptions = {
|
||||||
|
open: '$',
|
||||||
|
close: '$',
|
||||||
|
mode: inner,
|
||||||
|
delimStyle: 'delim',
|
||||||
|
innerStyle: 'inner'
|
||||||
|
};
|
||||||
|
|
||||||
|
return CodeMirror.multiplexingMode(outer, innerOptions);
|
||||||
|
});
|
||||||
|
|
||||||
|
var mode = CodeMirror.getMode({}, "markdown_with_stex");
|
||||||
|
|
||||||
|
function MT(name) {
|
||||||
|
test.mode(
|
||||||
|
name,
|
||||||
|
mode,
|
||||||
|
Array.prototype.slice.call(arguments, 1),
|
||||||
|
'multiplexing');
|
||||||
|
}
|
||||||
|
|
||||||
|
MT(
|
||||||
|
"stexInsideMarkdown",
|
||||||
|
"[strong **Equation:**] [delim $][inner&tag \\pi][delim $]");
|
||||||
|
})();
|
85
public/vendor/codemirror/addon/mode/overlay.js
vendored
Executable file
85
public/vendor/codemirror/addon/mode/overlay.js
vendored
Executable file
|
@ -0,0 +1,85 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
// Utility function that allows modes to be combined. The mode given
|
||||||
|
// as the base argument takes care of most of the normal mode
|
||||||
|
// functionality, but a second (typically simple) mode is used, which
|
||||||
|
// can override the style of text. Both modes get to parse all of the
|
||||||
|
// text, but when both assign a non-null style to a piece of code, the
|
||||||
|
// overlay wins, unless the combine argument was true and not overridden,
|
||||||
|
// or state.overlay.combineTokens was true, in which case the styles are
|
||||||
|
// combined.
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.overlayMode = function(base, overlay, combine) {
|
||||||
|
return {
|
||||||
|
startState: function() {
|
||||||
|
return {
|
||||||
|
base: CodeMirror.startState(base),
|
||||||
|
overlay: CodeMirror.startState(overlay),
|
||||||
|
basePos: 0, baseCur: null,
|
||||||
|
overlayPos: 0, overlayCur: null,
|
||||||
|
streamSeen: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
copyState: function(state) {
|
||||||
|
return {
|
||||||
|
base: CodeMirror.copyState(base, state.base),
|
||||||
|
overlay: CodeMirror.copyState(overlay, state.overlay),
|
||||||
|
basePos: state.basePos, baseCur: null,
|
||||||
|
overlayPos: state.overlayPos, overlayCur: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
token: function(stream, state) {
|
||||||
|
if (stream != state.streamSeen ||
|
||||||
|
Math.min(state.basePos, state.overlayPos) < stream.start) {
|
||||||
|
state.streamSeen = stream;
|
||||||
|
state.basePos = state.overlayPos = stream.start;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream.start == state.basePos) {
|
||||||
|
state.baseCur = base.token(stream, state.base);
|
||||||
|
state.basePos = stream.pos;
|
||||||
|
}
|
||||||
|
if (stream.start == state.overlayPos) {
|
||||||
|
stream.pos = stream.start;
|
||||||
|
state.overlayCur = overlay.token(stream, state.overlay);
|
||||||
|
state.overlayPos = stream.pos;
|
||||||
|
}
|
||||||
|
stream.pos = Math.min(state.basePos, state.overlayPos);
|
||||||
|
|
||||||
|
// state.overlay.combineTokens always takes precedence over combine,
|
||||||
|
// unless set to null
|
||||||
|
if (state.overlayCur == null) return state.baseCur;
|
||||||
|
else if (state.baseCur != null &&
|
||||||
|
state.overlay.combineTokens ||
|
||||||
|
combine && state.overlay.combineTokens == null)
|
||||||
|
return state.baseCur + " " + state.overlayCur;
|
||||||
|
else return state.overlayCur;
|
||||||
|
},
|
||||||
|
|
||||||
|
indent: base.indent && function(state, textAfter) {
|
||||||
|
return base.indent(state.base, textAfter);
|
||||||
|
},
|
||||||
|
electricChars: base.electricChars,
|
||||||
|
|
||||||
|
innerMode: function(state) { return {state: state.base, mode: base}; },
|
||||||
|
|
||||||
|
blankLine: function(state) {
|
||||||
|
if (base.blankLine) base.blankLine(state.base);
|
||||||
|
if (overlay.blankLine) overlay.blankLine(state.overlay);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
213
public/vendor/codemirror/addon/mode/simple.js
vendored
Executable file
213
public/vendor/codemirror/addon/mode/simple.js
vendored
Executable file
|
@ -0,0 +1,213 @@
|
||||||
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||||
|
mod(require("../../lib/codemirror"));
|
||||||
|
else if (typeof define == "function" && define.amd) // AMD
|
||||||
|
define(["../../lib/codemirror"], mod);
|
||||||
|
else // Plain browser env
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
CodeMirror.defineSimpleMode = function(name, states) {
|
||||||
|
CodeMirror.defineMode(name, function(config) {
|
||||||
|
return CodeMirror.simpleMode(config, states);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
CodeMirror.simpleMode = function(config, states) {
|
||||||
|
ensureState(states, "start");
|
||||||
|
var states_ = {}, meta = states.meta || {}, hasIndentation = false;
|
||||||
|
for (var state in states) if (state != meta && states.hasOwnProperty(state)) {
|
||||||
|
var list = states_[state] = [], orig = states[state];
|
||||||
|
for (var i = 0; i < orig.length; i++) {
|
||||||
|
var data = orig[i];
|
||||||
|
list.push(new Rule(data, states));
|
||||||
|
if (data.indent || data.dedent) hasIndentation = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var mode = {
|
||||||
|
startState: function() {
|
||||||
|
return {state: "start", pending: null,
|
||||||
|
local: null, localState: null,
|
||||||
|
indent: hasIndentation ? [] : null};
|
||||||
|
},
|
||||||
|
copyState: function(state) {
|
||||||
|
var s = {state: state.state, pending: state.pending,
|
||||||
|
local: state.local, localState: null,
|
||||||
|
indent: state.indent && state.indent.slice(0)};
|
||||||
|
if (state.localState)
|
||||||
|
s.localState = CodeMirror.copyState(state.local.mode, state.localState);
|
||||||
|
if (state.stack)
|
||||||
|
s.stack = state.stack.slice(0);
|
||||||
|
for (var pers = state.persistentStates; pers; pers = pers.next)
|
||||||
|
s.persistentStates = {mode: pers.mode,
|
||||||
|
spec: pers.spec,
|
||||||
|
state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),
|
||||||
|
next: s.persistentStates};
|
||||||
|
return s;
|
||||||
|
},
|
||||||
|
token: tokenFunction(states_, config),
|
||||||
|
innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },
|
||||||
|
indent: indentFunction(states_, meta)
|
||||||
|
};
|
||||||
|
if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))
|
||||||
|
mode[prop] = meta[prop];
|
||||||
|
return mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
function ensureState(states, name) {
|
||||||
|
if (!states.hasOwnProperty(name))
|
||||||
|
throw new Error("Undefined state " + name + "in simple mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
function toRegex(val, caret) {
|
||||||
|
if (!val) return /(?:)/;
|
||||||
|
var flags = "";
|
||||||
|
if (val instanceof RegExp) {
|
||||||
|
if (val.ignoreCase) flags = "i";
|
||||||
|
val = val.source;
|
||||||
|
} else {
|
||||||
|
val = String(val);
|
||||||
|
}
|
||||||
|
return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
function asToken(val) {
|
||||||
|
if (!val) return null;
|
||||||
|
if (typeof val == "string") return val.replace(/\./g, " ");
|
||||||
|
var result = [];
|
||||||
|
for (var i = 0; i < val.length; i++)
|
||||||
|
result.push(val[i] && val[i].replace(/\./g, " "));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Rule(data, states) {
|
||||||
|
if (data.next || data.push) ensureState(states, data.next || data.push);
|
||||||
|
this.regex = toRegex(data.regex);
|
||||||
|
this.token = asToken(data.token);
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
function tokenFunction(states, config) {
|
||||||
|
return function(stream, state) {
|
||||||
|
if (state.pending) {
|
||||||
|
var pend = state.pending.shift();
|
||||||
|
if (state.pending.length == 0) state.pending = null;
|
||||||
|
stream.pos += pend.text.length;
|
||||||
|
return pend.token;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.local) {
|
||||||
|
if (state.local.end && stream.match(state.local.end)) {
|
||||||
|
var tok = state.local.endToken || null;
|
||||||
|
state.local = state.localState = null;
|
||||||
|
return tok;
|
||||||
|
} else {
|
||||||
|
var tok = state.local.mode.token(stream, state.localState), m;
|
||||||
|
if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))
|
||||||
|
stream.pos = stream.start + m.index;
|
||||||
|
return tok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var curState = states[state.state];
|
||||||
|
for (var i = 0; i < curState.length; i++) {
|
||||||
|
var rule = curState[i];
|
||||||
|
var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex);
|
||||||
|
if (matches) {
|
||||||
|
if (rule.data.next) {
|
||||||
|
state.state = rule.data.next;
|
||||||
|
} else if (rule.data.push) {
|
||||||
|
(state.stack || (state.stack = [])).push(state.state);
|
||||||
|
state.state = rule.data.push;
|
||||||
|
} else if (rule.data.pop && state.stack && state.stack.length) {
|
||||||
|
state.state = state.stack.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule.data.mode)
|
||||||
|
enterLocalMode(config, state, rule.data.mode, rule.token);
|
||||||
|
if (rule.data.indent)
|
||||||
|
state.indent.push(stream.indentation() + config.indentUnit);
|
||||||
|
if (rule.data.dedent)
|
||||||
|
state.indent.pop();
|
||||||
|
if (matches.length > 2) {
|
||||||
|
state.pending = [];
|
||||||
|
for (var j = 2; j < matches.length; j++)
|
||||||
|
if (matches[j])
|
||||||
|
state.pending.push({text: matches[j], token: rule.token[j - 1]});
|
||||||
|
stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
|
||||||
|
return rule.token[0];
|
||||||
|
} else if (rule.token && rule.token.join) {
|
||||||
|
return rule.token[0];
|
||||||
|
} else {
|
||||||
|
return rule.token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stream.next();
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function cmp(a, b) {
|
||||||
|
if (a === b) return true;
|
||||||
|
if (!a || typeof a != "object" || !b || typeof b != "object") return false;
|
||||||
|
var props = 0;
|
||||||
|
for (var prop in a) if (a.hasOwnProperty(prop)) {
|
||||||
|
if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;
|
||||||
|
props++;
|
||||||
|
}
|
||||||
|
for (var prop in b) if (b.hasOwnProperty(prop)) props--;
|
||||||
|
return props == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function enterLocalMode(config, state, spec, token) {
|
||||||
|
var pers;
|
||||||
|
if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)
|
||||||
|
if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;
|
||||||
|
var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);
|
||||||
|
var lState = pers ? pers.state : CodeMirror.startState(mode);
|
||||||
|
if (spec.persistent && !pers)
|
||||||
|
state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};
|
||||||
|
|
||||||
|
state.localState = lState;
|
||||||
|
state.local = {mode: mode,
|
||||||
|
end: spec.end && toRegex(spec.end),
|
||||||
|
endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),
|
||||||
|
endToken: token && token.join ? token[token.length - 1] : token};
|
||||||
|
}
|
||||||
|
|
||||||
|
function indexOf(val, arr) {
|
||||||
|
for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function indentFunction(states, meta) {
|
||||||
|
return function(state, textAfter, line) {
|
||||||
|
if (state.local && state.local.mode.indent)
|
||||||
|
return state.local.mode.indent(state.localState, textAfter, line);
|
||||||
|
if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)
|
||||||
|
return CodeMirror.Pass;
|
||||||
|
|
||||||
|
var pos = state.indent.length - 1, rules = states[state.state];
|
||||||
|
scan: for (;;) {
|
||||||
|
for (var i = 0; i < rules.length; i++) {
|
||||||
|
var rule = rules[i];
|
||||||
|
if (rule.data.dedent && rule.data.dedentIfLineStart !== false) {
|
||||||
|
var m = rule.regex.exec(textAfter);
|
||||||
|
if (m && m[0]) {
|
||||||
|
pos--;
|
||||||
|
if (rule.next || rule.push) rules = states[rule.next || rule.push];
|
||||||
|
textAfter = textAfter.slice(m[0].length);
|
||||||
|
continue scan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return pos < 0 ? 0 : state.indent[pos];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue