Added ejs engine

This commit is contained in:
benweet 2013-10-19 23:59:17 +01:00
parent 5536ced7c8
commit 1e88a6fe21
17 changed files with 292 additions and 282 deletions

View File

@ -7,7 +7,8 @@
"doc": "doc"
},
"dependencies": {
"express": "3.x"
"express": "3.x",
"ejs": "~0.8.4"
},
"devDependencies": {
"grunt": "~0.4.1",

View File

@ -1,9 +1,7 @@
CACHE MANIFEST
#Date Wed Oct 16 2013 00:12:59
#Date Wed Oct 16 2013 00:12:57
CACHE:
index.html
viewer.html
res/worker.js
libs/MathJax/MathJax.js?config=TeX-AMS_HTML
libs/MathJax/config/Safe.js

View File

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html manifest="cache.manifest">
<head>
<title>StackEdit - Markdown editor</title>
<link rel="canonical" href="http://benweet.github.io/stackedit/">
<link rel="icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<link rel="shortcut icon" href="res-min/img/stackedit-32.ico"
type="image/x-icon">
<meta name="description"
content="StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.">
<meta name="author" content="Benoit Schweblin">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="msvalidate.01" content="5E47EE6F67B069C17E3CDD418351A612" />
<script>
// Use http://.../?debug to serve original JavaScript files instead of minified
var baseDir = 'res';
if(!/(\?|&)debug($|&)/.test(location.search)) {
baseDir += '-min';
}
var require = {
baseUrl: baseDir,
deps: [
'main'
]
};
</script>
<script src="res-min/require.js"></script>
</head>
<body>
</body>
</html>

View File

@ -830,11 +830,16 @@ define([
return function(e) {
try {
newLocalStorage = JSON.parse(e.target.result);
if(/^v/.test(newLocalStorage.version) === false) {
throw 1;
}
// Compare localStorage version
var newVersion = parseInt(newLocalStorage.version.match(/^v(\d+)$/)[1], 10);
var currentVersion = parseInt(localStorage.version.match(/^v(\d+)$/)[1], 10);
if(newVersion > currentVersion) {
// We manage localStorage upgrade, not downgrade
eventMgr.onError("Incompatible version. Please upgrade StackEdit.");
} else {
$('.modal-import-docs-settings').modal('show');
}
}
catch(e) {
eventMgr.onError("Wrong format: " + importedFile.name);
}
@ -889,7 +894,7 @@ define([
trigger: 'hover',
title: [
'Thanks for supporting StackEdit by adding a backlink in your documents!<br/><br/>',
'<b class="text-danger">NOTE: Backlinks are not welcome in Stack Exchange Q/A.</b>'
'<b class="text-danger">NOTE: Backlinks in Stack Exchange Q/A are not welcome.</b>'
].join('')
});
var tooltipOpen = false;

View File

@ -7,7 +7,7 @@ define([
"eventMgr",
"fileSystem",
"classes/FileDescriptor",
"text!../WELCOME.md"
"text!WELCOME.md"
], function($, _, core, utils, settings, eventMgr, fileSystem, FileDescriptor, welcomeContent) {
var fileMgr = {};

View File

@ -52,7 +52,7 @@
</button>
<div class="panel-content">
<div class="list-group">
<a href="viewer.html" title="StackEdit Viewer"
<a href="viewer" title="StackEdit Viewer"
class="list-group-item"><i class="icon-resize-full"></i>
StackEdit Viewer</a> <a href="#" data-toggle="collapse"
data-target=".collapse-open-from" class="list-group-item"><i
@ -1046,6 +1046,8 @@
data-target=".modal-app-reset"><i
class="icon-fire icon-white"></i> Reset application</a>
</div>
<span class="help-block text-center"><a target="_blank"
href="http://benweet.github.io/stackedit/recovery.html">Old platform recovery</a></span>
</div>
</div>

View File

@ -11,7 +11,7 @@
</p>
<blockquote>
<b>NOTE:</b> You can open any URL within StackEdit using <a
href="viewer.html#!url=https://raw.github.com/benweet/stackedit/master/README.md"
title="Sharing example"><code>viewer.html#!url=...</code></a>
href="viewer#!url=https://raw.github.com/benweet/stackedit/master/README.md"
title="Sharing example"><code>viewer#!url=...</code></a>
</blockquote>
</div>

View File

@ -1,4 +1,4 @@
<a href="viewer.html" class="btn btn-default dropdown-toggle"
<a href="viewer" class="btn btn-default dropdown-toggle"
title="Open in viewer">
<i class="icon-resize-full"></i>
</a>

View File

@ -33,6 +33,7 @@ define(function(require, exports, module) {
var lang = require("ace/lib/lang");
var config = require("ace/config");
var Range = require('ace/range').Range
function bindKey(win, mac) {
return {
@ -283,10 +284,12 @@ exports.commands = [{
name: "indent",
bindKey: bindKey("Tab", "Tab"),
exec: function(editor) {
var rowIndex = editor.$getSelectedRows().last;
var rowText = editor.session.getLine(rowIndex);
var rowState = editor.session.getState(rowIndex);
if((rowState == "listblock" || rowState == "listblock-start") && /^\s*(?:[-+*]|\d+\.)\s+$/.test(rowText)) {
// Perform block indent if the caret is at the begining of a list item
var selectionRange = editor.getSelectionRange();
var range = new Range(selectionRange.end.row, 0, selectionRange.end.row, selectionRange.end.column);
var startText = editor.session.getTextRange(range);
var token = editor.session.getTokenAt(selectionRange.end.row, selectionRange.end.column);
if(token.type == "markup.list" && /^\s*(?:[-+*]|\d+\.)\s+$/.test(startText)) {
editor.blockIndent();
}
else {

View File

@ -1,23 +1,19 @@
// RequireJS configuration
requirejs.config({
waitSeconds: 0,
packages: [
{
packages: [{
name: 'ace',
location: 'bower-libs/ace/lib/ace',
main: 'ace'
},
{
}, {
name: 'css',
location: 'bower-libs/require-css',
main: 'css'
},
{
}, {
name: 'less',
location: 'bower-libs/require-less',
main: 'less'
}
],
}],
paths: {
jquery: 'bower-libs/jquery/jquery',
underscore: 'bower-libs/underscore/underscore',
@ -63,13 +59,9 @@ requirejs.config({
underscore: {
exports: '_'
},
mathjax: [
'libs/mathjax_init'
],
mathjax: ['libs/mathjax_init'],
jgrowl: {
deps: [
'jquery'
],
deps: ['jquery'],
exports: 'jQuery.jGrowl'
},
mousetrap: {
@ -78,72 +70,52 @@ requirejs.config({
'yaml-js': {
exports: 'YAML'
},
'bootstrap-record': [
'mousetrap'
],
'bootstrap-record': ['mousetrap'],
toMarkdown: {
deps: [
'jquery'
],
deps: ['jquery'],
exports: 'toMarkdown'
},
'bootstrap-tour': [
'bootstrap'
],
bootstrap: [
'jquery'
],
'jquery-waitforimages': [
'jquery'
],
'jquery-mousewheel': [
'jquery'
],
uilayout: [
'jquery-ui-effect-slide'
],
'jquery-ui-effect-slide': [
'jquery-ui-effect'
],
'jquery-ui-effect': [
'jquery-ui-draggable'
],
'jquery-ui-draggable': [
'jquery-ui-mouse'
],
'jquery-ui-mouse': [
'jquery-ui-widget'
],
'jquery-ui-widget': [
'jquery-ui-core'
],
'jquery-ui-core': [
'jquery'
],
'pagedown-extra': [
'pagedown-ace',
'google-code-prettify',
'highlightjs'
],
'pagedown-ace': [
'bower-libs/pagedown-ace/Markdown.Converter'
]
'bootstrap-tour': ['bootstrap'],
bootstrap: ['jquery'],
'jquery-waitforimages': ['jquery'],
'jquery-mousewheel': ['jquery'],
uilayout: ['jquery-ui-effect-slide'],
'jquery-ui-effect-slide': ['jquery-ui-effect'],
'jquery-ui-effect': ['jquery-ui-draggable'],
'jquery-ui-draggable': ['jquery-ui-mouse'],
'jquery-ui-mouse': ['jquery-ui-widget'],
'jquery-ui-widget': ['jquery-ui-core'],
'jquery-ui-core': ['jquery'],
'pagedown-extra': ['pagedown-ace', 'google-code-prettify', 'highlightjs'],
'pagedown-ace': ['bower-libs/pagedown-ace/Markdown.Converter']
}
});
// Check browser compatibility
try {
var test = 'seLocalStorageCheck';
localStorage.setItem(test, test);
localStorage.removeItem(test);
var obj = {};
Object.defineProperty(obj, 'prop', {
get: function() {},
set: function() {}
});
}
catch (e) {
alert('Your browser is not supported, sorry!');
throw e;
}
// Defines the logger object
var logger = {
log: function() {
},
info: function() {
},
warn: function() {
},
error: function() {
}
log: function() {},
info: function() {},
warn: function() {},
error: function() {}
};
// We can run StackEdit with http://.../?console to print logs in the console
if(/(\?|&)console($|&)/.test(location.search)) {
if (/(\?|&)console($|&)/.test(location.search)) {
logger = console;
}
@ -151,35 +123,21 @@ if(/(\?|&)console($|&)/.test(location.search)) {
var viewerMode = /(^| )viewer($| )/.test(document.body.className);
// Light mode is for mobile or viewer
var lightMode =
viewerMode
|| /(\?|&)light($|&)/.test(location.search)
|| (function(a) {
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(a)
|| /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i
.test(a.substr(0, 4)))
return true;
})(navigator.userAgent || navigator.vendor || window.opera);
var lightMode = viewerMode || /(\?|&)light($|&)/.test(location.search) || (function(a) {
if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) return true;
})(navigator.userAgent || navigator.vendor || window.opera);
// Keep the theme in a global variable
var theme = localStorage.theme || 'default';
var themeModule = "less!themes/" + theme;
if(baseDir.indexOf('-min') !== -1) {
if (baseDir.indexOf('-min') !== -1) {
themeModule = "css!themes/" + theme;
}
// RequireJS entry point. By requiring synchronizer, publisher and
// media-importer, we are actually loading all the modules
require([
"jquery",
"core",
"eventMgr",
"synchronizer",
"publisher",
"mediaImporter",
"css",
themeModule,
], function($, core, eventMgr) {
require(["jquery", "core", "eventMgr", "synchronizer", "publisher", "mediaImporter", "css",
themeModule, ], function($, core, eventMgr) {
$(function() {
@ -187,9 +145,9 @@ require([
core.onReady();
// If browser has detected a new application cache.
if(window.applicationCache) {
if (window.applicationCache) {
window.applicationCache.addEventListener('updateready', function(e) {
if(window.applicationCache.status === window.applicationCache.UPDATEREADY) {
if (window.applicationCache.status === window.applicationCache.UPDATEREADY) {
window.applicationCache.swapCache();
eventMgr.onMessage('New version available!\nJust refresh the page to upgrade.');
}

View File

@ -45,7 +45,7 @@ define([
}
var url = [
MAIN_URL,
'viewer.html#!provider=',
'viewer#!provider=',
provider.providerId
];
_.each(provider.sharingAttributes, function(attributeName) {

View File

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html manifest="cache.manifest">
<head>
<title>StackEdit Viewer</title>
<link rel="canonical"
href="http://benweet.github.io/stackedit/viewer.html">
<link rel="icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<link rel="shortcut icon" href="res-min/img/stackedit-32.ico"
type="image/x-icon">
<meta name="description"
content="StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.">
<meta name="author" content="Benoit Schweblin">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="msvalidate.01" content="5E47EE6F67B069C17E3CDD418351A612" />
<script>
// Use http://.../?debug to serve original JavaScript files instead of minified
var baseDir = 'res';
if(!/(\?|&)debug($|&)/.test(location.search)) {
baseDir += '-min';
}
var require = {
baseUrl: baseDir,
deps: [
'main'
]
};
</script>
<script src="res-min/require.js"></script>
</head>
<body class="viewer">
</body>
</html>

View File

@ -1,6 +1,10 @@
var express = require('express');
var app = express();
// Configure ejs engine
app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);
// Force HTTPS on stackedit.io
app.all('*', function(req, res, next) {
if (req.headers.host == 'stackedit.io' && req.headers['x-forwarded-proto'] != 'https') {
@ -17,6 +21,28 @@ app.use(express.compress());
// Serve static resources
app.use(express.static(__dirname + '/public'));
// Serve index.html
app.get('/', function (req, res) {
res.render('index.html');
});
app.get('/index.html', function (req, res) {
res.render('index.html');
});
// Serve viewer.html
app.get('/viewer', function (req, res) {
res.render('viewer.html');
});
app.get('/viewer.html', function (req, res) {
res.render('viewer.html');
});
// Error 404
app.use(function(req, res, next){
res.status(404);
res.render('error_404.html');
});
// Listen on port 3000
var port = process.env.PORT || 3000;
app.listen(port, null, function() {

21
views/error_404.html Normal file
View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<title>StackEdit - Error 404</title>
<link rel="canonical" href="https://stackedit.io/">
<link rel="icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<link rel="shortcut icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="res-min/themes/default.css">
</head>
<body class="text-center">
<br/>
<p>
<a href="https://stackedit.io"><img src="res-min/img/stackedit-promo.png" width="240" height="60" /></a>
</p>
<p>404 &mdash; Page not found</p>
</body>
</html>

30
views/index.html Normal file
View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html manifest="cache.manifest">
<head>
<title>StackEdit - Markdown editor</title>
<link rel="canonical" href="https://stackedit.io/">
<link rel="icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<link rel="shortcut icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<meta name="description" content="StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.">
<meta name="author" content="Benoit Schweblin">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="msvalidate.01" content="5E47EE6F67B069C17E3CDD418351A612"
/>
<script>
// Use ?debug to serve original JavaScript files instead of minified
var baseDir = 'res';
if (!/(\?|&)debug($|&)/.test(location.search)) {
baseDir += '-min';
}
var require = {
baseUrl: baseDir,
deps: ['main']
};
</script>
<script src="res-min/require.js"></script>
</head>
<body></body>
</html>

30
views/viewer.html Normal file
View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html manifest="cache.manifest">
<head>
<title>StackEdit Viewer</title>
<link rel="canonical" href="https://stackedit.io/viewer">
<link rel="icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<link rel="shortcut icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<meta name="description" content="StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.">
<meta name="author" content="Benoit Schweblin">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="msvalidate.01" content="5E47EE6F67B069C17E3CDD418351A612"
/>
<script>
// Use ?debug to serve original JavaScript files instead of minified
var baseDir = 'res';
if (!/(\?|&)debug($|&)/.test(location.search)) {
baseDir += '-min';
}
var require = {
baseUrl: baseDir,
deps: ['main']
};
</script>
<script src="res-min/require.js"></script>
</head>
<body class="viewer"></body>
</html>