note.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**
  2. * @fileOverview
  3. *
  4. * 节点笔记支持
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. /* global marked: true */
  10. KityMinder.registerUI('ribbon/idea/note', function(minder) {
  11. var axss = minder.getUI('axss');
  12. marked.setOptions({
  13. gfm: true,
  14. breaks: true
  15. });
  16. var $attachment = minder.getUI('ribbon/idea/attachment');
  17. var $noteButtonMenu = new FUI.ButtonMenu({
  18. id: 'note-button-menu',
  19. text: minder.getLang('ui.note'),
  20. layout: 'bottom',
  21. buttons: [{}, {
  22. label: minder.getLang('ui.note')
  23. }],
  24. menu: {
  25. items: [minder.getLang('ui.removenote')]
  26. }
  27. }).appendTo($attachment);
  28. $noteButtonMenu.on('select', function() {
  29. minder.execCommand('note', null);
  30. });
  31. var $notePanel = $('<div id="note-panel"></div>');
  32. var $title = $('<h2>节点备注</h2>').appendTo($notePanel);
  33. var $close = $('<a class="close"></a>').appendTo($notePanel).click(hide);
  34. var $tab = $('<div class="tab">' +
  35. '<a class="edit-tab">编辑</a>' +
  36. '<a class="preview-tab">预览</a>' +
  37. '<a class="help" href="https://www.zybuluo.com/techird/note/46064" target="_blank">支持 GFM 语法书写</a>' +
  38. '</div>').appendTo($notePanel);
  39. var $editTab = $tab.find('.edit-tab');
  40. var $previewTab = $tab.find('.preview-tab');
  41. var $editor = $('<div class="note-editor"></div>').appendTo($notePanel);
  42. var $preview = $('<div class="note-preview"></div>').appendTo($notePanel);
  43. var noteVisible = false;
  44. $notePanel.on('keydown keyup keypress mouedown mouseup click contextmenu', function(e) {
  45. e.stopPropagation();
  46. });
  47. var editor = new window.CodeMirror($editor[0], {
  48. mode: 'gfm',
  49. lineWrapping: true,
  50. dragDrop: false
  51. });
  52. minder.on('uiready', function() {
  53. editor.setSize('100%', '100%');
  54. });
  55. var visible = false;
  56. var selectedNode = null;
  57. function updateEditorView() {
  58. if (noteVisible && selectedNode != minder.getSelectedNode()) {
  59. selectedNode = minder.getSelectedNode();
  60. var note = minder.queryCommandValue('note') || '';
  61. editor.setValue(note);
  62. if (selectedNode) {
  63. $notePanel.removeAttr('disabled');
  64. $title.text('备注 - ' + selectedNode.getText());
  65. } else {
  66. $notePanel.attr('disabled', 'disabled');
  67. $title.text('选择节点添加备注');
  68. }
  69. if ($previewTab.hasClass(activeTabClass)) {
  70. $preview.html(axss(marked(note)));
  71. $preview.find('a').attr('target', '_blank');
  72. }
  73. }
  74. }
  75. function updateNodeData() {
  76. if (selectedNode && minder.queryCommandState('note') != -1) {
  77. minder.execCommand('note', editor.getValue());
  78. }
  79. }
  80. minder.on('interactchange', updateEditorView);
  81. editor.on('change', updateNodeData);
  82. $noteButtonMenu.bindCommandState(minder, 'note');
  83. $noteButtonMenu.on('buttonclick', show);
  84. minder.on('editnoterequest', show);
  85. $('#kityminder').after($notePanel);
  86. hide();
  87. var activeTabClass = 'active-tab';
  88. function editMode() {
  89. if ($editTab.hasClass(activeTabClass)) return;
  90. $preview.hide();
  91. $previewTab.removeClass(activeTabClass);
  92. $editor.show().addClass(activeTabClass);
  93. $editTab.addClass(activeTabClass);
  94. var note = minder.queryCommandValue('note') || '';
  95. editor.setValue(note);
  96. }
  97. function previewMode() {
  98. if ($previewTab.hasClass(activeTabClass)) return;
  99. $editor.hide();
  100. $editTab.removeClass(activeTabClass);
  101. $preview.html(axss(marked(editor.getValue()))).show();
  102. $preview.find('a').attr('target', '_blank');
  103. $previewTab.addClass(activeTabClass);
  104. }
  105. $editTab.click(editMode);
  106. $previewTab.click(previewMode);
  107. function show() {
  108. noteVisible = true;
  109. $notePanel.show();
  110. editMode();
  111. updateEditorView();
  112. $('#content-wrapper').addClass('note-panel-visible');
  113. }
  114. function hide() {
  115. noteVisible = false;
  116. $notePanel.hide();
  117. $('#content-wrapper').removeClass('note-panel-visible');
  118. }
  119. });