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" "doc": "doc"
}, },
"dependencies": { "dependencies": {
"express": "3.x" "express": "3.x",
"ejs": "~0.8.4"
}, },
"devDependencies": { "devDependencies": {
"grunt": "~0.4.1", "grunt": "~0.4.1",

View File

@ -1,9 +1,7 @@
CACHE MANIFEST CACHE MANIFEST
#Date Wed Oct 16 2013 00:12:59 #Date Wed Oct 16 2013 00:12:57
CACHE: CACHE:
index.html
viewer.html
res/worker.js res/worker.js
libs/MathJax/MathJax.js?config=TeX-AMS_HTML libs/MathJax/MathJax.js?config=TeX-AMS_HTML
libs/MathJax/config/Safe.js 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,10 +830,15 @@ define([
return function(e) { return function(e) {
try { try {
newLocalStorage = JSON.parse(e.target.result); newLocalStorage = JSON.parse(e.target.result);
if(/^v/.test(newLocalStorage.version) === false) { // Compare localStorage version
throw 1; 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');
} }
$('.modal-import-docs-settings').modal('show');
} }
catch(e) { catch(e) {
eventMgr.onError("Wrong format: " + importedFile.name); eventMgr.onError("Wrong format: " + importedFile.name);
@ -889,7 +894,7 @@ define([
trigger: 'hover', trigger: 'hover',
title: [ title: [
'Thanks for supporting StackEdit by adding a backlink in your documents!<br/><br/>', '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('') ].join('')
}); });
var tooltipOpen = false; var tooltipOpen = false;

View File

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

View File

@ -52,7 +52,7 @@
</button> </button>
<div class="panel-content"> <div class="panel-content">
<div class="list-group"> <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> class="list-group-item"><i class="icon-resize-full"></i>
StackEdit Viewer</a> <a href="#" data-toggle="collapse" StackEdit Viewer</a> <a href="#" data-toggle="collapse"
data-target=".collapse-open-from" class="list-group-item"><i data-target=".collapse-open-from" class="list-group-item"><i
@ -1046,6 +1046,8 @@
data-target=".modal-app-reset"><i data-target=".modal-app-reset"><i
class="icon-fire icon-white"></i> Reset application</a> class="icon-fire icon-white"></i> Reset application</a>
</div> </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>
</div> </div>

View File

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

View File

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

View File

@ -1,200 +1,158 @@
// RequireJS configuration // RequireJS configuration
requirejs.config({ requirejs.config({
waitSeconds: 0, waitSeconds: 0,
packages: [ packages: [{
{ name: 'ace',
name: 'ace', location: 'bower-libs/ace/lib/ace',
location: 'bower-libs/ace/lib/ace', main: 'ace'
main: 'ace' }, {
}, name: 'css',
{ location: 'bower-libs/require-css',
name: 'css', main: 'css'
location: 'bower-libs/require-css', }, {
main: 'css' name: 'less',
}, location: 'bower-libs/require-less',
{ main: 'less'
name: 'less', }],
location: 'bower-libs/require-less', paths: {
main: 'less' jquery: 'bower-libs/jquery/jquery',
} underscore: 'bower-libs/underscore/underscore',
], crel: 'bower-libs/crel/crel',
paths: { jgrowl: 'bower-libs/jgrowl/jquery.jgrowl',
jquery: 'bower-libs/jquery/jquery', mousetrap: 'bower-libs/mousetrap/mousetrap',
underscore: 'bower-libs/underscore/underscore', 'mousetrap-record': 'bower-libs/mousetrap/plugins/record/mousetrap-record',
crel: 'bower-libs/crel/crel', toMarkdown: 'bower-libs/to-markdown/src/to-markdown',
jgrowl: 'bower-libs/jgrowl/jquery.jgrowl', text: 'bower-libs/requirejs-text/text',
mousetrap: 'bower-libs/mousetrap/mousetrap', mathjax: '../libs/MathJax/MathJax.js?config=TeX-AMS_HTML',
'mousetrap-record': 'bower-libs/mousetrap/plugins/record/mousetrap-record', bootstrap: 'bower-libs/bootstrap/dist/js/bootstrap',
toMarkdown: 'bower-libs/to-markdown/src/to-markdown', requirejs: 'bower-libs/requirejs/require',
text: 'bower-libs/requirejs-text/text', 'google-code-prettify': 'bower-libs/google-code-prettify/src/prettify',
mathjax: '../libs/MathJax/MathJax.js?config=TeX-AMS_HTML', highlightjs: 'bower-libs/highlightjs/highlight.pack',
bootstrap: 'bower-libs/bootstrap/dist/js/bootstrap', 'jquery-waitforimages': 'bower-libs/waitForImages/src/jquery.waitforimages',
requirejs: 'bower-libs/requirejs/require', 'jquery-ui': 'bower-libs/jquery-ui/ui/jquery-ui',
'google-code-prettify': 'bower-libs/google-code-prettify/src/prettify', 'jquery-ui-core': 'bower-libs/jquery-ui/ui/jquery.ui.core',
highlightjs: 'bower-libs/highlightjs/highlight.pack', 'jquery-ui-widget': 'bower-libs/jquery-ui/ui/jquery.ui.widget',
'jquery-waitforimages': 'bower-libs/waitForImages/src/jquery.waitforimages', 'jquery-ui-mouse': 'bower-libs/jquery-ui/ui/jquery.ui.mouse',
'jquery-ui': 'bower-libs/jquery-ui/ui/jquery-ui', 'jquery-ui-draggable': 'bower-libs/jquery-ui/ui/jquery.ui.draggable',
'jquery-ui-core': 'bower-libs/jquery-ui/ui/jquery.ui.core', 'jquery-ui-effect': 'bower-libs/jquery-ui/ui/jquery.ui.effect',
'jquery-ui-widget': 'bower-libs/jquery-ui/ui/jquery.ui.widget', 'jquery-ui-effect-slide': 'bower-libs/jquery-ui/ui/jquery.ui.effect-slide',
'jquery-ui-mouse': 'bower-libs/jquery-ui/ui/jquery.ui.mouse', uilayout: 'libs/layout',
'jquery-ui-draggable': 'bower-libs/jquery-ui/ui/jquery.ui.draggable', FileSaver: 'bower-libs/FileSaver/FileSaver',
'jquery-ui-effect': 'bower-libs/jquery-ui/ui/jquery.ui.effect', stacktrace: 'bower-libs/stacktrace/stacktrace',
'jquery-ui-effect-slide': 'bower-libs/jquery-ui/ui/jquery.ui.effect-slide', 'requirejs-text': 'bower-libs/requirejs-text/text',
uilayout: 'libs/layout', 'bootstrap-tour': 'bower-libs/bootstrap-tour/build/js/bootstrap-tour',
FileSaver: 'bower-libs/FileSaver/FileSaver', css_browser_selector: 'bower-libs/css_browser_selector/css_browser_selector',
stacktrace: 'bower-libs/stacktrace/stacktrace', 'jquery-mousewheel': 'bower-libs/jquery-mousewheel/jquery.mousewheel',
'requirejs-text': 'bower-libs/requirejs-text/text', 'pagedown-ace': 'bower-libs/pagedown-ace/Markdown.Editor',
'bootstrap-tour': 'bower-libs/bootstrap-tour/build/js/bootstrap-tour', 'pagedown-extra': 'bower-libs/pagedown-extra/Markdown.Extra',
css_browser_selector: 'bower-libs/css_browser_selector/css_browser_selector', 'ace/requirejs/text': 'libs/ace_text',
'jquery-mousewheel': 'bower-libs/jquery-mousewheel/jquery.mousewheel', 'ace/commands/default_commands': 'libs/ace_commands',
'pagedown-ace': 'bower-libs/pagedown-ace/Markdown.Editor', 'require-css': 'bower-libs/require-css/css',
'pagedown-extra': 'bower-libs/pagedown-extra/Markdown.Extra', xregexp: 'bower-libs/xregexp/xregexp-all',
'ace/requirejs/text': 'libs/ace_text', yaml: 'bower-libs/yaml.js',
'ace/commands/default_commands': 'libs/ace_commands', 'yaml.js': 'bower-libs/yaml.js',
'require-css': 'bower-libs/require-css/css', 'yaml-js': 'bower-libs/yaml.js/bin/yaml',
xregexp: 'bower-libs/xregexp/xregexp-all', Typo: 'bower-libs/Typo.js',
yaml: 'bower-libs/yaml.js', 'Typo.js': 'bower-libs/Typo.js'
'yaml.js': 'bower-libs/yaml.js', },
'yaml-js': 'bower-libs/yaml.js/bin/yaml', shim: {
Typo: 'bower-libs/Typo.js', underscore: {
'Typo.js': 'bower-libs/Typo.js' exports: '_'
}, },
shim: { mathjax: ['libs/mathjax_init'],
underscore: { jgrowl: {
exports: '_' deps: ['jquery'],
}, exports: 'jQuery.jGrowl'
mathjax: [ },
'libs/mathjax_init' mousetrap: {
], exports: 'Mousetrap'
jgrowl: { },
deps: [ 'yaml-js': {
'jquery' exports: 'YAML'
], },
exports: 'jQuery.jGrowl' 'bootstrap-record': ['mousetrap'],
}, toMarkdown: {
mousetrap: { deps: ['jquery'],
exports: 'Mousetrap' exports: 'toMarkdown'
}, },
'yaml-js': { 'bootstrap-tour': ['bootstrap'],
exports: 'YAML' bootstrap: ['jquery'],
}, 'jquery-waitforimages': ['jquery'],
'bootstrap-record': [ 'jquery-mousewheel': ['jquery'],
'mousetrap' uilayout: ['jquery-ui-effect-slide'],
], 'jquery-ui-effect-slide': ['jquery-ui-effect'],
toMarkdown: { 'jquery-ui-effect': ['jquery-ui-draggable'],
deps: [ 'jquery-ui-draggable': ['jquery-ui-mouse'],
'jquery' 'jquery-ui-mouse': ['jquery-ui-widget'],
], 'jquery-ui-widget': ['jquery-ui-core'],
exports: 'toMarkdown' 'jquery-ui-core': ['jquery'],
}, 'pagedown-extra': ['pagedown-ace', 'google-code-prettify', 'highlightjs'],
'bootstrap-tour': [ 'pagedown-ace': ['bower-libs/pagedown-ace/Markdown.Converter']
'bootstrap' }
], });
bootstrap: [
'jquery' // Check browser compatibility
], try {
'jquery-waitforimages': [ var test = 'seLocalStorageCheck';
'jquery' localStorage.setItem(test, test);
], localStorage.removeItem(test);
'jquery-mousewheel': [ var obj = {};
'jquery' Object.defineProperty(obj, 'prop', {
], get: function() {},
uilayout: [ set: function() {}
'jquery-ui-effect-slide' });
], }
'jquery-ui-effect-slide': [ catch (e) {
'jquery-ui-effect' alert('Your browser is not supported, sorry!');
], throw e;
'jquery-ui-effect': [ }
'jquery-ui-draggable'
], // Defines the logger object
'jquery-ui-draggable': [ var logger = {
'jquery-ui-mouse' log: function() {},
], info: function() {},
'jquery-ui-mouse': [ warn: function() {},
'jquery-ui-widget' error: function() {}
], };
'jquery-ui-widget': [ // We can run StackEdit with http://.../?console to print logs in the console
'jquery-ui-core' if (/(\?|&)console($|&)/.test(location.search)) {
], logger = console;
'jquery-ui-core': [ }
'jquery'
], // Viewer mode is deduced from the body class
'pagedown-extra': [ var viewerMode = /(^| )viewer($| )/.test(document.body.className);
'pagedown-ace',
'google-code-prettify', // Light mode is for mobile or viewer
'highlightjs' 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;
'pagedown-ace': [ })(navigator.userAgent || navigator.vendor || window.opera);
'bower-libs/pagedown-ace/Markdown.Converter'
] // Keep the theme in a global variable
} var theme = localStorage.theme || 'default';
}); var themeModule = "less!themes/" + theme;
if (baseDir.indexOf('-min') !== -1) {
// Defines the logger object themeModule = "css!themes/" + theme;
var logger = { }
log: function() {
}, // RequireJS entry point. By requiring synchronizer, publisher and
info: function() { // media-importer, we are actually loading all the modules
}, require(["jquery", "core", "eventMgr", "synchronizer", "publisher", "mediaImporter", "css",
warn: function() { themeModule, ], function($, core, eventMgr) {
},
error: function() { $(function() {
}
}; // Here, all the modules are loaded and the DOM is ready
// We can run StackEdit with http://.../?console to print logs in the console core.onReady();
if(/(\?|&)console($|&)/.test(location.search)) {
logger = console; // If browser has detected a new application cache.
} if (window.applicationCache) {
window.applicationCache.addEventListener('updateready', function(e) {
// Viewer mode is deduced from the body class if (window.applicationCache.status === window.applicationCache.UPDATEREADY) {
var viewerMode = /(^| )viewer($| )/.test(document.body.className); window.applicationCache.swapCache();
eventMgr.onMessage('New version available!\nJust refresh the page to upgrade.');
// Light mode is for mobile or viewer }
var lightMode = }, false);
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) {
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) {
$(function() {
// Here, all the modules are loaded and the DOM is ready
core.onReady();
// If browser has detected a new application cache.
if(window.applicationCache) {
window.applicationCache.addEventListener('updateready', function(e) {
if(window.applicationCache.status === window.applicationCache.UPDATEREADY) {
window.applicationCache.swapCache();
eventMgr.onMessage('New version available!\nJust refresh the page to upgrade.');
}
}, false);
}
});
});

View File

@ -45,7 +45,7 @@ define([
} }
var url = [ var url = [
MAIN_URL, MAIN_URL,
'viewer.html#!provider=', 'viewer#!provider=',
provider.providerId provider.providerId
]; ];
_.each(provider.sharingAttributes, function(attributeName) { _.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 express = require('express');
var app = express(); var app = express();
// Configure ejs engine
app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);
// Force HTTPS on stackedit.io // Force HTTPS on stackedit.io
app.all('*', function(req, res, next) { app.all('*', function(req, res, next) {
if (req.headers.host == 'stackedit.io' && req.headers['x-forwarded-proto'] != 'https') { if (req.headers.host == 'stackedit.io' && req.headers['x-forwarded-proto'] != 'https') {
@ -17,6 +21,28 @@ app.use(express.compress());
// Serve static resources // Serve static resources
app.use(express.static(__dirname + '/public')); 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 // Listen on port 3000
var port = process.env.PORT || 3000; var port = process.env.PORT || 3000;
app.listen(port, null, function() { 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>