plugin.js 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402
  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.7.0 (2021-02-10)
  8. */
  9. (function () {
  10. 'use strict';
  11. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  12. var __assign = function () {
  13. __assign = Object.assign || function __assign(t) {
  14. for (var s, i = 1, n = arguments.length; i < n; i++) {
  15. s = arguments[i];
  16. for (var p in s)
  17. if (Object.prototype.hasOwnProperty.call(s, p))
  18. t[p] = s[p];
  19. }
  20. return t;
  21. };
  22. return __assign.apply(this, arguments);
  23. };
  24. var noop = function () {
  25. };
  26. var constant = function (value) {
  27. return function () {
  28. return value;
  29. };
  30. };
  31. var never = constant(false);
  32. var always = constant(true);
  33. var none = function () {
  34. return NONE;
  35. };
  36. var NONE = function () {
  37. var eq = function (o) {
  38. return o.isNone();
  39. };
  40. var call = function (thunk) {
  41. return thunk();
  42. };
  43. var id = function (n) {
  44. return n;
  45. };
  46. var me = {
  47. fold: function (n, _s) {
  48. return n();
  49. },
  50. is: never,
  51. isSome: never,
  52. isNone: always,
  53. getOr: id,
  54. getOrThunk: call,
  55. getOrDie: function (msg) {
  56. throw new Error(msg || 'error: getOrDie called on none.');
  57. },
  58. getOrNull: constant(null),
  59. getOrUndefined: constant(undefined),
  60. or: id,
  61. orThunk: call,
  62. map: none,
  63. each: noop,
  64. bind: none,
  65. exists: never,
  66. forall: always,
  67. filter: none,
  68. equals: eq,
  69. equals_: eq,
  70. toArray: function () {
  71. return [];
  72. },
  73. toString: constant('none()')
  74. };
  75. return me;
  76. }();
  77. var some = function (a) {
  78. var constant_a = constant(a);
  79. var self = function () {
  80. return me;
  81. };
  82. var bind = function (f) {
  83. return f(a);
  84. };
  85. var me = {
  86. fold: function (n, s) {
  87. return s(a);
  88. },
  89. is: function (v) {
  90. return a === v;
  91. },
  92. isSome: always,
  93. isNone: never,
  94. getOr: constant_a,
  95. getOrThunk: constant_a,
  96. getOrDie: constant_a,
  97. getOrNull: constant_a,
  98. getOrUndefined: constant_a,
  99. or: self,
  100. orThunk: self,
  101. map: function (f) {
  102. return some(f(a));
  103. },
  104. each: function (f) {
  105. f(a);
  106. },
  107. bind: bind,
  108. exists: bind,
  109. forall: bind,
  110. filter: function (f) {
  111. return f(a) ? me : NONE;
  112. },
  113. toArray: function () {
  114. return [a];
  115. },
  116. toString: function () {
  117. return 'some(' + a + ')';
  118. },
  119. equals: function (o) {
  120. return o.is(a);
  121. },
  122. equals_: function (o, elementEq) {
  123. return o.fold(never, function (b) {
  124. return elementEq(a, b);
  125. });
  126. }
  127. };
  128. return me;
  129. };
  130. var from = function (value) {
  131. return value === null || value === undefined ? NONE : some(value);
  132. };
  133. var Optional = {
  134. some: some,
  135. none: none,
  136. from: from
  137. };
  138. var typeOf = function (x) {
  139. var t = typeof x;
  140. if (x === null) {
  141. return 'null';
  142. } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  143. return 'array';
  144. } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  145. return 'string';
  146. } else {
  147. return t;
  148. }
  149. };
  150. var isType = function (type) {
  151. return function (value) {
  152. return typeOf(value) === type;
  153. };
  154. };
  155. var isString = isType('string');
  156. var isObject = isType('object');
  157. var isArray = isType('array');
  158. var isNullable = function (a) {
  159. return a === null || a === undefined;
  160. };
  161. var isNonNullable = function (a) {
  162. return !isNullable(a);
  163. };
  164. var nativePush = Array.prototype.push;
  165. var each = function (xs, f) {
  166. for (var i = 0, len = xs.length; i < len; i++) {
  167. var x = xs[i];
  168. f(x, i);
  169. }
  170. };
  171. var flatten = function (xs) {
  172. var r = [];
  173. for (var i = 0, len = xs.length; i < len; ++i) {
  174. if (!isArray(xs[i])) {
  175. throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
  176. }
  177. nativePush.apply(r, xs[i]);
  178. }
  179. return r;
  180. };
  181. var Cell = function (initial) {
  182. var value = initial;
  183. var get = function () {
  184. return value;
  185. };
  186. var set = function (v) {
  187. value = v;
  188. };
  189. return {
  190. get: get,
  191. set: set
  192. };
  193. };
  194. var keys = Object.keys;
  195. var hasOwnProperty = Object.hasOwnProperty;
  196. var each$1 = function (obj, f) {
  197. var props = keys(obj);
  198. for (var k = 0, len = props.length; k < len; k++) {
  199. var i = props[k];
  200. var x = obj[i];
  201. f(x, i);
  202. }
  203. };
  204. var objAcc = function (r) {
  205. return function (x, i) {
  206. r[i] = x;
  207. };
  208. };
  209. var internalFilter = function (obj, pred, onTrue, onFalse) {
  210. var r = {};
  211. each$1(obj, function (x, i) {
  212. (pred(x, i) ? onTrue : onFalse)(x, i);
  213. });
  214. return r;
  215. };
  216. var filter = function (obj, pred) {
  217. var t = {};
  218. internalFilter(obj, pred, objAcc(t), noop);
  219. return t;
  220. };
  221. var get = function (obj, key) {
  222. return has(obj, key) ? Optional.from(obj[key]) : Optional.none();
  223. };
  224. var has = function (obj, key) {
  225. return hasOwnProperty.call(obj, key);
  226. };
  227. var getScripts = function (editor) {
  228. return editor.getParam('media_scripts');
  229. };
  230. var getAudioTemplateCallback = function (editor) {
  231. return editor.getParam('audio_template_callback');
  232. };
  233. var getVideoTemplateCallback = function (editor) {
  234. return editor.getParam('video_template_callback');
  235. };
  236. var hasLiveEmbeds = function (editor) {
  237. return editor.getParam('media_live_embeds', true);
  238. };
  239. var shouldFilterHtml = function (editor) {
  240. return editor.getParam('media_filter_html', true);
  241. };
  242. var getUrlResolver = function (editor) {
  243. return editor.getParam('media_url_resolver');
  244. };
  245. var hasAltSource = function (editor) {
  246. return editor.getParam('media_alt_source', true);
  247. };
  248. var hasPoster = function (editor) {
  249. return editor.getParam('media_poster', true);
  250. };
  251. var hasDimensions = function (editor) {
  252. return editor.getParam('media_dimensions', true);
  253. };
  254. var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  255. var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  256. var global$3 = tinymce.util.Tools.resolve('tinymce.html.SaxParser');
  257. var getVideoScriptMatch = function (prefixes, src) {
  258. if (prefixes) {
  259. for (var i = 0; i < prefixes.length; i++) {
  260. if (src.indexOf(prefixes[i].filter) !== -1) {
  261. return prefixes[i];
  262. }
  263. }
  264. }
  265. };
  266. var DOM = global$2.DOM;
  267. var trimPx = function (value) {
  268. return value.replace(/px$/, '');
  269. };
  270. var getEphoxEmbedData = function (attrs) {
  271. var style = attrs.map.style;
  272. var styles = style ? DOM.parseStyle(style) : {};
  273. return {
  274. type: 'ephox-embed-iri',
  275. source: attrs.map['data-ephox-embed-iri'],
  276. altsource: '',
  277. poster: '',
  278. width: get(styles, 'max-width').map(trimPx).getOr(''),
  279. height: get(styles, 'max-height').map(trimPx).getOr('')
  280. };
  281. };
  282. var htmlToData = function (prefixes, html) {
  283. var isEphoxEmbed = Cell(false);
  284. var data = {};
  285. global$3({
  286. validate: false,
  287. allow_conditional_comments: true,
  288. start: function (name, attrs) {
  289. if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) {
  290. isEphoxEmbed.set(true);
  291. data = getEphoxEmbedData(attrs);
  292. } else {
  293. if (!data.source && name === 'param') {
  294. data.source = attrs.map.movie;
  295. }
  296. if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') {
  297. if (!data.type) {
  298. data.type = name;
  299. }
  300. data = global$1.extend(attrs.map, data);
  301. }
  302. if (name === 'script') {
  303. var videoScript = getVideoScriptMatch(prefixes, attrs.map.src);
  304. if (!videoScript) {
  305. return;
  306. }
  307. data = {
  308. type: 'script',
  309. source: attrs.map.src,
  310. width: String(videoScript.width),
  311. height: String(videoScript.height)
  312. };
  313. }
  314. if (name === 'source') {
  315. if (!data.source) {
  316. data.source = attrs.map.src;
  317. } else if (!data.altsource) {
  318. data.altsource = attrs.map.src;
  319. }
  320. }
  321. if (name === 'img' && !data.poster) {
  322. data.poster = attrs.map.src;
  323. }
  324. }
  325. }
  326. }).parse(html);
  327. data.source = data.source || data.src || data.data;
  328. data.altsource = data.altsource || '';
  329. data.poster = data.poster || '';
  330. return data;
  331. };
  332. var guess = function (url) {
  333. var mimes = {
  334. mp3: 'audio/mpeg',
  335. m4a: 'audio/x-m4a',
  336. wav: 'audio/wav',
  337. mp4: 'video/mp4',
  338. webm: 'video/webm',
  339. ogg: 'video/ogg',
  340. swf: 'application/x-shockwave-flash'
  341. };
  342. var fileEnd = url.toLowerCase().split('.').pop();
  343. var mime = mimes[fileEnd];
  344. return mime ? mime : '';
  345. };
  346. var global$4 = tinymce.util.Tools.resolve('tinymce.html.Schema');
  347. var global$5 = tinymce.util.Tools.resolve('tinymce.html.Writer');
  348. var DOM$1 = global$2.DOM;
  349. var addPx = function (value) {
  350. return /^[0-9.]+$/.test(value) ? value + 'px' : value;
  351. };
  352. var setAttributes = function (attrs, updatedAttrs) {
  353. each$1(updatedAttrs, function (val, name) {
  354. var value = '' + val;
  355. if (attrs.map[name]) {
  356. var i = attrs.length;
  357. while (i--) {
  358. var attr = attrs[i];
  359. if (attr.name === name) {
  360. if (value) {
  361. attrs.map[name] = value;
  362. attr.value = value;
  363. } else {
  364. delete attrs.map[name];
  365. attrs.splice(i, 1);
  366. }
  367. }
  368. }
  369. } else if (value) {
  370. attrs.push({
  371. name: name,
  372. value: value
  373. });
  374. attrs.map[name] = value;
  375. }
  376. });
  377. };
  378. var updateEphoxEmbed = function (data, attrs) {
  379. var style = attrs.map.style;
  380. var styleMap = style ? DOM$1.parseStyle(style) : {};
  381. styleMap['max-width'] = addPx(data.width);
  382. styleMap['max-height'] = addPx(data.height);
  383. setAttributes(attrs, { style: DOM$1.serializeStyle(styleMap) });
  384. };
  385. var sources = [
  386. 'source',
  387. 'altsource'
  388. ];
  389. var updateHtml = function (html, data, updateAll) {
  390. var writer = global$5();
  391. var isEphoxEmbed = Cell(false);
  392. var sourceCount = 0;
  393. var hasImage;
  394. global$3({
  395. validate: false,
  396. allow_conditional_comments: true,
  397. comment: function (text) {
  398. writer.comment(text);
  399. },
  400. cdata: function (text) {
  401. writer.cdata(text);
  402. },
  403. text: function (text, raw) {
  404. writer.text(text, raw);
  405. },
  406. start: function (name, attrs, empty) {
  407. if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) {
  408. isEphoxEmbed.set(true);
  409. updateEphoxEmbed(data, attrs);
  410. } else {
  411. switch (name) {
  412. case 'video':
  413. case 'object':
  414. case 'embed':
  415. case 'img':
  416. case 'iframe':
  417. if (data.height !== undefined && data.width !== undefined) {
  418. setAttributes(attrs, {
  419. width: data.width,
  420. height: data.height
  421. });
  422. }
  423. break;
  424. }
  425. if (updateAll) {
  426. switch (name) {
  427. case 'video':
  428. setAttributes(attrs, {
  429. poster: data.poster,
  430. src: ''
  431. });
  432. if (data.altsource) {
  433. setAttributes(attrs, { src: '' });
  434. }
  435. break;
  436. case 'iframe':
  437. setAttributes(attrs, { src: data.source });
  438. break;
  439. case 'source':
  440. if (sourceCount < 2) {
  441. setAttributes(attrs, {
  442. src: data[sources[sourceCount]],
  443. type: data[sources[sourceCount] + 'mime']
  444. });
  445. if (!data[sources[sourceCount]]) {
  446. return;
  447. }
  448. }
  449. sourceCount++;
  450. break;
  451. case 'img':
  452. if (!data.poster) {
  453. return;
  454. }
  455. hasImage = true;
  456. break;
  457. }
  458. }
  459. }
  460. writer.start(name, attrs, empty);
  461. },
  462. end: function (name) {
  463. if (!isEphoxEmbed.get()) {
  464. if (name === 'video' && updateAll) {
  465. for (var index = 0; index < 2; index++) {
  466. if (data[sources[index]]) {
  467. var attrs = [];
  468. attrs.map = {};
  469. if (sourceCount <= index) {
  470. setAttributes(attrs, {
  471. src: data[sources[index]],
  472. type: data[sources[index] + 'mime']
  473. });
  474. writer.start('source', attrs, true);
  475. }
  476. }
  477. }
  478. }
  479. if (data.poster && name === 'object' && updateAll && !hasImage) {
  480. var imgAttrs = [];
  481. imgAttrs.map = {};
  482. setAttributes(imgAttrs, {
  483. src: data.poster,
  484. width: data.width,
  485. height: data.height
  486. });
  487. writer.start('img', imgAttrs, true);
  488. }
  489. }
  490. writer.end(name);
  491. }
  492. }, global$4({})).parse(html);
  493. return writer.getContent();
  494. };
  495. var urlPatterns = [
  496. {
  497. regex: /youtu\.be\/([\w\-_\?&=.]+)/i,
  498. type: 'iframe',
  499. w: 560,
  500. h: 314,
  501. url: 'www.youtube.com/embed/$1',
  502. allowFullscreen: true
  503. },
  504. {
  505. regex: /youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,
  506. type: 'iframe',
  507. w: 560,
  508. h: 314,
  509. url: 'www.youtube.com/embed/$2?$4',
  510. allowFullscreen: true
  511. },
  512. {
  513. regex: /youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,
  514. type: 'iframe',
  515. w: 560,
  516. h: 314,
  517. url: 'www.youtube.com/embed/$1',
  518. allowFullscreen: true
  519. },
  520. {
  521. regex: /vimeo\.com\/([0-9]+)/,
  522. type: 'iframe',
  523. w: 425,
  524. h: 350,
  525. url: 'player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc',
  526. allowFullscreen: true
  527. },
  528. {
  529. regex: /vimeo\.com\/(.*)\/([0-9]+)/,
  530. type: 'iframe',
  531. w: 425,
  532. h: 350,
  533. url: 'player.vimeo.com/video/$2?title=0&amp;byline=0',
  534. allowFullscreen: true
  535. },
  536. {
  537. regex: /maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,
  538. type: 'iframe',
  539. w: 425,
  540. h: 350,
  541. url: 'maps.google.com/maps/ms?msid=$2&output=embed"',
  542. allowFullscreen: false
  543. },
  544. {
  545. regex: /dailymotion\.com\/video\/([^_]+)/,
  546. type: 'iframe',
  547. w: 480,
  548. h: 270,
  549. url: 'www.dailymotion.com/embed/video/$1',
  550. allowFullscreen: true
  551. },
  552. {
  553. regex: /dai\.ly\/([^_]+)/,
  554. type: 'iframe',
  555. w: 480,
  556. h: 270,
  557. url: 'www.dailymotion.com/embed/video/$1',
  558. allowFullscreen: true
  559. }
  560. ];
  561. var getProtocol = function (url) {
  562. var protocolMatches = url.match(/^(https?:\/\/|www\.)(.+)$/i);
  563. if (protocolMatches && protocolMatches.length > 1) {
  564. return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1];
  565. } else {
  566. return 'https://';
  567. }
  568. };
  569. var getUrl = function (pattern, url) {
  570. var protocol = getProtocol(url);
  571. var match = pattern.regex.exec(url);
  572. var newUrl = protocol + pattern.url;
  573. var _loop_1 = function (i) {
  574. newUrl = newUrl.replace('$' + i, function () {
  575. return match[i] ? match[i] : '';
  576. });
  577. };
  578. for (var i = 0; i < match.length; i++) {
  579. _loop_1(i);
  580. }
  581. return newUrl.replace(/\?$/, '');
  582. };
  583. var matchPattern = function (url) {
  584. var patterns = urlPatterns.filter(function (pattern) {
  585. return pattern.regex.test(url);
  586. });
  587. if (patterns.length > 0) {
  588. return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) });
  589. } else {
  590. return null;
  591. }
  592. };
  593. var getIframeHtml = function (data) {
  594. var allowFullscreen = data.allowfullscreen ? ' allowFullscreen="1"' : '';
  595. return '<iframe src="' + data.source + '" width="' + data.width + '" height="' + data.height + '"' + allowFullscreen + '></iframe>';
  596. };
  597. var getFlashHtml = function (data) {
  598. var html = '<object data="' + data.source + '" width="' + data.width + '" height="' + data.height + '" type="application/x-shockwave-flash">';
  599. if (data.poster) {
  600. html += '<img src="' + data.poster + '" width="' + data.width + '" height="' + data.height + '" />';
  601. }
  602. html += '</object>';
  603. return html;
  604. };
  605. var getAudioHtml = function (data, audioTemplateCallback) {
  606. if (audioTemplateCallback) {
  607. return audioTemplateCallback(data);
  608. } else {
  609. return '<audio controls="controls" src="' + data.source + '">' + (data.altsource ? '\n<source src="' + data.altsource + '"' + (data.altsourcemime ? ' type="' + data.altsourcemime + '"' : '') + ' />\n' : '') + '</audio>';
  610. }
  611. };
  612. var getVideoHtml = function (data, videoTemplateCallback) {
  613. if (videoTemplateCallback) {
  614. return videoTemplateCallback(data);
  615. } else {
  616. return '<video width="' + data.width + '" height="' + data.height + '"' + (data.poster ? ' poster="' + data.poster + '"' : '') + ' controls="controls">\n' + '<source src="' + data.source + '"' + (data.sourcemime ? ' type="' + data.sourcemime + '"' : '') + ' />\n' + (data.altsource ? '<source src="' + data.altsource + '"' + (data.altsourcemime ? ' type="' + data.altsourcemime + '"' : '') + ' />\n' : '') + '</video>';
  617. }
  618. };
  619. var getScriptHtml = function (data) {
  620. return '<script src="' + data.source + '"></script>';
  621. };
  622. var dataToHtml = function (editor, dataIn) {
  623. var data = global$1.extend({}, dataIn);
  624. if (!data.source) {
  625. global$1.extend(data, htmlToData(getScripts(editor), data.embed));
  626. if (!data.source) {
  627. return '';
  628. }
  629. }
  630. if (!data.altsource) {
  631. data.altsource = '';
  632. }
  633. if (!data.poster) {
  634. data.poster = '';
  635. }
  636. data.source = editor.convertURL(data.source, 'source');
  637. data.altsource = editor.convertURL(data.altsource, 'source');
  638. data.sourcemime = guess(data.source);
  639. data.altsourcemime = guess(data.altsource);
  640. data.poster = editor.convertURL(data.poster, 'poster');
  641. var pattern = matchPattern(data.source);
  642. if (pattern) {
  643. data.source = pattern.url;
  644. data.type = pattern.type;
  645. data.allowfullscreen = pattern.allowFullscreen;
  646. data.width = data.width || String(pattern.w);
  647. data.height = data.height || String(pattern.h);
  648. }
  649. if (data.embed) {
  650. return updateHtml(data.embed, data, true);
  651. } else {
  652. var videoScript = getVideoScriptMatch(getScripts(editor), data.source);
  653. if (videoScript) {
  654. data.type = 'script';
  655. data.width = String(videoScript.width);
  656. data.height = String(videoScript.height);
  657. }
  658. var audioTemplateCallback = getAudioTemplateCallback(editor);
  659. var videoTemplateCallback = getVideoTemplateCallback(editor);
  660. data.width = data.width || '300';
  661. data.height = data.height || '150';
  662. global$1.each(data, function (value, key) {
  663. data[key] = editor.dom.encode('' + value);
  664. });
  665. if (data.type === 'iframe') {
  666. return getIframeHtml(data);
  667. } else if (data.sourcemime === 'application/x-shockwave-flash') {
  668. return getFlashHtml(data);
  669. } else if (data.sourcemime.indexOf('audio') !== -1) {
  670. return getAudioHtml(data, audioTemplateCallback);
  671. } else if (data.type === 'script') {
  672. return getScriptHtml(data);
  673. } else {
  674. return getVideoHtml(data, videoTemplateCallback);
  675. }
  676. }
  677. };
  678. var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise');
  679. var cache = {};
  680. var embedPromise = function (data, dataToHtml, handler) {
  681. return new global$6(function (res, rej) {
  682. var wrappedResolve = function (response) {
  683. if (response.html) {
  684. cache[data.source] = response;
  685. }
  686. return res({
  687. url: data.source,
  688. html: response.html ? response.html : dataToHtml(data)
  689. });
  690. };
  691. if (cache[data.source]) {
  692. wrappedResolve(cache[data.source]);
  693. } else {
  694. handler({ url: data.source }, wrappedResolve, rej);
  695. }
  696. });
  697. };
  698. var defaultPromise = function (data, dataToHtml) {
  699. return new global$6(function (res) {
  700. res({
  701. html: dataToHtml(data),
  702. url: data.source
  703. });
  704. });
  705. };
  706. var loadedData = function (editor) {
  707. return function (data) {
  708. return dataToHtml(editor, data);
  709. };
  710. };
  711. var getEmbedHtml = function (editor, data) {
  712. var embedHandler = getUrlResolver(editor);
  713. return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));
  714. };
  715. var isCached = function (url) {
  716. return cache.hasOwnProperty(url);
  717. };
  718. var extractMeta = function (sourceInput, data) {
  719. return get(data, sourceInput).bind(function (mainData) {
  720. return get(mainData, 'meta');
  721. });
  722. };
  723. var getValue = function (data, metaData, sourceInput) {
  724. return function (prop) {
  725. var _a;
  726. var getFromData = function () {
  727. return get(data, prop);
  728. };
  729. var getFromMetaData = function () {
  730. return get(metaData, prop);
  731. };
  732. var getNonEmptyValue = function (c) {
  733. return get(c, 'value').bind(function (v) {
  734. return v.length > 0 ? Optional.some(v) : Optional.none();
  735. });
  736. };
  737. var getFromValueFirst = function () {
  738. return getFromData().bind(function (child) {
  739. return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () {
  740. return Optional.from(child);
  741. });
  742. });
  743. };
  744. var getFromMetaFirst = function () {
  745. return getFromMetaData().orThunk(function () {
  746. return getFromData().bind(function (child) {
  747. return isObject(child) ? getNonEmptyValue(child) : Optional.from(child);
  748. });
  749. });
  750. };
  751. return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a;
  752. };
  753. };
  754. var getDimensions = function (data, metaData) {
  755. var dimensions = {};
  756. get(data, 'dimensions').each(function (dims) {
  757. each([
  758. 'width',
  759. 'height'
  760. ], function (prop) {
  761. get(metaData, prop).orThunk(function () {
  762. return get(dims, prop);
  763. }).each(function (value) {
  764. return dimensions[prop] = value;
  765. });
  766. });
  767. });
  768. return dimensions;
  769. };
  770. var unwrap = function (data, sourceInput) {
  771. var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {};
  772. var get = getValue(data, metaData, sourceInput);
  773. return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData));
  774. };
  775. var wrap = function (data) {
  776. var wrapped = __assign(__assign({}, data), {
  777. source: { value: get(data, 'source').getOr('') },
  778. altsource: { value: get(data, 'altsource').getOr('') },
  779. poster: { value: get(data, 'poster').getOr('') }
  780. });
  781. each([
  782. 'width',
  783. 'height'
  784. ], function (prop) {
  785. get(data, prop).each(function (value) {
  786. var dimensions = wrapped.dimensions || {};
  787. dimensions[prop] = value;
  788. wrapped.dimensions = dimensions;
  789. });
  790. });
  791. return wrapped;
  792. };
  793. var handleError = function (editor) {
  794. return function (error) {
  795. var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.';
  796. editor.notificationManager.open({
  797. type: 'error',
  798. text: errorMessage
  799. });
  800. };
  801. };
  802. var snippetToData = function (editor, embedSnippet) {
  803. return htmlToData(getScripts(editor), embedSnippet);
  804. };
  805. var isMediaElement = function (element) {
  806. return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri');
  807. };
  808. var getEditorData = function (editor) {
  809. var element = editor.selection.getNode();
  810. var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : '';
  811. return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet));
  812. };
  813. var addEmbedHtml = function (api, editor) {
  814. return function (response) {
  815. if (isString(response.url) && response.url.trim().length > 0) {
  816. var html = response.html;
  817. var snippetData = snippetToData(editor, html);
  818. var nuData = __assign(__assign({}, snippetData), {
  819. source: response.url,
  820. embed: html
  821. });
  822. api.setData(wrap(nuData));
  823. }
  824. };
  825. };
  826. var selectPlaceholder = function (editor, beforeObjects) {
  827. var afterObjects = editor.dom.select('*[data-mce-object]');
  828. for (var i = 0; i < beforeObjects.length; i++) {
  829. for (var y = afterObjects.length - 1; y >= 0; y--) {
  830. if (beforeObjects[i] === afterObjects[y]) {
  831. afterObjects.splice(y, 1);
  832. }
  833. }
  834. }
  835. editor.selection.select(afterObjects[0]);
  836. };
  837. var handleInsert = function (editor, html) {
  838. var beforeObjects = editor.dom.select('*[data-mce-object]');
  839. editor.insertContent(html);
  840. selectPlaceholder(editor, beforeObjects);
  841. editor.nodeChanged();
  842. };
  843. var submitForm = function (prevData, newData, editor) {
  844. newData.embed = updateHtml(newData.embed, newData);
  845. if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) {
  846. handleInsert(editor, newData.embed);
  847. } else {
  848. getEmbedHtml(editor, newData).then(function (response) {
  849. handleInsert(editor, response.html);
  850. }).catch(handleError(editor));
  851. }
  852. };
  853. var showDialog = function (editor) {
  854. var editorData = getEditorData(editor);
  855. var currentData = Cell(editorData);
  856. var initialData = wrap(editorData);
  857. var handleSource = function (prevData, api) {
  858. var serviceData = unwrap(api.getData(), 'source');
  859. if (prevData.source !== serviceData.source) {
  860. addEmbedHtml(win, editor)({
  861. url: serviceData.source,
  862. html: ''
  863. });
  864. getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor));
  865. }
  866. };
  867. var handleEmbed = function (api) {
  868. var data = unwrap(api.getData());
  869. var dataFromEmbed = snippetToData(editor, data.embed);
  870. api.setData(wrap(dataFromEmbed));
  871. };
  872. var handleUpdate = function (api, sourceInput) {
  873. var data = unwrap(api.getData(), sourceInput);
  874. var embed = dataToHtml(editor, data);
  875. api.setData(wrap(__assign(__assign({}, data), { embed: embed })));
  876. };
  877. var mediaInput = [{
  878. name: 'source',
  879. type: 'urlinput',
  880. filetype: 'media',
  881. label: 'Source'
  882. }];
  883. var sizeInput = !hasDimensions(editor) ? [] : [{
  884. type: 'sizeinput',
  885. name: 'dimensions',
  886. label: 'Constrain proportions',
  887. constrain: true
  888. }];
  889. var generalTab = {
  890. title: 'General',
  891. name: 'general',
  892. items: flatten([
  893. mediaInput,
  894. sizeInput
  895. ])
  896. };
  897. var embedTextarea = {
  898. type: 'textarea',
  899. name: 'embed',
  900. label: 'Paste your embed code below:'
  901. };
  902. var embedTab = {
  903. title: 'Embed',
  904. items: [embedTextarea]
  905. };
  906. var advancedFormItems = [];
  907. if (hasAltSource(editor)) {
  908. advancedFormItems.push({
  909. name: 'altsource',
  910. type: 'urlinput',
  911. filetype: 'media',
  912. label: 'Alternative source URL'
  913. });
  914. }
  915. if (hasPoster(editor)) {
  916. advancedFormItems.push({
  917. name: 'poster',
  918. type: 'urlinput',
  919. filetype: 'image',
  920. label: 'Media poster (Image URL)'
  921. });
  922. }
  923. var advancedTab = {
  924. title: 'Advanced',
  925. name: 'advanced',
  926. items: advancedFormItems
  927. };
  928. var tabs = [
  929. generalTab,
  930. embedTab
  931. ];
  932. if (advancedFormItems.length > 0) {
  933. tabs.push(advancedTab);
  934. }
  935. var body = {
  936. type: 'tabpanel',
  937. tabs: tabs
  938. };
  939. var win = editor.windowManager.open({
  940. title: 'Insert/Edit Media',
  941. size: 'normal',
  942. body: body,
  943. buttons: [
  944. {
  945. type: 'cancel',
  946. name: 'cancel',
  947. text: 'Cancel'
  948. },
  949. {
  950. type: 'submit',
  951. name: 'save',
  952. text: 'Save',
  953. primary: true
  954. }
  955. ],
  956. onSubmit: function (api) {
  957. var serviceData = unwrap(api.getData());
  958. submitForm(currentData.get(), serviceData, editor);
  959. api.close();
  960. },
  961. onChange: function (api, detail) {
  962. switch (detail.name) {
  963. case 'source':
  964. handleSource(currentData.get(), api);
  965. break;
  966. case 'embed':
  967. handleEmbed(api);
  968. break;
  969. case 'dimensions':
  970. case 'altsource':
  971. case 'poster':
  972. handleUpdate(api, detail.name);
  973. break;
  974. }
  975. currentData.set(unwrap(api.getData()));
  976. },
  977. initialData: initialData
  978. });
  979. };
  980. var get$1 = function (editor) {
  981. var showDialog$1 = function () {
  982. showDialog(editor);
  983. };
  984. return { showDialog: showDialog$1 };
  985. };
  986. var register = function (editor) {
  987. var showDialog$1 = function () {
  988. showDialog(editor);
  989. };
  990. editor.addCommand('mceMedia', showDialog$1);
  991. };
  992. var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node');
  993. var global$8 = tinymce.util.Tools.resolve('tinymce.Env');
  994. var global$9 = tinymce.util.Tools.resolve('tinymce.html.DomParser');
  995. var sanitize = function (editor, html) {
  996. if (shouldFilterHtml(editor) === false) {
  997. return html;
  998. }
  999. var writer = global$5();
  1000. var blocked;
  1001. global$3({
  1002. validate: false,
  1003. allow_conditional_comments: false,
  1004. comment: function (text) {
  1005. if (!blocked) {
  1006. writer.comment(text);
  1007. }
  1008. },
  1009. cdata: function (text) {
  1010. if (!blocked) {
  1011. writer.cdata(text);
  1012. }
  1013. },
  1014. text: function (text, raw) {
  1015. if (!blocked) {
  1016. writer.text(text, raw);
  1017. }
  1018. },
  1019. start: function (name, attrs, empty) {
  1020. blocked = true;
  1021. if (name === 'script' || name === 'noscript' || name === 'svg') {
  1022. return;
  1023. }
  1024. for (var i = attrs.length - 1; i >= 0; i--) {
  1025. var attrName = attrs[i].name;
  1026. if (attrName.indexOf('on') === 0) {
  1027. delete attrs.map[attrName];
  1028. attrs.splice(i, 1);
  1029. }
  1030. if (attrName === 'style') {
  1031. attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name);
  1032. }
  1033. }
  1034. writer.start(name, attrs, empty);
  1035. blocked = false;
  1036. },
  1037. end: function (name) {
  1038. if (blocked) {
  1039. return;
  1040. }
  1041. writer.end(name);
  1042. }
  1043. }, global$4({})).parse(html);
  1044. return writer.getContent();
  1045. };
  1046. var isLiveEmbedNode = function (node) {
  1047. var name = node.name;
  1048. return name === 'iframe' || name === 'video' || name === 'audio';
  1049. };
  1050. var getDimension = function (node, styles, dimension, defaultValue) {
  1051. if (defaultValue === void 0) {
  1052. defaultValue = null;
  1053. }
  1054. var value = node.attr(dimension);
  1055. if (isNonNullable(value)) {
  1056. return value;
  1057. } else if (!has(styles, dimension)) {
  1058. return defaultValue;
  1059. } else {
  1060. return null;
  1061. }
  1062. };
  1063. var setDimensions = function (node, previewNode, styles) {
  1064. var useDefaults = previewNode.name === 'img' || node.name === 'video';
  1065. var defaultWidth = useDefaults ? '300' : null;
  1066. var fallbackHeight = node.name === 'audio' ? '30' : '150';
  1067. var defaultHeight = useDefaults ? fallbackHeight : null;
  1068. previewNode.attr({
  1069. width: getDimension(node, styles, 'width', defaultWidth),
  1070. height: getDimension(node, styles, 'height', defaultHeight)
  1071. });
  1072. };
  1073. var appendNodeContent = function (editor, nodeName, previewNode, html) {
  1074. var newNode = global$9({
  1075. forced_root_block: false,
  1076. validate: false
  1077. }, editor.schema).parse(html, { context: nodeName });
  1078. while (newNode.firstChild) {
  1079. previewNode.append(newNode.firstChild);
  1080. }
  1081. };
  1082. var createPlaceholderNode = function (editor, node) {
  1083. var name = node.name;
  1084. var placeHolder = new global$7('img', 1);
  1085. placeHolder.shortEnded = true;
  1086. retainAttributesAndInnerHtml(editor, node, placeHolder);
  1087. setDimensions(node, placeHolder, {});
  1088. placeHolder.attr({
  1089. 'style': node.attr('style'),
  1090. 'src': global$8.transparentSrc,
  1091. 'data-mce-object': name,
  1092. 'class': 'mce-object mce-object-' + name
  1093. });
  1094. return placeHolder;
  1095. };
  1096. var createPreviewNode = function (editor, node) {
  1097. var name = node.name;
  1098. var styles = editor.dom.parseStyle(node.attr('style'));
  1099. var filteredStyles = filter(styles, function (value, key) {
  1100. return key !== 'width' && key !== 'height';
  1101. });
  1102. var previewWrapper = new global$7('span', 1);
  1103. previewWrapper.attr({
  1104. 'contentEditable': 'false',
  1105. 'style': editor.dom.serializeStyle(filteredStyles),
  1106. 'data-mce-object': name,
  1107. 'class': 'mce-preview-object mce-object-' + name
  1108. });
  1109. retainAttributesAndInnerHtml(editor, node, previewWrapper);
  1110. var previewNode = new global$7(name, 1);
  1111. setDimensions(node, previewNode, styles);
  1112. previewNode.attr({
  1113. src: node.attr('src'),
  1114. style: node.attr('style'),
  1115. class: node.attr('class')
  1116. });
  1117. if (name === 'iframe') {
  1118. previewNode.attr({
  1119. allowfullscreen: node.attr('allowfullscreen'),
  1120. frameborder: '0'
  1121. });
  1122. } else {
  1123. var attrs = [
  1124. 'controls',
  1125. 'crossorigin',
  1126. 'currentTime',
  1127. 'loop',
  1128. 'muted',
  1129. 'poster',
  1130. 'preload'
  1131. ];
  1132. each(attrs, function (attrName) {
  1133. previewNode.attr(attrName, node.attr(attrName));
  1134. });
  1135. var sanitizedHtml = previewWrapper.attr('data-mce-html');
  1136. if (isNonNullable(sanitizedHtml)) {
  1137. appendNodeContent(editor, name, previewNode, sanitizedHtml);
  1138. }
  1139. }
  1140. var shimNode = new global$7('span', 1);
  1141. shimNode.attr('class', 'mce-shim');
  1142. previewWrapper.append(previewNode);
  1143. previewWrapper.append(shimNode);
  1144. return previewWrapper;
  1145. };
  1146. var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) {
  1147. var attribs = sourceNode.attributes;
  1148. var ai = attribs.length;
  1149. while (ai--) {
  1150. var attrName = attribs[ai].name;
  1151. var attrValue = attribs[ai].value;
  1152. if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') {
  1153. if (attrName === 'data' || attrName === 'src') {
  1154. attrValue = editor.convertURL(attrValue, attrName);
  1155. }
  1156. targetNode.attr('data-mce-p-' + attrName, attrValue);
  1157. }
  1158. }
  1159. var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value;
  1160. if (innerHtml) {
  1161. targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml)));
  1162. targetNode.firstChild = null;
  1163. }
  1164. };
  1165. var isPageEmbedWrapper = function (node) {
  1166. var nodeClass = node.attr('class');
  1167. return nodeClass && /\btiny-pageembed\b/.test(nodeClass);
  1168. };
  1169. var isWithinEmbedWrapper = function (node) {
  1170. while (node = node.parent) {
  1171. if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) {
  1172. return true;
  1173. }
  1174. }
  1175. return false;
  1176. };
  1177. var placeHolderConverter = function (editor) {
  1178. return function (nodes) {
  1179. var i = nodes.length;
  1180. var node;
  1181. var videoScript;
  1182. while (i--) {
  1183. node = nodes[i];
  1184. if (!node.parent) {
  1185. continue;
  1186. }
  1187. if (node.parent.attr('data-mce-object')) {
  1188. continue;
  1189. }
  1190. if (node.name === 'script') {
  1191. videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src'));
  1192. if (!videoScript) {
  1193. continue;
  1194. }
  1195. }
  1196. if (videoScript) {
  1197. if (videoScript.width) {
  1198. node.attr('width', videoScript.width.toString());
  1199. }
  1200. if (videoScript.height) {
  1201. node.attr('height', videoScript.height.toString());
  1202. }
  1203. }
  1204. if (isLiveEmbedNode(node) && hasLiveEmbeds(editor) && global$8.ceFalse) {
  1205. if (!isWithinEmbedWrapper(node)) {
  1206. node.replace(createPreviewNode(editor, node));
  1207. }
  1208. } else {
  1209. if (!isWithinEmbedWrapper(node)) {
  1210. node.replace(createPlaceholderNode(editor, node));
  1211. }
  1212. }
  1213. }
  1214. };
  1215. };
  1216. var setup = function (editor) {
  1217. editor.on('preInit', function () {
  1218. var specialElements = editor.schema.getSpecialElements();
  1219. global$1.each('video audio iframe object'.split(' '), function (name) {
  1220. specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
  1221. });
  1222. var boolAttrs = editor.schema.getBoolAttrs();
  1223. global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) {
  1224. boolAttrs[name] = {};
  1225. });
  1226. editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor));
  1227. editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) {
  1228. var i = nodes.length;
  1229. var node;
  1230. var realElm;
  1231. var ai;
  1232. var attribs;
  1233. var innerHtml;
  1234. var innerNode;
  1235. var realElmName;
  1236. var className;
  1237. while (i--) {
  1238. node = nodes[i];
  1239. if (!node.parent) {
  1240. continue;
  1241. }
  1242. realElmName = node.attr(name);
  1243. realElm = new global$7(realElmName, 1);
  1244. if (realElmName !== 'audio' && realElmName !== 'script') {
  1245. className = node.attr('class');
  1246. if (className && className.indexOf('mce-preview-object') !== -1) {
  1247. realElm.attr({
  1248. width: node.firstChild.attr('width'),
  1249. height: node.firstChild.attr('height')
  1250. });
  1251. } else {
  1252. realElm.attr({
  1253. width: node.attr('width'),
  1254. height: node.attr('height')
  1255. });
  1256. }
  1257. }
  1258. realElm.attr({ style: node.attr('style') });
  1259. attribs = node.attributes;
  1260. ai = attribs.length;
  1261. while (ai--) {
  1262. var attrName = attribs[ai].name;
  1263. if (attrName.indexOf('data-mce-p-') === 0) {
  1264. realElm.attr(attrName.substr(11), attribs[ai].value);
  1265. }
  1266. }
  1267. if (realElmName === 'script') {
  1268. realElm.attr('type', 'text/javascript');
  1269. }
  1270. innerHtml = node.attr('data-mce-html');
  1271. if (innerHtml) {
  1272. innerNode = new global$7('#text', 3);
  1273. innerNode.raw = true;
  1274. innerNode.value = sanitize(editor, unescape(innerHtml));
  1275. realElm.append(innerNode);
  1276. }
  1277. node.replace(realElm);
  1278. }
  1279. });
  1280. });
  1281. editor.on('SetContent', function () {
  1282. editor.$('span.mce-preview-object').each(function (index, elm) {
  1283. var $elm = editor.$(elm);
  1284. if ($elm.find('span.mce-shim').length === 0) {
  1285. $elm.append('<span class="mce-shim"></span>');
  1286. }
  1287. });
  1288. });
  1289. };
  1290. var setup$1 = function (editor) {
  1291. editor.on('ResolveName', function (e) {
  1292. var name;
  1293. if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {
  1294. e.name = name;
  1295. }
  1296. });
  1297. };
  1298. var setup$2 = function (editor) {
  1299. editor.on('click keyup touchend', function () {
  1300. var selectedNode = editor.selection.getNode();
  1301. if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {
  1302. if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {
  1303. selectedNode.setAttribute('data-mce-selected', '2');
  1304. }
  1305. }
  1306. });
  1307. editor.on('ObjectSelected', function (e) {
  1308. var objectType = e.target.getAttribute('data-mce-object');
  1309. if (objectType === 'script') {
  1310. e.preventDefault();
  1311. }
  1312. });
  1313. editor.on('ObjectResized', function (e) {
  1314. var target = e.target;
  1315. var html;
  1316. if (target.getAttribute('data-mce-object')) {
  1317. html = target.getAttribute('data-mce-html');
  1318. if (html) {
  1319. html = unescape(html);
  1320. target.setAttribute('data-mce-html', escape(updateHtml(html, {
  1321. width: String(e.width),
  1322. height: String(e.height)
  1323. })));
  1324. }
  1325. }
  1326. });
  1327. };
  1328. var stateSelectorAdapter = function (editor, selector) {
  1329. return function (buttonApi) {
  1330. return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind;
  1331. };
  1332. };
  1333. var register$1 = function (editor) {
  1334. editor.ui.registry.addToggleButton('media', {
  1335. tooltip: 'Insert/edit media',
  1336. icon: 'embed',
  1337. onAction: function () {
  1338. editor.execCommand('mceMedia');
  1339. },
  1340. onSetup: stateSelectorAdapter(editor, [
  1341. 'img[data-mce-object]',
  1342. 'span[data-mce-object]',
  1343. 'div[data-ephox-embed-iri]'
  1344. ])
  1345. });
  1346. editor.ui.registry.addMenuItem('media', {
  1347. icon: 'embed',
  1348. text: 'Media...',
  1349. onAction: function () {
  1350. editor.execCommand('mceMedia');
  1351. }
  1352. });
  1353. };
  1354. function Plugin () {
  1355. global.add('media', function (editor) {
  1356. register(editor);
  1357. register$1(editor);
  1358. setup$1(editor);
  1359. setup(editor);
  1360. setup$2(editor);
  1361. return get$1(editor);
  1362. });
  1363. }
  1364. Plugin();
  1365. }());