notepreview.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /**
  2. * @fileOverview
  3. *
  4. * 节点笔记支持
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. /* global marked: true */
  10. KityMinder.registerUI('ribbon/idea/notepreview', function(minder) {
  11. var axss = minder.getUI('axss');
  12. marked.setOptions({
  13. gfm: true,
  14. breaks: true
  15. });
  16. var $previewer = $('<div id="note-previewer"></div>').appendTo('#content-wrapper');
  17. var visible = false;
  18. var selectedNode = null;
  19. var previewTimer;
  20. minder.on('shownoterequest', function(e) {
  21. previewTimer = setTimeout(function() {
  22. preview(e.node);
  23. }, 300);
  24. });
  25. minder.on('hidenoterequest', function() {
  26. clearTimeout(previewTimer);
  27. });
  28. var previewLive = false;
  29. $('#kityminder').on('mousedown mousewheel DOMMouseScroll', function() {
  30. if (!previewLive) return;
  31. $previewer.fadeOut();
  32. previewLive = false;
  33. });
  34. $previewer.hide();
  35. function preview(node, keyword) {
  36. var icon = node.getRenderer('NoteIconRenderer').getRenderShape();
  37. var b = icon.getRenderBox('screen');
  38. var note = node.getData('note');
  39. $previewer[0].scrollTop = 0;
  40. var html = marked(note);
  41. if (keyword) {
  42. html = html.replace(new RegExp('(' + keyword + ')', 'ig'), '<span class="highlight">$1</span>');
  43. }
  44. $previewer.html(axss(html));
  45. var cw = $('#content-wrapper').width();
  46. var ch = $('#content-wrapper').height();
  47. var pw = $previewer.outerWidth();
  48. var ph = $previewer.outerHeight();
  49. var x = b.cx - pw / 2;
  50. var y = b.bottom + 10;
  51. if (x < 0) x = 10;
  52. if (x + pw > cw) x = cw - pw - 10;
  53. if (y + ph > ch) y = b.top - ph - 10;
  54. $previewer.css({
  55. left: Math.round(x),
  56. top: Math.round(y)
  57. });
  58. $previewer.show();
  59. var view = $previewer[0].querySelector('.highlight');
  60. if (view) {
  61. view.scrollIntoView();
  62. }
  63. previewLive = true;
  64. }
  65. $previewer.delegate('a', 'click', function(e) {
  66. var $a = $(e.target).closest('a');
  67. var href = $a.prop('href');
  68. if (window.confirm(minder.getLang('ui.redirect', href))) {
  69. window.open(href, '_blank');
  70. }
  71. e.preventDefault();
  72. });
  73. return {
  74. preview: preview,
  75. hide: function() {
  76. $previewer.hide();
  77. }
  78. };
  79. });