markdown.html 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <script src="../../../../node_modules/marked/marked.min.js"></script>
  2. <script src="../../../../node_modules/lodash/lodash.min.js"></script>
  3. <script src="../../dist/vue.global.js"></script>
  4. <div id="editor">
  5. <textarea :value="input" @input="update"></textarea>
  6. <div v-html="compiledMarkdown"></div>
  7. </div>
  8. <script>
  9. const delay = window.location.hash === '#test' ? 50 : 300
  10. Vue.createApp({
  11. data: () => ({
  12. input: '# hello'
  13. }),
  14. computed: {
  15. compiledMarkdown() {
  16. return marked(this.input, { sanitize: true })
  17. }
  18. },
  19. methods: {
  20. update: _.debounce(function (e) {
  21. this.input = e.target.value
  22. }, delay)
  23. }
  24. }).mount('#editor')
  25. </script>
  26. <style>
  27. html, body, #editor {
  28. margin: 0;
  29. height: 100%;
  30. font-family: 'Helvetica Neue', Arial, sans-serif;
  31. color: #333;
  32. }
  33. textarea, #editor div {
  34. display: inline-block;
  35. overflow: auto;
  36. width: 50%;
  37. height: 100%;
  38. vertical-align: top;
  39. -webkit-box-sizing: border-box;
  40. -moz-box-sizing: border-box;
  41. box-sizing: border-box;
  42. padding: 0 20px;
  43. }
  44. textarea {
  45. border: none;
  46. border-right: 1px solid #ccc;
  47. resize: none;
  48. outline: none;
  49. background-color: #f6f6f6;
  50. font-size: 14px;
  51. font-family: 'Monaco', courier, monospace;
  52. padding: 20px;
  53. }
  54. code {
  55. color: #f66;
  56. }
  57. </style>