markdown-editor.html 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <link rel="import" href="../bower_components/polymer/polymer.html">
  2. <link rel="import" href="../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
  3. <link rel="import" href="../bower_components/iron-flex-layout/iron-flex-layout-classes.html">
  4. <link rel="import" href="../bower_components/iron-icons/editor-icons.html">
  5. <link rel="import" href="../bower_components/paper-icon-button/paper-icon-button.html">
  6. <link rel="import" href="../bower_components/marked-element/marked-element.html">
  7. <dom-module id="markdown-editor">
  8. <template>
  9. <style is="custom-style" include="iron-flex iron-positioning"></style>
  10. <style>
  11. .container {
  12. height: 100%;
  13. @apply(--layout-vertical);
  14. }
  15. .actions {
  16. background-color: var(--zebra-medium-gray);
  17. }
  18. .actions > paper-icon-button {
  19. color: white;
  20. }
  21. .editor-preview {
  22. @apply(--layout-flex);
  23. @apply(--layout-horizontal);
  24. }
  25. .editor {
  26. width: 98%;
  27. }
  28. </style>
  29. <div class="container">
  30. <!-- Editor Actions (bar) -->
  31. <div class="actions">
  32. <paper-icon-button id="bold" icon="editor:format-bold" on-tap="_insertMarkdown"></paper-icon-button>
  33. <paper-icon-button id="italic" icon="editor:format-italic" on-tap="_insertMarkdown"></paper-icon-button>
  34. <paper-icon-button id="link" icon="editor:insert-link" on-tap="_insertMarkdown"></paper-icon-button>
  35. <paper-icon-button id="blockquote" icon="editor:format-indent-increase"
  36. on-tap="_insertMarkdown"></paper-icon-button>
  37. <paper-icon-button id="code" icon="code" on-tap="_insertMarkdown"></paper-icon-button>
  38. <paper-icon-button id="photo" icon="editor:insert-photo" on-tap="_insertMarkdown"></paper-icon-button>
  39. <paper-icon-button id="bulleted" icon="editor:format-list-bulleted"
  40. on-tap="_insertMarkdown"></paper-icon-button>
  41. <paper-icon-button id="numbered" icon="editor:format-list-numbered"
  42. on-tap="_insertMarkdown"></paper-icon-button>
  43. <paper-icon-button id="linebreak" class="action-icon" icon="remove"
  44. on-tap="_insertMarkdown"></paper-icon-button>
  45. </div>
  46. <!-- Editor / Preview -->
  47. <div class="editor-preview">
  48. <div class="flex">
  49. <iron-autogrow-textarea id="markdownEditor" class="editor" value="{{markdown}}"
  50. rows="5"></iron-autogrow-textarea>
  51. </div>
  52. <div class="flex">
  53. <marked-element id="markdownViewer" markdown="{{markdown}}"></marked-element>
  54. </div>
  55. </div>
  56. </div>
  57. </template>
  58. <script>
  59. Polymer({
  60. is: 'markdown-editor',
  61. properties: {
  62. editorMarkdown: {
  63. type: String,
  64. },
  65. markdown: {
  66. type: String,
  67. value: "# Test Markdown"
  68. }
  69. },
  70. attached: function () {
  71. var me = this;
  72. var markdownEditor = me.$.markdownEditor;
  73. var markdownViewer = me.$.markdownViewer;
  74. //Set the initial markdown value
  75. markdownEditor.value = me.markdown;
  76. //When the input changes in the textarea, set `markdown` so that the viewer can render it
  77. markdownEditor.addEventListener('input', function () {
  78. me.markdown = markdownEditor.value;
  79. });
  80. },
  81. _insertMarkdown: function (event) {
  82. var me = this;
  83. var action = event.currentTarget.id;
  84. switch (action) {
  85. case "bold":
  86. me._insertInTextarea(me.$.markdownEditor, "**strong text**");
  87. break;
  88. case "italic":
  89. me._insertInTextarea(me.$.markdownEditor, "*italic text*");
  90. break;
  91. case "link":
  92. me._insertInTextarea(me.$.markdownEditor, "[link](http://path.to.link)");
  93. break;
  94. case "blockquote":
  95. me._insertInTextarea(me.$.markdownEditor, "> blockquote text");
  96. break;
  97. case "code":
  98. me._insertInTextarea(me.$.markdownEditor, "\t Code Block (4 spaces / 1 tab)");
  99. break;
  100. case "photo":
  101. me._insertInTextarea(me.$.markdownEditor, "![Alt text](/path/to/image.jpg)");
  102. break;
  103. case "bulleted":
  104. me._insertInTextarea(me.$.markdownEditor, "Unordered List \n* List Item 1 \n* List Item 2 \n* List Item 3");
  105. break;
  106. case "numbered":
  107. me._insertInTextarea(me.$.markdownEditor, "Ordered List \n1. List Item 1 \n2. List Item 2 \n3. List Item 3");
  108. break;
  109. case "linebreak":
  110. me._insertInTextarea(me.$.markdownEditor, "\n---\n");
  111. break;
  112. }
  113. },
  114. _insertInTextarea: function (textarea, textToInsert) {
  115. var start = textarea.selectionStart;
  116. var end = textarea.selectionEnd;
  117. var text = textarea.value;
  118. var before = text.substring(0, start);
  119. var after = text.substring(end, text.length);
  120. textarea.value = (before + textToInsert + after);
  121. textarea.selectionStart = textarea.selectionEnd = start + textToInsert.length;
  122. textarea.focus()
  123. }
  124. });
  125. </script>
  126. </dom-module>