|
@@ -14,7 +14,7 @@
|
|
|
<div
|
|
|
class="news-item"
|
|
|
id="preview"
|
|
|
- v-html="marked(markdown)"
|
|
|
+ v-html="sanitize(marked(markdown))"
|
|
|
></div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -60,6 +60,7 @@
|
|
|
<script>
|
|
|
import { mapActions, mapGetters, mapState } from "vuex";
|
|
|
import marked from "marked";
|
|
|
+import { sanitize } from "dompurify";
|
|
|
import Toast from "toasters";
|
|
|
import { formatDistance } from "date-fns";
|
|
|
|
|
@@ -120,11 +121,15 @@ export default {
|
|
|
},
|
|
|
methods: {
|
|
|
marked,
|
|
|
+ sanitize,
|
|
|
getTitle() {
|
|
|
let title = "";
|
|
|
const preview = document.getElementById("preview");
|
|
|
|
|
|
// validate existence of h1 for the page title
|
|
|
+
|
|
|
+ if (preview.childNodes.length === 0) return "";
|
|
|
+
|
|
|
if (preview.childNodes[0].tagName !== "H1") {
|
|
|
for (
|
|
|
let node = 0;
|
|
@@ -143,6 +148,9 @@ export default {
|
|
|
return title;
|
|
|
},
|
|
|
create(close) {
|
|
|
+ if (this.markdown === "")
|
|
|
+ return new Toast("News item cannot be empty.");
|
|
|
+
|
|
|
const title = this.getTitle();
|
|
|
if (!title)
|
|
|
return new Toast(
|
|
@@ -164,6 +172,9 @@ export default {
|
|
|
);
|
|
|
},
|
|
|
update(close) {
|
|
|
+ if (this.markdown === "")
|
|
|
+ return new Toast("News item cannot be empty.");
|
|
|
+
|
|
|
const title = this.getTitle();
|
|
|
if (!title)
|
|
|
return new Toast(
|
|
@@ -212,6 +223,13 @@ export default {
|
|
|
</style>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
+.night-mode {
|
|
|
+ #markdown-editor-and-preview textarea,
|
|
|
+ #markdown-editor-and-preview #preview {
|
|
|
+ border-color: #fff;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#markdown-editor-and-preview {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
@@ -235,12 +253,13 @@ export default {
|
|
|
#preview {
|
|
|
word-break: break-all;
|
|
|
overflow: auto;
|
|
|
+ box-shadow: none;
|
|
|
}
|
|
|
|
|
|
textarea,
|
|
|
#preview {
|
|
|
padding: 5px;
|
|
|
- border: 1px solid var(--light-grey-3);
|
|
|
+ border: 1px solid var(--light-grey-3) !important;
|
|
|
border-radius: 3px;
|
|
|
height: 700px;
|
|
|
}
|