scrivito_editors 1.5.5 → 1.6.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/scrivito_editors.js +5 -1
- data/app/assets/javascripts/scrivito_editors/binary_editor.js +1 -6
- data/app/assets/javascripts/scrivito_editors/date_editor.js +1 -1
- data/app/assets/javascripts/scrivito_editors/default_editor.js +3 -12
- data/app/assets/javascripts/scrivito_editors/helpers/setup_button_container.js +19 -0
- data/app/assets/javascripts/scrivito_editors/image_editor.js +1 -1
- data/app/assets/javascripts/scrivito_editors/link_editor.js +6 -4
- data/app/assets/javascripts/scrivito_editors/linklist_editor.js +6 -4
- data/app/assets/javascripts/scrivito_editors/number_editor.js +88 -0
- data/app/assets/javascripts/scrivito_editors/redactor_editor.js +12 -3
- data/app/assets/javascripts/scrivito_editors/reference_editor.js +22 -7
- data/app/assets/javascripts/scrivito_editors/referencelist_editor.js +4 -4
- data/app/assets/javascripts/scrivito_editors/slider_editor.js +3 -3
- data/app/assets/stylesheets/scrivito_editors/ui_container.css +11 -11
- data/vendor/assets/javascripts/URI.js +56 -0
- data/vendor/assets/javascripts/medium-editor.js +184 -55
- data/vendor/assets/stylesheets/medium-editor-themes/flat.css +1 -1
- metadata +9 -18
- data/app/assets/javascripts/scrivito_editors/dependencies/jquery_ui.js.erb +0 -11
- data/app/assets/javascripts/scrivito_editors/deprecated_data_attrs.js +0 -44
- data/app/assets/javascripts/scrivito_editors/helpers/file_dropzone.js +0 -38
- data/app/assets/javascripts/scrivito_editors/helpers/setup_binary_button_container.js +0 -12
- data/app/assets/javascripts/scrivito_editors/image_drop_editor.js +0 -52
- data/app/assets/stylesheets/scrivito_editors/image_drop_editor.css +0 -7
@@ -0,0 +1,56 @@
|
|
1
|
+
/*! URI.js v1.18.1 http://medialize.github.io/URI.js/ */
|
2
|
+
/* build contains: URI.js */
|
3
|
+
(function(n,v){"object"===typeof exports?module.exports=v(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],v):n.URI=v(n.punycode,n.IPv6,n.SecondLevelDomains,n)})(this,function(n,v,t,h){function d(a,b){var c=1<=arguments.length,g=2<=arguments.length;if(!(this instanceof d))return c?g?new d(a,b):new d(a):new d;if(void 0===a){if(c)throw new TypeError("undefined is not a valid argument for URI");
|
4
|
+
a="undefined"!==typeof location?location.href+"":""}this.href(a);return void 0!==b?this.absoluteTo(b):this}function q(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function u(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function k(a){return"Array"===u(a)}function C(a,b){var c={},d,f;if("RegExp"===u(b))c=null;else if(k(b))for(d=0,f=b.length;d<f;d++)c[b[d]]=!0;else c[b]=!0;d=0;for(f=a.length;d<f;d++)if(c&&void 0!==c[a[d]]||!c&&b.test(a[d]))a.splice(d,
|
5
|
+
1),f--,d--;return a}function y(a,b){var c,d;if(k(b)){c=0;for(d=b.length;c<d;c++)if(!y(a,b[c]))return!1;return!0}var f=u(b);c=0;for(d=a.length;c<d;c++)if("RegExp"===f){if("string"===typeof a[c]&&a[c].match(b))return!0}else if(a[c]===b)return!0;return!1}function D(a,b){if(!k(a)||!k(b)||a.length!==b.length)return!1;a.sort();b.sort();for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;return!0}function z(a){return a.replace(/^\/+|\/+$/g,"")}function F(a){return escape(a)}function A(a){return encodeURIComponent(a).replace(/[!'()*]/g,
|
6
|
+
F).replace(/\*/g,"%2A")}function w(a){return function(b,c){if(void 0===b)return this._parts[a]||"";this._parts[a]=b||null;this.build(!c);return this}}function E(a,b){return function(c,d){if(void 0===c)return this._parts[a]||"";null!==c&&(c+="",c.charAt(0)===b&&(c=c.substring(1)));this._parts[a]=c;this.build(!d);return this}}var G=h&&h.URI;d.version="1.18.1";var e=d.prototype,p=Object.prototype.hasOwnProperty;d._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,
|
7
|
+
port:null,path:null,query:null,fragment:null,duplicateQueryParameters:d.duplicateQueryParameters,escapeQuerySpace:d.escapeQuerySpace}};d.duplicateQueryParameters=!1;d.escapeQuerySpace=!0;d.protocol_expression=/^[a-z][a-z0-9.+-]*$/i;d.idn_expression=/[^a-z0-9\.-]/i;d.punycode_expression=/(xn--)/i;d.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;d.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
|
8
|
+
d.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/ig;d.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/};d.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"};d.invalid_hostname_characters=
|
9
|
+
/[^a-zA-Z0-9\.-]/;d.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"};d.getDomAttribute=function(a){if(a&&a.nodeName){var b=a.nodeName.toLowerCase();return"input"===b&&"image"!==a.type?void 0:d.domAttributes[b]}};d.encode=A;d.decode=decodeURIComponent;d.iso8859=function(){d.encode=escape;d.decode=unescape};d.unicode=function(){d.encode=A;d.decode=
|
10
|
+
decodeURIComponent};d.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",",
|
11
|
+
"%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}};d.encodeQuery=function(a,b){var c=d.encode(a+"");void 0===b&&(b=d.escapeQuerySpace);return b?c.replace(/%20/g,"+"):c};d.decodeQuery=function(a,b){a+="";void 0===b&&(b=d.escapeQuerySpace);try{return d.decode(b?a.replace(/\+/g,
|
12
|
+
"%20"):a)}catch(c){return a}};var r={encode:"encode",decode:"decode"},x,B=function(a,b){return function(c){try{return d[b](c+"").replace(d.characters[a][b].expression,function(c){return d.characters[a][b].map[c]})}catch(g){return c}}};for(x in r)d[x+"PathSegment"]=B("pathname",r[x]),d[x+"UrnPathSegment"]=B("urnpath",r[x]);r=function(a,b,c){return function(g){var f;f=c?function(a){return d[b](d[c](a))}:d[b];g=(g+"").split(a);for(var e=0,l=g.length;e<l;e++)g[e]=f(g[e]);return g.join(a)}};d.decodePath=
|
13
|
+
r("/","decodePathSegment");d.decodeUrnPath=r(":","decodeUrnPathSegment");d.recodePath=r("/","encodePathSegment","decode");d.recodeUrnPath=r(":","encodeUrnPathSegment","decode");d.encodeReserved=B("reserved","encode");d.parse=function(a,b){var c;b||(b={});c=a.indexOf("#");-1<c&&(b.fragment=a.substring(c+1)||null,a=a.substring(0,c));c=a.indexOf("?");-1<c&&(b.query=a.substring(c+1)||null,a=a.substring(0,c));"//"===a.substring(0,2)?(b.protocol=null,a=a.substring(2),a=d.parseAuthority(a,b)):(c=a.indexOf(":"),
|
14
|
+
-1<c&&(b.protocol=a.substring(0,c)||null,b.protocol&&!b.protocol.match(d.protocol_expression)?b.protocol=void 0:"//"===a.substring(c+1,c+3)?(a=a.substring(c+3),a=d.parseAuthority(a,b)):(a=a.substring(c+1),b.urn=!0)));b.path=a;return b};d.parseHost=function(a,b){a=a.replace(/\\/g,"/");var c=a.indexOf("/"),d;-1===c&&(c=a.length);if("["===a.charAt(0))d=a.indexOf("]"),b.hostname=a.substring(1,d)||null,b.port=a.substring(d+2,c)||null,"/"===b.port&&(b.port=null);else{var f=a.indexOf(":");d=a.indexOf("/");
|
15
|
+
f=a.indexOf(":",f+1);-1!==f&&(-1===d||f<d)?(b.hostname=a.substring(0,c)||null,b.port=null):(d=a.substring(0,c).split(":"),b.hostname=d[0]||null,b.port=d[1]||null)}b.hostname&&"/"!==a.substring(c).charAt(0)&&(c++,a="/"+a);return a.substring(c)||"/"};d.parseAuthority=function(a,b){a=d.parseUserinfo(a,b);return d.parseHost(a,b)};d.parseUserinfo=function(a,b){var c=a.indexOf("/"),g=a.lastIndexOf("@",-1<c?c:a.length-1);-1<g&&(-1===c||g<c)?(c=a.substring(0,g).split(":"),b.username=c[0]?d.decode(c[0]):null,
|
16
|
+
c.shift(),b.password=c[0]?d.decode(c.join(":")):null,a=a.substring(g+1)):(b.username=null,b.password=null);return a};d.parseQuery=function(a,b){if(!a)return{};a=a.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,"");if(!a)return{};for(var c={},g=a.split("&"),f=g.length,e,l,m=0;m<f;m++)if(e=g[m].split("="),l=d.decodeQuery(e.shift(),b),e=e.length?d.decodeQuery(e.join("="),b):null,p.call(c,l)){if("string"===typeof c[l]||null===c[l])c[l]=[c[l]];c[l].push(e)}else c[l]=e;return c};d.build=function(a){var b="";
|
17
|
+
a.protocol&&(b+=a.protocol+":");a.urn||!b&&!a.hostname||(b+="//");b+=d.buildAuthority(a)||"";"string"===typeof a.path&&("/"!==a.path.charAt(0)&&"string"===typeof a.hostname&&(b+="/"),b+=a.path);"string"===typeof a.query&&a.query&&(b+="?"+a.query);"string"===typeof a.fragment&&a.fragment&&(b+="#"+a.fragment);return b};d.buildHost=function(a){var b="";if(a.hostname)b=d.ip6_expression.test(a.hostname)?b+("["+a.hostname+"]"):b+a.hostname;else return"";a.port&&(b+=":"+a.port);return b};d.buildAuthority=
|
18
|
+
function(a){return d.buildUserinfo(a)+d.buildHost(a)};d.buildUserinfo=function(a){var b="";a.username&&(b+=d.encode(a.username));a.password&&(b+=":"+d.encode(a.password));b&&(b+="@");return b};d.buildQuery=function(a,b,c){var g="",f,e,l,m;for(e in a)if(p.call(a,e)&&e)if(k(a[e]))for(f={},l=0,m=a[e].length;l<m;l++)void 0!==a[e][l]&&void 0===f[a[e][l]+""]&&(g+="&"+d.buildQueryParameter(e,a[e][l],c),!0!==b&&(f[a[e][l]+""]=!0));else void 0!==a[e]&&(g+="&"+d.buildQueryParameter(e,a[e],c));return g.substring(1)};
|
19
|
+
d.buildQueryParameter=function(a,b,c){return d.encodeQuery(a,c)+(null!==b?"="+d.encodeQuery(b,c):"")};d.addQuery=function(a,b,c){if("object"===typeof b)for(var g in b)p.call(b,g)&&d.addQuery(a,g,b[g]);else if("string"===typeof b)void 0===a[b]?a[b]=c:("string"===typeof a[b]&&(a[b]=[a[b]]),k(c)||(c=[c]),a[b]=(a[b]||[]).concat(c));else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");};d.removeQuery=function(a,b,c){var g;if(k(b))for(c=0,g=b.length;c<g;c++)a[b[c]]=
|
20
|
+
void 0;else if("RegExp"===u(b))for(g in a)b.test(g)&&(a[g]=void 0);else if("object"===typeof b)for(g in b)p.call(b,g)&&d.removeQuery(a,g,b[g]);else if("string"===typeof b)void 0!==c?"RegExp"===u(c)?!k(a[b])&&c.test(a[b])?a[b]=void 0:a[b]=C(a[b],c):a[b]!==String(c)||k(c)&&1!==c.length?k(a[b])&&(a[b]=C(a[b],c)):a[b]=void 0:a[b]=void 0;else throw new TypeError("URI.removeQuery() accepts an object, string, RegExp as the first parameter");};d.hasQuery=function(a,b,c,g){switch(u(b)){case "String":break;
|
21
|
+
case "RegExp":for(var f in a)if(p.call(a,f)&&b.test(f)&&(void 0===c||d.hasQuery(a,f,c)))return!0;return!1;case "Object":for(var e in b)if(p.call(b,e)&&!d.hasQuery(a,e,b[e]))return!1;return!0;default:throw new TypeError("URI.hasQuery() accepts a string, regular expression or object as the name parameter");}switch(u(c)){case "Undefined":return b in a;case "Boolean":return a=!(k(a[b])?!a[b].length:!a[b]),c===a;case "Function":return!!c(a[b],b,a);case "Array":return k(a[b])?(g?y:D)(a[b],c):!1;case "RegExp":return k(a[b])?
|
22
|
+
g?y(a[b],c):!1:!(!a[b]||!a[b].match(c));case "Number":c=String(c);case "String":return k(a[b])?g?y(a[b],c):!1:a[b]===c;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter");}};d.joinPaths=function(){for(var a=[],b=[],c=0,g=0;g<arguments.length;g++){var f=new d(arguments[g]);a.push(f);for(var f=f.segment(),e=0;e<f.length;e++)"string"===typeof f[e]&&b.push(f[e]),f[e]&&c++}if(!b.length||!c)return new d("");b=(new d("")).segment(b);
|
23
|
+
""!==a[0].path()&&"/"!==a[0].path().slice(0,1)||b.path("/"+b.path());return b.normalize()};d.commonPath=function(a,b){var c=Math.min(a.length,b.length),d;for(d=0;d<c;d++)if(a.charAt(d)!==b.charAt(d)){d--;break}if(1>d)return a.charAt(0)===b.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(d)||"/"!==b.charAt(d))d=a.substring(0,d).lastIndexOf("/");return a.substring(0,d+1)};d.withinString=function(a,b,c){c||(c={});var g=c.start||d.findUri.start,e=c.end||d.findUri.end,H=c.trim||d.findUri.trim,l=
|
24
|
+
/[a-z0-9-]=["']?$/i;for(g.lastIndex=0;;){var m=g.exec(a);if(!m)break;m=m.index;if(c.ignoreHtml){var k=a.slice(Math.max(m-3,0),m);if(k&&l.test(k))continue}var k=m+a.slice(m).search(e),h=a.slice(m,k).replace(H,"");c.ignore&&c.ignore.test(h)||(k=m+h.length,h=b(h,m,k,a),a=a.slice(0,m)+h+a.slice(k),g.lastIndex=m+h.length)}g.lastIndex=0;return a};d.ensureValidHostname=function(a){if(a.match(d.invalid_hostname_characters)){if(!n)throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-] and Punycode.js is not available');
|
25
|
+
if(n.toASCII(a).match(d.invalid_hostname_characters))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');}};d.noConflict=function(a){if(a)return a={URI:this.noConflict()},h.URITemplate&&"function"===typeof h.URITemplate.noConflict&&(a.URITemplate=h.URITemplate.noConflict()),h.IPv6&&"function"===typeof h.IPv6.noConflict&&(a.IPv6=h.IPv6.noConflict()),h.SecondLevelDomains&&"function"===typeof h.SecondLevelDomains.noConflict&&(a.SecondLevelDomains=h.SecondLevelDomains.noConflict()),
|
26
|
+
a;h.URI===this&&(h.URI=G);return this};e.build=function(a){if(!0===a)this._deferred_build=!0;else if(void 0===a||this._deferred_build)this._string=d.build(this._parts),this._deferred_build=!1;return this};e.clone=function(){return new d(this)};e.valueOf=e.toString=function(){return this.build(!1)._string};e.protocol=w("protocol");e.username=w("username");e.password=w("password");e.hostname=w("hostname");e.port=w("port");e.query=E("query","?");e.fragment=E("fragment","#");e.search=function(a,b){var c=
|
27
|
+
this.query(a,b);return"string"===typeof c&&c.length?"?"+c:c};e.hash=function(a,b){var c=this.fragment(a,b);return"string"===typeof c&&c.length?"#"+c:c};e.pathname=function(a,b){if(void 0===a||!0===a){var c=this._parts.path||(this._parts.hostname?"/":"");return a?(this._parts.urn?d.decodeUrnPath:d.decodePath)(c):c}this._parts.path=this._parts.urn?a?d.recodeUrnPath(a):"":a?d.recodePath(a):"/";this.build(!b);return this};e.path=e.pathname;e.href=function(a,b){var c;if(void 0===a)return this.toString();
|
28
|
+
this._string="";this._parts=d._parts();var g=a instanceof d,e="object"===typeof a&&(a.hostname||a.path||a.pathname);a.nodeName&&(e=d.getDomAttribute(a),a=a[e]||"",e=!1);!g&&e&&void 0!==a.pathname&&(a=a.toString());if("string"===typeof a||a instanceof String)this._parts=d.parse(String(a),this._parts);else if(g||e)for(c in g=g?a._parts:a,g)p.call(this._parts,c)&&(this._parts[c]=g[c]);else throw new TypeError("invalid input");this.build(!b);return this};e.is=function(a){var b=!1,c=!1,g=!1,e=!1,k=!1,
|
29
|
+
l=!1,m=!1,h=!this._parts.urn;this._parts.hostname&&(h=!1,c=d.ip4_expression.test(this._parts.hostname),g=d.ip6_expression.test(this._parts.hostname),b=c||g,k=(e=!b)&&t&&t.has(this._parts.hostname),l=e&&d.idn_expression.test(this._parts.hostname),m=e&&d.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case "relative":return h;case "absolute":return!h;case "domain":case "name":return e;case "sld":return k;case "ip":return b;case "ip4":case "ipv4":case "inet4":return c;case "ip6":case "ipv6":case "inet6":return g;
|
30
|
+
case "idn":return l;case "url":return!this._parts.urn;case "urn":return!!this._parts.urn;case "punycode":return m}return null};var I=e.protocol,J=e.port,K=e.hostname;e.protocol=function(a,b){if(void 0!==a&&a&&(a=a.replace(/:(\/\/)?$/,""),!a.match(d.protocol_expression)))throw new TypeError('Protocol "'+a+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return I.call(this,a,b)};e.scheme=e.protocol;e.port=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==
|
31
|
+
a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError('Port "'+a+'" contains characters other than [0-9]');return J.call(this,a,b)};e.hostname=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var c={};if("/"!==d.parseHost(a,c))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');a=c.hostname}return K.call(this,a,b)};e.origin=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===
|
32
|
+
a){var c=this.protocol();return this.authority()?(c?c+"://":"")+this.authority():""}c=d(a);this.protocol(c.protocol()).authority(c.authority()).build(!b);return this};e.host=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?d.buildHost(this._parts):"";if("/"!==d.parseHost(a,this._parts))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');this.build(!b);return this};e.authority=function(a,b){if(this._parts.urn)return void 0===
|
33
|
+
a?"":this;if(void 0===a)return this._parts.hostname?d.buildAuthority(this._parts):"";if("/"!==d.parseAuthority(a,this._parts))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');this.build(!b);return this};e.userinfo=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){var c=d.buildUserinfo(this._parts);return c?c.substring(0,c.length-1):c}"@"!==a[a.length-1]&&(a+="@");d.parseUserinfo(a,this._parts);this.build(!b);return this};e.resource=function(a,
|
34
|
+
b){var c;if(void 0===a)return this.path()+this.search()+this.hash();c=d.parse(a);this._parts.path=c.path;this._parts.query=c.query;this._parts.fragment=c.fragment;this.build(!b);return this};e.subdomain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,c)||""}c=this._parts.hostname.length-this.domain().length;c=this._parts.hostname.substring(0,
|
35
|
+
c);c=new RegExp("^"+q(c));a&&"."!==a.charAt(a.length-1)&&(a+=".");a&&d.ensureValidHostname(a);this._parts.hostname=this._parts.hostname.replace(c,a);this.build(!b);return this};e.domain=function(a,b){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(b=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.match(/\./g);if(c&&2>c.length)return this._parts.hostname;c=this._parts.hostname.length-this.tld(b).length-1;c=this._parts.hostname.lastIndexOf(".",
|
36
|
+
c-1)+1;return this._parts.hostname.substring(c)||""}if(!a)throw new TypeError("cannot set domain empty");d.ensureValidHostname(a);!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(c=new RegExp(q(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a));this.build(!b);return this};e.tld=function(a,b){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(b=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.lastIndexOf("."),
|
37
|
+
c=this._parts.hostname.substring(c+1);return!0!==b&&t&&t.list[c.toLowerCase()]?t.get(this._parts.hostname)||c:c}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(t&&t.is(a))c=new RegExp(q(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a);else throw new TypeError('TLD "'+a+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");c=new RegExp(q(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(c,
|
38
|
+
a)}else throw new TypeError("cannot set TLD empty");this.build(!b);return this};e.directory=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var c=this._parts.path.length-this.filename().length-1,c=this._parts.path.substring(0,c)||(this._parts.hostname?"/":"");return a?d.decodePath(c):c}c=this._parts.path.length-this.filename().length;c=this._parts.path.substring(0,c);c=new RegExp("^"+
|
39
|
+
q(c));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=d.recodePath(a);this._parts.path=this._parts.path.replace(c,a);this.build(!b);return this};e.filename=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var c=this._parts.path.lastIndexOf("/"),c=this._parts.path.substring(c+1);return a?d.decodePathSegment(c):c}c=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\.?\//)&&
|
40
|
+
(c=!0);var g=new RegExp(q(this.filename())+"$");a=d.recodePath(a);this._parts.path=this._parts.path.replace(g,a);c?this.normalizePath(b):this.build(!b);return this};e.suffix=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var c=this.filename(),g=c.lastIndexOf(".");if(-1===g)return"";c=c.substring(g+1);c=/^[a-z0-9%]+$/i.test(c)?c:"";return a?d.decodePathSegment(c):c}"."===a.charAt(0)&&(a=a.substring(1));if(c=this.suffix())g=
|
41
|
+
a?new RegExp(q(c)+"$"):new RegExp(q("."+c)+"$");else{if(!a)return this;this._parts.path+="."+d.recodePath(a)}g&&(a=d.recodePath(a),this._parts.path=this._parts.path.replace(g,a));this.build(!b);return this};e.segment=function(a,b,c){var d=this._parts.urn?":":"/",e=this.path(),h="/"===e.substring(0,1),e=e.split(d);void 0!==a&&"number"!==typeof a&&(c=b,b=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error('Bad segment "'+a+'", must be 0-based integer');h&&e.shift();0>a&&(a=Math.max(e.length+
|
42
|
+
a,0));if(void 0===b)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(k(b)){e=[];a=0;for(var l=b.length;a<l;a++)if(b[a].length||e.length&&e[e.length-1].length)e.length&&!e[e.length-1].length&&e.pop(),e.push(z(b[a]))}else{if(b||"string"===typeof b)b=z(b),""===e[e.length-1]?e[e.length-1]=b:e.push(b)}else b?e[a]=z(b):e.splice(a,1);h&&e.unshift("");return this.path(e.join(d),c)};e.segmentCoded=function(a,b,c){var e,f;"number"!==typeof a&&(c=b,b=a,a=void 0);if(void 0===b){a=this.segment(a,b,c);if(k(a))for(e=
|
43
|
+
0,f=a.length;e<f;e++)a[e]=d.decode(a[e]);else a=void 0!==a?d.decode(a):void 0;return a}if(k(b))for(e=0,f=b.length;e<f;e++)b[e]=d.encode(b[e]);else b="string"===typeof b||b instanceof String?d.encode(b):b;return this.segment(a,b,c)};var L=e.query;e.query=function(a,b){if(!0===a)return d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("function"===typeof a){var c=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace),e=a.call(this,c);this._parts.query=d.buildQuery(e||c,this._parts.duplicateQueryParameters,
|
44
|
+
this._parts.escapeQuerySpace);this.build(!b);return this}return void 0!==a&&"string"!==typeof a?(this._parts.query=d.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!b),this):L.call(this,a,b)};e.setQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("string"===typeof a||a instanceof String)e[a]=void 0!==b?b:null;else if("object"===typeof a)for(var f in a)p.call(a,f)&&(e[f]=a[f]);else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");
|
45
|
+
this._parts.query=d.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(c=b);this.build(!c);return this};e.addQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);d.addQuery(e,a,void 0===b?null:b);this._parts.query=d.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(c=b);this.build(!c);return this};e.removeQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,
|
46
|
+
this._parts.escapeQuerySpace);d.removeQuery(e,a,b);this._parts.query=d.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(c=b);this.build(!c);return this};e.hasQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return d.hasQuery(e,a,b,c)};e.setSearch=e.setQuery;e.addSearch=e.addQuery;e.removeSearch=e.removeQuery;e.hasSearch=e.hasQuery;e.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build():
|
47
|
+
this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()};e.normalizeProtocol=function(a){"string"===typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!a));return this};e.normalizeHostname=function(a){this._parts.hostname&&(this.is("IDN")&&n?this._parts.hostname=n.toASCII(this._parts.hostname):this.is("IPv6")&&v&&(this._parts.hostname=v.best(this._parts.hostname)),this._parts.hostname=
|
48
|
+
this._parts.hostname.toLowerCase(),this.build(!a));return this};e.normalizePort=function(a){"string"===typeof this._parts.protocol&&this._parts.port===d.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a));return this};e.normalizePath=function(a){var b=this._parts.path;if(!b)return this;if(this._parts.urn)return this._parts.path=d.recodeUrnPath(this._parts.path),this.build(!a),this;if("/"===this._parts.path)return this;var b=d.recodePath(b),c,e="",f,k;"/"!==b.charAt(0)&&(c=!0,
|
49
|
+
b="/"+b);if("/.."===b.slice(-3)||"/."===b.slice(-2))b+="/";b=b.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/");c&&(e=b.substring(1).match(/^(\.\.\/)+/)||"")&&(e=e[0]);for(;;){f=b.search(/\/\.\.(\/|$)/);if(-1===f)break;else if(0===f){b=b.substring(3);continue}k=b.substring(0,f).lastIndexOf("/");-1===k&&(k=f);b=b.substring(0,k)+b.substring(f+3)}c&&this.is("relative")&&(b=e+b.substring(1));this._parts.path=b;this.build(!a);return this};e.normalizePathname=e.normalizePath;e.normalizeQuery=
|
50
|
+
function(a){"string"===typeof this._parts.query&&(this._parts.query.length?this.query(d.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a));return this};e.normalizeFragment=function(a){this._parts.fragment||(this._parts.fragment=null,this.build(!a));return this};e.normalizeSearch=e.normalizeQuery;e.normalizeHash=e.normalizeFragment;e.iso8859=function(){var a=d.encode,b=d.decode;d.encode=escape;d.decode=decodeURIComponent;try{this.normalize()}finally{d.encode=
|
51
|
+
a,d.decode=b}return this};e.unicode=function(){var a=d.encode,b=d.decode;d.encode=A;d.decode=unescape;try{this.normalize()}finally{d.encode=a,d.decode=b}return this};e.readable=function(){var a=this.clone();a.username("").password("").normalize();var b="";a._parts.protocol&&(b+=a._parts.protocol+"://");a._parts.hostname&&(a.is("punycode")&&n?(b+=n.toUnicode(a._parts.hostname),a._parts.port&&(b+=":"+a._parts.port)):b+=a.host());a._parts.hostname&&a._parts.path&&"/"!==a._parts.path.charAt(0)&&(b+="/");
|
52
|
+
b+=a.path(!0);if(a._parts.query){for(var c="",e=0,f=a._parts.query.split("&"),k=f.length;e<k;e++){var l=(f[e]||"").split("="),c=c+("&"+d.decodeQuery(l[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"));void 0!==l[1]&&(c+="="+d.decodeQuery(l[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}b+="?"+c.substring(1)}return b+=d.decodeQuery(a.hash(),!0)};e.absoluteTo=function(a){var b=this.clone(),c=["protocol","username","password","hostname","port"],e,f;if(this._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");
|
53
|
+
a instanceof d||(a=new d(a));b._parts.protocol||(b._parts.protocol=a._parts.protocol);if(this._parts.hostname)return b;for(e=0;f=c[e];e++)b._parts[f]=a._parts[f];b._parts.path?".."===b._parts.path.substring(-2)&&(b._parts.path+="/"):(b._parts.path=a._parts.path,b._parts.query||(b._parts.query=a._parts.query));"/"!==b.path().charAt(0)&&(c=(c=a.directory())?c:0===a.path().indexOf("/")?"/":"",b._parts.path=(c?c+"/":"")+b._parts.path,b.normalizePath());b.build();return b};e.relativeTo=function(a){var b=
|
54
|
+
this.clone().normalize(),c,e,f;if(b._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a=(new d(a)).normalize();c=b._parts;e=a._parts;f=b.path();a=a.path();if("/"!==f.charAt(0))throw Error("URI is already relative");if("/"!==a.charAt(0))throw Error("Cannot calculate a URI relative to another relative URI");c.protocol===e.protocol&&(c.protocol=null);if(c.username===e.username&&c.password===e.password&&null===c.protocol&&null===c.username&&null===c.password&&c.hostname===
|
55
|
+
e.hostname&&c.port===e.port)c.hostname=null,c.port=null;else return b.build();if(f===a)return c.path="",b.build();f=d.commonPath(f,a);if(!f)return b.build();e=e.path.substring(f.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");c.path=e+c.path.substring(f.length)||"./";return b.build()};e.equals=function(a){var b=this.clone(),c=new d(a),e;a={};var f,h;b.normalize();c.normalize();if(b.toString()===c.toString())return!0;f=b.query();e=c.query();b.query("");c.query("");if(b.toString()!==c.toString()||
|
56
|
+
f.length!==e.length)return!1;b=d.parseQuery(f,this._parts.escapeQuerySpace);e=d.parseQuery(e,this._parts.escapeQuerySpace);for(h in b)if(p.call(b,h)){if(!k(b[h])){if(b[h]!==e[h])return!1}else if(!D(b[h],e[h]))return!1;a[h]=!0}for(h in e)if(p.call(e,h)&&!a[h])return!1;return!0};e.duplicateQueryParameters=function(a){this._parts.duplicateQueryParameters=!!a;return this};e.escapeQuerySpace=function(a){this._parts.escapeQuerySpace=!!a;return this};return d});
|
@@ -385,7 +385,7 @@ if (!("classList" in document.createElement("_"))) {
|
|
385
385
|
|
386
386
|
(function (root, factory) {
|
387
387
|
'use strict';
|
388
|
-
var isElectron = typeof module === 'object' && process && process.versions && process.versions.electron;
|
388
|
+
var isElectron = typeof module === 'object' && typeof process !== 'undefined' && process && process.versions && process.versions.electron;
|
389
389
|
if (!isElectron && typeof module === 'object') {
|
390
390
|
module.exports = factory;
|
391
391
|
} else if (typeof define === 'function' && define.amd) {
|
@@ -1430,11 +1430,15 @@ MediumEditor.extensions = {};
|
|
1430
1430
|
},
|
1431
1431
|
|
1432
1432
|
cleanupTags: function (el, tags) {
|
1433
|
-
tags.
|
1434
|
-
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1433
|
+
if (tags.indexOf(el.nodeName.toLowerCase()) !== -1) {
|
1434
|
+
el.parentNode.removeChild(el);
|
1435
|
+
}
|
1436
|
+
},
|
1437
|
+
|
1438
|
+
unwrapTags: function (el, tags) {
|
1439
|
+
if (tags.indexOf(el.nodeName.toLowerCase()) !== -1) {
|
1440
|
+
MediumEditor.util.unwrap(el, document);
|
1441
|
+
}
|
1438
1442
|
},
|
1439
1443
|
|
1440
1444
|
// get the closest parent
|
@@ -2465,7 +2469,10 @@ MediumEditor.extensions = {};
|
|
2465
2469
|
// Helpers for event handling
|
2466
2470
|
|
2467
2471
|
attachDOMEvent: function (targets, event, listener, useCapture) {
|
2468
|
-
|
2472
|
+
var win = this.base.options.contentWindow,
|
2473
|
+
doc = this.base.options.ownerDocument;
|
2474
|
+
|
2475
|
+
targets = MediumEditor.util.isElement(targets) || [win, doc].indexOf(targets) > -1 ? [targets] : targets;
|
2469
2476
|
|
2470
2477
|
Array.prototype.forEach.call(targets, function (target) {
|
2471
2478
|
target.addEventListener(event, listener, useCapture);
|
@@ -2474,8 +2481,11 @@ MediumEditor.extensions = {};
|
|
2474
2481
|
},
|
2475
2482
|
|
2476
2483
|
detachDOMEvent: function (targets, event, listener, useCapture) {
|
2477
|
-
var index, e
|
2478
|
-
|
2484
|
+
var index, e,
|
2485
|
+
win = this.base.options.contentWindow,
|
2486
|
+
doc = this.base.options.ownerDocument;
|
2487
|
+
|
2488
|
+
targets = MediumEditor.util.isElement(targets) || [win, doc].indexOf(targets) > -1 ? [targets] : targets;
|
2479
2489
|
|
2480
2490
|
Array.prototype.forEach.call(targets, function (target) {
|
2481
2491
|
index = this.indexOfListener(target, event, listener, useCapture);
|
@@ -2643,23 +2653,23 @@ MediumEditor.extensions = {};
|
|
2643
2653
|
|
2644
2654
|
// Helper method to call all listeners to execCommand
|
2645
2655
|
var callListeners = function (args, result) {
|
2646
|
-
|
2647
|
-
|
2648
|
-
|
2649
|
-
|
2650
|
-
|
2651
|
-
|
2652
|
-
|
2653
|
-
});
|
2656
|
+
if (doc.execCommand.listeners) {
|
2657
|
+
doc.execCommand.listeners.forEach(function (listener) {
|
2658
|
+
listener({
|
2659
|
+
command: args[0],
|
2660
|
+
value: args[2],
|
2661
|
+
args: args,
|
2662
|
+
result: result
|
2654
2663
|
});
|
2655
|
-
}
|
2656
|
-
}
|
2664
|
+
});
|
2665
|
+
}
|
2666
|
+
},
|
2657
2667
|
|
2658
|
-
|
2659
|
-
|
2660
|
-
|
2661
|
-
|
2662
|
-
|
2668
|
+
// Create a wrapper method for execCommand which will:
|
2669
|
+
// 1) Call document.execCommand with the correct arguments
|
2670
|
+
// 2) Loop through any listeners and notify them that execCommand was called
|
2671
|
+
// passing extra info on the call
|
2672
|
+
// 3) Return the result
|
2663
2673
|
wrapper = function () {
|
2664
2674
|
var result = doc.execCommand.orig.apply(this, arguments);
|
2665
2675
|
|
@@ -2834,10 +2844,10 @@ MediumEditor.extensions = {};
|
|
2834
2844
|
// For clicks, we need to know if the mousedown that caused the click happened inside the existing focused element
|
2835
2845
|
// or one of the extension elements. If so, we don't want to focus another element
|
2836
2846
|
if (hadFocus &&
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2847
|
+
eventObj.type === 'click' &&
|
2848
|
+
this.lastMousedownTarget &&
|
2849
|
+
(MediumEditor.util.isDescendant(hadFocus, this.lastMousedownTarget, true) ||
|
2850
|
+
isElementDescendantOfExtension(this.base.extensions, this.lastMousedownTarget))) {
|
2841
2851
|
toFocus = hadFocus;
|
2842
2852
|
}
|
2843
2853
|
|
@@ -2855,7 +2865,7 @@ MediumEditor.extensions = {};
|
|
2855
2865
|
|
2856
2866
|
// Check if the target is external (not part of the editor, toolbar, or any other extension)
|
2857
2867
|
var externalEvent = !MediumEditor.util.isDescendant(hadFocus, target, true) &&
|
2858
|
-
|
2868
|
+
!isElementDescendantOfExtension(this.base.extensions, target);
|
2859
2869
|
|
2860
2870
|
if (toFocus !== hadFocus) {
|
2861
2871
|
// If element has focus, and focus is going outside of editor
|
@@ -3854,18 +3864,47 @@ MediumEditor.extensions = {};
|
|
3854
3864
|
this.base.checkSelection();
|
3855
3865
|
},
|
3856
3866
|
|
3867
|
+
ensureEncodedUri: function (str) {
|
3868
|
+
return str === decodeURI(str) ? encodeURI(str) : str;
|
3869
|
+
},
|
3870
|
+
|
3871
|
+
ensureEncodedUriComponent: function (str) {
|
3872
|
+
return str === decodeURIComponent(str) ? encodeURIComponent(str) : str;
|
3873
|
+
},
|
3874
|
+
|
3875
|
+
ensureEncodedParam: function (param) {
|
3876
|
+
var split = param.split('='),
|
3877
|
+
key = split[0],
|
3878
|
+
val = split[1];
|
3879
|
+
|
3880
|
+
return key + (val === undefined ? '' : '=' + this.ensureEncodedUriComponent(val));
|
3881
|
+
},
|
3882
|
+
|
3883
|
+
ensureEncodedQuery: function (queryString) {
|
3884
|
+
return queryString.split('&').map(this.ensureEncodedParam.bind(this)).join('&');
|
3885
|
+
},
|
3886
|
+
|
3857
3887
|
checkLinkFormat: function (value) {
|
3858
3888
|
// Matches any alphabetical characters followed by ://
|
3859
3889
|
// Matches protocol relative "//"
|
3860
3890
|
// Matches common external protocols "mailto:" "tel:" "maps:"
|
3861
|
-
|
3862
|
-
|
3863
|
-
|
3891
|
+
// Matches relative hash link, begins with "#"
|
3892
|
+
var urlSchemeRegex = /^([a-z]+:)?\/\/|^(mailto|tel|maps):|^\#/i,
|
3893
|
+
// telRegex is a regex for checking if the string is a telephone number
|
3894
|
+
telRegex = /^\+?\s?\(?(?:\d\s?\-?\)?){3,20}$/,
|
3895
|
+
split = value.split('?'),
|
3896
|
+
path = split[0],
|
3897
|
+
query = split[1];
|
3898
|
+
|
3864
3899
|
if (telRegex.test(value)) {
|
3865
3900
|
return 'tel:' + value;
|
3866
3901
|
} else {
|
3867
3902
|
// Check for URL scheme and default to http:// if none found
|
3868
|
-
return (urlSchemeRegex.test(value) ? '' : 'http://') +
|
3903
|
+
return (urlSchemeRegex.test(value) ? '' : 'http://') +
|
3904
|
+
// Ensure path is encoded
|
3905
|
+
this.ensureEncodedUri(path) +
|
3906
|
+
// Ensure query is encoded
|
3907
|
+
(query === undefined ? '' : '?' + this.ensureEncodedQuery(query));
|
3869
3908
|
}
|
3870
3909
|
},
|
3871
3910
|
|
@@ -4060,13 +4099,15 @@ MediumEditor.extensions = {};
|
|
4060
4099
|
|
4061
4100
|
positionPreview: function (activeAnchor) {
|
4062
4101
|
activeAnchor = activeAnchor || this.activeAnchor;
|
4063
|
-
var
|
4102
|
+
var containerWidth = this.window.innerWidth,
|
4103
|
+
buttonHeight = this.anchorPreview.offsetHeight,
|
4064
4104
|
boundary = activeAnchor.getBoundingClientRect(),
|
4065
|
-
middleBoundary = (boundary.left + boundary.right) / 2,
|
4066
4105
|
diffLeft = this.diffLeft,
|
4067
4106
|
diffTop = this.diffTop,
|
4068
|
-
|
4069
|
-
|
4107
|
+
elementsContainer = this.getEditorOption('elementsContainer'),
|
4108
|
+
elementsContainerAbsolute = ['absolute', 'fixed'].indexOf(window.getComputedStyle(elementsContainer).getPropertyValue('position')) > -1,
|
4109
|
+
relativeBoundary = {},
|
4110
|
+
halfOffsetWidth, defaultLeft, middleBoundary, elementsContainerBoundary, top;
|
4070
4111
|
|
4071
4112
|
halfOffsetWidth = this.anchorPreview.offsetWidth / 2;
|
4072
4113
|
var toolbarExtension = this.base.getExtensionByName('toolbar');
|
@@ -4076,12 +4117,35 @@ MediumEditor.extensions = {};
|
|
4076
4117
|
}
|
4077
4118
|
defaultLeft = diffLeft - halfOffsetWidth;
|
4078
4119
|
|
4079
|
-
|
4120
|
+
// If container element is absolute / fixed, recalculate boundaries to be relative to the container
|
4121
|
+
if (elementsContainerAbsolute) {
|
4122
|
+
elementsContainerBoundary = elementsContainer.getBoundingClientRect();
|
4123
|
+
['top', 'left'].forEach(function (key) {
|
4124
|
+
relativeBoundary[key] = boundary[key] - elementsContainerBoundary[key];
|
4125
|
+
});
|
4126
|
+
|
4127
|
+
relativeBoundary.width = boundary.width;
|
4128
|
+
relativeBoundary.height = boundary.height;
|
4129
|
+
boundary = relativeBoundary;
|
4130
|
+
|
4131
|
+
containerWidth = elementsContainerBoundary.width;
|
4132
|
+
|
4133
|
+
// Adjust top position according to container scroll position
|
4134
|
+
top = elementsContainer.scrollTop;
|
4135
|
+
} else {
|
4136
|
+
// Adjust top position according to window scroll position
|
4137
|
+
top = this.window.pageYOffset;
|
4138
|
+
}
|
4139
|
+
|
4140
|
+
middleBoundary = boundary.left + boundary.width / 2;
|
4141
|
+
top += buttonHeight + boundary.top + boundary.height - diffTop - this.anchorPreview.offsetHeight;
|
4142
|
+
|
4143
|
+
this.anchorPreview.style.top = Math.round(top) + 'px';
|
4080
4144
|
this.anchorPreview.style.right = 'initial';
|
4081
4145
|
if (middleBoundary < halfOffsetWidth) {
|
4082
4146
|
this.anchorPreview.style.left = defaultLeft + halfOffsetWidth + 'px';
|
4083
4147
|
this.anchorPreview.style.right = 'initial';
|
4084
|
-
} else if ((
|
4148
|
+
} else if ((containerWidth - middleBoundary) < halfOffsetWidth) {
|
4085
4149
|
this.anchorPreview.style.left = 'auto';
|
4086
4150
|
this.anchorPreview.style.right = 0;
|
4087
4151
|
} else {
|
@@ -5068,13 +5132,13 @@ MediumEditor.extensions = {};
|
|
5068
5132
|
[new RegExp(/<br class="Apple-interchange-newline">/g), '<br>'],
|
5069
5133
|
|
5070
5134
|
// replace google docs italics+bold with a span to be replaced once the html is inserted
|
5071
|
-
[new RegExp(/<span[^>]*(font-style:italic;font-weight:bold|font-weight:bold;font-style:italic)[^>]*>/gi), '<span class="replace-with italic bold">'],
|
5135
|
+
[new RegExp(/<span[^>]*(font-style:italic;font-weight:(bold|700)|font-weight:(bold|700);font-style:italic)[^>]*>/gi), '<span class="replace-with italic bold">'],
|
5072
5136
|
|
5073
5137
|
// replace google docs italics with a span to be replaced once the html is inserted
|
5074
5138
|
[new RegExp(/<span[^>]*font-style:italic[^>]*>/gi), '<span class="replace-with italic">'],
|
5075
5139
|
|
5076
5140
|
//[replace google docs bolds with a span to be replaced once the html is inserted
|
5077
|
-
[new RegExp(/<span[^>]*font-weight:bold[^>]*>/gi), '<span class="replace-with bold">'],
|
5141
|
+
[new RegExp(/<span[^>]*font-weight:(bold|700)[^>]*>/gi), '<span class="replace-with bold">'],
|
5078
5142
|
|
5079
5143
|
// replace manually entered b/i/a tags with real ones
|
5080
5144
|
[new RegExp(/<(\/?)(i|b|a)>/gi), '<$1$2>'],
|
@@ -5170,6 +5234,13 @@ MediumEditor.extensions = {};
|
|
5170
5234
|
*/
|
5171
5235
|
cleanTags: ['meta'],
|
5172
5236
|
|
5237
|
+
/* unwrapTags: [Array]
|
5238
|
+
* list of element tag names to unwrap (remove the element tag but retain its child elements)
|
5239
|
+
* during paste when __cleanPastedHTML__ is `true` or when
|
5240
|
+
* calling `cleanPaste(text)` or `pasteHTML(html, options)` helper methods.
|
5241
|
+
*/
|
5242
|
+
unwrapTags: [],
|
5243
|
+
|
5173
5244
|
init: function () {
|
5174
5245
|
MediumEditor.Extension.prototype.init.apply(this, arguments);
|
5175
5246
|
|
@@ -5453,7 +5524,8 @@ MediumEditor.extensions = {};
|
|
5453
5524
|
pasteHTML: function (html, options) {
|
5454
5525
|
options = MediumEditor.util.defaults({}, options, {
|
5455
5526
|
cleanAttrs: this.cleanAttrs,
|
5456
|
-
cleanTags: this.cleanTags
|
5527
|
+
cleanTags: this.cleanTags,
|
5528
|
+
unwrapTags: this.unwrapTags
|
5457
5529
|
});
|
5458
5530
|
|
5459
5531
|
var elList, workEl, i, fragmentBody, pasteBlock = this.document.createDocumentFragment();
|
@@ -5475,6 +5547,7 @@ MediumEditor.extensions = {};
|
|
5475
5547
|
|
5476
5548
|
MediumEditor.util.cleanupAttrs(workEl, options.cleanAttrs);
|
5477
5549
|
MediumEditor.util.cleanupTags(workEl, options.cleanTags);
|
5550
|
+
MediumEditor.util.unwrapTags(workEl, options.unwrapTags);
|
5478
5551
|
}
|
5479
5552
|
|
5480
5553
|
MediumEditor.util.insertHTMLCommand(this.document, fragmentBody.innerHTML.replace(/ /g, ' '));
|
@@ -6306,35 +6379,66 @@ MediumEditor.extensions = {};
|
|
6306
6379
|
}
|
6307
6380
|
}
|
6308
6381
|
|
6309
|
-
var
|
6310
|
-
middleBoundary = (boundary.left + boundary.right) / 2,
|
6382
|
+
var containerWidth = this.window.innerWidth,
|
6311
6383
|
toolbarElement = this.getToolbarElement(),
|
6312
6384
|
toolbarHeight = toolbarElement.offsetHeight,
|
6313
6385
|
toolbarWidth = toolbarElement.offsetWidth,
|
6314
6386
|
halfOffsetWidth = toolbarWidth / 2,
|
6315
6387
|
buttonHeight = 50,
|
6316
|
-
defaultLeft = this.diffLeft - halfOffsetWidth
|
6388
|
+
defaultLeft = this.diffLeft - halfOffsetWidth,
|
6389
|
+
elementsContainer = this.getEditorOption('elementsContainer'),
|
6390
|
+
elementsContainerAbsolute = ['absolute', 'fixed'].indexOf(window.getComputedStyle(elementsContainer).getPropertyValue('position')) > -1,
|
6391
|
+
positions = {},
|
6392
|
+
relativeBoundary = {},
|
6393
|
+
middleBoundary, elementsContainerBoundary;
|
6394
|
+
|
6395
|
+
// If container element is absolute / fixed, recalculate boundaries to be relative to the container
|
6396
|
+
if (elementsContainerAbsolute) {
|
6397
|
+
elementsContainerBoundary = elementsContainer.getBoundingClientRect();
|
6398
|
+
['top', 'left'].forEach(function (key) {
|
6399
|
+
relativeBoundary[key] = boundary[key] - elementsContainerBoundary[key];
|
6400
|
+
});
|
6401
|
+
|
6402
|
+
relativeBoundary.width = boundary.width;
|
6403
|
+
relativeBoundary.height = boundary.height;
|
6404
|
+
boundary = relativeBoundary;
|
6405
|
+
|
6406
|
+
containerWidth = elementsContainerBoundary.width;
|
6407
|
+
|
6408
|
+
// Adjust top position according to container scroll position
|
6409
|
+
positions.top = elementsContainer.scrollTop;
|
6410
|
+
} else {
|
6411
|
+
// Adjust top position according to window scroll position
|
6412
|
+
positions.top = this.window.pageYOffset;
|
6413
|
+
}
|
6414
|
+
|
6415
|
+
middleBoundary = boundary.left + boundary.width / 2;
|
6416
|
+
positions.top += boundary.top - toolbarHeight;
|
6317
6417
|
|
6318
6418
|
if (boundary.top < buttonHeight) {
|
6319
6419
|
toolbarElement.classList.add('medium-toolbar-arrow-over');
|
6320
6420
|
toolbarElement.classList.remove('medium-toolbar-arrow-under');
|
6321
|
-
|
6421
|
+
positions.top += buttonHeight + boundary.height - this.diffTop;
|
6322
6422
|
} else {
|
6323
6423
|
toolbarElement.classList.add('medium-toolbar-arrow-under');
|
6324
6424
|
toolbarElement.classList.remove('medium-toolbar-arrow-over');
|
6325
|
-
|
6425
|
+
positions.top += this.diffTop;
|
6326
6426
|
}
|
6327
6427
|
|
6328
6428
|
if (middleBoundary < halfOffsetWidth) {
|
6329
|
-
|
6330
|
-
|
6331
|
-
} else if ((
|
6332
|
-
|
6333
|
-
|
6429
|
+
positions.left = defaultLeft + halfOffsetWidth;
|
6430
|
+
positions.right = 'initial';
|
6431
|
+
} else if ((containerWidth - middleBoundary) < halfOffsetWidth) {
|
6432
|
+
positions.left = 'auto';
|
6433
|
+
positions.right = 0;
|
6334
6434
|
} else {
|
6335
|
-
|
6336
|
-
|
6435
|
+
positions.left = defaultLeft + middleBoundary;
|
6436
|
+
positions.right = 'initial';
|
6337
6437
|
}
|
6438
|
+
|
6439
|
+
['top', 'left', 'right'].forEach(function (key) {
|
6440
|
+
toolbarElement.style[key] = positions[key] + (isNaN(positions[key]) ? '' : 'px');
|
6441
|
+
});
|
6338
6442
|
}
|
6339
6443
|
});
|
6340
6444
|
|
@@ -6541,6 +6645,31 @@ MediumEditor.extensions = {};
|
|
6541
6645
|
// then pressing backspace key should change the <blockquote> to a <p> tag
|
6542
6646
|
event.preventDefault();
|
6543
6647
|
MediumEditor.util.execFormatBlock(this.options.ownerDocument, 'p');
|
6648
|
+
} else if (MediumEditor.util.isKey(event, MediumEditor.util.keyCode.ENTER) &&
|
6649
|
+
(MediumEditor.util.getClosestTag(node, 'blockquote') !== false) &&
|
6650
|
+
MediumEditor.selection.getCaretOffsets(node).right === 0) {
|
6651
|
+
|
6652
|
+
// when cursor is at the end of <blockquote>,
|
6653
|
+
// then pressing enter key should create <p> tag, not <blockquote>
|
6654
|
+
p = this.options.ownerDocument.createElement('p');
|
6655
|
+
p.innerHTML = '<br>';
|
6656
|
+
node.parentElement.insertBefore(p, node.nextSibling);
|
6657
|
+
|
6658
|
+
// move the cursor into the new paragraph
|
6659
|
+
MediumEditor.selection.moveCursor(this.options.ownerDocument, p);
|
6660
|
+
|
6661
|
+
event.preventDefault();
|
6662
|
+
} else if (MediumEditor.util.isKey(event, MediumEditor.util.keyCode.BACKSPACE) &&
|
6663
|
+
MediumEditor.util.isMediumEditorElement(node.parentElement) &&
|
6664
|
+
!node.previousElementSibling &&
|
6665
|
+
node.nextElementSibling &&
|
6666
|
+
isEmpty.test(node.innerHTML)) {
|
6667
|
+
|
6668
|
+
// when cursor is in the first element, it's empty and user presses backspace,
|
6669
|
+
// do delete action instead to get rid of the first element and move caret to 2nd
|
6670
|
+
event.preventDefault();
|
6671
|
+
MediumEditor.selection.moveCursor(this.options.ownerDocument, node.nextSibling);
|
6672
|
+
node.parentElement.removeChild(node);
|
6544
6673
|
}
|
6545
6674
|
}
|
6546
6675
|
|
@@ -7697,7 +7826,7 @@ MediumEditor.parseVersionString = function (release) {
|
|
7697
7826
|
|
7698
7827
|
MediumEditor.version = MediumEditor.parseVersionString.call(this, ({
|
7699
7828
|
// grunt-bump looks for this:
|
7700
|
-
'version': '5.
|
7829
|
+
'version': '5.22.1'
|
7701
7830
|
}).version);
|
7702
7831
|
|
7703
7832
|
return MediumEditor;
|