forked from textAngular/textAngular
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtextAngular.min.js
1 lines (1 loc) · 18.2 KB
/
textAngular.min.js
1
if(!window.console){console={log:function(){}}}var textAngular=angular.module("textAngular",["ngSanitize"]);textAngular.directive("textAngular",["$compile","$window","$document","$rootScope","$timeout",function(e,g,f,a,d){console.log("Thank you for using textAngular! http://www.textangular.com");function c(h,j){for(var i in j){if(j[i]&&j[i].constructor&&j[i].constructor===Object){h[i]=h[i]||{};arguments.callee(h[i],j[i])}else{h[i]=j[i]}}return h}a.textAngularOpts=c({toolbar:[["paragraph","subtitle","picture"],["fit"]],classes:{focussed:"focussed",toolbar:"btn-toolbar",toolbarGroup:"btn-group",toolbarButton:"btn btn-default",toolbarButtonActive:"active",textEditor:"form-control",htmlEditor:"form-control"}},(a.textAngularOpts!=null)?a.textAngularOpts:{});var b=function(i){i=i.toLowerCase();var h=f[0].queryCommandValue("formatBlock").toLowerCase();return h===i||h===i};a.textAngularTools=c({paragraph:{display:"<button ng-click='action()' ng-class='displayActiveToolClass(active)'><i class='fa fa-align-justify'></i> 段落</button>",action:function(){return this.$parent.wrapSelection("formatBlock","<p>")},activeState:function(){return b("p")}},subtitle:{display:"<button ng-click='action()' ng-class='displayActiveToolClass(active)'><i class='fa fa-font'></i> 小標</button>",action:function(){return this.$parent.wrapSelection("formatBlock","<h2>")},activeState:function(){return b("h2")}},picture:{display:"<button ng-click='action()' ng-class='displayActiveToolClass(active)'><i class='fa fa-picture-o'></i> 照片</button>",action:function(){var h;this.$parent.wrapSelection("formatBlock","<figure>");h=angular.element("<photo-selector></photo-selector>");return this.$parent.displayElements.toolbar.after(h)},activeState:function(){return b("figure")}},fit:{display:"<button ng-click='action()' ng-class='displayActiveToolClass(active)'><i class='fa fa-magic'></i> 自動修正</button>",action:function(){var h;h=angular.element("text-angular");h.find(".editor-content p").removeAttr("style");return this.$parent.wrapSelection("formatBlock","<p>")},activeState:function(){return false}}},(a.textAngularTools!=null)?a.textAngularTools:{});return{require:"?ngModel",scope:{},restrict:"EA",link:function(u,n,t,m){var s,q,j,h,l,p,v;angular.extend(u,a.textAngularOpts,{wrapSelection:function(x,w){document.execCommand(x,false,w);if(u.showHtml){u.displayElements.html[0].focus()}else{u.displayElements.text[0].focus()}u.updateSelectedStyles();if(!u.showHtml){u.updateTaBindtext()}},showHtml:false});if(!!t.taToolbar){u.toolbar=u.$eval(t.taToolbar)}if(!!t.taFocussedClass){u.classes.focussed=u.$eval(t.taFocussedClass)}if(!!t.taToolbarClass){u.classes.toolbar=t.taToolbarClass}if(!!t.taToolbarGroupClass){u.classes.toolbarGroup=t.taToolbarGroupClass}if(!!t.taToolbarButtonClass){u.classes.toolbarButton=t.taToolbarButtonClass}if(!!t.taToolbarActiveButtonClass){u.classes.toolbarButtonActive=t.taToolbarActiveButtonClass}if(!!t.taTextEditorClass){u.classes.textEditor=t.taTextEditorClass}if(!!t.taHtmlEditorClass){u.classes.htmlEditor=t.taHtmlEditorClass}var o=n.html();n.html("");u.displayElements={photoSelector:angular.element("<photo-selector></photo-selector>"),toolbar:angular.element("<div></div>"),forminput:angular.element("<input type='hidden' style='display: none;'>"),html:angular.element("<textarea ng-show='showHtml' ta-bind='html' ng-model='html' ></textarea>"),text:angular.element("<div contentEditable='true' ng-hide='showHtml' ta-bind='text' ng-model='text' ></div>")};n.append(u.displayElements.toolbar);n.append(u.displayElements.photoSelector);n.append(u.displayElements.text);n.append(u.displayElements.html);e(u.displayElements.photoSelector)(u);if(!!t.name){u.displayElements.forminput.attr("name",t.name);n.append(u.displayElements.forminput)}if(!!t.taDisabled){u.displayElements.text.attr("ta-readonly","disabled");u.displayElements.html.attr("ta-readonly","disabled");u.disabled=u.$parent.$eval(t.taDisabled);u.$parent.$watch(t.taDisabled,function(w){u.disabled=w;if(u.disabled){n.addClass("disabled")}else{n.removeClass("disabled")}})}e(u.displayElements.text)(u);e(u.displayElements.html)(u);n.addClass("ta-root");u.displayElements.toolbar.addClass("ta-toolbar "+u.classes.toolbar);u.displayElements.text.addClass("ta-text ta-editor "+u.classes.textEditor);u.displayElements.html.addClass("ta-html ta-editor "+u.classes.textEditor);n.on("focusin",function(){n.addClass(u.classes.focussed);d(function(){n.triggerHandler("focus")},0)});n.on("focusout",function(){d(function(){if(!(f[0].activeElement===u.displayElements.html[0])&&!(f[0].activeElement===u.displayElements.text[0])){n.removeClass(u.classes.focussed);d(function(){n.triggerHandler("blur")},0)}},0)});u.tools={};for(var k=0;k<u.toolbar.length;k++){s=u.toolbar[k];q=angular.element("<div></div>");q.addClass(u.classes.toolbarGroup);for(var i=0;i<s.length;i++){p=s[i];v=angular.element(a.textAngularTools[p].display);v.addClass(u.classes.toolbarButton);v.attr("unselectable","on");v.attr("tabindex","-1");v.attr("ng-disabled","showHtml()");var r=angular.extend(u.$new(true),a.textAngularTools[p],{name:p,showHtml:function(){if(this.name!=="html"){return this.$parent.disabled||this.$parent.showHtml}return this.$parent.disabled},displayActiveToolClass:function(w){return(w)?this.$parent.classes.toolbarButtonActive:""}});u.tools[p]=r;q.append(e(v)(r))}u.displayElements.toolbar.append(q)}if(t.ngModel){m.$render=function(){u.displayElements.forminput.val(m.$viewValue);if(!(f[0].activeElement===u.displayElements.html[0])&&!(f[0].activeElement===u.displayElements.text[0])){var w=m.$viewValue||"";u.text=w;u.html=w}}}else{u.displayElements.forminput.val(o);u.text=o;u.html=o}u.$watch("text",function(x,w){u.html=x;if(t.ngModel&&x!==w){m.$setViewValue(x)}u.displayElements.forminput.val(x)});u.$watch("html",function(x,w){u.text=x;if(t.ngModel&&x!==w){m.$setViewValue(x)}u.displayElements.forminput.val(x)});u.bUpdateSelectedStyles=false;u.updateSelectedStyles=function(){for(var y=0;y<u.toolbar.length;y++){var w=u.toolbar[y];for(var x=0;x<w.length;x++){p=w[x];if(u.tools[p].activeState!=null){u.tools[p].active=u.tools[p].activeState.apply(u)}}}if(u.bUpdateSelectedStyles){d(u.updateSelectedStyles,200)}};j=function(w){u.bUpdateSelectedStyles=true;u.$apply(function(){u.updateSelectedStyles()})};u.displayElements.html.on("keydown",j);u.displayElements.text.on("keydown",j);h=function(w){u.bUpdateSelectedStyles=false};u.displayElements.html.on("keyup",h);u.displayElements.text.on("keyup",h);l=function(w){u.$apply(function(){u.updateSelectedStyles()})};u.displayElements.html.on("mouseup",l);u.displayElements.text.on("mouseup",l)}}}]).directive("taBind",["$sanitize","$document","taFixChrome",function(a,b,c){return{require:"ngModel",scope:{taBind:"@"},link:function(i,h,g,k){var e=h[0].tagName.toLowerCase()!=="textarea"&&h[0].tagName.toLowerCase()!=="input"&&h.attr("contenteditable")!==undefined&&h.attr("contenteditable");var d=false;var f=function(){var l=c(h).html();if(i.taBind==="html"&&e){l=l.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&")}return l};i.$parent["updateTaBind"+i.taBind]=function(){var m=f();var l=k.$parsers;k.$parsers=[];k.$oldViewValue=m;k.$setViewValue(m);k.$parsers=l};if(e){h.on("keyup",function(l){if(!d){k.$setViewValue(f())}})}function j(m,l){var n;try{n=a(m)}catch(o){n=l||""}return n}k.$parsers.push(function(l){var m=k.$oldViewValue=j(l,k.$oldViewValue);return m});k.$formatters.push(function(l){var m=j(l,"");return m});k.$render=function(){if(b[0].activeElement!==h[0]){var m=k.$viewValue||"";k.$oldViewValue=m;if(i.taBind==="text"){try{angular.element(m).find("script").remove()}catch(l){}h.html(m);h.find("a").on("click",function(n){n.preventDefault();return false})}else{if(e||(h[0].tagName.toLowerCase()!=="textarea"&&h[0].tagName.toLowerCase()!=="input")){h.html(m.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"))}else{h.val(m)}}}else{if(!e){h.val(m)}}};if(!!g.taReadonly){if(i.$parent.$eval(g.taReadonly)){if(h[0].tagName.toLowerCase()==="textarea"||h[0].tagName.toLowerCase()==="input"){h.attr("disabled","disabled")}if(h.attr("contenteditable")!==undefined&&h.attr("contenteditable")){h.removeAttr("contenteditable")}}else{if(h[0].tagName.toLowerCase()==="textarea"||h[0].tagName.toLowerCase()==="input"){h.removeAttr("disabled")}else{if(e){h.attr("contenteditable","true")}}}i.$parent.$watch(g.taReadonly,function(m,l){if(l===m){return}if(m){if(h[0].tagName.toLowerCase()==="textarea"||h[0].tagName.toLowerCase()==="input"){h.attr("disabled","disabled")}if(h.attr("contenteditable")!==undefined&&h.attr("contenteditable")){h.removeAttr("contenteditable")}}else{if(h[0].tagName.toLowerCase()==="textarea"||h[0].tagName.toLowerCase()==="input"){h.removeAttr("disabled")}else{if(e){h.attr("contenteditable","true")}}}d=m})}}}}]).factory("taFixChrome",function(){var a=function(c){var d=angular.element(c).find("span");for(var f=0;f<d.length;f++){var e=angular.element(d[f]);if(e.attr("style")&&e.attr("style").match(/line-height: 1.428571429;|color: inherit; line-height: 1.1;/i)){if(e.next().length>0&&e.next()[0].tagName==="BR"){e.next().remove()}e.replaceWith(e.html())}}var b=c.html().replace(/style="[^"]*?(line-height: 1.428571429;|color: inherit; line-height: 1.1;)[^"]*"/ig,"");if(b!==c.html()){c.html(b)}return c};return a});