plugin.js 43 KB

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