12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- // TODO: 使用一个 div 容器作为 previewer,而不是两个
- angular.module('kityminderEditor')
- .directive('notePreviewer', ['$sce', 'valueTransfer', function($sce, valueTransfer) {
- return {
- restrict: 'A',
- templateUrl: 'ui/directive/notePreviewer/notePreviewer.html',
- link: function(scope, element) {
- var minder = scope.minder;
- var $container = element.parent();
- var $previewer = element.children();
- scope.showNotePreviewer = false;
- marked.setOptions({
- gfm: true,
- tables: true,
- breaks: true,
- pedantic: false,
- sanitize: true,
- smartLists: true,
- smartypants: false
- });
- var previewTimer;
- minder.on('shownoterequest', function(e) {
- previewTimer = setTimeout(function() {
- preview(e.node, e.keyword);
- }, 300);
- });
- minder.on('hidenoterequest', function() {
- clearTimeout(previewTimer);
- scope.showNotePreviewer = false;
- //scope.$apply();
- });
- var previewLive = false;
- $(document).on('mousedown mousewheel DOMMouseScroll', function() {
- if (!previewLive) return;
- scope.showNotePreviewer = false;
- scope.$apply();
- });
- element.on('mousedown mousewheel DOMMouseScroll', function(e) {
- e.stopPropagation();
- });
- function preview(node, keyword) {
- var icon = node.getRenderer('NoteIconRenderer').getRenderShape();
- var b = icon.getRenderBox('screen');
- var note = node.getData('note');
- $previewer[0].scrollTop = 0;
- var html = marked(note);
- if (keyword) {
- html = html.replace(new RegExp('(' + keyword + ')', 'ig'), '<span class="highlight">$1</span>');
- }
- scope.noteContent = $sce.trustAsHtml(html);
- scope.$apply(); // 让浏览器重新渲染以获取 previewer 提示框的尺寸
- var cw = $($container[0]).width();
- var ch = $($container[0]).height();
- var pw = $($previewer).outerWidth();
- var ph = $($previewer).outerHeight();
- var x = b.cx - pw / 2 - $container[0].offsetLeft;
- var y = b.bottom + 10 - $container[0].offsetTop;
- if (x < 0) x = 10;
- if (x + pw > cw) x = b.left - pw - 10 - $container[0].offsetLeft;
- if (y + ph > ch) y = b.top - ph - 10 - $container[0].offsetTop;
- scope.previewerStyle = {
- 'left': Math.round(x) + 'px',
- 'top': Math.round(y) + 'px'
- };
- scope.showNotePreviewer = true;
- var view = $previewer[0].querySelector('.highlight');
- if (view) {
- view.scrollIntoView();
- }
- previewLive = true;
- scope.$apply();
- }
- }
- }
- }]);
|