diff --git a/.travis.yml b/.travis.yml
index efb09833..5d9f799d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,3 +1,16 @@
language: node_js
+
node_js:
- "8"
+
+services:
+ - docker
+
+before_deploy:
+ - docker build -t benweet/stackedit .
+
+deploy:
+ provider: script
+ script: bash build/docker-push-tag.sh
+ on:
+ tags: true
diff --git a/build/docker-push-tag.sh b/build/docker-push-tag.sh
new file mode 100644
index 00000000..2190b8b5
--- /dev/null
+++ b/build/docker-push-tag.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+set -e
+docker login -u benweet -p "$DOCKER_PASSWORD"
+docker tag benweet/stackedit "benweet/stackedit:$TRAVIS_TAG"
+docker push benweet/stackedit:$TRAVIS_TAG
+docker tag benweet/stackedit:$TRAVIS_TAG benweet/stackedit:latest
+docker push benweet/stackedit:latest
diff --git a/index.js b/index.js
index 7404ec99..71d0caf3 100644
--- a/index.js
+++ b/index.js
@@ -18,3 +18,10 @@ const httpServer = http.createServer(app);
httpServer.listen(port, null, () => {
console.log(`HTTP server started: http://localhost:${port}`);
});
+
+// Handle graceful shutdown
+process.on('SIGTERM', () => {
+ httpServer.close(() => {
+ process.exit(0);
+ });
+});
diff --git a/package-lock.json b/package-lock.json
index b9ce00ab..fadccd91 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "stackedit",
- "version": "5.10.2",
+ "version": "5.10.5",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index b616b0ea..b025326e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "stackedit",
- "version": "5.10.2",
+ "version": "5.10.5",
"description": "Free, open-source, full-featured Markdown editor",
"author": "Benoit Schweblin",
"license": "Apache-2.0",
diff --git a/src/components/SideBar.vue b/src/components/SideBar.vue
index b5b1dd0f..d7ccd06f 100644
--- a/src/components/SideBar.vue
+++ b/src/components/SideBar.vue
@@ -75,7 +75,7 @@ export default {
}),
computed: {
panel() {
- return this.$store.getters['data/layoutSettings'].sideBarPanel;
+ return !this.$store.state.light && this.$store.getters['data/layoutSettings'].sideBarPanel;
},
panelName() {
return panelNames[this.panel];
diff --git a/src/components/modals/AboutModal.vue b/src/components/modals/AboutModal.vue
index 3a1e393b..17f93035 100644
--- a/src/components/modals/AboutModal.vue
+++ b/src/components/modals/AboutModal.vue
@@ -13,7 +13,9 @@
StackEdit on Twitter
Community
-
+
FAQ
diff --git a/src/data/faq.md b/src/data/faq.md
index 36b1c581..ad6add70 100644
--- a/src/data/faq.md
+++ b/src/data/faq.md
@@ -1,14 +1,17 @@
**Where is my data stored?**
If your workspace is not synced, your files are only stored inside your browser (using the [IndexedDB API](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API)) and are not stored anywhere else.
+
We recommend syncing your workspace to make sure files won't be lost in case your browser data is cleared.
**Where is my data stored once I sync my workspace?**
If you sign in with Google, your main workspace will be stored in Google Drive (in your [app data folder](https://developers.google.com/drive/v3/web/appdata)).
+
If you open a Google Drive workspace, the files in the workspace will be stored inside a Google Drive folder which you can share with other users.
+
If you open a CouchDB workspace, the files in the workspace will be stored in the CouchDB database which can be hosted on premises for privacy concerns.
**Can StackEdit access my data without telling me?**
-StackEdit is a frontend application. The access tokens issued by Google, Dropbox, GitHub... are stored in your browser and are not sent to our backend or to 3rd parties so your data won't be accessed by anybody.
+StackEdit is a frontend application. The access tokens issued by Google, Dropbox, GitHub... are stored in your browser and are not sent to any backend or 3^rd^ parties so your data won't be accessed by anyone.
diff --git a/src/services/cledit/cleditCore.js b/src/services/cledit/cleditCore.js
index 8ebb185f..67fd9bd4 100644
--- a/src/services/cledit/cleditCore.js
+++ b/src/services/cledit/cleditCore.js
@@ -335,6 +335,7 @@ function cledit(contentElt, scrollEltOpt, isMarkdown = false) {
});
turndownService = new TurndownService(store.getters['data/computedSettings'].turndown);
+ turndownService.escape = str => str; // Disable escaping
}
contentElt.addEventListener('paste', (evt) => {
@@ -347,7 +348,7 @@ function cledit(contentElt, scrollEltOpt, isMarkdown = false) {
if (turndownService) {
try {
const html = clipboardData.getData('text/html');
- if (html && !clipboardData.getData('text/css')) {
+ if (html) {
const sanitizedHtml = htmlSanitizer.sanitizeHtml(html)
.replace(/ /g, ' '); // Replace non-breaking spaces with classic spaces
if (sanitizedHtml) {
diff --git a/src/services/sponsorSvc.js b/src/services/sponsorSvc.js
index d643d2fb..26807542 100644
--- a/src/services/sponsorSvc.js
+++ b/src/services/sponsorSvc.js
@@ -23,8 +23,11 @@ const isGoogleSponsor = () => {
const checkPayment = () => {
const currentDate = Date.now();
- if (!isGoogleSponsor() && networkSvc.isUserActive() && !store.state.offline &&
- lastCheck + checkPaymentEvery < currentDate
+ if (!isGoogleSponsor()
+ && networkSvc.isUserActive()
+ && !store.state.offline
+ && !store.state.light
+ && lastCheck + checkPaymentEvery < currentDate
) {
lastCheck = currentDate;
getMonetize()