markdown.js 2.63 KB
angular.module("xn.markdown",[])
.value("markdownConfig", {})
.directive("xnMarkdown", ["markdownConfig", function(markdownConfig) {
    var config = {
        language: 'zh',
        fullscreen: {
            enable: true
        },
        resize: 'vertical',
        localStorage: 'md',
        abledButtons:{
            groupUtil:'cmdPreview'
        }
    };

    var config = angular.extend(config, markdownConfig);
        
    var count = 0;

    var link = function($scope, element, attrs, ngModel) {
        if(!ngModel) return ;
        
        $scope.isOpen = false;

        $scope.id = "";
        if(attrs.id) {
            $scope.id = attrs.id;
        } else {
            $scope.count = count++;
            $scope.count = $scope.count>=10?$scope.count:"0"+$scope.count;
            $scope.id = "markdown"+$scope.count;
        }
        
        angular.element(element).append("<textarea name='"+$scope.name+"' rows='"+$scope.rows+"' id='"+$scope.id+"'></textarea>");
        
        angular.element("#"+$scope.id).markdown(config);

        angular.element("#"+$scope.id).attr("data-provide", "markdown");

        angular.element("#"+$scope.id).on("blur", function(e) {
            ngModel.$setViewValue(angular.element(this).val());
        });

        angular.element("#bootstrap-markdown-cmdImage").on("click", function(e) {
            $scope.isOpen = !$scope.isOpen;
            $scope.$apply(function() {
                ngModel.$setViewValue(angular.element("#"+$scope.id).val());
            });
        });

        $scope.$watch("attachmentList", function(newVal, oldVal) {
            if(newVal && newVal.attachmentList) {
                var content = angular.element("#"+$scope.id).val();
                for(var i=0; i<newVal.attachmentList.length; i++) {
                    var img = "![输入图片说明]("+newVal.attachmentList[i].path+" \"在这里输入图片标题\")";
                    content += img;
                }
                angular.element("#"+$scope.id).val(content);
                ngModel.$setViewValue(content);
            }
        });

        $scope.$watch("data", function(val) {
            if(!val) {
                val = "";
            }
            angular.element("#"+$scope.id).val(val);
        });
    };

    var compile = function(element, attrs) {
        return link;
    };
    return {
        restrict: "AE",
        priority: 10,
        scope: {
            data: "=ngModel",
            name: "@",
            rows : "@"
        },
        require: "ngModel",
        compile: compile,
        template: "<div xn-attachment-box ng-model=\"attachmentList\" data-is-open=\"isOpen\"></div>"
    };
}]);