plugin.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. /**
  2. * Copyright (c) Tiny Technologies, Inc. All rights reserved.
  3. * Licensed under the LGPL or a commercial license.
  4. * For LGPL see License.txt in the project root for license information.
  5. * For commercial licenses see https://www.tiny.cloud/
  6. *
  7. * Version: 5.0.1 (2019-02-21)
  8. */
  9. (function () {
  10. var quickbars = (function (domGlobals) {
  11. 'use strict';
  12. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  13. var unique = 0;
  14. var generate = function (prefix) {
  15. var date = new Date();
  16. var time = date.getTime();
  17. var random = Math.floor(Math.random() * 1000000000);
  18. unique++;
  19. return prefix + '_' + random + unique + String(time);
  20. };
  21. var createTableHtml = function (cols, rows) {
  22. var x, y, html;
  23. html = '<table data-mce-id="mce" style="width: 100%">';
  24. html += '<tbody>';
  25. for (y = 0; y < rows; y++) {
  26. html += '<tr>';
  27. for (x = 0; x < cols; x++) {
  28. html += '<td><br></td>';
  29. }
  30. html += '</tr>';
  31. }
  32. html += '</tbody>';
  33. html += '</table>';
  34. return html;
  35. };
  36. var getInsertedElement = function (editor) {
  37. var elms = editor.dom.select('*[data-mce-id]');
  38. return elms[0];
  39. };
  40. var insertTableHtml = function (editor, cols, rows) {
  41. editor.undoManager.transact(function () {
  42. var tableElm, cellElm;
  43. editor.insertContent(createTableHtml(cols, rows));
  44. tableElm = getInsertedElement(editor);
  45. tableElm.removeAttribute('data-mce-id');
  46. cellElm = editor.dom.select('td,th', tableElm);
  47. editor.selection.setCursorLocation(cellElm[0], 0);
  48. });
  49. };
  50. var insertTable = function (editor, cols, rows) {
  51. editor.plugins.table ? editor.plugins.table.insertTable(cols, rows) : insertTableHtml(editor, cols, rows);
  52. };
  53. var insertBlob = function (editor, base64, blob) {
  54. var blobCache, blobInfo;
  55. blobCache = editor.editorUpload.blobCache;
  56. blobInfo = blobCache.create(generate('mceu'), blob, base64);
  57. blobCache.add(blobInfo);
  58. editor.insertContent(editor.dom.createHTML('img', { src: blobInfo.blobUri() }));
  59. };
  60. var Actions = {
  61. insertTable: insertTable,
  62. insertBlob: insertBlob
  63. };
  64. var Global = typeof window !== 'undefined' ? window : Function('return this;')();
  65. var path = function (parts, scope) {
  66. var o = scope !== undefined && scope !== null ? scope : Global;
  67. for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i)
  68. o = o[parts[i]];
  69. return o;
  70. };
  71. var resolve = function (p, scope) {
  72. var parts = p.split('.');
  73. return path(parts, scope);
  74. };
  75. var unsafe = function (name, scope) {
  76. return resolve(name, scope);
  77. };
  78. var getOrDie = function (name, scope) {
  79. var actual = unsafe(name, scope);
  80. if (actual === undefined || actual === null)
  81. throw name + ' not available on this browser';
  82. return actual;
  83. };
  84. var Global$1 = { getOrDie: getOrDie };
  85. function FileReader () {
  86. var f = Global$1.getOrDie('FileReader');
  87. return new f();
  88. }
  89. var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise');
  90. var blobToBase64 = function (blob) {
  91. return new global$1(function (resolve) {
  92. var reader = FileReader();
  93. reader.onloadend = function () {
  94. resolve(reader.result.split(',')[1]);
  95. };
  96. reader.readAsDataURL(blob);
  97. });
  98. };
  99. var Conversions = { blobToBase64: blobToBase64 };
  100. var pickFile = function () {
  101. return new global$1(function (resolve) {
  102. var fileInput;
  103. fileInput = domGlobals.document.createElement('input');
  104. fileInput.type = 'file';
  105. fileInput.style.position = 'fixed';
  106. fileInput.style.left = 0;
  107. fileInput.style.top = 0;
  108. fileInput.style.opacity = 0.001;
  109. domGlobals.document.body.appendChild(fileInput);
  110. fileInput.onchange = function (e) {
  111. resolve(Array.prototype.slice.call(e.target.files));
  112. };
  113. fileInput.click();
  114. fileInput.parentNode.removeChild(fileInput);
  115. });
  116. };
  117. var Picker = { pickFile: pickFile };
  118. var setupButtons = function (editor) {
  119. editor.ui.registry.addButton('quickimage', {
  120. icon: 'image',
  121. tooltip: 'Insert image',
  122. onAction: function () {
  123. Picker.pickFile().then(function (files) {
  124. var blob = files[0];
  125. Conversions.blobToBase64(blob).then(function (base64) {
  126. Actions.insertBlob(editor, base64, blob);
  127. });
  128. });
  129. }
  130. });
  131. editor.ui.registry.addButton('quicktable', {
  132. icon: 'table',
  133. tooltip: 'Insert table',
  134. onAction: function () {
  135. Actions.insertTable(editor, 2, 2);
  136. }
  137. });
  138. };
  139. var InsertButtons = { setupButtons: setupButtons };
  140. var constant = function (value) {
  141. return function () {
  142. return value;
  143. };
  144. };
  145. var never = constant(false);
  146. var always = constant(true);
  147. var never$1 = never;
  148. var always$1 = always;
  149. var none = function () {
  150. return NONE;
  151. };
  152. var NONE = function () {
  153. var eq = function (o) {
  154. return o.isNone();
  155. };
  156. var call = function (thunk) {
  157. return thunk();
  158. };
  159. var id = function (n) {
  160. return n;
  161. };
  162. var noop = function () {
  163. };
  164. var nul = function () {
  165. return null;
  166. };
  167. var undef = function () {
  168. return undefined;
  169. };
  170. var me = {
  171. fold: function (n, s) {
  172. return n();
  173. },
  174. is: never$1,
  175. isSome: never$1,
  176. isNone: always$1,
  177. getOr: id,
  178. getOrThunk: call,
  179. getOrDie: function (msg) {
  180. throw new Error(msg || 'error: getOrDie called on none.');
  181. },
  182. getOrNull: nul,
  183. getOrUndefined: undef,
  184. or: id,
  185. orThunk: call,
  186. map: none,
  187. ap: none,
  188. each: noop,
  189. bind: none,
  190. flatten: none,
  191. exists: never$1,
  192. forall: always$1,
  193. filter: none,
  194. equals: eq,
  195. equals_: eq,
  196. toArray: function () {
  197. return [];
  198. },
  199. toString: constant('none()')
  200. };
  201. if (Object.freeze)
  202. Object.freeze(me);
  203. return me;
  204. }();
  205. var some = function (a) {
  206. var constant_a = function () {
  207. return a;
  208. };
  209. var self = function () {
  210. return me;
  211. };
  212. var map = function (f) {
  213. return some(f(a));
  214. };
  215. var bind = function (f) {
  216. return f(a);
  217. };
  218. var me = {
  219. fold: function (n, s) {
  220. return s(a);
  221. },
  222. is: function (v) {
  223. return a === v;
  224. },
  225. isSome: always$1,
  226. isNone: never$1,
  227. getOr: constant_a,
  228. getOrThunk: constant_a,
  229. getOrDie: constant_a,
  230. getOrNull: constant_a,
  231. getOrUndefined: constant_a,
  232. or: self,
  233. orThunk: self,
  234. map: map,
  235. ap: function (optfab) {
  236. return optfab.fold(none, function (fab) {
  237. return some(fab(a));
  238. });
  239. },
  240. each: function (f) {
  241. f(a);
  242. },
  243. bind: bind,
  244. flatten: constant_a,
  245. exists: bind,
  246. forall: bind,
  247. filter: function (f) {
  248. return f(a) ? me : NONE;
  249. },
  250. equals: function (o) {
  251. return o.is(a);
  252. },
  253. equals_: function (o, elementEq) {
  254. return o.fold(never$1, function (b) {
  255. return elementEq(a, b);
  256. });
  257. },
  258. toArray: function () {
  259. return [a];
  260. },
  261. toString: function () {
  262. return 'some(' + a + ')';
  263. }
  264. };
  265. return me;
  266. };
  267. var from = function (value) {
  268. return value === null || value === undefined ? NONE : some(value);
  269. };
  270. var Option = {
  271. some: some,
  272. none: none,
  273. from: from
  274. };
  275. var fromHtml = function (html, scope) {
  276. var doc = scope || domGlobals.document;
  277. var div = doc.createElement('div');
  278. div.innerHTML = html;
  279. if (!div.hasChildNodes() || div.childNodes.length > 1) {
  280. domGlobals.console.error('HTML does not have a single root node', html);
  281. throw new Error('HTML must have a single root node');
  282. }
  283. return fromDom(div.childNodes[0]);
  284. };
  285. var fromTag = function (tag, scope) {
  286. var doc = scope || domGlobals.document;
  287. var node = doc.createElement(tag);
  288. return fromDom(node);
  289. };
  290. var fromText = function (text, scope) {
  291. var doc = scope || domGlobals.document;
  292. var node = doc.createTextNode(text);
  293. return fromDom(node);
  294. };
  295. var fromDom = function (node) {
  296. if (node === null || node === undefined) {
  297. throw new Error('Node cannot be null or undefined');
  298. }
  299. return { dom: constant(node) };
  300. };
  301. var fromPoint = function (docElm, x, y) {
  302. var doc = docElm.dom();
  303. return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
  304. };
  305. var Element = {
  306. fromHtml: fromHtml,
  307. fromTag: fromTag,
  308. fromText: fromText,
  309. fromDom: fromDom,
  310. fromPoint: fromPoint
  311. };
  312. var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
  313. var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
  314. var COMMENT = domGlobals.Node.COMMENT_NODE;
  315. var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
  316. var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
  317. var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
  318. var ELEMENT = domGlobals.Node.ELEMENT_NODE;
  319. var TEXT = domGlobals.Node.TEXT_NODE;
  320. var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
  321. var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
  322. var ENTITY = domGlobals.Node.ENTITY_NODE;
  323. var NOTATION = domGlobals.Node.NOTATION_NODE;
  324. var name = function (element) {
  325. var r = element.dom().nodeName;
  326. return r.toLowerCase();
  327. };
  328. var typeOf = function (x) {
  329. if (x === null)
  330. return 'null';
  331. var t = typeof x;
  332. if (t === 'object' && Array.prototype.isPrototypeOf(x))
  333. return 'array';
  334. if (t === 'object' && String.prototype.isPrototypeOf(x))
  335. return 'string';
  336. return t;
  337. };
  338. var isType = function (type) {
  339. return function (value) {
  340. return typeOf(value) === type;
  341. };
  342. };
  343. var isString = isType('string');
  344. var isObject = isType('object');
  345. var isArray = isType('array');
  346. var isBoolean = isType('boolean');
  347. var isUndefined = isType('undefined');
  348. var isFunction = isType('function');
  349. var find = function (xs, pred) {
  350. for (var i = 0, len = xs.length; i < len; i++) {
  351. var x = xs[i];
  352. if (pred(x, i, xs)) {
  353. return Option.some(x);
  354. }
  355. }
  356. return Option.none();
  357. };
  358. var slice = Array.prototype.slice;
  359. var from$1 = isFunction(Array.from) ? Array.from : function (x) {
  360. return slice.call(x);
  361. };
  362. function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
  363. return is(scope, a) ? Option.some(scope) : isFunction(isRoot) && isRoot(scope) ? Option.none() : ancestor(scope, a, isRoot);
  364. }
  365. var node = function () {
  366. var f = Global$1.getOrDie('Node');
  367. return f;
  368. };
  369. var compareDocumentPosition = function (a, b, match) {
  370. return (a.compareDocumentPosition(b) & match) !== 0;
  371. };
  372. var documentPositionPreceding = function (a, b) {
  373. return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
  374. };
  375. var documentPositionContainedBy = function (a, b) {
  376. return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
  377. };
  378. var Node = {
  379. documentPositionPreceding: documentPositionPreceding,
  380. documentPositionContainedBy: documentPositionContainedBy
  381. };
  382. var cached = function (f) {
  383. var called = false;
  384. var r;
  385. return function () {
  386. var args = [];
  387. for (var _i = 0; _i < arguments.length; _i++) {
  388. args[_i] = arguments[_i];
  389. }
  390. if (!called) {
  391. called = true;
  392. r = f.apply(null, args);
  393. }
  394. return r;
  395. };
  396. };
  397. var firstMatch = function (regexes, s) {
  398. for (var i = 0; i < regexes.length; i++) {
  399. var x = regexes[i];
  400. if (x.test(s))
  401. return x;
  402. }
  403. return undefined;
  404. };
  405. var find$1 = function (regexes, agent) {
  406. var r = firstMatch(regexes, agent);
  407. if (!r)
  408. return {
  409. major: 0,
  410. minor: 0
  411. };
  412. var group = function (i) {
  413. return Number(agent.replace(r, '$' + i));
  414. };
  415. return nu(group(1), group(2));
  416. };
  417. var detect = function (versionRegexes, agent) {
  418. var cleanedAgent = String(agent).toLowerCase();
  419. if (versionRegexes.length === 0)
  420. return unknown();
  421. return find$1(versionRegexes, cleanedAgent);
  422. };
  423. var unknown = function () {
  424. return nu(0, 0);
  425. };
  426. var nu = function (major, minor) {
  427. return {
  428. major: major,
  429. minor: minor
  430. };
  431. };
  432. var Version = {
  433. nu: nu,
  434. detect: detect,
  435. unknown: unknown
  436. };
  437. var edge = 'Edge';
  438. var chrome = 'Chrome';
  439. var ie = 'IE';
  440. var opera = 'Opera';
  441. var firefox = 'Firefox';
  442. var safari = 'Safari';
  443. var isBrowser = function (name, current) {
  444. return function () {
  445. return current === name;
  446. };
  447. };
  448. var unknown$1 = function () {
  449. return nu$1({
  450. current: undefined,
  451. version: Version.unknown()
  452. });
  453. };
  454. var nu$1 = function (info) {
  455. var current = info.current;
  456. var version = info.version;
  457. return {
  458. current: current,
  459. version: version,
  460. isEdge: isBrowser(edge, current),
  461. isChrome: isBrowser(chrome, current),
  462. isIE: isBrowser(ie, current),
  463. isOpera: isBrowser(opera, current),
  464. isFirefox: isBrowser(firefox, current),
  465. isSafari: isBrowser(safari, current)
  466. };
  467. };
  468. var Browser = {
  469. unknown: unknown$1,
  470. nu: nu$1,
  471. edge: constant(edge),
  472. chrome: constant(chrome),
  473. ie: constant(ie),
  474. opera: constant(opera),
  475. firefox: constant(firefox),
  476. safari: constant(safari)
  477. };
  478. var windows = 'Windows';
  479. var ios = 'iOS';
  480. var android = 'Android';
  481. var linux = 'Linux';
  482. var osx = 'OSX';
  483. var solaris = 'Solaris';
  484. var freebsd = 'FreeBSD';
  485. var isOS = function (name, current) {
  486. return function () {
  487. return current === name;
  488. };
  489. };
  490. var unknown$2 = function () {
  491. return nu$2({
  492. current: undefined,
  493. version: Version.unknown()
  494. });
  495. };
  496. var nu$2 = function (info) {
  497. var current = info.current;
  498. var version = info.version;
  499. return {
  500. current: current,
  501. version: version,
  502. isWindows: isOS(windows, current),
  503. isiOS: isOS(ios, current),
  504. isAndroid: isOS(android, current),
  505. isOSX: isOS(osx, current),
  506. isLinux: isOS(linux, current),
  507. isSolaris: isOS(solaris, current),
  508. isFreeBSD: isOS(freebsd, current)
  509. };
  510. };
  511. var OperatingSystem = {
  512. unknown: unknown$2,
  513. nu: nu$2,
  514. windows: constant(windows),
  515. ios: constant(ios),
  516. android: constant(android),
  517. linux: constant(linux),
  518. osx: constant(osx),
  519. solaris: constant(solaris),
  520. freebsd: constant(freebsd)
  521. };
  522. var DeviceType = function (os, browser, userAgent) {
  523. var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
  524. var isiPhone = os.isiOS() && !isiPad;
  525. var isAndroid3 = os.isAndroid() && os.version.major === 3;
  526. var isAndroid4 = os.isAndroid() && os.version.major === 4;
  527. var isTablet = isiPad || isAndroid3 || isAndroid4 && /mobile/i.test(userAgent) === true;
  528. var isTouch = os.isiOS() || os.isAndroid();
  529. var isPhone = isTouch && !isTablet;
  530. var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
  531. return {
  532. isiPad: constant(isiPad),
  533. isiPhone: constant(isiPhone),
  534. isTablet: constant(isTablet),
  535. isPhone: constant(isPhone),
  536. isTouch: constant(isTouch),
  537. isAndroid: os.isAndroid,
  538. isiOS: os.isiOS,
  539. isWebView: constant(iOSwebview)
  540. };
  541. };
  542. var detect$1 = function (candidates, userAgent) {
  543. var agent = String(userAgent).toLowerCase();
  544. return find(candidates, function (candidate) {
  545. return candidate.search(agent);
  546. });
  547. };
  548. var detectBrowser = function (browsers, userAgent) {
  549. return detect$1(browsers, userAgent).map(function (browser) {
  550. var version = Version.detect(browser.versionRegexes, userAgent);
  551. return {
  552. current: browser.name,
  553. version: version
  554. };
  555. });
  556. };
  557. var detectOs = function (oses, userAgent) {
  558. return detect$1(oses, userAgent).map(function (os) {
  559. var version = Version.detect(os.versionRegexes, userAgent);
  560. return {
  561. current: os.name,
  562. version: version
  563. };
  564. });
  565. };
  566. var UaString = {
  567. detectBrowser: detectBrowser,
  568. detectOs: detectOs
  569. };
  570. var contains = function (str, substr) {
  571. return str.indexOf(substr) !== -1;
  572. };
  573. var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
  574. var checkContains = function (target) {
  575. return function (uastring) {
  576. return contains(uastring, target);
  577. };
  578. };
  579. var browsers = [
  580. {
  581. name: 'Edge',
  582. versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
  583. search: function (uastring) {
  584. var monstrosity = contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
  585. return monstrosity;
  586. }
  587. },
  588. {
  589. name: 'Chrome',
  590. versionRegexes: [
  591. /.*?chrome\/([0-9]+)\.([0-9]+).*/,
  592. normalVersionRegex
  593. ],
  594. search: function (uastring) {
  595. return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
  596. }
  597. },
  598. {
  599. name: 'IE',
  600. versionRegexes: [
  601. /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
  602. /.*?rv:([0-9]+)\.([0-9]+).*/
  603. ],
  604. search: function (uastring) {
  605. return contains(uastring, 'msie') || contains(uastring, 'trident');
  606. }
  607. },
  608. {
  609. name: 'Opera',
  610. versionRegexes: [
  611. normalVersionRegex,
  612. /.*?opera\/([0-9]+)\.([0-9]+).*/
  613. ],
  614. search: checkContains('opera')
  615. },
  616. {
  617. name: 'Firefox',
  618. versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
  619. search: checkContains('firefox')
  620. },
  621. {
  622. name: 'Safari',
  623. versionRegexes: [
  624. normalVersionRegex,
  625. /.*?cpu os ([0-9]+)_([0-9]+).*/
  626. ],
  627. search: function (uastring) {
  628. return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
  629. }
  630. }
  631. ];
  632. var oses = [
  633. {
  634. name: 'Windows',
  635. search: checkContains('win'),
  636. versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
  637. },
  638. {
  639. name: 'iOS',
  640. search: function (uastring) {
  641. return contains(uastring, 'iphone') || contains(uastring, 'ipad');
  642. },
  643. versionRegexes: [
  644. /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
  645. /.*cpu os ([0-9]+)_([0-9]+).*/,
  646. /.*cpu iphone os ([0-9]+)_([0-9]+).*/
  647. ]
  648. },
  649. {
  650. name: 'Android',
  651. search: checkContains('android'),
  652. versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
  653. },
  654. {
  655. name: 'OSX',
  656. search: checkContains('os x'),
  657. versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
  658. },
  659. {
  660. name: 'Linux',
  661. search: checkContains('linux'),
  662. versionRegexes: []
  663. },
  664. {
  665. name: 'Solaris',
  666. search: checkContains('sunos'),
  667. versionRegexes: []
  668. },
  669. {
  670. name: 'FreeBSD',
  671. search: checkContains('freebsd'),
  672. versionRegexes: []
  673. }
  674. ];
  675. var PlatformInfo = {
  676. browsers: constant(browsers),
  677. oses: constant(oses)
  678. };
  679. var detect$2 = function (userAgent) {
  680. var browsers = PlatformInfo.browsers();
  681. var oses = PlatformInfo.oses();
  682. var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu);
  683. var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
  684. var deviceType = DeviceType(os, browser, userAgent);
  685. return {
  686. browser: browser,
  687. os: os,
  688. deviceType: deviceType
  689. };
  690. };
  691. var PlatformDetection = { detect: detect$2 };
  692. var detect$3 = cached(function () {
  693. var userAgent = domGlobals.navigator.userAgent;
  694. return PlatformDetection.detect(userAgent);
  695. });
  696. var PlatformDetection$1 = { detect: detect$3 };
  697. var ELEMENT$1 = ELEMENT;
  698. var is = function (element, selector) {
  699. var elem = element.dom();
  700. if (elem.nodeType !== ELEMENT$1) {
  701. return false;
  702. } else if (elem.matches !== undefined) {
  703. return elem.matches(selector);
  704. } else if (elem.msMatchesSelector !== undefined) {
  705. return elem.msMatchesSelector(selector);
  706. } else if (elem.webkitMatchesSelector !== undefined) {
  707. return elem.webkitMatchesSelector(selector);
  708. } else if (elem.mozMatchesSelector !== undefined) {
  709. return elem.mozMatchesSelector(selector);
  710. } else {
  711. throw new Error('Browser lacks native selectors');
  712. }
  713. };
  714. var regularContains = function (e1, e2) {
  715. var d1 = e1.dom();
  716. var d2 = e2.dom();
  717. return d1 === d2 ? false : d1.contains(d2);
  718. };
  719. var ieContains = function (e1, e2) {
  720. return Node.documentPositionContainedBy(e1.dom(), e2.dom());
  721. };
  722. var browser = PlatformDetection$1.detect().browser;
  723. var contains$1 = browser.isIE() ? ieContains : regularContains;
  724. var ancestor = function (scope, predicate, isRoot) {
  725. var element = scope.dom();
  726. var stop = isFunction(isRoot) ? isRoot : constant(false);
  727. while (element.parentNode) {
  728. element = element.parentNode;
  729. var el = Element.fromDom(element);
  730. if (predicate(el)) {
  731. return Option.some(el);
  732. } else if (stop(el)) {
  733. break;
  734. }
  735. }
  736. return Option.none();
  737. };
  738. var closest = function (scope, predicate, isRoot) {
  739. var is = function (s) {
  740. return predicate(s);
  741. };
  742. return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot);
  743. };
  744. var ancestor$1 = function (scope, selector, isRoot) {
  745. return ancestor(scope, function (e) {
  746. return is(e, selector);
  747. }, isRoot);
  748. };
  749. var closest$1 = function (scope, selector, isRoot) {
  750. return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot);
  751. };
  752. var validDefaultOrDie = function (value, predicate) {
  753. if (predicate(value)) {
  754. return true;
  755. }
  756. throw new Error('Default value doesn\'t match requested type.');
  757. };
  758. var items = function (value, defaultValue) {
  759. if (isArray(value) || isObject(value)) {
  760. throw new Error('expected a string but found: ' + value);
  761. }
  762. if (isUndefined(value)) {
  763. return defaultValue;
  764. }
  765. if (isBoolean(value)) {
  766. return value === false ? '' : defaultValue;
  767. }
  768. return value;
  769. };
  770. var getToolbarItemsOr = function (predicate) {
  771. return function (editor, name, defaultValue) {
  772. var value = name in editor.settings ? editor.settings[name] : defaultValue;
  773. validDefaultOrDie(defaultValue, predicate);
  774. return items(value, defaultValue);
  775. };
  776. };
  777. var EditorSettings = { getToolbarItemsOr: getToolbarItemsOr(isString) };
  778. var getTextSelectionToolbarItems = function (editor) {
  779. return EditorSettings.getToolbarItemsOr(editor, 'quickbars_selection_toolbar', 'bold italic | form:link-form h2 h3 blockquote');
  780. };
  781. var getInsertToolbarItems = function (editor) {
  782. return EditorSettings.getToolbarItemsOr(editor, 'quickbars_insert_toolbar', 'quickimage quicktable');
  783. };
  784. var Settings = {
  785. getTextSelectionToolbarItems: getTextSelectionToolbarItems,
  786. getInsertToolbarItems: getInsertToolbarItems
  787. };
  788. var addToEditor = function (editor) {
  789. editor.ui.registry.addContextToolbar('quickblock', {
  790. predicate: function (node) {
  791. var sugarNode = Element.fromDom(node);
  792. var textBlockElementsMap = editor.schema.getTextBlockElements();
  793. var isRoot = function (elem) {
  794. return elem.dom() === editor.getBody();
  795. };
  796. return closest$1(sugarNode, 'table', isRoot).fold(function () {
  797. return closest(sugarNode, function (elem) {
  798. return name(elem) in textBlockElementsMap && editor.dom.isEmpty(elem.dom());
  799. }, isRoot).isSome();
  800. }, function () {
  801. return false;
  802. });
  803. },
  804. items: Settings.getInsertToolbarItems(editor),
  805. position: 'line',
  806. scope: 'editor'
  807. });
  808. };
  809. var InsertToolbars = { addToEditor: addToEditor };
  810. var addToEditor$1 = function (editor) {
  811. editor.ui.registry.addContextToolbar('imageselection', {
  812. predicate: function (node) {
  813. return node.nodeName === 'IMG' || node.nodeName === 'FIGURE' && /image/i.test(node.className);
  814. },
  815. items: 'alignleft aligncenter alignright',
  816. position: 'node'
  817. });
  818. editor.ui.registry.addContextToolbar('textselection', {
  819. predicate: function (node) {
  820. return !editor.selection.isCollapsed();
  821. },
  822. items: Settings.getTextSelectionToolbarItems(editor),
  823. position: 'selection'
  824. });
  825. };
  826. var SelectionToolbars = { addToEditor: addToEditor$1 };
  827. global.add('quickbars', function (editor) {
  828. InsertButtons.setupButtons(editor);
  829. InsertToolbars.addToEditor(editor);
  830. SelectionToolbars.addToEditor(editor);
  831. });
  832. function Plugin () {
  833. }
  834. return Plugin;
  835. }(window));
  836. })();