plugin.js 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399
  1. /**
  2. * Copyright (c) Tiny Technologies, Inc. All rights reserved.
  3. * Licensed under the LGPL or a commercial license.
  4. * For LGPL see License.txt in the project root for license information.
  5. * For commercial licenses see https://www.tiny.cloud/
  6. *
  7. * Version: 5.0.7 (2019-06-05)
  8. */
  9. (function () {
  10. var image = (function (domGlobals) {
  11. 'use strict';
  12. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  13. var noop = function () {
  14. };
  15. var constant = function (value) {
  16. return function () {
  17. return value;
  18. };
  19. };
  20. var identity = function (x) {
  21. return x;
  22. };
  23. var die = function (msg) {
  24. return function () {
  25. throw new Error(msg);
  26. };
  27. };
  28. var never = constant(false);
  29. var always = constant(true);
  30. var never$1 = never;
  31. var always$1 = always;
  32. var none = function () {
  33. return NONE;
  34. };
  35. var NONE = function () {
  36. var eq = function (o) {
  37. return o.isNone();
  38. };
  39. var call = function (thunk) {
  40. return thunk();
  41. };
  42. var id = function (n) {
  43. return n;
  44. };
  45. var noop = function () {
  46. };
  47. var nul = function () {
  48. return null;
  49. };
  50. var undef = function () {
  51. return undefined;
  52. };
  53. var me = {
  54. fold: function (n, s) {
  55. return n();
  56. },
  57. is: never$1,
  58. isSome: never$1,
  59. isNone: always$1,
  60. getOr: id,
  61. getOrThunk: call,
  62. getOrDie: function (msg) {
  63. throw new Error(msg || 'error: getOrDie called on none.');
  64. },
  65. getOrNull: nul,
  66. getOrUndefined: undef,
  67. or: id,
  68. orThunk: call,
  69. map: none,
  70. ap: none,
  71. each: noop,
  72. bind: none,
  73. flatten: none,
  74. exists: never$1,
  75. forall: always$1,
  76. filter: none,
  77. equals: eq,
  78. equals_: eq,
  79. toArray: function () {
  80. return [];
  81. },
  82. toString: constant('none()')
  83. };
  84. if (Object.freeze)
  85. Object.freeze(me);
  86. return me;
  87. }();
  88. var some = function (a) {
  89. var constant_a = function () {
  90. return a;
  91. };
  92. var self = function () {
  93. return me;
  94. };
  95. var map = function (f) {
  96. return some(f(a));
  97. };
  98. var bind = function (f) {
  99. return f(a);
  100. };
  101. var me = {
  102. fold: function (n, s) {
  103. return s(a);
  104. },
  105. is: function (v) {
  106. return a === v;
  107. },
  108. isSome: always$1,
  109. isNone: never$1,
  110. getOr: constant_a,
  111. getOrThunk: constant_a,
  112. getOrDie: constant_a,
  113. getOrNull: constant_a,
  114. getOrUndefined: constant_a,
  115. or: self,
  116. orThunk: self,
  117. map: map,
  118. ap: function (optfab) {
  119. return optfab.fold(none, function (fab) {
  120. return some(fab(a));
  121. });
  122. },
  123. each: function (f) {
  124. f(a);
  125. },
  126. bind: bind,
  127. flatten: constant_a,
  128. exists: bind,
  129. forall: bind,
  130. filter: function (f) {
  131. return f(a) ? me : NONE;
  132. },
  133. equals: function (o) {
  134. return o.is(a);
  135. },
  136. equals_: function (o, elementEq) {
  137. return o.fold(never$1, function (b) {
  138. return elementEq(a, b);
  139. });
  140. },
  141. toArray: function () {
  142. return [a];
  143. },
  144. toString: function () {
  145. return 'some(' + a + ')';
  146. }
  147. };
  148. return me;
  149. };
  150. var from = function (value) {
  151. return value === null || value === undefined ? NONE : some(value);
  152. };
  153. var Option = {
  154. some: some,
  155. none: none,
  156. from: from
  157. };
  158. var typeOf = function (x) {
  159. if (x === null)
  160. return 'null';
  161. var t = typeof x;
  162. if (t === 'object' && Array.prototype.isPrototypeOf(x))
  163. return 'array';
  164. if (t === 'object' && String.prototype.isPrototypeOf(x))
  165. return 'string';
  166. return t;
  167. };
  168. var isType = function (type) {
  169. return function (value) {
  170. return typeOf(value) === type;
  171. };
  172. };
  173. var isString = isType('string');
  174. var isObject = isType('object');
  175. var isBoolean = isType('boolean');
  176. var isFunction = isType('function');
  177. var slice = Array.prototype.slice;
  178. var each = function (xs, f) {
  179. for (var i = 0, len = xs.length; i < len; i++) {
  180. var x = xs[i];
  181. f(x, i, xs);
  182. }
  183. };
  184. var find = function (xs, pred) {
  185. for (var i = 0, len = xs.length; i < len; i++) {
  186. var x = xs[i];
  187. if (pred(x, i, xs)) {
  188. return Option.some(x);
  189. }
  190. }
  191. return Option.none();
  192. };
  193. var push = Array.prototype.push;
  194. var flatten = function (xs) {
  195. var r = [];
  196. for (var i = 0, len = xs.length; i < len; ++i) {
  197. if (!Array.prototype.isPrototypeOf(xs[i]))
  198. throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
  199. push.apply(r, xs[i]);
  200. }
  201. return r;
  202. };
  203. var head = function (xs) {
  204. return xs.length === 0 ? Option.none() : Option.some(xs[0]);
  205. };
  206. var from$1 = isFunction(Array.from) ? Array.from : function (x) {
  207. return slice.call(x);
  208. };
  209. var __assign = function () {
  210. __assign = Object.assign || function __assign(t) {
  211. for (var s, i = 1, n = arguments.length; i < n; i++) {
  212. s = arguments[i];
  213. for (var p in s)
  214. if (Object.prototype.hasOwnProperty.call(s, p))
  215. t[p] = s[p];
  216. }
  217. return t;
  218. };
  219. return __assign.apply(this, arguments);
  220. };
  221. var nu = function (baseFn) {
  222. var data = Option.none();
  223. var callbacks = [];
  224. var map = function (f) {
  225. return nu(function (nCallback) {
  226. get(function (data) {
  227. nCallback(f(data));
  228. });
  229. });
  230. };
  231. var get = function (nCallback) {
  232. if (isReady())
  233. call(nCallback);
  234. else
  235. callbacks.push(nCallback);
  236. };
  237. var set = function (x) {
  238. data = Option.some(x);
  239. run(callbacks);
  240. callbacks = [];
  241. };
  242. var isReady = function () {
  243. return data.isSome();
  244. };
  245. var run = function (cbs) {
  246. each(cbs, call);
  247. };
  248. var call = function (cb) {
  249. data.each(function (x) {
  250. domGlobals.setTimeout(function () {
  251. cb(x);
  252. }, 0);
  253. });
  254. };
  255. baseFn(set);
  256. return {
  257. get: get,
  258. map: map,
  259. isReady: isReady
  260. };
  261. };
  262. var pure = function (a) {
  263. return nu(function (callback) {
  264. callback(a);
  265. });
  266. };
  267. var LazyValue = {
  268. nu: nu,
  269. pure: pure
  270. };
  271. var bounce = function (f) {
  272. return function () {
  273. var args = [];
  274. for (var _i = 0; _i < arguments.length; _i++) {
  275. args[_i] = arguments[_i];
  276. }
  277. var me = this;
  278. domGlobals.setTimeout(function () {
  279. f.apply(me, args);
  280. }, 0);
  281. };
  282. };
  283. var nu$1 = function (baseFn) {
  284. var get = function (callback) {
  285. baseFn(bounce(callback));
  286. };
  287. var map = function (fab) {
  288. return nu$1(function (callback) {
  289. get(function (a) {
  290. var value = fab(a);
  291. callback(value);
  292. });
  293. });
  294. };
  295. var bind = function (aFutureB) {
  296. return nu$1(function (callback) {
  297. get(function (a) {
  298. aFutureB(a).get(callback);
  299. });
  300. });
  301. };
  302. var anonBind = function (futureB) {
  303. return nu$1(function (callback) {
  304. get(function (a) {
  305. futureB.get(callback);
  306. });
  307. });
  308. };
  309. var toLazy = function () {
  310. return LazyValue.nu(get);
  311. };
  312. var toCached = function () {
  313. var cache = null;
  314. return nu$1(function (callback) {
  315. if (cache === null) {
  316. cache = toLazy();
  317. }
  318. cache.get(callback);
  319. });
  320. };
  321. return {
  322. map: map,
  323. bind: bind,
  324. anonBind: anonBind,
  325. toLazy: toLazy,
  326. toCached: toCached,
  327. get: get
  328. };
  329. };
  330. var pure$1 = function (a) {
  331. return nu$1(function (callback) {
  332. callback(a);
  333. });
  334. };
  335. var Future = {
  336. nu: nu$1,
  337. pure: pure$1
  338. };
  339. var value = function (o) {
  340. var is = function (v) {
  341. return o === v;
  342. };
  343. var or = function (opt) {
  344. return value(o);
  345. };
  346. var orThunk = function (f) {
  347. return value(o);
  348. };
  349. var map = function (f) {
  350. return value(f(o));
  351. };
  352. var mapError = function (f) {
  353. return value(o);
  354. };
  355. var each = function (f) {
  356. f(o);
  357. };
  358. var bind = function (f) {
  359. return f(o);
  360. };
  361. var fold = function (_, onValue) {
  362. return onValue(o);
  363. };
  364. var exists = function (f) {
  365. return f(o);
  366. };
  367. var forall = function (f) {
  368. return f(o);
  369. };
  370. var toOption = function () {
  371. return Option.some(o);
  372. };
  373. return {
  374. is: is,
  375. isValue: always,
  376. isError: never,
  377. getOr: constant(o),
  378. getOrThunk: constant(o),
  379. getOrDie: constant(o),
  380. or: or,
  381. orThunk: orThunk,
  382. fold: fold,
  383. map: map,
  384. mapError: mapError,
  385. each: each,
  386. bind: bind,
  387. exists: exists,
  388. forall: forall,
  389. toOption: toOption
  390. };
  391. };
  392. var error = function (message) {
  393. var getOrThunk = function (f) {
  394. return f();
  395. };
  396. var getOrDie = function () {
  397. return die(String(message))();
  398. };
  399. var or = function (opt) {
  400. return opt;
  401. };
  402. var orThunk = function (f) {
  403. return f();
  404. };
  405. var map = function (f) {
  406. return error(message);
  407. };
  408. var mapError = function (f) {
  409. return error(f(message));
  410. };
  411. var bind = function (f) {
  412. return error(message);
  413. };
  414. var fold = function (onError, _) {
  415. return onError(message);
  416. };
  417. return {
  418. is: never,
  419. isValue: never,
  420. isError: always,
  421. getOr: identity,
  422. getOrThunk: getOrThunk,
  423. getOrDie: getOrDie,
  424. or: or,
  425. orThunk: orThunk,
  426. fold: fold,
  427. map: map,
  428. mapError: mapError,
  429. each: noop,
  430. bind: bind,
  431. exists: never,
  432. forall: always,
  433. toOption: Option.none
  434. };
  435. };
  436. var fromOption = function (opt, err) {
  437. return opt.fold(function () {
  438. return error(err);
  439. }, value);
  440. };
  441. var Result = {
  442. value: value,
  443. error: error,
  444. fromOption: fromOption
  445. };
  446. var wrap = function (delegate) {
  447. var toCached = function () {
  448. return wrap(delegate.toCached());
  449. };
  450. var bindFuture = function (f) {
  451. return wrap(delegate.bind(function (resA) {
  452. return resA.fold(function (err) {
  453. return Future.pure(Result.error(err));
  454. }, function (a) {
  455. return f(a);
  456. });
  457. }));
  458. };
  459. var bindResult = function (f) {
  460. return wrap(delegate.map(function (resA) {
  461. return resA.bind(f);
  462. }));
  463. };
  464. var mapResult = function (f) {
  465. return wrap(delegate.map(function (resA) {
  466. return resA.map(f);
  467. }));
  468. };
  469. var mapError = function (f) {
  470. return wrap(delegate.map(function (resA) {
  471. return resA.mapError(f);
  472. }));
  473. };
  474. var foldResult = function (whenError, whenValue) {
  475. return delegate.map(function (res) {
  476. return res.fold(whenError, whenValue);
  477. });
  478. };
  479. var withTimeout = function (timeout, errorThunk) {
  480. return wrap(Future.nu(function (callback) {
  481. var timedOut = false;
  482. var timer = domGlobals.setTimeout(function () {
  483. timedOut = true;
  484. callback(Result.error(errorThunk()));
  485. }, timeout);
  486. delegate.get(function (result) {
  487. if (!timedOut) {
  488. domGlobals.clearTimeout(timer);
  489. callback(result);
  490. }
  491. });
  492. }));
  493. };
  494. return __assign({}, delegate, {
  495. toCached: toCached,
  496. bindFuture: bindFuture,
  497. bindResult: bindResult,
  498. mapResult: mapResult,
  499. mapError: mapError,
  500. foldResult: foldResult,
  501. withTimeout: withTimeout
  502. });
  503. };
  504. var nu$2 = function (worker) {
  505. return wrap(Future.nu(worker));
  506. };
  507. var value$1 = function (value) {
  508. return wrap(Future.pure(Result.value(value)));
  509. };
  510. var error$1 = function (error) {
  511. return wrap(Future.pure(Result.error(error)));
  512. };
  513. var fromResult = function (result) {
  514. return wrap(Future.pure(result));
  515. };
  516. var fromFuture = function (future) {
  517. return wrap(future.map(Result.value));
  518. };
  519. var fromPromise = function (promise) {
  520. return nu$2(function (completer) {
  521. promise.then(function (value) {
  522. completer(Result.value(value));
  523. }, function (error) {
  524. completer(Result.error(error));
  525. });
  526. });
  527. };
  528. var FutureResult = {
  529. nu: nu$2,
  530. wrap: wrap,
  531. pure: value$1,
  532. value: value$1,
  533. error: error$1,
  534. fromResult: fromResult,
  535. fromFuture: fromFuture,
  536. fromPromise: fromPromise
  537. };
  538. var hasOwnProperty = Object.prototype.hasOwnProperty;
  539. var shallow = function (old, nu) {
  540. return nu;
  541. };
  542. var deep = function (old, nu) {
  543. var bothObjects = isObject(old) && isObject(nu);
  544. return bothObjects ? deepMerge(old, nu) : nu;
  545. };
  546. var baseMerge = function (merger) {
  547. return function () {
  548. var objects = new Array(arguments.length);
  549. for (var i = 0; i < objects.length; i++)
  550. objects[i] = arguments[i];
  551. if (objects.length === 0)
  552. throw new Error('Can\'t merge zero objects');
  553. var ret = {};
  554. for (var j = 0; j < objects.length; j++) {
  555. var curObject = objects[j];
  556. for (var key in curObject)
  557. if (hasOwnProperty.call(curObject, key)) {
  558. ret[key] = merger(ret[key], curObject[key]);
  559. }
  560. }
  561. return ret;
  562. };
  563. };
  564. var deepMerge = baseMerge(deep);
  565. var merge = baseMerge(shallow);
  566. var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
  567. var path = function (parts, scope) {
  568. var o = scope !== undefined && scope !== null ? scope : Global;
  569. for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i)
  570. o = o[parts[i]];
  571. return o;
  572. };
  573. var resolve = function (p, scope) {
  574. var parts = p.split('.');
  575. return path(parts, scope);
  576. };
  577. var unsafe = function (name, scope) {
  578. return resolve(name, scope);
  579. };
  580. var getOrDie = function (name, scope) {
  581. var actual = unsafe(name, scope);
  582. if (actual === undefined || actual === null)
  583. throw name + ' not available on this browser';
  584. return actual;
  585. };
  586. var Global$1 = { getOrDie: getOrDie };
  587. var url = function () {
  588. return Global$1.getOrDie('URL');
  589. };
  590. var createObjectURL = function (blob) {
  591. return url().createObjectURL(blob);
  592. };
  593. var revokeObjectURL = function (u) {
  594. url().revokeObjectURL(u);
  595. };
  596. var URL = {
  597. createObjectURL: createObjectURL,
  598. revokeObjectURL: revokeObjectURL
  599. };
  600. var makeItems = function (info) {
  601. var imageUrl = {
  602. name: 'src',
  603. type: 'urlinput',
  604. filetype: 'image',
  605. label: 'Source'
  606. };
  607. var imageList = info.imageList.map(function (items) {
  608. return {
  609. name: 'images',
  610. type: 'selectbox',
  611. label: 'Image list',
  612. items: items
  613. };
  614. });
  615. var imageDescription = {
  616. name: 'alt',
  617. type: 'input',
  618. label: 'Image description'
  619. };
  620. var imageTitle = {
  621. name: 'title',
  622. type: 'input',
  623. label: 'Image title'
  624. };
  625. var imageDimensions = {
  626. name: 'dimensions',
  627. type: 'sizeinput'
  628. };
  629. var classList = info.classList.map(function (items) {
  630. return {
  631. name: 'classes',
  632. type: 'selectbox',
  633. label: 'Class',
  634. items: items
  635. };
  636. });
  637. var caption = {
  638. type: 'label',
  639. label: 'Caption',
  640. items: [{
  641. type: 'checkbox',
  642. name: 'caption',
  643. label: 'Show caption'
  644. }]
  645. };
  646. return flatten([
  647. [imageUrl],
  648. imageList.toArray(),
  649. info.hasDescription ? [imageDescription] : [],
  650. info.hasImageTitle ? [imageTitle] : [],
  651. info.hasDimensions ? [imageDimensions] : [],
  652. [{
  653. type: 'grid',
  654. columns: 2,
  655. items: flatten([
  656. classList.toArray(),
  657. info.hasImageCaption ? [caption] : []
  658. ])
  659. }]
  660. ]);
  661. };
  662. var makeTab = function (info) {
  663. return {
  664. title: 'General',
  665. name: 'general',
  666. items: makeItems(info)
  667. };
  668. };
  669. var MainTab = {
  670. makeTab: makeTab,
  671. makeItems: makeItems
  672. };
  673. function FileReader () {
  674. var f = Global$1.getOrDie('FileReader');
  675. return new f();
  676. }
  677. var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise');
  678. var global$2 = tinymce.util.Tools.resolve('tinymce.util.XHR');
  679. var hasDimensions = function (editor) {
  680. return editor.getParam('image_dimensions', true, 'boolean');
  681. };
  682. var hasAdvTab = function (editor) {
  683. return editor.getParam('image_advtab', false, 'boolean');
  684. };
  685. var hasUploadTab = function (editor) {
  686. return editor.getParam('image_uploadtab', true, 'boolean');
  687. };
  688. var getPrependUrl = function (editor) {
  689. return editor.getParam('image_prepend_url', '', 'string');
  690. };
  691. var getClassList = function (editor) {
  692. return editor.getParam('image_class_list');
  693. };
  694. var hasDescription = function (editor) {
  695. return editor.getParam('image_description', true, 'boolean');
  696. };
  697. var hasImageTitle = function (editor) {
  698. return editor.getParam('image_title', false, 'boolean');
  699. };
  700. var hasImageCaption = function (editor) {
  701. return editor.getParam('image_caption', false, 'boolean');
  702. };
  703. var getImageList = function (editor) {
  704. return editor.getParam('image_list', false);
  705. };
  706. var hasUploadUrl = function (editor) {
  707. return !!getUploadUrl(editor);
  708. };
  709. var hasUploadHandler = function (editor) {
  710. return !!getUploadHandler(editor);
  711. };
  712. var getUploadUrl = function (editor) {
  713. return editor.getParam('images_upload_url', '', 'string');
  714. };
  715. var getUploadHandler = function (editor) {
  716. return editor.getParam('images_upload_handler', undefined, 'function');
  717. };
  718. var getUploadBasePath = function (editor) {
  719. return editor.getParam('images_upload_base_path', undefined, 'string');
  720. };
  721. var getUploadCredentials = function (editor) {
  722. return editor.getParam('images_upload_credentials', false, 'boolean');
  723. };
  724. var Settings = {
  725. hasDimensions: hasDimensions,
  726. hasUploadTab: hasUploadTab,
  727. hasAdvTab: hasAdvTab,
  728. getPrependUrl: getPrependUrl,
  729. getClassList: getClassList,
  730. hasDescription: hasDescription,
  731. hasImageTitle: hasImageTitle,
  732. hasImageCaption: hasImageCaption,
  733. getImageList: getImageList,
  734. hasUploadUrl: hasUploadUrl,
  735. hasUploadHandler: hasUploadHandler,
  736. getUploadUrl: getUploadUrl,
  737. getUploadHandler: getUploadHandler,
  738. getUploadBasePath: getUploadBasePath,
  739. getUploadCredentials: getUploadCredentials
  740. };
  741. var parseIntAndGetMax = function (val1, val2) {
  742. return Math.max(parseInt(val1, 10), parseInt(val2, 10));
  743. };
  744. var getImageSize = function (url, callback) {
  745. var img = domGlobals.document.createElement('img');
  746. var done = function (dimensions) {
  747. if (img.parentNode) {
  748. img.parentNode.removeChild(img);
  749. }
  750. callback(dimensions);
  751. };
  752. img.onload = function () {
  753. var width = parseIntAndGetMax(img.width, img.clientWidth);
  754. var height = parseIntAndGetMax(img.height, img.clientHeight);
  755. var dimensions = {
  756. width: width,
  757. height: height
  758. };
  759. done(Result.value(dimensions));
  760. };
  761. img.onerror = function () {
  762. done(Result.error('Failed to get image dimensions for: ' + url));
  763. };
  764. var style = img.style;
  765. style.visibility = 'hidden';
  766. style.position = 'fixed';
  767. style.bottom = style.left = '0px';
  768. style.width = style.height = 'auto';
  769. domGlobals.document.body.appendChild(img);
  770. img.src = url;
  771. };
  772. var removePixelSuffix = function (value) {
  773. if (value) {
  774. value = value.replace(/px$/, '');
  775. }
  776. return value;
  777. };
  778. var addPixelSuffix = function (value) {
  779. if (value.length > 0 && /^[0-9]+$/.test(value)) {
  780. value += 'px';
  781. }
  782. return value;
  783. };
  784. var mergeMargins = function (css) {
  785. if (css.margin) {
  786. var splitMargin = String(css.margin).split(' ');
  787. switch (splitMargin.length) {
  788. case 1:
  789. css['margin-top'] = css['margin-top'] || splitMargin[0];
  790. css['margin-right'] = css['margin-right'] || splitMargin[0];
  791. css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
  792. css['margin-left'] = css['margin-left'] || splitMargin[0];
  793. break;
  794. case 2:
  795. css['margin-top'] = css['margin-top'] || splitMargin[0];
  796. css['margin-right'] = css['margin-right'] || splitMargin[1];
  797. css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
  798. css['margin-left'] = css['margin-left'] || splitMargin[1];
  799. break;
  800. case 3:
  801. css['margin-top'] = css['margin-top'] || splitMargin[0];
  802. css['margin-right'] = css['margin-right'] || splitMargin[1];
  803. css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
  804. css['margin-left'] = css['margin-left'] || splitMargin[1];
  805. break;
  806. case 4:
  807. css['margin-top'] = css['margin-top'] || splitMargin[0];
  808. css['margin-right'] = css['margin-right'] || splitMargin[1];
  809. css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
  810. css['margin-left'] = css['margin-left'] || splitMargin[3];
  811. }
  812. delete css.margin;
  813. }
  814. return css;
  815. };
  816. var createImageList = function (editor, callback) {
  817. var imageList = Settings.getImageList(editor);
  818. if (typeof imageList === 'string') {
  819. global$2.send({
  820. url: imageList,
  821. success: function (text) {
  822. callback(JSON.parse(text));
  823. }
  824. });
  825. } else if (typeof imageList === 'function') {
  826. imageList(callback);
  827. } else {
  828. callback(imageList);
  829. }
  830. };
  831. var waitLoadImage = function (editor, data, imgElm) {
  832. var selectImage = function () {
  833. imgElm.onload = imgElm.onerror = null;
  834. if (editor.selection) {
  835. editor.selection.select(imgElm);
  836. editor.nodeChanged();
  837. }
  838. };
  839. imgElm.onload = function () {
  840. if (!data.width && !data.height && Settings.hasDimensions(editor)) {
  841. editor.dom.setAttribs(imgElm, {
  842. width: String(imgElm.clientWidth),
  843. height: String(imgElm.clientHeight)
  844. });
  845. }
  846. selectImage();
  847. };
  848. imgElm.onerror = selectImage;
  849. };
  850. var blobToDataUri = function (blob) {
  851. return new global$1(function (resolve, reject) {
  852. var reader = FileReader();
  853. reader.onload = function () {
  854. resolve(reader.result);
  855. };
  856. reader.onerror = function () {
  857. reject(reader.error.message);
  858. };
  859. reader.readAsDataURL(blob);
  860. });
  861. };
  862. var isPlaceholderImage = function (imgElm) {
  863. return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder'));
  864. };
  865. var Utils = {
  866. getImageSize: getImageSize,
  867. removePixelSuffix: removePixelSuffix,
  868. addPixelSuffix: addPixelSuffix,
  869. mergeMargins: mergeMargins,
  870. createImageList: createImageList,
  871. waitLoadImage: waitLoadImage,
  872. blobToDataUri: blobToDataUri,
  873. isPlaceholderImage: isPlaceholderImage
  874. };
  875. var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  876. var DOM = global$3.DOM;
  877. var getHspace = function (image) {
  878. if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {
  879. return Utils.removePixelSuffix(image.style.marginLeft);
  880. } else {
  881. return '';
  882. }
  883. };
  884. var getVspace = function (image) {
  885. if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) {
  886. return Utils.removePixelSuffix(image.style.marginTop);
  887. } else {
  888. return '';
  889. }
  890. };
  891. var getBorder = function (image) {
  892. if (image.style.borderWidth) {
  893. return Utils.removePixelSuffix(image.style.borderWidth);
  894. } else {
  895. return '';
  896. }
  897. };
  898. var getAttrib = function (image, name) {
  899. if (image.hasAttribute(name)) {
  900. return image.getAttribute(name);
  901. } else {
  902. return '';
  903. }
  904. };
  905. var getStyle = function (image, name) {
  906. return image.style[name] ? image.style[name] : '';
  907. };
  908. var hasCaption = function (image) {
  909. return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE';
  910. };
  911. var setAttrib = function (image, name, value) {
  912. image.setAttribute(name, value);
  913. };
  914. var wrapInFigure = function (image) {
  915. var figureElm = DOM.create('figure', { class: 'image' });
  916. DOM.insertAfter(figureElm, image);
  917. figureElm.appendChild(image);
  918. figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));
  919. figureElm.contentEditable = 'false';
  920. };
  921. var removeFigure = function (image) {
  922. var figureElm = image.parentNode;
  923. DOM.insertAfter(image, figureElm);
  924. DOM.remove(figureElm);
  925. };
  926. var toggleCaption = function (image) {
  927. if (hasCaption(image)) {
  928. removeFigure(image);
  929. } else {
  930. wrapInFigure(image);
  931. }
  932. };
  933. var normalizeStyle = function (image, normalizeCss) {
  934. var attrValue = image.getAttribute('style');
  935. var value = normalizeCss(attrValue !== null ? attrValue : '');
  936. if (value.length > 0) {
  937. image.setAttribute('style', value);
  938. image.setAttribute('data-mce-style', value);
  939. } else {
  940. image.removeAttribute('style');
  941. }
  942. };
  943. var setSize = function (name, normalizeCss) {
  944. return function (image, name, value) {
  945. if (image.style[name]) {
  946. image.style[name] = Utils.addPixelSuffix(value);
  947. normalizeStyle(image, normalizeCss);
  948. } else {
  949. setAttrib(image, name, value);
  950. }
  951. };
  952. };
  953. var getSize = function (image, name) {
  954. if (image.style[name]) {
  955. return Utils.removePixelSuffix(image.style[name]);
  956. } else {
  957. return getAttrib(image, name);
  958. }
  959. };
  960. var setHspace = function (image, value) {
  961. var pxValue = Utils.addPixelSuffix(value);
  962. image.style.marginLeft = pxValue;
  963. image.style.marginRight = pxValue;
  964. };
  965. var setVspace = function (image, value) {
  966. var pxValue = Utils.addPixelSuffix(value);
  967. image.style.marginTop = pxValue;
  968. image.style.marginBottom = pxValue;
  969. };
  970. var setBorder = function (image, value) {
  971. var pxValue = Utils.addPixelSuffix(value);
  972. image.style.borderWidth = pxValue;
  973. };
  974. var setBorderStyle = function (image, value) {
  975. image.style.borderStyle = value;
  976. };
  977. var getBorderStyle = function (image) {
  978. return getStyle(image, 'borderStyle');
  979. };
  980. var isFigure = function (elm) {
  981. return elm.nodeName === 'FIGURE';
  982. };
  983. var isImage = function (elm) {
  984. return elm.nodeName === 'IMG';
  985. };
  986. var defaultData = function () {
  987. return {
  988. src: '',
  989. alt: '',
  990. title: '',
  991. width: '',
  992. height: '',
  993. class: '',
  994. style: '',
  995. caption: false,
  996. hspace: '',
  997. vspace: '',
  998. border: '',
  999. borderStyle: ''
  1000. };
  1001. };
  1002. var getStyleValue = function (normalizeCss, data) {
  1003. var image = domGlobals.document.createElement('img');
  1004. setAttrib(image, 'style', data.style);
  1005. if (getHspace(image) || data.hspace !== '') {
  1006. setHspace(image, data.hspace);
  1007. }
  1008. if (getVspace(image) || data.vspace !== '') {
  1009. setVspace(image, data.vspace);
  1010. }
  1011. if (getBorder(image) || data.border !== '') {
  1012. setBorder(image, data.border);
  1013. }
  1014. if (getBorderStyle(image) || data.borderStyle !== '') {
  1015. setBorderStyle(image, data.borderStyle);
  1016. }
  1017. return normalizeCss(image.getAttribute('style'));
  1018. };
  1019. var create = function (normalizeCss, data) {
  1020. var image = domGlobals.document.createElement('img');
  1021. write(normalizeCss, merge(data, { caption: false }), image);
  1022. setAttrib(image, 'alt', data.alt);
  1023. if (data.caption) {
  1024. var figure = DOM.create('figure', { class: 'image' });
  1025. figure.appendChild(image);
  1026. figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));
  1027. figure.contentEditable = 'false';
  1028. return figure;
  1029. } else {
  1030. return image;
  1031. }
  1032. };
  1033. var read = function (normalizeCss, image) {
  1034. return {
  1035. src: getAttrib(image, 'src'),
  1036. alt: getAttrib(image, 'alt'),
  1037. title: getAttrib(image, 'title'),
  1038. width: getSize(image, 'width'),
  1039. height: getSize(image, 'height'),
  1040. class: getAttrib(image, 'class'),
  1041. style: normalizeCss(getAttrib(image, 'style')),
  1042. caption: hasCaption(image),
  1043. hspace: getHspace(image),
  1044. vspace: getVspace(image),
  1045. border: getBorder(image),
  1046. borderStyle: getStyle(image, 'borderStyle')
  1047. };
  1048. };
  1049. var updateProp = function (image, oldData, newData, name, set) {
  1050. if (newData[name] !== oldData[name]) {
  1051. set(image, name, newData[name]);
  1052. }
  1053. };
  1054. var normalized = function (set, normalizeCss) {
  1055. return function (image, name, value) {
  1056. set(image, value);
  1057. normalizeStyle(image, normalizeCss);
  1058. };
  1059. };
  1060. var write = function (normalizeCss, newData, image) {
  1061. var oldData = read(normalizeCss, image);
  1062. updateProp(image, oldData, newData, 'caption', function (image, _name, _value) {
  1063. return toggleCaption(image);
  1064. });
  1065. updateProp(image, oldData, newData, 'src', setAttrib);
  1066. updateProp(image, oldData, newData, 'alt', setAttrib);
  1067. updateProp(image, oldData, newData, 'title', setAttrib);
  1068. updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));
  1069. updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));
  1070. updateProp(image, oldData, newData, 'class', setAttrib);
  1071. updateProp(image, oldData, newData, 'style', normalized(function (image, value) {
  1072. return setAttrib(image, 'style', value);
  1073. }, normalizeCss));
  1074. updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss));
  1075. updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss));
  1076. updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss));
  1077. updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss));
  1078. };
  1079. var normalizeCss = function (editor, cssText) {
  1080. var css = editor.dom.styles.parse(cssText);
  1081. var mergedCss = Utils.mergeMargins(css);
  1082. var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss));
  1083. return editor.dom.styles.serialize(compressed);
  1084. };
  1085. var getSelectedImage = function (editor) {
  1086. var imgElm = editor.selection.getNode();
  1087. var figureElm = editor.dom.getParent(imgElm, 'figure.image');
  1088. if (figureElm) {
  1089. return editor.dom.select('img', figureElm)[0];
  1090. }
  1091. if (imgElm && (imgElm.nodeName !== 'IMG' || Utils.isPlaceholderImage(imgElm))) {
  1092. return null;
  1093. }
  1094. return imgElm;
  1095. };
  1096. var splitTextBlock = function (editor, figure) {
  1097. var dom = editor.dom;
  1098. var textBlock = dom.getParent(figure.parentNode, function (node) {
  1099. return editor.schema.getTextBlockElements()[node.nodeName];
  1100. }, editor.getBody());
  1101. if (textBlock) {
  1102. return dom.split(textBlock, figure);
  1103. } else {
  1104. return figure;
  1105. }
  1106. };
  1107. var readImageDataFromSelection = function (editor) {
  1108. var image = getSelectedImage(editor);
  1109. return image ? read(function (css) {
  1110. return normalizeCss(editor, css);
  1111. }, image) : defaultData();
  1112. };
  1113. var insertImageAtCaret = function (editor, data) {
  1114. var elm = create(function (css) {
  1115. return normalizeCss(editor, css);
  1116. }, data);
  1117. editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew');
  1118. editor.focus();
  1119. editor.selection.setContent(elm.outerHTML);
  1120. var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0];
  1121. editor.dom.setAttrib(insertedElm, 'data-mce-id', null);
  1122. if (isFigure(insertedElm)) {
  1123. var figure = splitTextBlock(editor, insertedElm);
  1124. editor.selection.select(figure);
  1125. } else {
  1126. editor.selection.select(insertedElm);
  1127. }
  1128. };
  1129. var syncSrcAttr = function (editor, image) {
  1130. editor.dom.setAttrib(image, 'src', image.getAttribute('src'));
  1131. };
  1132. var deleteImage = function (editor, image) {
  1133. if (image) {
  1134. var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image;
  1135. editor.dom.remove(elm);
  1136. editor.focus();
  1137. editor.nodeChanged();
  1138. if (editor.dom.isEmpty(editor.getBody())) {
  1139. editor.setContent('');
  1140. editor.selection.setCursorLocation();
  1141. }
  1142. }
  1143. };
  1144. var writeImageDataToSelection = function (editor, data) {
  1145. var image = getSelectedImage(editor);
  1146. write(function (css) {
  1147. return normalizeCss(editor, css);
  1148. }, data, image);
  1149. syncSrcAttr(editor, image);
  1150. if (isFigure(image.parentNode)) {
  1151. var figure = image.parentNode;
  1152. splitTextBlock(editor, figure);
  1153. editor.selection.select(image.parentNode);
  1154. } else {
  1155. editor.selection.select(image);
  1156. Utils.waitLoadImage(editor, data, image);
  1157. }
  1158. };
  1159. var insertOrUpdateImage = function (editor, data) {
  1160. var image = getSelectedImage(editor);
  1161. if (image) {
  1162. if (data.src) {
  1163. writeImageDataToSelection(editor, data);
  1164. } else {
  1165. deleteImage(editor, image);
  1166. }
  1167. } else if (data.src) {
  1168. insertImageAtCaret(editor, data);
  1169. }
  1170. };
  1171. var findMap = function (arr, f) {
  1172. for (var i = 0; i < arr.length; i++) {
  1173. var r = f(arr[i], i);
  1174. if (r.isSome()) {
  1175. return r;
  1176. }
  1177. }
  1178. return Option.none();
  1179. };
  1180. var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  1181. var getValue = function (item) {
  1182. return isString(item.value) ? item.value : '';
  1183. };
  1184. var sanitizeList = function (list, extractValue) {
  1185. var out = [];
  1186. global$4.each(list, function (item) {
  1187. var text = isString(item.text) ? item.text : isString(item.title) ? item.title : '';
  1188. if (item.menu !== undefined) {
  1189. var items = sanitizeList(item.menu, extractValue);
  1190. out.push({
  1191. text: text,
  1192. items: items
  1193. });
  1194. } else {
  1195. var value = extractValue(item);
  1196. out.push({
  1197. text: text,
  1198. value: value
  1199. });
  1200. }
  1201. });
  1202. return out;
  1203. };
  1204. var sanitizer = function (extracter) {
  1205. if (extracter === void 0) {
  1206. extracter = getValue;
  1207. }
  1208. return function (list) {
  1209. if (list) {
  1210. return Option.from(list).map(function (list) {
  1211. return sanitizeList(list, extracter);
  1212. });
  1213. } else {
  1214. return Option.none();
  1215. }
  1216. };
  1217. };
  1218. var sanitize = function (list) {
  1219. return sanitizer(getValue)(list);
  1220. };
  1221. var isGroup = function (item) {
  1222. return Object.prototype.hasOwnProperty.call(item, 'items');
  1223. };
  1224. var findEntryDelegate = function (list, value) {
  1225. return findMap(list, function (item) {
  1226. if (isGroup(item)) {
  1227. return findEntryDelegate(item.items, value);
  1228. } else if (item.value === value) {
  1229. return Option.some(item);
  1230. } else {
  1231. return Option.none();
  1232. }
  1233. });
  1234. };
  1235. var findEntry = function (optList, value) {
  1236. return optList.bind(function (list) {
  1237. return findEntryDelegate(list, value);
  1238. });
  1239. };
  1240. var ListUtils = {
  1241. sanitizer: sanitizer,
  1242. sanitize: sanitize,
  1243. findEntry: findEntry
  1244. };
  1245. function XMLHttpRequest () {
  1246. var f = Global$1.getOrDie('XMLHttpRequest');
  1247. return new f();
  1248. }
  1249. var pathJoin = function (path1, path2) {
  1250. if (path1) {
  1251. return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
  1252. }
  1253. return path2;
  1254. };
  1255. function Uploader (settings) {
  1256. var defaultHandler = function (blobInfo, success, failure, progress) {
  1257. var xhr, formData;
  1258. xhr = XMLHttpRequest();
  1259. xhr.open('POST', settings.url);
  1260. xhr.withCredentials = settings.credentials;
  1261. xhr.upload.onprogress = function (e) {
  1262. progress(e.loaded / e.total * 100);
  1263. };
  1264. xhr.onerror = function () {
  1265. failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
  1266. };
  1267. xhr.onload = function () {
  1268. var json;
  1269. if (xhr.status < 200 || xhr.status >= 300) {
  1270. failure('HTTP Error: ' + xhr.status);
  1271. return;
  1272. }
  1273. json = JSON.parse(xhr.responseText);
  1274. if (!json || typeof json.location !== 'string') {
  1275. failure('Invalid JSON: ' + xhr.responseText);
  1276. return;
  1277. }
  1278. success(pathJoin(settings.basePath, json.location));
  1279. };
  1280. formData = new domGlobals.FormData();
  1281. formData.append('file', blobInfo.blob(), blobInfo.filename());
  1282. xhr.send(formData);
  1283. };
  1284. var uploadBlob = function (blobInfo, handler) {
  1285. return new global$1(function (resolve, reject) {
  1286. try {
  1287. handler(blobInfo, resolve, reject, noop);
  1288. } catch (ex) {
  1289. reject(ex.message);
  1290. }
  1291. });
  1292. };
  1293. var isDefaultHandler = function (handler) {
  1294. return handler === defaultHandler;
  1295. };
  1296. var upload = function (blobInfo) {
  1297. return !settings.url && isDefaultHandler(settings.handler) ? global$1.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler);
  1298. };
  1299. settings = global$4.extend({
  1300. credentials: false,
  1301. handler: defaultHandler
  1302. }, settings);
  1303. return { upload: upload };
  1304. }
  1305. var makeTab$1 = function (info) {
  1306. return {
  1307. title: 'Advanced',
  1308. name: 'advanced',
  1309. items: [
  1310. {
  1311. type: 'input',
  1312. label: 'Style',
  1313. name: 'style'
  1314. },
  1315. {
  1316. type: 'grid',
  1317. columns: 2,
  1318. items: [
  1319. {
  1320. type: 'input',
  1321. label: 'Vertical space',
  1322. name: 'vspace'
  1323. },
  1324. {
  1325. type: 'input',
  1326. label: 'Horizontal space',
  1327. name: 'hspace'
  1328. },
  1329. {
  1330. type: 'input',
  1331. label: 'Border width',
  1332. name: 'border'
  1333. },
  1334. {
  1335. type: 'selectbox',
  1336. name: 'borderstyle',
  1337. label: 'Border style',
  1338. items: [
  1339. {
  1340. text: 'Select...',
  1341. value: ''
  1342. },
  1343. {
  1344. text: 'Solid',
  1345. value: 'solid'
  1346. },
  1347. {
  1348. text: 'Dotted',
  1349. value: 'dotted'
  1350. },
  1351. {
  1352. text: 'Dashed',
  1353. value: 'dashed'
  1354. },
  1355. {
  1356. text: 'Double',
  1357. value: 'double'
  1358. },
  1359. {
  1360. text: 'Groove',
  1361. value: 'groove'
  1362. },
  1363. {
  1364. text: 'Ridge',
  1365. value: 'ridge'
  1366. },
  1367. {
  1368. text: 'Inset',
  1369. value: 'inset'
  1370. },
  1371. {
  1372. text: 'Outset',
  1373. value: 'outset'
  1374. },
  1375. {
  1376. text: 'None',
  1377. value: 'none'
  1378. },
  1379. {
  1380. text: 'Hidden',
  1381. value: 'hidden'
  1382. }
  1383. ]
  1384. }
  1385. ]
  1386. }
  1387. ]
  1388. };
  1389. };
  1390. var AdvTab = { makeTab: makeTab$1 };
  1391. var collect = function (editor) {
  1392. var urlListSanitizer = ListUtils.sanitizer(function (item) {
  1393. return editor.convertURL(item.value || item.url, 'src');
  1394. });
  1395. var futureImageList = Future.nu(function (completer) {
  1396. Utils.createImageList(editor, function (imageList) {
  1397. completer(urlListSanitizer(imageList).map(function (items) {
  1398. return flatten([
  1399. [{
  1400. text: 'None',
  1401. value: ''
  1402. }],
  1403. items
  1404. ]);
  1405. }));
  1406. });
  1407. });
  1408. var classList = ListUtils.sanitize(Settings.getClassList(editor));
  1409. var hasAdvTab = Settings.hasAdvTab(editor);
  1410. var hasUploadTab = Settings.hasUploadTab(editor);
  1411. var hasUploadUrl = Settings.hasUploadUrl(editor);
  1412. var hasUploadHandler = Settings.hasUploadHandler(editor);
  1413. var image = readImageDataFromSelection(editor);
  1414. var hasDescription = Settings.hasDescription(editor);
  1415. var hasImageTitle = Settings.hasImageTitle(editor);
  1416. var hasDimensions = Settings.hasDimensions(editor);
  1417. var hasImageCaption = Settings.hasImageCaption(editor);
  1418. var url = Settings.getUploadUrl(editor);
  1419. var basePath = Settings.getUploadBasePath(editor);
  1420. var credentials = Settings.getUploadCredentials(editor);
  1421. var handler = Settings.getUploadHandler(editor);
  1422. var prependURL = Option.some(Settings.getPrependUrl(editor)).filter(function (preUrl) {
  1423. return isString(preUrl) && preUrl.length > 0;
  1424. });
  1425. return futureImageList.map(function (imageList) {
  1426. return {
  1427. image: image,
  1428. imageList: imageList,
  1429. classList: classList,
  1430. hasAdvTab: hasAdvTab,
  1431. hasUploadTab: hasUploadTab,
  1432. hasUploadUrl: hasUploadUrl,
  1433. hasUploadHandler: hasUploadHandler,
  1434. hasDescription: hasDescription,
  1435. hasImageTitle: hasImageTitle,
  1436. hasDimensions: hasDimensions,
  1437. hasImageCaption: hasImageCaption,
  1438. url: url,
  1439. basePath: basePath,
  1440. credentials: credentials,
  1441. handler: handler,
  1442. prependURL: prependURL
  1443. };
  1444. });
  1445. };
  1446. var makeTab$2 = function (info) {
  1447. var items = [{
  1448. type: 'dropzone',
  1449. name: 'fileinput'
  1450. }];
  1451. return {
  1452. title: 'Upload',
  1453. name: 'upload',
  1454. items: items
  1455. };
  1456. };
  1457. var UploadTab = { makeTab: makeTab$2 };
  1458. var createState = function (info) {
  1459. return {
  1460. prevImage: ListUtils.findEntry(info.imageList, info.image.src),
  1461. prevAlt: info.image.alt,
  1462. open: true
  1463. };
  1464. };
  1465. var fromImageData = function (image) {
  1466. return {
  1467. src: {
  1468. value: image.src,
  1469. meta: {}
  1470. },
  1471. images: image.src,
  1472. alt: image.alt,
  1473. title: image.title,
  1474. dimensions: {
  1475. width: image.width,
  1476. height: image.height
  1477. },
  1478. classes: image.class,
  1479. caption: image.caption,
  1480. style: image.style,
  1481. vspace: image.vspace,
  1482. border: image.border,
  1483. hspace: image.hspace,
  1484. borderstyle: image.borderStyle,
  1485. fileinput: []
  1486. };
  1487. };
  1488. var toImageData = function (data) {
  1489. return {
  1490. src: data.src.value,
  1491. alt: data.alt,
  1492. title: data.title,
  1493. width: data.dimensions.width,
  1494. height: data.dimensions.height,
  1495. class: data.classes,
  1496. style: data.style,
  1497. caption: data.caption,
  1498. hspace: data.hspace,
  1499. vspace: data.vspace,
  1500. border: data.border,
  1501. borderStyle: data.borderstyle
  1502. };
  1503. };
  1504. var addPrependUrl2 = function (info, srcURL) {
  1505. if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) {
  1506. return info.prependURL.bind(function (prependUrl) {
  1507. if (srcURL.substring(0, prependUrl.length) !== prependUrl) {
  1508. return Option.some(prependUrl + srcURL);
  1509. }
  1510. return Option.none();
  1511. });
  1512. }
  1513. return Option.none();
  1514. };
  1515. var addPrependUrl = function (info, api) {
  1516. var data = api.getData();
  1517. addPrependUrl2(info, data.src.value).each(function (srcURL) {
  1518. api.setData({
  1519. src: {
  1520. value: srcURL,
  1521. meta: data.src.meta
  1522. }
  1523. });
  1524. });
  1525. };
  1526. var formFillFromMeta2 = function (info, data, meta) {
  1527. if (info.hasDescription && isString(meta.alt)) {
  1528. data.alt = meta.alt;
  1529. }
  1530. if (info.hasImageTitle && isString(meta.title)) {
  1531. data.title = meta.title;
  1532. }
  1533. if (info.hasDimensions) {
  1534. if (isString(meta.width)) {
  1535. data.dimensions.width = meta.width;
  1536. }
  1537. if (isString(meta.height)) {
  1538. data.dimensions.height = meta.height;
  1539. }
  1540. }
  1541. if (isString(meta.class)) {
  1542. ListUtils.findEntry(info.classList, meta.class).each(function (entry) {
  1543. data.classes = entry.value;
  1544. });
  1545. }
  1546. if (info.hasImageCaption) {
  1547. if (isBoolean(meta.caption)) {
  1548. data.caption = meta.caption;
  1549. }
  1550. }
  1551. if (info.hasAdvTab) {
  1552. if (isString(meta.vspace)) {
  1553. data.vspace = meta.vspace;
  1554. }
  1555. if (isString(meta.border)) {
  1556. data.border = meta.border;
  1557. }
  1558. if (isString(meta.hspace)) {
  1559. data.hspace = meta.hspace;
  1560. }
  1561. if (isString(meta.borderstyle)) {
  1562. data.borderstyle = meta.borderstyle;
  1563. }
  1564. }
  1565. };
  1566. var formFillFromMeta = function (info, api) {
  1567. var data = api.getData();
  1568. var meta = data.src.meta;
  1569. if (meta !== undefined) {
  1570. var newData = deepMerge({}, data);
  1571. formFillFromMeta2(info, newData, meta);
  1572. api.setData(newData);
  1573. }
  1574. };
  1575. var calculateImageSize = function (helpers, info, state, api) {
  1576. var data = api.getData();
  1577. var url = data.src.value;
  1578. var meta = data.src.meta || {};
  1579. if (!meta.width && !meta.height && info.hasDimensions) {
  1580. helpers.imageSize(url).get(function (result) {
  1581. result.each(function (size) {
  1582. if (state.open) {
  1583. api.setData({ dimensions: size });
  1584. }
  1585. });
  1586. });
  1587. }
  1588. };
  1589. var updateImagesDropdown = function (info, state, api) {
  1590. var data = api.getData();
  1591. var image = ListUtils.findEntry(info.imageList, data.src.value);
  1592. state.prevImage = image;
  1593. api.setData({
  1594. images: image.map(function (entry) {
  1595. return entry.value;
  1596. }).getOr('')
  1597. });
  1598. };
  1599. var changeSrc = function (helpers, info, state, api) {
  1600. addPrependUrl(info, api);
  1601. formFillFromMeta(info, api);
  1602. calculateImageSize(helpers, info, state, api);
  1603. updateImagesDropdown(info, state, api);
  1604. };
  1605. var changeImages = function (helpers, info, state, api) {
  1606. var data = api.getData();
  1607. var image = ListUtils.findEntry(info.imageList, data.images);
  1608. image.each(function (img) {
  1609. var updateAlt = data.alt === '' || state.prevImage.map(function (image) {
  1610. return image.text === data.alt;
  1611. }).getOr(false);
  1612. if (updateAlt) {
  1613. if (img.value === '') {
  1614. api.setData({
  1615. src: img,
  1616. alt: state.prevAlt
  1617. });
  1618. } else {
  1619. api.setData({
  1620. src: img,
  1621. alt: img.text
  1622. });
  1623. }
  1624. } else {
  1625. api.setData({ src: img });
  1626. }
  1627. });
  1628. state.prevImage = image;
  1629. changeSrc(helpers, info, state, api);
  1630. };
  1631. var calcVSpace = function (css) {
  1632. var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom'];
  1633. return matchingTopBottom ? Utils.removePixelSuffix(String(css['margin-top'])) : '';
  1634. };
  1635. var calcHSpace = function (css) {
  1636. var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left'];
  1637. return matchingLeftRight ? Utils.removePixelSuffix(String(css['margin-right'])) : '';
  1638. };
  1639. var calcBorderWidth = function (css) {
  1640. return css['border-width'] ? Utils.removePixelSuffix(String(css['border-width'])) : '';
  1641. };
  1642. var calcBorderStyle = function (css) {
  1643. return css['border-style'] ? String(css['border-style']) : '';
  1644. };
  1645. var calcStyle = function (parseStyle, serializeStyle, css) {
  1646. return serializeStyle(parseStyle(serializeStyle(css)));
  1647. };
  1648. var changeStyle2 = function (parseStyle, serializeStyle, data) {
  1649. var css = Utils.mergeMargins(parseStyle(data.style));
  1650. var dataCopy = deepMerge({}, data);
  1651. dataCopy.vspace = calcVSpace(css);
  1652. dataCopy.hspace = calcHSpace(css);
  1653. dataCopy.border = calcBorderWidth(css);
  1654. dataCopy.borderstyle = calcBorderStyle(css);
  1655. dataCopy.style = calcStyle(parseStyle, serializeStyle, css);
  1656. return dataCopy;
  1657. };
  1658. var changeStyle = function (helpers, api) {
  1659. var data = api.getData();
  1660. var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data);
  1661. api.setData(newData);
  1662. };
  1663. var changeAStyle = function (helpers, info, api) {
  1664. var data = deepMerge(fromImageData(info.image), api.getData());
  1665. var style = getStyleValue(helpers.normalizeCss, toImageData(data));
  1666. api.setData({ style: style });
  1667. };
  1668. var changeFileInput = function (helpers, info, state, api) {
  1669. var data = api.getData();
  1670. api.block('Uploading image');
  1671. head(data.fileinput).fold(function () {
  1672. api.unblock();
  1673. }, function (file) {
  1674. var blobUri = URL.createObjectURL(file);
  1675. var uploader = Uploader({
  1676. url: info.url,
  1677. basePath: info.basePath,
  1678. credentials: info.credentials,
  1679. handler: info.handler
  1680. });
  1681. var finalize = function () {
  1682. api.unblock();
  1683. URL.revokeObjectURL(blobUri);
  1684. };
  1685. Utils.blobToDataUri(file).then(function (dataUrl) {
  1686. var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl);
  1687. uploader.upload(blobInfo).then(function (url) {
  1688. api.setData({
  1689. src: {
  1690. value: url,
  1691. meta: {}
  1692. }
  1693. });
  1694. api.showTab('general');
  1695. changeSrc(helpers, info, state, api);
  1696. finalize();
  1697. }).catch(function (err) {
  1698. finalize();
  1699. helpers.alertErr(api, err);
  1700. });
  1701. });
  1702. });
  1703. };
  1704. var changeHandler = function (helpers, info, state) {
  1705. return function (api, evt) {
  1706. if (evt.name === 'src') {
  1707. changeSrc(helpers, info, state, api);
  1708. } else if (evt.name === 'images') {
  1709. changeImages(helpers, info, state, api);
  1710. } else if (evt.name === 'alt') {
  1711. state.prevAlt = api.getData().alt;
  1712. } else if (evt.name === 'style') {
  1713. changeStyle(helpers, api);
  1714. } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') {
  1715. changeAStyle(helpers, info, api);
  1716. } else if (evt.name === 'fileinput') {
  1717. changeFileInput(helpers, info, state, api);
  1718. }
  1719. };
  1720. };
  1721. var closeHandler = function (state) {
  1722. return function () {
  1723. state.open = false;
  1724. };
  1725. };
  1726. var makeDialogBody = function (info) {
  1727. if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) {
  1728. var tabPanel = {
  1729. type: 'tabpanel',
  1730. tabs: flatten([
  1731. [MainTab.makeTab(info)],
  1732. info.hasAdvTab ? [AdvTab.makeTab(info)] : [],
  1733. info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : []
  1734. ])
  1735. };
  1736. return tabPanel;
  1737. } else {
  1738. var panel = {
  1739. type: 'panel',
  1740. items: MainTab.makeItems(info)
  1741. };
  1742. return panel;
  1743. }
  1744. };
  1745. var makeDialog = function (helpers) {
  1746. return function (info) {
  1747. var state = createState(info);
  1748. return {
  1749. title: 'Insert/Edit Image',
  1750. size: 'normal',
  1751. body: makeDialogBody(info),
  1752. buttons: [
  1753. {
  1754. type: 'cancel',
  1755. name: 'cancel',
  1756. text: 'Cancel'
  1757. },
  1758. {
  1759. type: 'submit',
  1760. name: 'save',
  1761. text: 'Save',
  1762. primary: true
  1763. }
  1764. ],
  1765. initialData: fromImageData(info.image),
  1766. onSubmit: helpers.onSubmit(info),
  1767. onChange: changeHandler(helpers, info, state),
  1768. onClose: closeHandler(state)
  1769. };
  1770. };
  1771. };
  1772. var submitHandler = function (editor) {
  1773. return function (info) {
  1774. return function (api) {
  1775. var data = deepMerge(fromImageData(info.image), api.getData());
  1776. editor.undoManager.transact(function () {
  1777. insertOrUpdateImage(editor, toImageData(data));
  1778. });
  1779. editor.editorUpload.uploadImagesAuto();
  1780. api.close();
  1781. };
  1782. };
  1783. };
  1784. var imageSize = function (editor) {
  1785. return function (url) {
  1786. return FutureResult.nu(function (completer) {
  1787. Utils.getImageSize(editor.documentBaseURI.toAbsolute(url), function (data) {
  1788. var result = data.map(function (dimensions) {
  1789. return {
  1790. width: String(dimensions.width),
  1791. height: String(dimensions.height)
  1792. };
  1793. });
  1794. completer(result);
  1795. });
  1796. });
  1797. };
  1798. };
  1799. var createBlobCache = function (editor) {
  1800. return function (file, blobUri, dataUrl) {
  1801. return editor.editorUpload.blobCache.create({
  1802. blob: file,
  1803. blobUri: blobUri,
  1804. name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null,
  1805. base64: dataUrl.split(',')[1]
  1806. });
  1807. };
  1808. };
  1809. var alertErr = function (editor) {
  1810. return function (api, message) {
  1811. editor.windowManager.alert(message, api.close);
  1812. };
  1813. };
  1814. var normalizeCss$1 = function (editor) {
  1815. return function (cssText) {
  1816. return normalizeCss(editor, cssText);
  1817. };
  1818. };
  1819. var parseStyle = function (editor) {
  1820. return function (cssText) {
  1821. return editor.dom.parseStyle(cssText);
  1822. };
  1823. };
  1824. var serializeStyle = function (editor) {
  1825. return function (stylesArg, name) {
  1826. return editor.dom.serializeStyle(stylesArg, name);
  1827. };
  1828. };
  1829. var Dialog = function (editor) {
  1830. var helpers = {
  1831. onSubmit: submitHandler(editor),
  1832. imageSize: imageSize(editor),
  1833. createBlobCache: createBlobCache(editor),
  1834. alertErr: alertErr(editor),
  1835. normalizeCss: normalizeCss$1(editor),
  1836. parseStyle: parseStyle(editor),
  1837. serializeStyle: serializeStyle(editor)
  1838. };
  1839. var open = function () {
  1840. return collect(editor).map(makeDialog(helpers)).get(function (spec) {
  1841. editor.windowManager.open(spec);
  1842. });
  1843. };
  1844. return { open: open };
  1845. };
  1846. var register = function (editor) {
  1847. editor.addCommand('mceImage', Dialog(editor).open);
  1848. };
  1849. var Commands = { register: register };
  1850. var hasImageClass = function (node) {
  1851. var className = node.attr('class');
  1852. return className && /\bimage\b/.test(className);
  1853. };
  1854. var toggleContentEditableState = function (state) {
  1855. return function (nodes) {
  1856. var i = nodes.length;
  1857. var toggleContentEditable = function (node) {
  1858. node.attr('contenteditable', state ? 'true' : null);
  1859. };
  1860. while (i--) {
  1861. var node = nodes[i];
  1862. if (hasImageClass(node)) {
  1863. node.attr('contenteditable', state ? 'false' : null);
  1864. global$4.each(node.getAll('figcaption'), toggleContentEditable);
  1865. }
  1866. }
  1867. };
  1868. };
  1869. var setup = function (editor) {
  1870. editor.on('PreInit', function () {
  1871. editor.parser.addNodeFilter('figure', toggleContentEditableState(true));
  1872. editor.serializer.addNodeFilter('figure', toggleContentEditableState(false));
  1873. });
  1874. };
  1875. var FilterContent = { setup: setup };
  1876. var fromHtml = function (html, scope) {
  1877. var doc = scope || domGlobals.document;
  1878. var div = doc.createElement('div');
  1879. div.innerHTML = html;
  1880. if (!div.hasChildNodes() || div.childNodes.length > 1) {
  1881. domGlobals.console.error('HTML does not have a single root node', html);
  1882. throw new Error('HTML must have a single root node');
  1883. }
  1884. return fromDom(div.childNodes[0]);
  1885. };
  1886. var fromTag = function (tag, scope) {
  1887. var doc = scope || domGlobals.document;
  1888. var node = doc.createElement(tag);
  1889. return fromDom(node);
  1890. };
  1891. var fromText = function (text, scope) {
  1892. var doc = scope || domGlobals.document;
  1893. var node = doc.createTextNode(text);
  1894. return fromDom(node);
  1895. };
  1896. var fromDom = function (node) {
  1897. if (node === null || node === undefined) {
  1898. throw new Error('Node cannot be null or undefined');
  1899. }
  1900. return { dom: constant(node) };
  1901. };
  1902. var fromPoint = function (docElm, x, y) {
  1903. var doc = docElm.dom();
  1904. return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
  1905. };
  1906. var Element = {
  1907. fromHtml: fromHtml,
  1908. fromTag: fromTag,
  1909. fromText: fromText,
  1910. fromDom: fromDom,
  1911. fromPoint: fromPoint
  1912. };
  1913. var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
  1914. var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
  1915. var COMMENT = domGlobals.Node.COMMENT_NODE;
  1916. var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
  1917. var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
  1918. var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
  1919. var ELEMENT = domGlobals.Node.ELEMENT_NODE;
  1920. var TEXT = domGlobals.Node.TEXT_NODE;
  1921. var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
  1922. var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
  1923. var ENTITY = domGlobals.Node.ENTITY_NODE;
  1924. var NOTATION = domGlobals.Node.NOTATION_NODE;
  1925. var name = function (element) {
  1926. var r = element.dom().nodeName;
  1927. return r.toLowerCase();
  1928. };
  1929. var Immutable = function () {
  1930. var fields = [];
  1931. for (var _i = 0; _i < arguments.length; _i++) {
  1932. fields[_i] = arguments[_i];
  1933. }
  1934. return function () {
  1935. var values = [];
  1936. for (var _i = 0; _i < arguments.length; _i++) {
  1937. values[_i] = arguments[_i];
  1938. }
  1939. if (fields.length !== values.length) {
  1940. throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments');
  1941. }
  1942. var struct = {};
  1943. each(fields, function (name, i) {
  1944. struct[name] = constant(values[i]);
  1945. });
  1946. return struct;
  1947. };
  1948. };
  1949. var node = function () {
  1950. var f = Global$1.getOrDie('Node');
  1951. return f;
  1952. };
  1953. var compareDocumentPosition = function (a, b, match) {
  1954. return (a.compareDocumentPosition(b) & match) !== 0;
  1955. };
  1956. var documentPositionPreceding = function (a, b) {
  1957. return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
  1958. };
  1959. var documentPositionContainedBy = function (a, b) {
  1960. return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
  1961. };
  1962. var Node = {
  1963. documentPositionPreceding: documentPositionPreceding,
  1964. documentPositionContainedBy: documentPositionContainedBy
  1965. };
  1966. var cached = function (f) {
  1967. var called = false;
  1968. var r;
  1969. return function () {
  1970. var args = [];
  1971. for (var _i = 0; _i < arguments.length; _i++) {
  1972. args[_i] = arguments[_i];
  1973. }
  1974. if (!called) {
  1975. called = true;
  1976. r = f.apply(null, args);
  1977. }
  1978. return r;
  1979. };
  1980. };
  1981. var firstMatch = function (regexes, s) {
  1982. for (var i = 0; i < regexes.length; i++) {
  1983. var x = regexes[i];
  1984. if (x.test(s))
  1985. return x;
  1986. }
  1987. return undefined;
  1988. };
  1989. var find$1 = function (regexes, agent) {
  1990. var r = firstMatch(regexes, agent);
  1991. if (!r)
  1992. return {
  1993. major: 0,
  1994. minor: 0
  1995. };
  1996. var group = function (i) {
  1997. return Number(agent.replace(r, '$' + i));
  1998. };
  1999. return nu$3(group(1), group(2));
  2000. };
  2001. var detect = function (versionRegexes, agent) {
  2002. var cleanedAgent = String(agent).toLowerCase();
  2003. if (versionRegexes.length === 0)
  2004. return unknown();
  2005. return find$1(versionRegexes, cleanedAgent);
  2006. };
  2007. var unknown = function () {
  2008. return nu$3(0, 0);
  2009. };
  2010. var nu$3 = function (major, minor) {
  2011. return {
  2012. major: major,
  2013. minor: minor
  2014. };
  2015. };
  2016. var Version = {
  2017. nu: nu$3,
  2018. detect: detect,
  2019. unknown: unknown
  2020. };
  2021. var edge = 'Edge';
  2022. var chrome = 'Chrome';
  2023. var ie = 'IE';
  2024. var opera = 'Opera';
  2025. var firefox = 'Firefox';
  2026. var safari = 'Safari';
  2027. var isBrowser = function (name, current) {
  2028. return function () {
  2029. return current === name;
  2030. };
  2031. };
  2032. var unknown$1 = function () {
  2033. return nu$4({
  2034. current: undefined,
  2035. version: Version.unknown()
  2036. });
  2037. };
  2038. var nu$4 = function (info) {
  2039. var current = info.current;
  2040. var version = info.version;
  2041. return {
  2042. current: current,
  2043. version: version,
  2044. isEdge: isBrowser(edge, current),
  2045. isChrome: isBrowser(chrome, current),
  2046. isIE: isBrowser(ie, current),
  2047. isOpera: isBrowser(opera, current),
  2048. isFirefox: isBrowser(firefox, current),
  2049. isSafari: isBrowser(safari, current)
  2050. };
  2051. };
  2052. var Browser = {
  2053. unknown: unknown$1,
  2054. nu: nu$4,
  2055. edge: constant(edge),
  2056. chrome: constant(chrome),
  2057. ie: constant(ie),
  2058. opera: constant(opera),
  2059. firefox: constant(firefox),
  2060. safari: constant(safari)
  2061. };
  2062. var windows = 'Windows';
  2063. var ios = 'iOS';
  2064. var android = 'Android';
  2065. var linux = 'Linux';
  2066. var osx = 'OSX';
  2067. var solaris = 'Solaris';
  2068. var freebsd = 'FreeBSD';
  2069. var isOS = function (name, current) {
  2070. return function () {
  2071. return current === name;
  2072. };
  2073. };
  2074. var unknown$2 = function () {
  2075. return nu$5({
  2076. current: undefined,
  2077. version: Version.unknown()
  2078. });
  2079. };
  2080. var nu$5 = function (info) {
  2081. var current = info.current;
  2082. var version = info.version;
  2083. return {
  2084. current: current,
  2085. version: version,
  2086. isWindows: isOS(windows, current),
  2087. isiOS: isOS(ios, current),
  2088. isAndroid: isOS(android, current),
  2089. isOSX: isOS(osx, current),
  2090. isLinux: isOS(linux, current),
  2091. isSolaris: isOS(solaris, current),
  2092. isFreeBSD: isOS(freebsd, current)
  2093. };
  2094. };
  2095. var OperatingSystem = {
  2096. unknown: unknown$2,
  2097. nu: nu$5,
  2098. windows: constant(windows),
  2099. ios: constant(ios),
  2100. android: constant(android),
  2101. linux: constant(linux),
  2102. osx: constant(osx),
  2103. solaris: constant(solaris),
  2104. freebsd: constant(freebsd)
  2105. };
  2106. var DeviceType = function (os, browser, userAgent) {
  2107. var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
  2108. var isiPhone = os.isiOS() && !isiPad;
  2109. var isAndroid3 = os.isAndroid() && os.version.major === 3;
  2110. var isAndroid4 = os.isAndroid() && os.version.major === 4;
  2111. var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true;
  2112. var isTouch = os.isiOS() || os.isAndroid();
  2113. var isPhone = isTouch && !isTablet;
  2114. var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
  2115. return {
  2116. isiPad: constant(isiPad),
  2117. isiPhone: constant(isiPhone),
  2118. isTablet: constant(isTablet),
  2119. isPhone: constant(isPhone),
  2120. isTouch: constant(isTouch),
  2121. isAndroid: os.isAndroid,
  2122. isiOS: os.isiOS,
  2123. isWebView: constant(iOSwebview)
  2124. };
  2125. };
  2126. var detect$1 = function (candidates, userAgent) {
  2127. var agent = String(userAgent).toLowerCase();
  2128. return find(candidates, function (candidate) {
  2129. return candidate.search(agent);
  2130. });
  2131. };
  2132. var detectBrowser = function (browsers, userAgent) {
  2133. return detect$1(browsers, userAgent).map(function (browser) {
  2134. var version = Version.detect(browser.versionRegexes, userAgent);
  2135. return {
  2136. current: browser.name,
  2137. version: version
  2138. };
  2139. });
  2140. };
  2141. var detectOs = function (oses, userAgent) {
  2142. return detect$1(oses, userAgent).map(function (os) {
  2143. var version = Version.detect(os.versionRegexes, userAgent);
  2144. return {
  2145. current: os.name,
  2146. version: version
  2147. };
  2148. });
  2149. };
  2150. var UaString = {
  2151. detectBrowser: detectBrowser,
  2152. detectOs: detectOs
  2153. };
  2154. var contains = function (str, substr) {
  2155. return str.indexOf(substr) !== -1;
  2156. };
  2157. var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
  2158. var checkContains = function (target) {
  2159. return function (uastring) {
  2160. return contains(uastring, target);
  2161. };
  2162. };
  2163. var browsers = [
  2164. {
  2165. name: 'Edge',
  2166. versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
  2167. search: function (uastring) {
  2168. var monstrosity = contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
  2169. return monstrosity;
  2170. }
  2171. },
  2172. {
  2173. name: 'Chrome',
  2174. versionRegexes: [
  2175. /.*?chrome\/([0-9]+)\.([0-9]+).*/,
  2176. normalVersionRegex
  2177. ],
  2178. search: function (uastring) {
  2179. return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
  2180. }
  2181. },
  2182. {
  2183. name: 'IE',
  2184. versionRegexes: [
  2185. /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
  2186. /.*?rv:([0-9]+)\.([0-9]+).*/
  2187. ],
  2188. search: function (uastring) {
  2189. return contains(uastring, 'msie') || contains(uastring, 'trident');
  2190. }
  2191. },
  2192. {
  2193. name: 'Opera',
  2194. versionRegexes: [
  2195. normalVersionRegex,
  2196. /.*?opera\/([0-9]+)\.([0-9]+).*/
  2197. ],
  2198. search: checkContains('opera')
  2199. },
  2200. {
  2201. name: 'Firefox',
  2202. versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
  2203. search: checkContains('firefox')
  2204. },
  2205. {
  2206. name: 'Safari',
  2207. versionRegexes: [
  2208. normalVersionRegex,
  2209. /.*?cpu os ([0-9]+)_([0-9]+).*/
  2210. ],
  2211. search: function (uastring) {
  2212. return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
  2213. }
  2214. }
  2215. ];
  2216. var oses = [
  2217. {
  2218. name: 'Windows',
  2219. search: checkContains('win'),
  2220. versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
  2221. },
  2222. {
  2223. name: 'iOS',
  2224. search: function (uastring) {
  2225. return contains(uastring, 'iphone') || contains(uastring, 'ipad');
  2226. },
  2227. versionRegexes: [
  2228. /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
  2229. /.*cpu os ([0-9]+)_([0-9]+).*/,
  2230. /.*cpu iphone os ([0-9]+)_([0-9]+).*/
  2231. ]
  2232. },
  2233. {
  2234. name: 'Android',
  2235. search: checkContains('android'),
  2236. versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
  2237. },
  2238. {
  2239. name: 'OSX',
  2240. search: checkContains('os x'),
  2241. versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
  2242. },
  2243. {
  2244. name: 'Linux',
  2245. search: checkContains('linux'),
  2246. versionRegexes: []
  2247. },
  2248. {
  2249. name: 'Solaris',
  2250. search: checkContains('sunos'),
  2251. versionRegexes: []
  2252. },
  2253. {
  2254. name: 'FreeBSD',
  2255. search: checkContains('freebsd'),
  2256. versionRegexes: []
  2257. }
  2258. ];
  2259. var PlatformInfo = {
  2260. browsers: constant(browsers),
  2261. oses: constant(oses)
  2262. };
  2263. var detect$2 = function (userAgent) {
  2264. var browsers = PlatformInfo.browsers();
  2265. var oses = PlatformInfo.oses();
  2266. var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);
  2267. var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
  2268. var deviceType = DeviceType(os, browser, userAgent);
  2269. return {
  2270. browser: browser,
  2271. os: os,
  2272. deviceType: deviceType
  2273. };
  2274. };
  2275. var PlatformDetection = { detect: detect$2 };
  2276. var detect$3 = cached(function () {
  2277. var userAgent = domGlobals.navigator.userAgent;
  2278. return PlatformDetection.detect(userAgent);
  2279. });
  2280. var PlatformDetection$1 = { detect: detect$3 };
  2281. var regularContains = function (e1, e2) {
  2282. var d1 = e1.dom();
  2283. var d2 = e2.dom();
  2284. return d1 === d2 ? false : d1.contains(d2);
  2285. };
  2286. var ieContains = function (e1, e2) {
  2287. return Node.documentPositionContainedBy(e1.dom(), e2.dom());
  2288. };
  2289. var browser = PlatformDetection$1.detect().browser;
  2290. var contains$1 = browser.isIE() ? ieContains : regularContains;
  2291. var parent = function (element) {
  2292. var dom = element.dom();
  2293. return Option.from(dom.parentNode).map(Element.fromDom);
  2294. };
  2295. var spot = Immutable('element', 'offset');
  2296. var getRootElement = function (elm) {
  2297. return parent(elm).filter(function (parentElm) {
  2298. return name(parentElm) === 'figure';
  2299. }).getOr(elm);
  2300. };
  2301. var register$1 = function (editor) {
  2302. var makeContextMenuItem = function (node) {
  2303. return {
  2304. text: 'Image',
  2305. icon: 'image',
  2306. onAction: function () {
  2307. var rootElm = getRootElement(Element.fromDom(node));
  2308. editor.selection.select(rootElm.dom());
  2309. Dialog(editor).open();
  2310. }
  2311. };
  2312. };
  2313. editor.ui.registry.addToggleButton('image', {
  2314. icon: 'image',
  2315. tooltip: 'Insert/edit image',
  2316. onAction: Dialog(editor).open,
  2317. onSetup: function (buttonApi) {
  2318. return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind;
  2319. }
  2320. });
  2321. editor.ui.registry.addMenuItem('image', {
  2322. icon: 'image',
  2323. text: 'Image...',
  2324. onAction: Dialog(editor).open
  2325. });
  2326. editor.ui.registry.addContextMenu('image', {
  2327. update: function (element) {
  2328. return isFigure(element) || isImage(element) && !Utils.isPlaceholderImage(element) ? [makeContextMenuItem(element)] : [];
  2329. }
  2330. });
  2331. };
  2332. var Buttons = { register: register$1 };
  2333. global.add('image', function (editor) {
  2334. FilterContent.setup(editor);
  2335. Buttons.register(editor);
  2336. Commands.register(editor);
  2337. });
  2338. function Plugin () {
  2339. }
  2340. return Plugin;
  2341. }(window));
  2342. })();