jodit 4.12.2 → 4.12.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/es2015/jodit.css +1 -1
- package/es2015/jodit.fat.min.js +4 -4
- package/es2015/jodit.js +69 -11
- package/es2015/jodit.min.js +3 -3
- package/es2015/plugins/debug/debug.css +1 -1
- package/es2015/plugins/debug/debug.js +1 -1
- package/es2015/plugins/debug/debug.min.js +1 -1
- package/es2015/plugins/speech-recognize/speech-recognize.css +1 -1
- package/es2015/plugins/speech-recognize/speech-recognize.js +50 -8
- package/es2015/plugins/speech-recognize/speech-recognize.min.js +2 -2
- package/es2018/jodit.fat.min.js +4 -4
- package/es2018/jodit.min.js +24 -24
- package/es2018/plugins/debug/debug.min.js +1 -1
- package/es2018/plugins/speech-recognize/speech-recognize.min.js +2 -2
- package/es2021/jodit.css +1 -1
- package/es2021/jodit.fat.min.js +4 -4
- package/es2021/jodit.js +69 -11
- package/es2021/jodit.min.js +3 -3
- package/es2021/plugins/debug/debug.css +1 -1
- package/es2021/plugins/debug/debug.js +1 -1
- package/es2021/plugins/debug/debug.min.js +1 -1
- package/es2021/plugins/speech-recognize/speech-recognize.css +1 -1
- package/es2021/plugins/speech-recognize/speech-recognize.js +50 -8
- package/es2021/plugins/speech-recognize/speech-recognize.min.js +2 -2
- package/es2021.en/jodit.css +1 -1
- package/es2021.en/jodit.fat.min.js +4 -4
- package/es2021.en/jodit.js +69 -11
- package/es2021.en/jodit.min.js +3 -3
- package/es2021.en/plugins/debug/debug.css +1 -1
- package/es2021.en/plugins/debug/debug.js +1 -1
- package/es2021.en/plugins/debug/debug.min.js +1 -1
- package/es2021.en/plugins/speech-recognize/speech-recognize.css +1 -1
- package/es2021.en/plugins/speech-recognize/speech-recognize.js +50 -8
- package/es2021.en/plugins/speech-recognize/speech-recognize.min.js +2 -2
- package/es5/jodit.css +2 -2
- package/es5/jodit.fat.min.js +2 -2
- package/es5/jodit.js +72 -11
- package/es5/jodit.min.css +2 -2
- package/es5/jodit.min.js +2 -2
- package/es5/plugins/debug/debug.css +1 -1
- package/es5/plugins/debug/debug.js +1 -1
- package/es5/plugins/debug/debug.min.js +1 -1
- package/es5/plugins/speech-recognize/speech-recognize.css +1 -1
- package/es5/plugins/speech-recognize/speech-recognize.js +51 -9
- package/es5/plugins/speech-recognize/speech-recognize.min.js +2 -2
- package/es5/polyfills.fat.min.js +1 -1
- package/es5/polyfills.js +1 -1
- package/es5/polyfills.min.js +1 -1
- package/esm/config.d.ts +48 -4
- package/esm/config.js +28 -3
- package/esm/core/constants.js +1 -1
- package/esm/core/ui/icon.d.ts +10 -0
- package/esm/core/ui/icon.js +17 -1
- package/esm/plugins/speech-recognize/config.js +4 -1
- package/esm/plugins/speech-recognize/helpers/recognize-manager.js +3 -2
- package/esm/plugins/speech-recognize/helpers/sound.d.ts +8 -1
- package/esm/plugins/speech-recognize/helpers/sound.js +45 -8
- package/package.json +1 -1
- package/types/config.d.ts +48 -4
- package/types/core/ui/icon.d.ts +10 -0
- package/types/plugins/speech-recognize/helpers/sound.d.ts +8 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser
|
|
3
3
|
* Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/jodit/)
|
|
4
|
-
* Version: v4.12.
|
|
4
|
+
* Version: v4.12.4
|
|
5
5
|
* Url: https://xdsoft.net/jodit/
|
|
6
6
|
* License(s): MIT
|
|
7
7
|
*/
|
|
@@ -107,7 +107,10 @@ jodit_config__WEBPACK_IMPORTED_MODULE_5__.Config.prototype.controls.speechRecogn
|
|
|
107
107
|
api.on('error', function(text) {
|
|
108
108
|
return jodit.message.error(text);
|
|
109
109
|
});
|
|
110
|
-
|
|
110
|
+
// Tie cleanup to the editor lifecycle (not the button): the manager
|
|
111
|
+
// must survive toolbar rebuilds and be released — together with its
|
|
112
|
+
// AudioContext — only when the editor itself is destroyed.
|
|
113
|
+
jodit.hookStatus('beforeDestruct', function() {
|
|
111
114
|
(0,jodit_core_helpers_utils_data_bind__WEBPACK_IMPORTED_MODULE_3__.dataBind)(jodit, 'speech', null);
|
|
112
115
|
api.destruct();
|
|
113
116
|
});
|
|
@@ -306,6 +309,7 @@ var RecognizeManager = /*#__PURE__*/ function(Eventify) {
|
|
|
306
309
|
key: "destruct",
|
|
307
310
|
value: function destruct() {
|
|
308
311
|
this.stop();
|
|
312
|
+
(0,_sound__WEBPACK_IMPORTED_MODULE_10__.closeSound)(this);
|
|
309
313
|
RecognizeManager._instances.delete(this);
|
|
310
314
|
(0,_swc_helpers_get__WEBPACK_IMPORTED_MODULE_4__._)((0,_swc_helpers_get_prototype_of__WEBPACK_IMPORTED_MODULE_5__._)(RecognizeManager.prototype), "destruct", this).call(this);
|
|
311
315
|
}
|
|
@@ -438,7 +442,7 @@ var RecognizeManager = /*#__PURE__*/ function(Eventify) {
|
|
|
438
442
|
key: "_makeSound",
|
|
439
443
|
value: function _makeSound(frequency) {
|
|
440
444
|
if (this.sound) {
|
|
441
|
-
(0,_sound__WEBPACK_IMPORTED_MODULE_10__.sound)({
|
|
445
|
+
(0,_sound__WEBPACK_IMPORTED_MODULE_10__.sound)(this, {
|
|
442
446
|
frequency: frequency
|
|
443
447
|
});
|
|
444
448
|
}
|
|
@@ -466,6 +470,7 @@ var RecognizeManager = /*#__PURE__*/ function(Eventify) {
|
|
|
466
470
|
|
|
467
471
|
"use strict";
|
|
468
472
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
473
|
+
/* harmony export */ closeSound: function() { return /* binding */ closeSound; },
|
|
469
474
|
/* harmony export */ sound: function() { return /* binding */ sound; }
|
|
470
475
|
/* harmony export */ });
|
|
471
476
|
/* harmony import */ var jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81937);
|
|
@@ -479,23 +484,60 @@ var RecognizeManager = /*#__PURE__*/ function(Eventify) {
|
|
|
479
484
|
*/
|
|
480
485
|
|
|
481
486
|
/**
|
|
487
|
+
* One AudioContext per owner (e.g. a RecognizeManager). Previously a new context
|
|
488
|
+
* was created on every beep and never closed, so during continuous recognition
|
|
489
|
+
* they piled up — leaking until the browser's per-page limit was hit and the
|
|
490
|
+
* overlapping audio turned into a "roar". We now reuse a single context per
|
|
491
|
+
* owner and release it via {@link closeSound} when the owner is destroyed.
|
|
482
492
|
* @internal
|
|
483
|
-
*/
|
|
484
|
-
|
|
485
|
-
if (!jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalWindow
|
|
493
|
+
*/ var contexts = new WeakMap();
|
|
494
|
+
function getContext(owner) {
|
|
495
|
+
if (!jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalWindow) {
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
var existing = contexts.get(owner);
|
|
499
|
+
if (existing && existing.state !== 'closed') {
|
|
500
|
+
return existing;
|
|
501
|
+
}
|
|
502
|
+
var Ctor = jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalWindow.AudioContext || jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalWindow.webkitAudioContext;
|
|
503
|
+
if (!Ctor) {
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
var context = new Ctor();
|
|
507
|
+
contexts.set(owner, context);
|
|
508
|
+
return context;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Play a short beep on the owner's (lazily created, reused) AudioContext.
|
|
512
|
+
* @internal
|
|
513
|
+
*/ function sound(owner) {
|
|
514
|
+
var _ref = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, _ref_sec = _ref.sec, sec = _ref_sec === void 0 ? 0.1 : _ref_sec, _ref_frequency = _ref.frequency, frequency = _ref_frequency === void 0 ? jodit_plugins_speech_recognize_constants__WEBPACK_IMPORTED_MODULE_1__.PII : _ref_frequency, _ref_gain = _ref.gain, gain = _ref_gain === void 0 ? 0.1 : _ref_gain, _ref_type = _ref.type, type = _ref_type === void 0 ? 'sine' : _ref_type;
|
|
515
|
+
var context = getContext(owner);
|
|
516
|
+
if (!context) {
|
|
486
517
|
return;
|
|
487
518
|
}
|
|
488
|
-
// one context per document
|
|
489
|
-
var context = new (jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalWindow.AudioContext || jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalWindow.webkitAudioContext)();
|
|
490
519
|
var vol = context.createGain();
|
|
491
520
|
var osc = context.createOscillator();
|
|
492
521
|
osc.type = type;
|
|
493
522
|
osc.frequency.value = frequency; // Hz
|
|
523
|
+
vol.gain.value = gain;
|
|
494
524
|
osc.connect(vol);
|
|
495
525
|
vol.connect(context.destination);
|
|
496
526
|
osc.start(); // start the oscillator
|
|
497
527
|
osc.stop(context.currentTime + sec);
|
|
498
|
-
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Close and forget the owner's AudioContext. Call this when the owner is
|
|
531
|
+
* destroyed so the context does not leak.
|
|
532
|
+
* @internal
|
|
533
|
+
*/ function closeSound(owner) {
|
|
534
|
+
var context = contexts.get(owner);
|
|
535
|
+
if (context) {
|
|
536
|
+
contexts.delete(owner);
|
|
537
|
+
if (context.state !== 'closed') {
|
|
538
|
+
void context.close();
|
|
539
|
+
}
|
|
540
|
+
}
|
|
499
541
|
}
|
|
500
542
|
|
|
501
543
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser
|
|
3
3
|
* Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/jodit/)
|
|
4
|
-
* Version: v4.12.
|
|
4
|
+
* Version: v4.12.4
|
|
5
5
|
* Url: https://xdsoft.net/jodit/
|
|
6
6
|
* License(s): MIT
|
|
7
7
|
*/
|
|
8
|
-
!function(e,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define([],n);else{var t=n();for(var i in t)("object"==typeof exports?exports:e)[i]=t[i]}}(self,function(){return(self.webpackChunkjodit=self.webpackChunkjodit||[]).push([[882],{75143:function(e,n,t){"use strict";var i=t(22289),o=t(85932),s=t(7909),r=t(36400),u=t(29434),c=t(5266),a=t(97743),l=t(68097),p=t(22227),d=t.n(p);c.Config.prototype.speechRecognize={api:void 0!==a.SpeechRecognition?a.SpeechRecognition:null,sound:!0,continuous:!1,interimResults:!0,commands:{"newline|enter":"enter","delete|remove word|delete word":"backspaceWordButton",comma:"inserthtml::,",underline:"inserthtml::_",hyphen:"inserthtml::-",space:"inserthtml:: ",question:"inserthtml::?",dot:"inserthtml::.","quote|quotes|open quote":"inserthtml::'","header|header h1":"formatblock::h1","select all":"selectall"}},u.Icon.set("speech-recognize",d()),c.Config.prototype.controls.speechRecognize={isVisible:function(e){return!!e.o.speechRecognize.api},isActive:function(e,n){var t=(0,r.dataBind)(e,"speech");return!!(null==t?void 0:t.isEnabled)},isDisabled:function(e){return!e.o.speechRecognize.api},exec:function(e,n,t){var u=t.button,c=t.control,a=e.o.speechRecognize,p=a.api,d=a.lang,h=a.continuous,f=a.interimResults,m=a.sound;if(!p)return void e.alert("Speech recognize API unsupported in your browser");var _=(0,r.dataBind)(e,"speech");if(!_){var g,R=new p;(_=new l.RecognizeManager(e.async,R)).lang=(0,o.isString)(d)?d:null!=(g=(0,s.attr)(e.od.documentElement,"lang"))?g:void 0,_.continuous=h,_.interimResults=f,_.sound=m,(0,r.dataBind)(e,"speech",_),_.on("pulse",function(e){u.setMod("pulse",e)}),_.on("result",function(n){return e.e.fire("speechRecognizeResult",n)}),_.on("progress",function(n){return e.e.fire("speechRecognizeProgressResult",n)}),_.on("error",function(n){return e.message.error(n)}),u.hookStatus("beforeDestruct",function(){(0,r.dataBind)(e,"speech",null),_.destruct()})}if(c.args){var v=c.args[0];if((0,i.isBoolean)(_[v])){_[v]=!_[v],_.isEnabled&&_.restart();return}}_.toggle(),_.isEnabled&&u.setMod("pulse",!0),u.state.activated=_.isEnabled},name:"speechRecognize",command:"toggleSpeechRecognize",tooltip:"Speech Recognize",list:{sound:"Sound",interimResults:"Interim Results"},childTemplate:function(e,n,t){var i,o=(0,r.dataBind)(e,"speech"),s=null!=(i=null==o?void 0:o[n])?i:e.o.speechRecognize[n];return"<span class='jodit-speech-recognize__list-item'><input ".concat(s?"checked":""," class='jodit-checkbox' type='checkbox'> ").concat(t,"</span>")},mods:{stroke:!1}}},94092:function(e,n,t){"use strict";t.d(n,{PII:function(){return i},WARN:function(){return o}});var i=440,o=940},97743:function(e,n,t){"use strict";t.d(n,{SpeechRecognition:function(){return o}});var i=t(81937),o=i.globalWindow?i.globalWindow.SpeechRecognition||i.globalWindow.webkitSpeechRecognition:void 0},8962:function(e,n,t){"use strict";t.d(n,{execSpellCommand:function(){return o}});var i=t(50684);function o(e,n){var t=(0,i._)(n.split("::"),2),o=t[0],s=t[1];e.execCommand(o,null,s)}},68097:function(e,n,t){"use strict";t.d(n,{RecognizeManager:function(){return m}});var i=t(69262),o=t(73104),s=t(53429),r=t(25045),u=t(22248),c=t(66773),a=t(34918),l=t(31635),p=t(84839),d=t(60216),h=t(32560),f=t(94092),m=function(e){function n(e,t){var s;return(0,o._)(this,n),s=(0,i._)(this,n),(0,r._)(s,"async",void 0),(0,r._)(s,"_lang",void 0),(0,r._)(s,"_continuous",void 0),(0,r._)(s,"_interimResults",void 0),(0,r._)(s,"sound",void 0),(0,r._)(s,"_isEnabled",void 0),(0,r._)(s,"_restartTimeout",void 0),(0,r._)(s,"_onSpeechStart",void 0),(0,r._)(s,"_api",void 0),(0,r._)(s,"__interimResults",void 0),s.async=e,s._continuous=!1,s._interimResults=!1,s.sound=!0,s._isEnabled=!1,s._restartTimeout=0,s._onSpeechStart=function(e){s._isEnabled&&(s.async.clearTimeout(s._restartTimeout),s._restartTimeout=s.async.setTimeout(function(){s.restart(),s.emit("pulse",!1),s._makeSound(f.WARN)},5e3),s.emit("pulse",!0))},s.__interimResults="",s._api=t,n._instances.add(s),s}return(0,a._)(n,e),(0,s._)(n,[{key:"lang",get:function(){return this._lang},set:function(e){this._lang=e,this._api.lang=e}},{key:"continuous",get:function(){return this._continuous},set:function(e){this._continuous=e,this._api.continuous=e}},{key:"interimResults",get:function(){return this._interimResults},set:function(e){this._interimResults=e,this._api.interimResults=e}},{key:"destruct",value:function(){this.stop(),n._instances.delete(this),(0,u._)((0,c._)(n.prototype),"destruct",this).call(this)}},{key:"isEnabled",get:function(){return this._isEnabled}},{key:"start",value:function(){var e=this;if(!this._isEnabled){this._isEnabled=!0,n._instances.forEach(function(n){n!==e&&n.stop()});try{this._api.start()}catch(e){this._onError(e),this.stop();return}this.__on("speechstart",this._onSpeechStart).__on("error",this._onError).__on("result",this._onProgress).__on("end",this._onResults)}}},{key:"stop",value:function(){this._isEnabled&&(this._api.abort(),this._api.stop(),this.__off("speechstart",this._onSpeechStart).__off("error",this._onError).__off("result",this._onProgress).__off("end",this._onResults),this.async.clearTimeout(this._restartTimeout),this._isEnabled=!1,this.emit("pulse",!1))}},{key:"toggle",value:function(){this._isEnabled?this.stop():this.start()}},{key:"restart",value:function(){this.stop(),this.start()}},{key:"__on",value:function(e,n){return this._api.addEventListener(e,n),this}},{key:"__off",value:function(e,n){return this._api.removeEventListener(e,n),this}},{key:"_onResults",value:function(e){this.emit("pulse",!1),this.emit("result",this.__interimResults),this.__interimResults="",this._makeSound(f.PII),this.restart()}},{key:"_onProgress",value:function(e){if(this._isEnabled&&(this.__interimResults="",e.results)){for(var n=0;n<e.results.length;n++){var t=e.results.item(n);if(t.length){var i=t.item(0).transcript;this.__interimResults+=i}}this.__interimResults&&this.emit("progress",this.__interimResults)}}},{key:"_onError",value:function(e){"voice-unavailable"===e.error&&this.emit("error","Voice unavailable"),"not-allowed"===e.error&&this.emit("error","Not allowed"),("language-unavailable"===e.error||"language-not-supported"===e.error)&&this.emit("error","Language unavailable"),this._makeSound(f.WARN),this.emit("pulse",!1),this.stop()}},{key:"_makeSound",value:function(e){this.sound&&(0,h.sound)({frequency:e})}}]),n}(d.Eventify);(0,r._)(m,"_instances",new Set),(0,l.__decorate)([p.autobind],m.prototype,"_onResults",null),(0,l.__decorate)([p.autobind],m.prototype,"_onProgress",null),(0,l.__decorate)([p.autobind],m.prototype,"_onError",null)},32560:function(e,n,t){"use strict";t.d(n,{sound:function(){return s}});var i=t(81937),o=t(94092);function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.sec,t=e.frequency,s=void 0===t?o.PII:t,r=e.gain,u=e.type;if(i.globalWindow&&(void 0!==i.globalWindow.AudioContext||void 0!==i.globalWindow.webkitAudioContext)){var c=new(i.globalWindow.AudioContext||i.globalWindow.webkitAudioContext),a=c.createGain(),l=c.createOscillator();l.type=void 0===u?"sine":u,l.frequency.value=s,l.connect(a),a.connect(c.destination),l.start(),l.stop(c.currentTime+(void 0===n?.1:n)),a.gain.value=void 0===r?.1:r}}},19922:function(e){e.exports={newline:"الخط الجديد",delete:"حذف",space:"الفضاء","Speech Recognize":"التعرف على الكلام",Sound:"الصوت","Interim Results":"النتائج المؤقتة"}},20759:function(e){e.exports={newline:"ř\xe1dek",delete:"odstranit",space:"prostora","Speech Recognize":"Rozpozn\xe1n\xed Řeči",Sound:"Zvuk","Interim Results":"Průběžn\xe9 V\xfdsledky"}},22350:function(e){e.exports={newline:"Zeilenumbruch",delete:"l\xf6schen",space:"Raum","Speech Recognize":"Sprache Erkennen",Sound:"Sound","Interim Results":"Zwischenergebnis"}},97509:function(e){e.exports={newline:"nueva l\xednea",delete:"eliminar",space:"espacio","Speech Recognize":"Reconocimiento de Voz",Sound:"Sonido","Interim Results":"Resultados Provisionales"}},49668:function(e){e.exports={newline:"خط جدید",delete:"حذف",space:"فضا","Speech Recognize":"گفتار را تشخیص دهید",Sound:"صدا","Interim Results":"نتایج موقت"}},33276:function(e){e.exports={"Speech Recognize":"Puheentunnistus",newline:"uusi rivi",delete:"poistaa",space:"tilaa",Sound:"\xc4\xe4ni","Interim Results":"V\xe4litulokset"}},43517:function(e){e.exports={newline:"nouvelle ligne",delete:"supprimer",space:"espace","Speech Recognize":"Reconnaissance Vocale",Sound:"Son","Interim Results":"R\xe9sultats Interm\xe9diaires"}},8858:function(e){e.exports={newline:"חדשות",delete:"מחק",space:"שטח","Speech Recognize":"דיבור מזהה",Sound:"קול","Interim Results":"תוצאות ביניים"}},22922:function(e){e.exports={newline:"\xfajsor",delete:"t\xf6rl\xe9s",space:"t\xe9r","Speech Recognize":"A Besz\xe9d Felismeri",Sound:"Hang","Interim Results":"Idők\xf6zi Eredm\xe9nyek"}},81900:function(e){e.exports={newline:"newline",delete:"Hapus",space:"ruang","Speech Recognize":"Pidato Mengenali",Sound:"Suara","Interim Results":"Hasil Sementara"}},43219:function(e,n,t){"use strict";t.r(n),t.d(n,{ar:function(){return i},cs_cz:function(){return o},de:function(){return s},es:function(){return r},fa:function(){return u},fi:function(){return c},fr:function(){return a},he:function(){return l},hu:function(){return p},id:function(){return d},it:function(){return h},ja:function(){return f},ko:function(){return m},mn:function(){return _},nl:function(){return g},no:function(){return R},pl:function(){return v},pt_br:function(){return S},ru:function(){return z},tr:function(){return w},ua:function(){return y},zh_cn:function(){return k},zh_tw:function(){return b}});var i=t(19922),o=t(20759),s=t(22350),r=t(97509),u=t(49668),c=t(33276),a=t(43517),l=t(8858),p=t(22922),d=t(81900),h=t(35420),f=t(18712),m=t(73363),_=t(74762),g=t(73759),R=t(72850),v=t(37161),S=t(62896),z=t(39996),w=t(93423),y=t(10179),k=t(62547),b=t(29475)},35420:function(e){e.exports={newline:"nuova riga",delete:"eliminare",space:"spazio","Speech Recognize":"Discorso Riconoscere",Sound:"Suono","Interim Results":"Risultati intermedi"}},18712:function(e){e.exports={newline:"改行",delete:"削除",space:"スペース","Speech Recognize":"音声認識",Sound:"音","Interim Results":"中間結果"}},73363:function(e){e.exports={newline:"줄 바꿈",delete:"삭제",space:"공간","Speech Recognize":"음성 인식",Sound:"소리","Interim Results":"중간 결과"}},74762:function(e){e.exports={newline:"Шинэ мөр",delete:"Устгах",space:"Зай","Speech Recognize":"Дуу хоолой таних",Sound:"Дуу","Interim Results":"Түр зуурын үр дүн"}},73759:function(e){e.exports={newline:"regel",delete:"verwijderen",space:"ruimte","Speech Recognize":"Spraak Herkennen",Sound:"Geluid","Interim Results":"Tussentijdse Resultaten"}},72850:function(e){e.exports={newline:"nylinje",delete:"slette",space:"rom","Speech Recognize":"Talegjenkjenning",Sound:"Lyd","Interim Results":"Midlertidige resultater"}},37161:function(e){e.exports={newline:"newline",delete:"usunąć",space:"przestrzeń","Speech Recognize":"Rozpoznawanie Mowy",Sound:"Dźwięk","Interim Results":"Wyniki Okresowe"}},62896:function(e){e.exports={newline:"linha",delete:"excluir",space:"espaco","Speech Recognize":"Discurso Reconhecer",Sound:"Som","Interim Results":"Resultados Provis\xf3rios"}},39996:function(e){e.exports={newline:"новая строка|перенос|энтер",delete:"удалить",space:"пробел","Speech Recognize":"Распознавание речи",Sound:"Звук","Interim Results":"Промежуточные результаты"}},93423:function(e){e.exports={newline:"yeni satır",delete:"silmek",space:"uzay","Speech Recognize":"Konuşma Tanıma",Sound:"Ses","Interim Results":"Ara Sonu\xe7lar"}},10179:function(e){e.exports={newline:"новая строка|перенос|ентер",delete:"видалити",space:"пробел","Speech Recognize":"Распознавание речи",Sound:"Звук","Interim Results":"Проміжні результати"}},62547:function(e){e.exports={newline:"新行",delete:"删除",space:"空间","Speech Recognize":"言语识别",Sound:"声音","Interim Results":"中期业绩"}},29475:function(e){e.exports={newline:"換行",delete:"刪除",space:"空白","Speech Recognize":"語音辨識",Sound:"聲音","Interim Results":"階段性辨識結果"}},31262:function(e,n,t){"use strict";t.r(n),t.d(n,{SpeechRecognizeNative:function(){return R}});var i=t(69262),o=t(73104),s=t(53429),r=t(25045),u=t(34918),c=t(38574),a=t(31635),l=t(68616),p=t(23211),d=t(28077),h=t(71125),f=t(91206);t(75143);var m=t(73302),_=t(8962),g=t(43219),R=function(e){function n(){var e;return(0,o._)(this,n),e=(0,i._)(this,n,arguments),(0,r._)(e,"buttons",[{group:"state",name:"speechRecognize"}]),(0,r._)(e,"messagePopup",void 0),(0,r._)(e,"__hidePopupTimeout",void 0),(0,r._)(e,"_commandToWord",{}),e}return(0,u._)(n,e),(0,s._)(n,[{key:"afterInit",value:function(e){var n=this,t=e.o.speechRecognize.commands;t&&((0,d.extendLang)(g),(0,h.keys)(t,!1).forEach(function(i){i.split("|").forEach(function(o){o=o.trim().toLowerCase(),n._commandToWord[o]=t[i];var s=e.i18n(o);s!==o&&s.split("|").forEach(function(e){n._commandToWord[e.trim().toLowerCase()]=t[i].trim()})})}))}},{key:"beforeDestruct",value:function(e){p.Dom.safeRemove(this.messagePopup)}},{key:"onSpeechRecognizeProgressResult",value:function(e){var n=this;this.messagePopup||(this.messagePopup=this.j.create.div("jodit-speech-recognize__popup")),this.j.workplace.appendChild(this.messagePopup),this.j.async.clearTimeout(this.__hidePopupTimeout),this.__hidePopupTimeout=this.j.async.setTimeout(function(){p.Dom.safeRemove(n.messagePopup)},1e3),this.messagePopup.innerText=e+"|"}},{key:"onSpeechRecognizeResult",value:function(e){this.j.async.clearTimeout(this.__hidePopupTimeout),p.Dom.safeRemove(this.messagePopup);var n=this.j,t=n.s;if(!this._checkCommand(e)){var i=t.range,o=t.current();if(t.isCollapsed()&&p.Dom.isText(o)&&p.Dom.isOrContains(n.editor,o)&&o.nodeValue){var s=o.nodeValue;o.nodeValue=s+(/[\u00A0 ]\uFEFF*$/.test(s)?"":" ")+e,i.setStartAfter(o),t.selectRange(i),n.synchronizeValues()}else t.insertHTML(e)}}},{key:"_checkCommand",value:function(e){return e=e.toLowerCase().replace(/\./g,""),!!this._commandToWord[e]&&((0,_.execSpellCommand)(this.j,this._commandToWord[e]),!0)}}]),n}((0,c._)(f.Plugin));(0,a.__decorate)([(0,l.watch)(":speechRecognizeProgressResult")],R.prototype,"onSpeechRecognizeProgressResult",null),(0,a.__decorate)([(0,l.watch)(":speechRecognizeResult")],R.prototype,"onSpeechRecognizeResult",null),m.Jodit.plugins.add("speech-recognize",R)},22227:function(e){e.exports='<svg viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <path d="M8,11c1.657,0,3-1.343,3-3V3c0-1.657-1.343-3-3-3S5,1.343,5,3v5C5,9.657,6.343,11,8,11z"/> <path d="M13,8V6h-1l0,1.844c0,1.92-1.282,3.688-3.164,4.071C6.266,12.438,4,10.479,4,8V6H3v2c0,2.414,1.721,4.434,4,4.899V15H5v1h6 v-1H9v-2.101C11.279,12.434,13,10.414,13,8z"/> </svg>'}},function(e){return e(e.s=31262)}])});
|
|
8
|
+
!function(e,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define([],n);else{var t=n();for(var i in t)("object"==typeof exports?exports:e)[i]=t[i]}}(self,function(){return(self.webpackChunkjodit=self.webpackChunkjodit||[]).push([[882],{75143:function(e,n,t){"use strict";var i=t(22289),o=t(85932),s=t(7909),r=t(36400),u=t(29434),c=t(5266),a=t(97743),l=t(68097),p=t(22227),d=t.n(p);c.Config.prototype.speechRecognize={api:void 0!==a.SpeechRecognition?a.SpeechRecognition:null,sound:!0,continuous:!1,interimResults:!0,commands:{"newline|enter":"enter","delete|remove word|delete word":"backspaceWordButton",comma:"inserthtml::,",underline:"inserthtml::_",hyphen:"inserthtml::-",space:"inserthtml:: ",question:"inserthtml::?",dot:"inserthtml::.","quote|quotes|open quote":"inserthtml::'","header|header h1":"formatblock::h1","select all":"selectall"}},u.Icon.set("speech-recognize",d()),c.Config.prototype.controls.speechRecognize={isVisible:function(e){return!!e.o.speechRecognize.api},isActive:function(e,n){var t=(0,r.dataBind)(e,"speech");return!!(null==t?void 0:t.isEnabled)},isDisabled:function(e){return!e.o.speechRecognize.api},exec:function(e,n,t){var u=t.button,c=t.control,a=e.o.speechRecognize,p=a.api,d=a.lang,h=a.continuous,f=a.interimResults,m=a.sound;if(!p)return void e.alert("Speech recognize API unsupported in your browser");var _=(0,r.dataBind)(e,"speech");if(!_){var g,R=new p;(_=new l.RecognizeManager(e.async,R)).lang=(0,o.isString)(d)?d:null!=(g=(0,s.attr)(e.od.documentElement,"lang"))?g:void 0,_.continuous=h,_.interimResults=f,_.sound=m,(0,r.dataBind)(e,"speech",_),_.on("pulse",function(e){u.setMod("pulse",e)}),_.on("result",function(n){return e.e.fire("speechRecognizeResult",n)}),_.on("progress",function(n){return e.e.fire("speechRecognizeProgressResult",n)}),_.on("error",function(n){return e.message.error(n)}),e.hookStatus("beforeDestruct",function(){(0,r.dataBind)(e,"speech",null),_.destruct()})}if(c.args){var v=c.args[0];if((0,i.isBoolean)(_[v])){_[v]=!_[v],_.isEnabled&&_.restart();return}}_.toggle(),_.isEnabled&&u.setMod("pulse",!0),u.state.activated=_.isEnabled},name:"speechRecognize",command:"toggleSpeechRecognize",tooltip:"Speech Recognize",list:{sound:"Sound",interimResults:"Interim Results"},childTemplate:function(e,n,t){var i,o=(0,r.dataBind)(e,"speech"),s=null!=(i=null==o?void 0:o[n])?i:e.o.speechRecognize[n];return"<span class='jodit-speech-recognize__list-item'><input ".concat(s?"checked":""," class='jodit-checkbox' type='checkbox'> ").concat(t,"</span>")},mods:{stroke:!1}}},94092:function(e,n,t){"use strict";t.d(n,{PII:function(){return i},WARN:function(){return o}});var i=440,o=940},97743:function(e,n,t){"use strict";t.d(n,{SpeechRecognition:function(){return o}});var i=t(81937),o=i.globalWindow?i.globalWindow.SpeechRecognition||i.globalWindow.webkitSpeechRecognition:void 0},8962:function(e,n,t){"use strict";t.d(n,{execSpellCommand:function(){return o}});var i=t(50684);function o(e,n){var t=(0,i._)(n.split("::"),2),o=t[0],s=t[1];e.execCommand(o,null,s)}},68097:function(e,n,t){"use strict";t.d(n,{RecognizeManager:function(){return m}});var i=t(69262),o=t(73104),s=t(53429),r=t(25045),u=t(22248),c=t(66773),a=t(34918),l=t(31635),p=t(84839),d=t(60216),h=t(32560),f=t(94092),m=function(e){function n(e,t){var s;return(0,o._)(this,n),s=(0,i._)(this,n),(0,r._)(s,"async",void 0),(0,r._)(s,"_lang",void 0),(0,r._)(s,"_continuous",void 0),(0,r._)(s,"_interimResults",void 0),(0,r._)(s,"sound",void 0),(0,r._)(s,"_isEnabled",void 0),(0,r._)(s,"_restartTimeout",void 0),(0,r._)(s,"_onSpeechStart",void 0),(0,r._)(s,"_api",void 0),(0,r._)(s,"__interimResults",void 0),s.async=e,s._continuous=!1,s._interimResults=!1,s.sound=!0,s._isEnabled=!1,s._restartTimeout=0,s._onSpeechStart=function(e){s._isEnabled&&(s.async.clearTimeout(s._restartTimeout),s._restartTimeout=s.async.setTimeout(function(){s.restart(),s.emit("pulse",!1),s._makeSound(f.WARN)},5e3),s.emit("pulse",!0))},s.__interimResults="",s._api=t,n._instances.add(s),s}return(0,a._)(n,e),(0,s._)(n,[{key:"lang",get:function(){return this._lang},set:function(e){this._lang=e,this._api.lang=e}},{key:"continuous",get:function(){return this._continuous},set:function(e){this._continuous=e,this._api.continuous=e}},{key:"interimResults",get:function(){return this._interimResults},set:function(e){this._interimResults=e,this._api.interimResults=e}},{key:"destruct",value:function(){this.stop(),(0,h.closeSound)(this),n._instances.delete(this),(0,u._)((0,c._)(n.prototype),"destruct",this).call(this)}},{key:"isEnabled",get:function(){return this._isEnabled}},{key:"start",value:function(){var e=this;if(!this._isEnabled){this._isEnabled=!0,n._instances.forEach(function(n){n!==e&&n.stop()});try{this._api.start()}catch(e){this._onError(e),this.stop();return}this.__on("speechstart",this._onSpeechStart).__on("error",this._onError).__on("result",this._onProgress).__on("end",this._onResults)}}},{key:"stop",value:function(){this._isEnabled&&(this._api.abort(),this._api.stop(),this.__off("speechstart",this._onSpeechStart).__off("error",this._onError).__off("result",this._onProgress).__off("end",this._onResults),this.async.clearTimeout(this._restartTimeout),this._isEnabled=!1,this.emit("pulse",!1))}},{key:"toggle",value:function(){this._isEnabled?this.stop():this.start()}},{key:"restart",value:function(){this.stop(),this.start()}},{key:"__on",value:function(e,n){return this._api.addEventListener(e,n),this}},{key:"__off",value:function(e,n){return this._api.removeEventListener(e,n),this}},{key:"_onResults",value:function(e){this.emit("pulse",!1),this.emit("result",this.__interimResults),this.__interimResults="",this._makeSound(f.PII),this.restart()}},{key:"_onProgress",value:function(e){if(this._isEnabled&&(this.__interimResults="",e.results)){for(var n=0;n<e.results.length;n++){var t=e.results.item(n);if(t.length){var i=t.item(0).transcript;this.__interimResults+=i}}this.__interimResults&&this.emit("progress",this.__interimResults)}}},{key:"_onError",value:function(e){"voice-unavailable"===e.error&&this.emit("error","Voice unavailable"),"not-allowed"===e.error&&this.emit("error","Not allowed"),("language-unavailable"===e.error||"language-not-supported"===e.error)&&this.emit("error","Language unavailable"),this._makeSound(f.WARN),this.emit("pulse",!1),this.stop()}},{key:"_makeSound",value:function(e){this.sound&&(0,h.sound)(this,{frequency:e})}}]),n}(d.Eventify);(0,r._)(m,"_instances",new Set),(0,l.__decorate)([p.autobind],m.prototype,"_onResults",null),(0,l.__decorate)([p.autobind],m.prototype,"_onProgress",null),(0,l.__decorate)([p.autobind],m.prototype,"_onError",null)},32560:function(e,n,t){"use strict";t.d(n,{closeSound:function(){return u},sound:function(){return r}});var i=t(81937),o=t(94092),s=new WeakMap;function r(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=n.sec,r=n.frequency,u=void 0===r?o.PII:r,c=n.gain,a=n.type,l=function(e){if(!i.globalWindow)return null;var n=s.get(e);if(n&&"closed"!==n.state)return n;var t=i.globalWindow.AudioContext||i.globalWindow.webkitAudioContext;if(!t)return null;var o=new t;return s.set(e,o),o}(e);if(l){var p=l.createGain(),d=l.createOscillator();d.type=void 0===a?"sine":a,d.frequency.value=u,p.gain.value=void 0===c?.1:c,d.connect(p),p.connect(l.destination),d.start(),d.stop(l.currentTime+(void 0===t?.1:t))}}function u(e){var n=s.get(e);n&&(s.delete(e),"closed"!==n.state&&n.close())}},19922:function(e){e.exports={newline:"الخط الجديد",delete:"حذف",space:"الفضاء","Speech Recognize":"التعرف على الكلام",Sound:"الصوت","Interim Results":"النتائج المؤقتة"}},20759:function(e){e.exports={newline:"ř\xe1dek",delete:"odstranit",space:"prostora","Speech Recognize":"Rozpozn\xe1n\xed Řeči",Sound:"Zvuk","Interim Results":"Průběžn\xe9 V\xfdsledky"}},22350:function(e){e.exports={newline:"Zeilenumbruch",delete:"l\xf6schen",space:"Raum","Speech Recognize":"Sprache Erkennen",Sound:"Sound","Interim Results":"Zwischenergebnis"}},97509:function(e){e.exports={newline:"nueva l\xednea",delete:"eliminar",space:"espacio","Speech Recognize":"Reconocimiento de Voz",Sound:"Sonido","Interim Results":"Resultados Provisionales"}},49668:function(e){e.exports={newline:"خط جدید",delete:"حذف",space:"فضا","Speech Recognize":"گفتار را تشخیص دهید",Sound:"صدا","Interim Results":"نتایج موقت"}},33276:function(e){e.exports={"Speech Recognize":"Puheentunnistus",newline:"uusi rivi",delete:"poistaa",space:"tilaa",Sound:"\xc4\xe4ni","Interim Results":"V\xe4litulokset"}},43517:function(e){e.exports={newline:"nouvelle ligne",delete:"supprimer",space:"espace","Speech Recognize":"Reconnaissance Vocale",Sound:"Son","Interim Results":"R\xe9sultats Interm\xe9diaires"}},8858:function(e){e.exports={newline:"חדשות",delete:"מחק",space:"שטח","Speech Recognize":"דיבור מזהה",Sound:"קול","Interim Results":"תוצאות ביניים"}},22922:function(e){e.exports={newline:"\xfajsor",delete:"t\xf6rl\xe9s",space:"t\xe9r","Speech Recognize":"A Besz\xe9d Felismeri",Sound:"Hang","Interim Results":"Idők\xf6zi Eredm\xe9nyek"}},81900:function(e){e.exports={newline:"newline",delete:"Hapus",space:"ruang","Speech Recognize":"Pidato Mengenali",Sound:"Suara","Interim Results":"Hasil Sementara"}},43219:function(e,n,t){"use strict";t.r(n),t.d(n,{ar:function(){return i},cs_cz:function(){return o},de:function(){return s},es:function(){return r},fa:function(){return u},fi:function(){return c},fr:function(){return a},he:function(){return l},hu:function(){return p},id:function(){return d},it:function(){return h},ja:function(){return f},ko:function(){return m},mn:function(){return _},nl:function(){return g},no:function(){return R},pl:function(){return v},pt_br:function(){return S},ru:function(){return z},tr:function(){return w},ua:function(){return y},zh_cn:function(){return k},zh_tw:function(){return b}});var i=t(19922),o=t(20759),s=t(22350),r=t(97509),u=t(49668),c=t(33276),a=t(43517),l=t(8858),p=t(22922),d=t(81900),h=t(35420),f=t(18712),m=t(73363),_=t(74762),g=t(73759),R=t(72850),v=t(37161),S=t(62896),z=t(39996),w=t(93423),y=t(10179),k=t(62547),b=t(29475)},35420:function(e){e.exports={newline:"nuova riga",delete:"eliminare",space:"spazio","Speech Recognize":"Discorso Riconoscere",Sound:"Suono","Interim Results":"Risultati intermedi"}},18712:function(e){e.exports={newline:"改行",delete:"削除",space:"スペース","Speech Recognize":"音声認識",Sound:"音","Interim Results":"中間結果"}},73363:function(e){e.exports={newline:"줄 바꿈",delete:"삭제",space:"공간","Speech Recognize":"음성 인식",Sound:"소리","Interim Results":"중간 결과"}},74762:function(e){e.exports={newline:"Шинэ мөр",delete:"Устгах",space:"Зай","Speech Recognize":"Дуу хоолой таних",Sound:"Дуу","Interim Results":"Түр зуурын үр дүн"}},73759:function(e){e.exports={newline:"regel",delete:"verwijderen",space:"ruimte","Speech Recognize":"Spraak Herkennen",Sound:"Geluid","Interim Results":"Tussentijdse Resultaten"}},72850:function(e){e.exports={newline:"nylinje",delete:"slette",space:"rom","Speech Recognize":"Talegjenkjenning",Sound:"Lyd","Interim Results":"Midlertidige resultater"}},37161:function(e){e.exports={newline:"newline",delete:"usunąć",space:"przestrzeń","Speech Recognize":"Rozpoznawanie Mowy",Sound:"Dźwięk","Interim Results":"Wyniki Okresowe"}},62896:function(e){e.exports={newline:"linha",delete:"excluir",space:"espaco","Speech Recognize":"Discurso Reconhecer",Sound:"Som","Interim Results":"Resultados Provis\xf3rios"}},39996:function(e){e.exports={newline:"новая строка|перенос|энтер",delete:"удалить",space:"пробел","Speech Recognize":"Распознавание речи",Sound:"Звук","Interim Results":"Промежуточные результаты"}},93423:function(e){e.exports={newline:"yeni satır",delete:"silmek",space:"uzay","Speech Recognize":"Konuşma Tanıma",Sound:"Ses","Interim Results":"Ara Sonu\xe7lar"}},10179:function(e){e.exports={newline:"новая строка|перенос|ентер",delete:"видалити",space:"пробел","Speech Recognize":"Распознавание речи",Sound:"Звук","Interim Results":"Проміжні результати"}},62547:function(e){e.exports={newline:"新行",delete:"删除",space:"空间","Speech Recognize":"言语识别",Sound:"声音","Interim Results":"中期业绩"}},29475:function(e){e.exports={newline:"換行",delete:"刪除",space:"空白","Speech Recognize":"語音辨識",Sound:"聲音","Interim Results":"階段性辨識結果"}},31262:function(e,n,t){"use strict";t.r(n),t.d(n,{SpeechRecognizeNative:function(){return R}});var i=t(69262),o=t(73104),s=t(53429),r=t(25045),u=t(34918),c=t(38574),a=t(31635),l=t(68616),p=t(23211),d=t(28077),h=t(71125),f=t(91206);t(75143);var m=t(73302),_=t(8962),g=t(43219),R=function(e){function n(){var e;return(0,o._)(this,n),e=(0,i._)(this,n,arguments),(0,r._)(e,"buttons",[{group:"state",name:"speechRecognize"}]),(0,r._)(e,"messagePopup",void 0),(0,r._)(e,"__hidePopupTimeout",void 0),(0,r._)(e,"_commandToWord",{}),e}return(0,u._)(n,e),(0,s._)(n,[{key:"afterInit",value:function(e){var n=this,t=e.o.speechRecognize.commands;t&&((0,d.extendLang)(g),(0,h.keys)(t,!1).forEach(function(i){i.split("|").forEach(function(o){o=o.trim().toLowerCase(),n._commandToWord[o]=t[i];var s=e.i18n(o);s!==o&&s.split("|").forEach(function(e){n._commandToWord[e.trim().toLowerCase()]=t[i].trim()})})}))}},{key:"beforeDestruct",value:function(e){p.Dom.safeRemove(this.messagePopup)}},{key:"onSpeechRecognizeProgressResult",value:function(e){var n=this;this.messagePopup||(this.messagePopup=this.j.create.div("jodit-speech-recognize__popup")),this.j.workplace.appendChild(this.messagePopup),this.j.async.clearTimeout(this.__hidePopupTimeout),this.__hidePopupTimeout=this.j.async.setTimeout(function(){p.Dom.safeRemove(n.messagePopup)},1e3),this.messagePopup.innerText=e+"|"}},{key:"onSpeechRecognizeResult",value:function(e){this.j.async.clearTimeout(this.__hidePopupTimeout),p.Dom.safeRemove(this.messagePopup);var n=this.j,t=n.s;if(!this._checkCommand(e)){var i=t.range,o=t.current();if(t.isCollapsed()&&p.Dom.isText(o)&&p.Dom.isOrContains(n.editor,o)&&o.nodeValue){var s=o.nodeValue;o.nodeValue=s+(/[\u00A0 ]\uFEFF*$/.test(s)?"":" ")+e,i.setStartAfter(o),t.selectRange(i),n.synchronizeValues()}else t.insertHTML(e)}}},{key:"_checkCommand",value:function(e){return e=e.toLowerCase().replace(/\./g,""),!!this._commandToWord[e]&&((0,_.execSpellCommand)(this.j,this._commandToWord[e]),!0)}}]),n}((0,c._)(f.Plugin));(0,a.__decorate)([(0,l.watch)(":speechRecognizeProgressResult")],R.prototype,"onSpeechRecognizeProgressResult",null),(0,a.__decorate)([(0,l.watch)(":speechRecognizeResult")],R.prototype,"onSpeechRecognizeResult",null),m.Jodit.plugins.add("speech-recognize",R)},22227:function(e){e.exports='<svg viewBox="0 0 16 16" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <path d="M8,11c1.657,0,3-1.343,3-3V3c0-1.657-1.343-3-3-3S5,1.343,5,3v5C5,9.657,6.343,11,8,11z"/> <path d="M13,8V6h-1l0,1.844c0,1.92-1.282,3.688-3.164,4.071C6.266,12.438,4,10.479,4,8V6H3v2c0,2.414,1.721,4.434,4,4.899V15H5v1h6 v-1H9v-2.101C11.279,12.434,13,10.414,13,8z"/> </svg>'}},function(e){return e(e.s=31262)}])});
|
package/es5/polyfills.fat.min.js
CHANGED
package/es5/polyfills.js
CHANGED
package/es5/polyfills.min.js
CHANGED
package/esm/config.d.ts
CHANGED
|
@@ -619,18 +619,62 @@ declare class Config implements IViewOptions {
|
|
|
619
619
|
*/
|
|
620
620
|
disablePlugins: string[] | string;
|
|
621
621
|
/**
|
|
622
|
-
* Init and download extra plugins
|
|
622
|
+
* Init and download extra plugins that are **not** already bundled/registered.
|
|
623
|
+
*
|
|
624
|
+
* For every name in this list that is not found in the plugin registry, Jodit
|
|
625
|
+
* loads it **at runtime over the network** from:
|
|
626
|
+
*
|
|
627
|
+
* ```text
|
|
628
|
+
* <basePath>plugins/<name>/<name>(.min).js
|
|
629
|
+
* ```
|
|
630
|
+
*
|
|
631
|
+
* (see {@link Config.basePath} and {@link Config.minified}). If the plugin is
|
|
632
|
+
* already registered — e.g. you imported it statically, or you use a bundle
|
|
633
|
+
* that ships it (such as the `jodit-pro` / `jodit-pro-react` "all plugins"
|
|
634
|
+
* build) — it is **skipped** and no request is made; in that case you don't
|
|
635
|
+
* need `extraPlugins` at all, just add the plugin's button.
|
|
623
636
|
*
|
|
624
637
|
* ```typescript
|
|
625
|
-
*
|
|
638
|
+
* // Dynamic loading: fetches <basePath>plugins/emoji/emoji.js
|
|
639
|
+
* const editor = Jodit.make('.editor', {
|
|
626
640
|
* extraPlugins: ['emoji']
|
|
627
641
|
* });
|
|
628
642
|
* ```
|
|
629
|
-
*
|
|
643
|
+
*
|
|
644
|
+
* You can also pass an explicit URL to bypass the `basePath` convention:
|
|
645
|
+
*
|
|
646
|
+
* ```typescript
|
|
647
|
+
* const editor = Jodit.make('.editor', {
|
|
648
|
+
* extraPlugins: [{ name: 'emoji', url: 'https://cdn.example.com/emoji.js' }]
|
|
649
|
+
* });
|
|
650
|
+
* ```
|
|
651
|
+
*
|
|
652
|
+
* Note: if you see a request to a malformed URL (e.g. `.../src/main.tsx?t=...plugins/emoji/emoji.js`),
|
|
653
|
+
* it means `basePath` was auto-detected incorrectly under your bundler — set
|
|
654
|
+
* {@link Config.basePath} explicitly. See the Plugin System docs for details.
|
|
630
655
|
*/
|
|
631
656
|
extraPlugins: Array<string | IExtraPlugin>;
|
|
632
657
|
/**
|
|
633
|
-
* Base path for
|
|
658
|
+
* Base path used to build the URL for dynamically loaded {@link Config.extraPlugins}
|
|
659
|
+
* (and their styles): `<basePath>plugins/<name>/<name>(.min).js`.
|
|
660
|
+
*
|
|
661
|
+
* When not set, Jodit auto-detects it from `document.currentScript`, then the
|
|
662
|
+
* last `<script src>` on the page, then `location.href`. That detection works
|
|
663
|
+
* for classic `<script>` includes, but **fails under ESM bundlers / dev
|
|
664
|
+
* servers** (Vite, Webpack dev, etc.) where there is no script tag for the
|
|
665
|
+
* bundle — it falls back to the entry module URL (e.g. `main.tsx`) and produces
|
|
666
|
+
* a broken plugin URL.
|
|
667
|
+
*
|
|
668
|
+
* Fix: host the plugin files at a public location and point `basePath` there
|
|
669
|
+
* (note the trailing slash):
|
|
670
|
+
*
|
|
671
|
+
* ```typescript
|
|
672
|
+
* const editor = Jodit.make('.editor', {
|
|
673
|
+
* basePath: 'https://your-site.com/jodit-assets/',
|
|
674
|
+
* extraPlugins: ['emoji']
|
|
675
|
+
* // → loads https://your-site.com/jodit-assets/plugins/emoji/emoji.js
|
|
676
|
+
* });
|
|
677
|
+
* ```
|
|
634
678
|
*/
|
|
635
679
|
basePath?: string;
|
|
636
680
|
/**
|
package/esm/config.js
CHANGED
|
@@ -729,14 +729,39 @@ class Config {
|
|
|
729
729
|
*/
|
|
730
730
|
this.disablePlugins = [];
|
|
731
731
|
/**
|
|
732
|
-
* Init and download extra plugins
|
|
732
|
+
* Init and download extra plugins that are **not** already bundled/registered.
|
|
733
|
+
*
|
|
734
|
+
* For every name in this list that is not found in the plugin registry, Jodit
|
|
735
|
+
* loads it **at runtime over the network** from:
|
|
736
|
+
*
|
|
737
|
+
* ```text
|
|
738
|
+
* <basePath>plugins/<name>/<name>(.min).js
|
|
739
|
+
* ```
|
|
740
|
+
*
|
|
741
|
+
* (see {@link Config.basePath} and {@link Config.minified}). If the plugin is
|
|
742
|
+
* already registered — e.g. you imported it statically, or you use a bundle
|
|
743
|
+
* that ships it (such as the `jodit-pro` / `jodit-pro-react` "all plugins"
|
|
744
|
+
* build) — it is **skipped** and no request is made; in that case you don't
|
|
745
|
+
* need `extraPlugins` at all, just add the plugin's button.
|
|
733
746
|
*
|
|
734
747
|
* ```typescript
|
|
735
|
-
*
|
|
748
|
+
* // Dynamic loading: fetches <basePath>plugins/emoji/emoji.js
|
|
749
|
+
* const editor = Jodit.make('.editor', {
|
|
736
750
|
* extraPlugins: ['emoji']
|
|
737
751
|
* });
|
|
738
752
|
* ```
|
|
739
|
-
*
|
|
753
|
+
*
|
|
754
|
+
* You can also pass an explicit URL to bypass the `basePath` convention:
|
|
755
|
+
*
|
|
756
|
+
* ```typescript
|
|
757
|
+
* const editor = Jodit.make('.editor', {
|
|
758
|
+
* extraPlugins: [{ name: 'emoji', url: 'https://cdn.example.com/emoji.js' }]
|
|
759
|
+
* });
|
|
760
|
+
* ```
|
|
761
|
+
*
|
|
762
|
+
* Note: if you see a request to a malformed URL (e.g. `.../src/main.tsx?t=...plugins/emoji/emoji.js`),
|
|
763
|
+
* it means `basePath` was auto-detected incorrectly under your bundler — set
|
|
764
|
+
* {@link Config.basePath} explicitly. See the Plugin System docs for details.
|
|
740
765
|
*/
|
|
741
766
|
this.extraPlugins = [];
|
|
742
767
|
/**
|
package/esm/core/constants.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Released under MIT see LICENSE.txt in the project root for license information.
|
|
4
4
|
* Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net
|
|
5
5
|
*/
|
|
6
|
-
export const APP_VERSION = "4.12.
|
|
6
|
+
export const APP_VERSION = "4.12.4";
|
|
7
7
|
// prettier-ignore
|
|
8
8
|
export const ES = "es2020";
|
|
9
9
|
export const IS_ES_MODERN = true;
|
package/esm/core/ui/icon.d.ts
CHANGED
|
@@ -27,4 +27,14 @@ export declare class Icon {
|
|
|
27
27
|
* Make icon html element
|
|
28
28
|
*/
|
|
29
29
|
static makeIcon(jodit: IViewBased, icon: IUIIconState): CanUndef<Node>;
|
|
30
|
+
/**
|
|
31
|
+
* Turn a raw icon string into an element with a `classList`.
|
|
32
|
+
*
|
|
33
|
+
* A plain-text icon (e.g. an emoji/text glyph) makes `fromHTML` return a
|
|
34
|
+
* Text node, which has no `classList`; wrap it in a span so classes/styles
|
|
35
|
+
* can be applied and `makeIcon` never crashes on `iconElement.classList`.
|
|
36
|
+
* Note: SVG icons are `SVGElement` (not `HTMLElement`) but are still Element
|
|
37
|
+
* nodes with a `classList`, so we check `isElement`, not `isHTMLElement`.
|
|
38
|
+
*/
|
|
39
|
+
private static toIconElement;
|
|
30
40
|
}
|
package/esm/core/ui/icon.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net
|
|
5
5
|
*/
|
|
6
6
|
import { IS_PROD } from "../constants.js";
|
|
7
|
+
import { Dom } from "../dom/dom.js";
|
|
7
8
|
import { camelCase, kebabCase } from "../helpers/index.js";
|
|
8
9
|
import { css } from "../helpers/utils/css.js";
|
|
9
10
|
export class Icon {
|
|
@@ -71,7 +72,7 @@ export class Icon {
|
|
|
71
72
|
Icon.get(name, '') ||
|
|
72
73
|
((_d = jodit.o.extraIcons) === null || _d === void 0 ? void 0 : _d[name]);
|
|
73
74
|
if (svg) {
|
|
74
|
-
iconElement =
|
|
75
|
+
iconElement = Icon.toIconElement(jodit, svg.trim());
|
|
75
76
|
if (!/^<svg/i.test(name)) {
|
|
76
77
|
iconElement.classList.add('jodit-icon_' + clearName);
|
|
77
78
|
}
|
|
@@ -88,6 +89,21 @@ export class Icon {
|
|
|
88
89
|
}
|
|
89
90
|
return iconElement;
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Turn a raw icon string into an element with a `classList`.
|
|
94
|
+
*
|
|
95
|
+
* A plain-text icon (e.g. an emoji/text glyph) makes `fromHTML` return a
|
|
96
|
+
* Text node, which has no `classList`; wrap it in a span so classes/styles
|
|
97
|
+
* can be applied and `makeIcon` never crashes on `iconElement.classList`.
|
|
98
|
+
* Note: SVG icons are `SVGElement` (not `HTMLElement`) but are still Element
|
|
99
|
+
* nodes with a `classList`, so we check `isElement`, not `isHTMLElement`.
|
|
100
|
+
*/
|
|
101
|
+
static toIconElement(jodit, svg) {
|
|
102
|
+
const node = jodit.c.fromHTML(svg);
|
|
103
|
+
return Dom.isElement(node)
|
|
104
|
+
? node
|
|
105
|
+
: jodit.c.span('jodit-icon_text', node);
|
|
106
|
+
}
|
|
91
107
|
}
|
|
92
108
|
Icon.icons = {};
|
|
93
109
|
Icon.__cache = new Map();
|
|
@@ -67,7 +67,10 @@ Config.prototype.controls.speechRecognize = {
|
|
|
67
67
|
api.on('result', (text) => jodit.e.fire('speechRecognizeResult', text));
|
|
68
68
|
api.on('progress', (text) => jodit.e.fire('speechRecognizeProgressResult', text));
|
|
69
69
|
api.on('error', (text) => jodit.message.error(text));
|
|
70
|
-
|
|
70
|
+
// Tie cleanup to the editor lifecycle (not the button): the manager
|
|
71
|
+
// must survive toolbar rebuilds and be released — together with its
|
|
72
|
+
// AudioContext — only when the editor itself is destroyed.
|
|
73
|
+
jodit.hookStatus('beforeDestruct', () => {
|
|
71
74
|
dataBind(jodit, 'speech', null);
|
|
72
75
|
api.destruct();
|
|
73
76
|
});
|
|
@@ -15,7 +15,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
15
15
|
};
|
|
16
16
|
import { autobind } from "../../../core/decorators/index.js";
|
|
17
17
|
import { Eventify } from "../../../core/event-emitter/eventify.js";
|
|
18
|
-
import { sound } from "./sound.js";
|
|
18
|
+
import { closeSound, sound } from "./sound.js";
|
|
19
19
|
import { PII, WARN } from "../constants.js";
|
|
20
20
|
export class RecognizeManager extends Eventify {
|
|
21
21
|
set lang(v) {
|
|
@@ -65,6 +65,7 @@ export class RecognizeManager extends Eventify {
|
|
|
65
65
|
}
|
|
66
66
|
destruct() {
|
|
67
67
|
this.stop();
|
|
68
|
+
closeSound(this);
|
|
68
69
|
RecognizeManager._instances.delete(this);
|
|
69
70
|
super.destruct();
|
|
70
71
|
}
|
|
@@ -172,7 +173,7 @@ export class RecognizeManager extends Eventify {
|
|
|
172
173
|
}
|
|
173
174
|
_makeSound(frequency) {
|
|
174
175
|
if (this.sound) {
|
|
175
|
-
sound({ frequency });
|
|
176
|
+
sound(this, { frequency });
|
|
176
177
|
}
|
|
177
178
|
}
|
|
178
179
|
}
|
|
@@ -4,11 +4,18 @@
|
|
|
4
4
|
* Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
|
+
* Play a short beep on the owner's (lazily created, reused) AudioContext.
|
|
7
8
|
* @internal
|
|
8
9
|
*/
|
|
9
|
-
export declare function sound({ sec, frequency, gain, type }?: {
|
|
10
|
+
export declare function sound(owner: object, { sec, frequency, gain, type }?: {
|
|
10
11
|
sec?: number;
|
|
11
12
|
frequency?: number;
|
|
12
13
|
gain?: number;
|
|
13
14
|
type?: 'sine' | 'square' | 'sawtooth' | 'triangle';
|
|
14
15
|
}): void;
|
|
16
|
+
/**
|
|
17
|
+
* Close and forget the owner's AudioContext. Call this when the owner is
|
|
18
|
+
* destroyed so the context does not leak.
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export declare function closeSound(owner: object): void;
|
|
@@ -9,24 +9,61 @@
|
|
|
9
9
|
import { globalWindow } from "../../../core/constants.js";
|
|
10
10
|
import { PII } from "../constants.js";
|
|
11
11
|
/**
|
|
12
|
+
* One AudioContext per owner (e.g. a RecognizeManager). Previously a new context
|
|
13
|
+
* was created on every beep and never closed, so during continuous recognition
|
|
14
|
+
* they piled up — leaking until the browser's per-page limit was hit and the
|
|
15
|
+
* overlapping audio turned into a "roar". We now reuse a single context per
|
|
16
|
+
* owner and release it via {@link closeSound} when the owner is destroyed.
|
|
12
17
|
* @internal
|
|
13
18
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
const contexts = new WeakMap();
|
|
20
|
+
function getContext(owner) {
|
|
21
|
+
if (!globalWindow) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const existing = contexts.get(owner);
|
|
25
|
+
if (existing && existing.state !== 'closed') {
|
|
26
|
+
return existing;
|
|
27
|
+
}
|
|
28
|
+
const Ctor = globalWindow.AudioContext ||
|
|
29
|
+
globalWindow.webkitAudioContext;
|
|
30
|
+
if (!Ctor) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const context = new Ctor();
|
|
34
|
+
contexts.set(owner, context);
|
|
35
|
+
return context;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Play a short beep on the owner's (lazily created, reused) AudioContext.
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export function sound(owner, { sec = 0.1, frequency = PII, gain = 0.1, type = 'sine' } = {}) {
|
|
42
|
+
const context = getContext(owner);
|
|
43
|
+
if (!context) {
|
|
18
44
|
return;
|
|
19
45
|
}
|
|
20
|
-
// one context per document
|
|
21
|
-
const context = new (globalWindow.AudioContext ||
|
|
22
|
-
globalWindow.webkitAudioContext)();
|
|
23
46
|
const vol = context.createGain();
|
|
24
47
|
const osc = context.createOscillator();
|
|
25
48
|
osc.type = type;
|
|
26
49
|
osc.frequency.value = frequency; // Hz
|
|
50
|
+
vol.gain.value = gain;
|
|
27
51
|
osc.connect(vol);
|
|
28
52
|
vol.connect(context.destination);
|
|
29
53
|
osc.start(); // start the oscillator
|
|
30
54
|
osc.stop(context.currentTime + sec);
|
|
31
|
-
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Close and forget the owner's AudioContext. Call this when the owner is
|
|
58
|
+
* destroyed so the context does not leak.
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
export function closeSound(owner) {
|
|
62
|
+
const context = contexts.get(owner);
|
|
63
|
+
if (context) {
|
|
64
|
+
contexts.delete(owner);
|
|
65
|
+
if (context.state !== 'closed') {
|
|
66
|
+
void context.close();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
32
69
|
}
|