@mdaemon/html-editor 1.2.0 → 1.3.0

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/dist/index.js CHANGED
@@ -17437,6 +17437,26 @@ function canInsertNode(state, nodeType) {
17437
17437
  }
17438
17438
  return false;
17439
17439
  }
17440
+ function getStyleProperty(element, propertyName) {
17441
+ const styleAttr = element.getAttribute("style");
17442
+ if (!styleAttr) {
17443
+ return null;
17444
+ }
17445
+ const decls = styleAttr.split(";").map((decl) => decl.trim()).filter(Boolean);
17446
+ const target = propertyName.toLowerCase();
17447
+ for (let i = decls.length - 1; i >= 0; i -= 1) {
17448
+ const decl = decls[i];
17449
+ const colonIndex = decl.indexOf(":");
17450
+ if (colonIndex === -1) {
17451
+ continue;
17452
+ }
17453
+ const prop = decl.slice(0, colonIndex).trim().toLowerCase();
17454
+ if (prop === target) {
17455
+ return decl.slice(colonIndex + 1).trim();
17456
+ }
17457
+ }
17458
+ return null;
17459
+ }
17440
17460
  var markdown_exports = {};
17441
17461
  __export$1(markdown_exports, {
17442
17462
  createAtomBlockMarkdownSpec: () => createAtomBlockMarkdownSpec,
@@ -18874,7 +18894,7 @@ var Italic = Mark2.create({
18874
18894
  ];
18875
18895
  }
18876
18896
  });
18877
- const encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
18897
+ const encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2";
18878
18898
  const encodedUtlds = "ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2";
18879
18899
  const numeric = "numeric";
18880
18900
  const ascii = "ascii";
@@ -19804,8 +19824,6 @@ function init$1({
19804
19824
  ta(Email$1, groups.domain, EmailDomain);
19805
19825
  tt(Email$1, DOT, EmailDomainDot);
19806
19826
  tt(Email$1, HYPHEN, EmailDomainHyphen);
19807
- const EmailColon = tt(Email$1, COLON);
19808
- ta(EmailColon, groups.numeric, Email);
19809
19827
  const DomainHyphen = tt(Domain, HYPHEN);
19810
19828
  const DomainDot = tt(Domain, DOT);
19811
19829
  tt(DomainHyphen, HYPHEN, DomainHyphen);
@@ -19869,11 +19887,11 @@ function init$1({
19869
19887
  const [OPEN, CLOSE] = bracketPairs[i];
19870
19888
  const UrlOpen = tt(Url$1, OPEN);
19871
19889
  tt(UrlNonaccept, OPEN, UrlOpen);
19872
- tt(UrlOpen, CLOSE, Url$1);
19873
19890
  const UrlOpenQ = makeState(Url);
19874
19891
  ta(UrlOpen, qsAccepting, UrlOpenQ);
19875
19892
  const UrlOpenSyms = makeState();
19876
- ta(UrlOpen, qsNonAccepting);
19893
+ ta(UrlOpen, qsNonAccepting, UrlOpenSyms);
19894
+ tt(UrlOpen, CLOSE, Url$1);
19877
19895
  ta(UrlOpenQ, qsAccepting, UrlOpenQ);
19878
19896
  ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);
19879
19897
  ta(UrlOpenSyms, qsAccepting, UrlOpenQ);
@@ -22608,6 +22626,7 @@ var CharacterCount = Extension.create({
22608
22626
  addOptions() {
22609
22627
  return {
22610
22628
  limit: null,
22629
+ autoTrim: true,
22611
22630
  mode: "textSize",
22612
22631
  textCounter: (text) => text.length,
22613
22632
  wordCounter: (text) => text.split(" ").filter((word) => word !== "").length
@@ -22645,7 +22664,8 @@ var CharacterCount = Extension.create({
22645
22664
  return;
22646
22665
  }
22647
22666
  const limit = this.options.limit;
22648
- if (limit === null || limit === void 0 || limit === 0) {
22667
+ const autoTrim = this.options.autoTrim;
22668
+ if (limit === null || limit === void 0 || limit === 0 || autoTrim === false) {
22649
22669
  initialEvaluationDone = true;
22650
22670
  return;
22651
22671
  }
@@ -23195,21 +23215,8 @@ var BackgroundColor = Extension.create({
23195
23215
  default: null,
23196
23216
  parseHTML: (element) => {
23197
23217
  var _a;
23198
- const styleAttr = element.getAttribute("style");
23199
- if (styleAttr) {
23200
- const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
23201
- for (let i = decls.length - 1; i >= 0; i -= 1) {
23202
- const parts = decls[i].split(":");
23203
- if (parts.length >= 2) {
23204
- const prop = parts[0].trim().toLowerCase();
23205
- const val = parts.slice(1).join(":").trim();
23206
- if (prop === "background-color") {
23207
- return val.replace(/['"]+/g, "");
23208
- }
23209
- }
23210
- }
23211
- }
23212
- return (_a = element.style.backgroundColor) == null ? void 0 : _a.replace(/['"]+/g, "");
23218
+ const value = (_a = getStyleProperty(element, "background-color")) != null ? _a : element.style.backgroundColor;
23219
+ return value == null ? void 0 : value.replace(/['"]+/g, "");
23213
23220
  },
23214
23221
  renderHTML: (attributes) => {
23215
23222
  if (!attributes.backgroundColor) {
@@ -23251,21 +23258,8 @@ var Color = Extension.create({
23251
23258
  default: null,
23252
23259
  parseHTML: (element) => {
23253
23260
  var _a;
23254
- const styleAttr = element.getAttribute("style");
23255
- if (styleAttr) {
23256
- const decls = styleAttr.split(";").map((s) => s.trim()).filter(Boolean);
23257
- for (let i = decls.length - 1; i >= 0; i -= 1) {
23258
- const parts = decls[i].split(":");
23259
- if (parts.length >= 2) {
23260
- const prop = parts[0].trim().toLowerCase();
23261
- const val = parts.slice(1).join(":").trim();
23262
- if (prop === "color") {
23263
- return val.replace(/['"]+/g, "");
23264
- }
23265
- }
23266
- }
23267
- }
23268
- return (_a = element.style.color) == null ? void 0 : _a.replace(/['"]+/g, "");
23261
+ const value = (_a = getStyleProperty(element, "color")) != null ? _a : element.style.color;
23262
+ return value == null ? void 0 : value.replace(/['"]+/g, "");
23269
23263
  },
23270
23264
  renderHTML: (attributes) => {
23271
23265
  if (!attributes.color) {
@@ -23305,7 +23299,14 @@ var FontFamily = Extension.create({
23305
23299
  attributes: {
23306
23300
  fontFamily: {
23307
23301
  default: null,
23308
- parseHTML: (element) => element.style.fontFamily,
23302
+ // Prefer the raw inline `style` attribute so unquoted or
23303
+ // single-quoted multi-word names are preserved instead of being
23304
+ // canonicalized by `element.style.fontFamily`, which forces double
23305
+ // quotes that then get HTML-encoded to `"` on serialization.
23306
+ parseHTML: (element) => {
23307
+ var _a;
23308
+ return (_a = getStyleProperty(element, "font-family")) != null ? _a : element.style.fontFamily;
23309
+ },
23309
23310
  renderHTML: (attributes) => {
23310
23311
  if (!attributes.fontFamily) {
23311
23312
  return {};
@@ -23344,7 +23345,13 @@ var FontSize$1 = Extension.create({
23344
23345
  attributes: {
23345
23346
  fontSize: {
23346
23347
  default: null,
23347
- parseHTML: (element) => element.style.fontSize,
23348
+ // Prefer the raw inline `style` attribute so the original format
23349
+ // is preserved instead of the canonicalized value returned by
23350
+ // `element.style.fontSize`.
23351
+ parseHTML: (element) => {
23352
+ var _a;
23353
+ return (_a = getStyleProperty(element, "font-size")) != null ? _a : element.style.fontSize;
23354
+ },
23348
23355
  renderHTML: (attributes) => {
23349
23356
  if (!attributes.fontSize) {
23350
23357
  return {};
@@ -23383,7 +23390,13 @@ var LineHeight$1 = Extension.create({
23383
23390
  attributes: {
23384
23391
  lineHeight: {
23385
23392
  default: null,
23386
- parseHTML: (element) => element.style.lineHeight,
23393
+ // Prefer the raw inline `style` attribute so the original format
23394
+ // is preserved instead of the canonicalized value returned by
23395
+ // `element.style.lineHeight`.
23396
+ parseHTML: (element) => {
23397
+ var _a;
23398
+ return (_a = getStyleProperty(element, "line-height")) != null ? _a : element.style.lineHeight;
23399
+ },
23387
23400
  renderHTML: (attributes) => {
23388
23401
  if (!attributes.lineHeight) {
23389
23402
  return {};
@@ -23450,7 +23463,11 @@ var Highlight = Mark2.create({
23450
23463
  return {
23451
23464
  color: {
23452
23465
  default: null,
23453
- parseHTML: (element) => element.getAttribute("data-color") || element.style.backgroundColor,
23466
+ // Prefer `data-color` (set by our own `renderHTML`) for lossless
23467
+ // round-trips. Otherwise parse the raw inline `style` attribute so
23468
+ // the original color format (e.g. `#rrggbb`) is preserved instead of
23469
+ // the canonicalized `rgb(...)` value from `element.style.backgroundColor`.
23470
+ parseHTML: (element) => element.getAttribute("data-color") || getStyleProperty(element, "background-color") || element.style.backgroundColor,
23454
23471
  renderHTML: (attributes) => {
23455
23472
  if (!attributes.color) {
23456
23473
  return {};
@@ -42870,6 +42887,567 @@ class LinkEditor {
42870
42887
  }
42871
42888
  }
42872
42889
  }
42890
+ const SPEECH_LANGUAGES = [
42891
+ { code: "ar-SA", name: "العربية" },
42892
+ { code: "ca-ES", name: "Català" },
42893
+ { code: "cs-CZ", name: "Čeština" },
42894
+ { code: "da-DK", name: "Dansk" },
42895
+ { code: "de-DE", name: "Deutsch" },
42896
+ { code: "el-GR", name: "Ελληνικά" },
42897
+ { code: "en-US", name: "English (US)" },
42898
+ { code: "en-GB", name: "English (UK)" },
42899
+ { code: "es-ES", name: "Español" },
42900
+ { code: "fi-FI", name: "Suomi" },
42901
+ { code: "fr-FR", name: "Français" },
42902
+ { code: "fr-CA", name: "Français (Canada)" },
42903
+ { code: "hu-HU", name: "Magyar" },
42904
+ { code: "id-ID", name: "Bahasa Indonesia" },
42905
+ { code: "it-IT", name: "Italiano" },
42906
+ { code: "ja-JP", name: "日本語" },
42907
+ { code: "ko-KR", name: "한국어" },
42908
+ { code: "nb-NO", name: "Norsk Bokmål" },
42909
+ { code: "nl-NL", name: "Nederlands" },
42910
+ { code: "pl-PL", name: "Polski" },
42911
+ { code: "pt-BR", name: "Português" },
42912
+ { code: "ro-RO", name: "Română" },
42913
+ { code: "ru-RU", name: "Русский" },
42914
+ { code: "sl-SI", name: "Slovenščina" },
42915
+ { code: "sr-RS", name: "Српски" },
42916
+ { code: "sv-SE", name: "Svenska" },
42917
+ { code: "th-TH", name: "ไทย" },
42918
+ { code: "tr-TR", name: "Türkçe" },
42919
+ { code: "vi-VN", name: "Tiếng Việt" },
42920
+ { code: "zh-CN", name: "中文 (简体)" },
42921
+ { code: "zh-TW", name: "中文 (繁體)" }
42922
+ ];
42923
+ const LOCALE_TO_BCP47$1 = {
42924
+ "ar": "ar-SA",
42925
+ "ca": "ca-ES",
42926
+ "cs": "cs-CZ",
42927
+ "da": "da-DK",
42928
+ "de": "de-DE",
42929
+ "el": "el-GR",
42930
+ "en": "en-US",
42931
+ "en-gb": "en-GB",
42932
+ "es": "es-ES",
42933
+ "fi": "fi-FI",
42934
+ "fr": "fr-FR",
42935
+ "fr-ca": "fr-CA",
42936
+ "hu": "hu-HU",
42937
+ "id": "id-ID",
42938
+ "it": "it-IT",
42939
+ "ja": "ja-JP",
42940
+ "ko": "ko-KR",
42941
+ "nb": "nb-NO",
42942
+ "nl": "nl-NL",
42943
+ "pl": "pl-PL",
42944
+ "pt": "pt-BR",
42945
+ "ro": "ro-RO",
42946
+ "ru": "ru-RU",
42947
+ "sl": "sl-SI",
42948
+ "sr": "sr-RS",
42949
+ "sv": "sv-SE",
42950
+ "th": "th-TH",
42951
+ "tr": "tr-TR",
42952
+ "vi": "vi-VN",
42953
+ "zh": "zh-CN",
42954
+ "zh-tw": "zh-TW"
42955
+ };
42956
+ function isSpeechRecognitionSupported() {
42957
+ return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
42958
+ }
42959
+ function getSpeechRecognitionConstructor$1() {
42960
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
42961
+ }
42962
+ class SpeechToText {
42963
+ options;
42964
+ overlay = null;
42965
+ dialog = null;
42966
+ recognition = null;
42967
+ isListening = false;
42968
+ finalTranscript = "";
42969
+ interimTranscript = "";
42970
+ lastConfidence = 0;
42971
+ restartTimer = null;
42972
+ // DOM references
42973
+ transcriptArea = null;
42974
+ confidenceEl = null;
42975
+ statusEl = null;
42976
+ startStopBtn = null;
42977
+ insertBtn = null;
42978
+ clearBtn = null;
42979
+ languageSelect = null;
42980
+ constructor(options) {
42981
+ this.options = options;
42982
+ }
42983
+ open() {
42984
+ if (this.overlay) {
42985
+ this.overlay.style.display = "flex";
42986
+ return;
42987
+ }
42988
+ this.createDialog();
42989
+ }
42990
+ close() {
42991
+ if (this.overlay) {
42992
+ this.overlay.style.display = "none";
42993
+ }
42994
+ this.stopRecognition();
42995
+ }
42996
+ destroy() {
42997
+ this.stopRecognition();
42998
+ this.overlay?.remove();
42999
+ this.overlay = null;
43000
+ this.dialog = null;
43001
+ this.transcriptArea = null;
43002
+ this.confidenceEl = null;
43003
+ this.statusEl = null;
43004
+ this.startStopBtn = null;
43005
+ this.insertBtn = null;
43006
+ this.clearBtn = null;
43007
+ this.languageSelect = null;
43008
+ }
43009
+ get editorLanguage() {
43010
+ return this.options.editor.getConfig().language ?? "en";
43011
+ }
43012
+ getDefaultSpeechLang() {
43013
+ return LOCALE_TO_BCP47$1[this.editorLanguage] ?? "en-US";
43014
+ }
43015
+ createDialog() {
43016
+ const trans = this.options.trans;
43017
+ this.overlay = document.createElement("div");
43018
+ this.overlay.className = "md-dialog-overlay";
43019
+ this.overlay.addEventListener("click", (e) => {
43020
+ if (e.target === this.overlay) this.close();
43021
+ });
43022
+ this.dialog = document.createElement("div");
43023
+ this.dialog.className = "md-dialog md-speechtotext-dialog";
43024
+ const header = document.createElement("div");
43025
+ header.className = "md-dialog-header";
43026
+ header.innerHTML = `
43027
+ <h3>${trans("Speech to Text")}</h3>
43028
+ <button type="button" class="md-dialog-close">×</button>
43029
+ `;
43030
+ header.querySelector(".md-dialog-close").addEventListener("click", () => this.close());
43031
+ const body = document.createElement("div");
43032
+ body.className = "md-dialog-body md-speechtotext-body";
43033
+ const langRow = document.createElement("div");
43034
+ langRow.className = "md-speechtotext-lang-row";
43035
+ const langLabel = document.createElement("label");
43036
+ langLabel.className = "md-speechtotext-label";
43037
+ langLabel.textContent = trans("Language");
43038
+ this.languageSelect = document.createElement("select");
43039
+ this.languageSelect.className = "md-speechtotext-language";
43040
+ const defaultLang = this.getDefaultSpeechLang();
43041
+ for (const lang of SPEECH_LANGUAGES) {
43042
+ const opt = document.createElement("option");
43043
+ opt.value = lang.code;
43044
+ opt.textContent = lang.name;
43045
+ if (lang.code === defaultLang) opt.selected = true;
43046
+ this.languageSelect.appendChild(opt);
43047
+ }
43048
+ langRow.appendChild(langLabel);
43049
+ langRow.appendChild(this.languageSelect);
43050
+ this.statusEl = document.createElement("div");
43051
+ this.statusEl.className = "md-speechtotext-status";
43052
+ this.statusEl.textContent = "";
43053
+ this.transcriptArea = document.createElement("div");
43054
+ this.transcriptArea.className = "md-speechtotext-transcript";
43055
+ this.confidenceEl = document.createElement("div");
43056
+ this.confidenceEl.className = "md-speechtotext-confidence";
43057
+ this.confidenceEl.textContent = "";
43058
+ const controls = document.createElement("div");
43059
+ controls.className = "md-speechtotext-controls";
43060
+ this.startStopBtn = document.createElement("button");
43061
+ this.startStopBtn.type = "button";
43062
+ this.startStopBtn.className = "md-speechtotext-btn md-speechtotext-btn-start";
43063
+ this.startStopBtn.textContent = trans("Start");
43064
+ this.startStopBtn.addEventListener("click", () => this.toggleRecognition());
43065
+ this.insertBtn = document.createElement("button");
43066
+ this.insertBtn.type = "button";
43067
+ this.insertBtn.className = "md-speechtotext-btn md-speechtotext-btn-insert";
43068
+ this.insertBtn.textContent = trans("Insert");
43069
+ this.insertBtn.addEventListener("click", () => this.insertTranscript());
43070
+ this.clearBtn = document.createElement("button");
43071
+ this.clearBtn.type = "button";
43072
+ this.clearBtn.className = "md-speechtotext-btn md-speechtotext-btn-clear";
43073
+ this.clearBtn.textContent = trans("Clear");
43074
+ this.clearBtn.addEventListener("click", () => this.clearTranscript());
43075
+ controls.appendChild(this.startStopBtn);
43076
+ controls.appendChild(this.insertBtn);
43077
+ controls.appendChild(this.clearBtn);
43078
+ body.appendChild(langRow);
43079
+ body.appendChild(this.statusEl);
43080
+ body.appendChild(this.transcriptArea);
43081
+ body.appendChild(this.confidenceEl);
43082
+ body.appendChild(controls);
43083
+ this.dialog.appendChild(header);
43084
+ this.dialog.appendChild(body);
43085
+ this.overlay.appendChild(this.dialog);
43086
+ document.body.appendChild(this.overlay);
43087
+ this.dialog.addEventListener("keydown", (e) => {
43088
+ if (e.key === "Escape") {
43089
+ this.close();
43090
+ }
43091
+ });
43092
+ }
43093
+ toggleRecognition() {
43094
+ if (this.isListening) {
43095
+ this.stopRecognition();
43096
+ } else {
43097
+ this.startRecognition();
43098
+ }
43099
+ }
43100
+ startRecognition() {
43101
+ const SpeechRecognitionCtor = getSpeechRecognitionConstructor$1();
43102
+ if (!SpeechRecognitionCtor) return;
43103
+ this.recognition = new SpeechRecognitionCtor();
43104
+ this.recognition.continuous = true;
43105
+ this.recognition.interimResults = true;
43106
+ this.recognition.maxAlternatives = 1;
43107
+ this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
43108
+ this.recognition.onresult = this.handleResult.bind(this);
43109
+ this.recognition.onerror = this.handleError.bind(this);
43110
+ this.recognition.onend = this.handleEnd.bind(this);
43111
+ try {
43112
+ this.recognition.start();
43113
+ this.isListening = true;
43114
+ this.updateButtonState();
43115
+ this.setStatus(this.options.trans("Listening..."));
43116
+ } catch {
43117
+ }
43118
+ }
43119
+ handleResult(event) {
43120
+ this.interimTranscript = "";
43121
+ for (let i = event.resultIndex; i < event.results.length; i++) {
43122
+ const result = event.results[i];
43123
+ if (result.isFinal) {
43124
+ const text = result[0].transcript;
43125
+ if (this.finalTranscript.length > 0 && !this.finalTranscript.endsWith(" ") && !text.startsWith(" ")) {
43126
+ this.finalTranscript += " ";
43127
+ }
43128
+ this.finalTranscript += text;
43129
+ this.lastConfidence = result[0].confidence;
43130
+ } else {
43131
+ this.interimTranscript += result[0].transcript;
43132
+ }
43133
+ }
43134
+ this.updateTranscriptDisplay();
43135
+ this.updateConfidenceDisplay();
43136
+ }
43137
+ handleError(event) {
43138
+ const trans = this.options.trans;
43139
+ if (event.error === "no-speech") ;
43140
+ else if (event.error === "not-allowed") {
43141
+ this.stopRecognition();
43142
+ this.setStatus(trans("Microphone access denied"));
43143
+ } else if (event.error === "audio-capture") {
43144
+ this.stopRecognition();
43145
+ this.setStatus(trans("No microphone found"));
43146
+ } else if (event.error === "network") {
43147
+ this.stopRecognition();
43148
+ this.setStatus(trans("Network error - speech recognition requires internet"));
43149
+ } else if (event.error !== "aborted") ;
43150
+ }
43151
+ handleEnd() {
43152
+ if (this.isListening) {
43153
+ this.restartTimer = setTimeout(() => {
43154
+ if (!this.isListening) return;
43155
+ try {
43156
+ this.recognition?.start();
43157
+ } catch {
43158
+ const Ctor = getSpeechRecognitionConstructor$1();
43159
+ if (!Ctor) return;
43160
+ this.recognition = new Ctor();
43161
+ this.recognition.continuous = true;
43162
+ this.recognition.interimResults = true;
43163
+ this.recognition.maxAlternatives = 1;
43164
+ this.recognition.lang = this.languageSelect?.value ?? this.getDefaultSpeechLang();
43165
+ this.recognition.onresult = this.handleResult.bind(this);
43166
+ this.recognition.onerror = this.handleError.bind(this);
43167
+ this.recognition.onend = this.handleEnd.bind(this);
43168
+ try {
43169
+ this.recognition.start();
43170
+ } catch {
43171
+ this.stopRecognition();
43172
+ }
43173
+ }
43174
+ }, 300);
43175
+ }
43176
+ }
43177
+ stopRecognition() {
43178
+ this.isListening = false;
43179
+ if (this.restartTimer) {
43180
+ clearTimeout(this.restartTimer);
43181
+ this.restartTimer = null;
43182
+ }
43183
+ if (this.recognition) {
43184
+ try {
43185
+ this.recognition.stop();
43186
+ } catch {
43187
+ }
43188
+ this.recognition = null;
43189
+ }
43190
+ this.updateButtonState();
43191
+ this.setStatus("");
43192
+ }
43193
+ updateButtonState() {
43194
+ const trans = this.options.trans;
43195
+ if (this.startStopBtn) {
43196
+ if (this.isListening) {
43197
+ this.startStopBtn.textContent = trans("Stop");
43198
+ this.startStopBtn.classList.remove("md-speechtotext-btn-start");
43199
+ this.startStopBtn.classList.add("md-speechtotext-btn-stop");
43200
+ } else {
43201
+ this.startStopBtn.textContent = trans("Start");
43202
+ this.startStopBtn.classList.remove("md-speechtotext-btn-stop");
43203
+ this.startStopBtn.classList.add("md-speechtotext-btn-start");
43204
+ }
43205
+ }
43206
+ if (this.statusEl) {
43207
+ this.statusEl.classList.toggle("md-speechtotext-status-active", this.isListening);
43208
+ }
43209
+ }
43210
+ setStatus(text) {
43211
+ if (this.statusEl) {
43212
+ this.statusEl.textContent = text;
43213
+ }
43214
+ }
43215
+ updateTranscriptDisplay() {
43216
+ if (!this.transcriptArea) return;
43217
+ const finalSpan = `<span class="md-speechtotext-final">${this.escapeHtml(this.finalTranscript)}</span>`;
43218
+ const interimSpan = this.interimTranscript ? `<span class="md-speechtotext-interim">${this.escapeHtml(this.interimTranscript)}</span>` : "";
43219
+ this.transcriptArea.innerHTML = finalSpan + interimSpan;
43220
+ this.transcriptArea.scrollTop = this.transcriptArea.scrollHeight;
43221
+ }
43222
+ updateConfidenceDisplay() {
43223
+ if (!this.confidenceEl) return;
43224
+ if (this.lastConfidence > 0) {
43225
+ const pct = Math.round(this.lastConfidence * 100);
43226
+ this.confidenceEl.textContent = `${this.options.trans("Confidence")}: ${pct}%`;
43227
+ }
43228
+ }
43229
+ insertTranscript() {
43230
+ const text = this.finalTranscript.trim();
43231
+ if (!text) return;
43232
+ const tiptap = this.options.editor.getTipTap();
43233
+ if (tiptap) {
43234
+ tiptap.chain().focus().insertContent(text).run();
43235
+ }
43236
+ this.clearTranscript();
43237
+ this.close();
43238
+ }
43239
+ clearTranscript() {
43240
+ this.finalTranscript = "";
43241
+ this.interimTranscript = "";
43242
+ this.lastConfidence = 0;
43243
+ if (this.transcriptArea) {
43244
+ this.transcriptArea.innerHTML = "";
43245
+ }
43246
+ if (this.confidenceEl) {
43247
+ this.confidenceEl.textContent = "";
43248
+ }
43249
+ }
43250
+ escapeHtml(text) {
43251
+ const div = document.createElement("div");
43252
+ div.textContent = text;
43253
+ return div.innerHTML;
43254
+ }
43255
+ }
43256
+ const LOCALE_TO_BCP47 = {
43257
+ "ar": "ar-SA",
43258
+ "ca": "ca-ES",
43259
+ "cs": "cs-CZ",
43260
+ "da": "da-DK",
43261
+ "de": "de-DE",
43262
+ "el": "el-GR",
43263
+ "en": "en-US",
43264
+ "en-gb": "en-GB",
43265
+ "es": "es-ES",
43266
+ "fi": "fi-FI",
43267
+ "fr": "fr-FR",
43268
+ "fr-ca": "fr-CA",
43269
+ "hu": "hu-HU",
43270
+ "id": "id-ID",
43271
+ "it": "it-IT",
43272
+ "ja": "ja-JP",
43273
+ "ko": "ko-KR",
43274
+ "nb": "nb-NO",
43275
+ "nl": "nl-NL",
43276
+ "pl": "pl-PL",
43277
+ "pt": "pt-BR",
43278
+ "ro": "ro-RO",
43279
+ "ru": "ru-RU",
43280
+ "sl": "sl-SI",
43281
+ "sr": "sr-RS",
43282
+ "sv": "sv-SE",
43283
+ "th": "th-TH",
43284
+ "tr": "tr-TR",
43285
+ "vi": "vi-VN",
43286
+ "zh": "zh-CN",
43287
+ "zh-tw": "zh-TW"
43288
+ };
43289
+ function getSpeechRecognitionConstructor() {
43290
+ return window.SpeechRecognition || window.webkitSpeechRecognition || null;
43291
+ }
43292
+ class Dictation {
43293
+ options;
43294
+ recognition = null;
43295
+ _isActive = false;
43296
+ restartTimer = null;
43297
+ // Tracks the start position of current interim text so we can replace it
43298
+ interimStart = null;
43299
+ interimLength = 0;
43300
+ constructor(options) {
43301
+ this.options = options;
43302
+ }
43303
+ get isActive() {
43304
+ return this._isActive;
43305
+ }
43306
+ toggle() {
43307
+ if (this._isActive) {
43308
+ this.stop();
43309
+ } else {
43310
+ this.start();
43311
+ }
43312
+ }
43313
+ start() {
43314
+ const Ctor = getSpeechRecognitionConstructor();
43315
+ if (!Ctor) return;
43316
+ this.recognition = new Ctor();
43317
+ this.recognition.continuous = true;
43318
+ this.recognition.interimResults = true;
43319
+ this.recognition.maxAlternatives = 1;
43320
+ this.recognition.lang = this.getSpeechLang();
43321
+ this.recognition.onresult = this.handleResult.bind(this);
43322
+ this.recognition.onerror = this.handleError.bind(this);
43323
+ this.recognition.onend = this.handleEnd.bind(this);
43324
+ try {
43325
+ this.recognition.start();
43326
+ this._isActive = true;
43327
+ this.interimStart = null;
43328
+ this.interimLength = 0;
43329
+ this.options.onStateChange?.(true);
43330
+ } catch {
43331
+ }
43332
+ }
43333
+ stop() {
43334
+ this._isActive = false;
43335
+ if (this.restartTimer) {
43336
+ clearTimeout(this.restartTimer);
43337
+ this.restartTimer = null;
43338
+ }
43339
+ this.clearInterim();
43340
+ if (this.recognition) {
43341
+ try {
43342
+ this.recognition.stop();
43343
+ } catch {
43344
+ }
43345
+ this.recognition = null;
43346
+ }
43347
+ this.options.onStateChange?.(false);
43348
+ }
43349
+ destroy() {
43350
+ this.stop();
43351
+ }
43352
+ getSpeechLang() {
43353
+ const locale = this.options.editor.getConfig().language ?? "en";
43354
+ return LOCALE_TO_BCP47[locale] ?? "en-US";
43355
+ }
43356
+ handleResult(event) {
43357
+ const tiptap = this.options.editor.getTipTap();
43358
+ if (!tiptap) return;
43359
+ for (let i = event.resultIndex; i < event.results.length; i++) {
43360
+ const result = event.results[i];
43361
+ const transcript = result[0].transcript;
43362
+ if (result.isFinal) {
43363
+ this.clearInterim();
43364
+ let text = transcript;
43365
+ if (this.needsLeadingSpace(text)) {
43366
+ text = " " + text;
43367
+ }
43368
+ tiptap.chain().focus().insertContent(text).run();
43369
+ } else {
43370
+ let text = transcript;
43371
+ if (this.interimStart === null && this.needsLeadingSpace(text)) {
43372
+ text = " " + text;
43373
+ }
43374
+ this.replaceInterim(text);
43375
+ }
43376
+ }
43377
+ }
43378
+ /** Replace the current interim text in the editor with new interim text */
43379
+ replaceInterim(text) {
43380
+ const tiptap = this.options.editor.getTipTap();
43381
+ if (!tiptap) return;
43382
+ if (this.interimStart !== null && this.interimLength > 0) {
43383
+ tiptap.chain().focus().command(({ tr: tr2 }) => {
43384
+ tr2.delete(this.interimStart, this.interimStart + this.interimLength);
43385
+ return true;
43386
+ }).run();
43387
+ }
43388
+ if (this.interimStart === null) {
43389
+ this.interimStart = tiptap.state.selection.from;
43390
+ }
43391
+ tiptap.chain().focus().insertContent(text).run();
43392
+ this.interimLength = text.length;
43393
+ }
43394
+ /** Remove interim text without inserting anything */
43395
+ clearInterim() {
43396
+ if (this.interimStart !== null && this.interimLength > 0) {
43397
+ const tiptap = this.options.editor.getTipTap();
43398
+ if (tiptap) {
43399
+ tiptap.chain().focus().command(({ tr: tr2 }) => {
43400
+ tr2.delete(this.interimStart, this.interimStart + this.interimLength);
43401
+ return true;
43402
+ }).run();
43403
+ }
43404
+ }
43405
+ this.interimStart = null;
43406
+ this.interimLength = 0;
43407
+ }
43408
+ needsLeadingSpace(newText) {
43409
+ if (newText.startsWith(" ")) return false;
43410
+ const tiptap = this.options.editor.getTipTap();
43411
+ if (!tiptap) return false;
43412
+ const { from: from2 } = tiptap.state.selection;
43413
+ if (from2 === 0) return false;
43414
+ const textBefore = tiptap.state.doc.textBetween(Math.max(0, from2 - 1), from2, "");
43415
+ if (!textBefore) return false;
43416
+ return textBefore.trim().length > 0;
43417
+ }
43418
+ handleError(event) {
43419
+ if (event.error === "no-speech") ;
43420
+ else if (event.error === "not-allowed" || event.error === "audio-capture" || event.error === "network") {
43421
+ this.stop();
43422
+ }
43423
+ }
43424
+ handleEnd() {
43425
+ if (this._isActive) {
43426
+ this.restartTimer = setTimeout(() => {
43427
+ if (!this._isActive) return;
43428
+ try {
43429
+ this.recognition?.start();
43430
+ } catch {
43431
+ const Ctor = getSpeechRecognitionConstructor();
43432
+ if (!Ctor) return;
43433
+ this.recognition = new Ctor();
43434
+ this.recognition.continuous = true;
43435
+ this.recognition.interimResults = true;
43436
+ this.recognition.maxAlternatives = 1;
43437
+ this.recognition.lang = this.getSpeechLang();
43438
+ this.recognition.onresult = this.handleResult.bind(this);
43439
+ this.recognition.onerror = this.handleError.bind(this);
43440
+ this.recognition.onend = this.handleEnd.bind(this);
43441
+ try {
43442
+ this.recognition.start();
43443
+ } catch {
43444
+ this.stop();
43445
+ }
43446
+ }
43447
+ }, 300);
43448
+ }
43449
+ }
43450
+ }
42873
43451
  const DEFAULT_BUTTON_PRIORITY = {
42874
43452
  bold: 1,
42875
43453
  italic: 1,
@@ -42932,6 +43510,8 @@ class Toolbar {
42932
43510
  searchReplace = null;
42933
43511
  sourceEditor = null;
42934
43512
  linkEditor = null;
43513
+ speechToText = null;
43514
+ dictation = null;
42935
43515
  updateInterval = null;
42936
43516
  boundClickHandler = null;
42937
43517
  boundKeydownHandler = null;
@@ -43248,6 +43828,32 @@ class Toolbar {
43248
43828
  return this.createActionButton("searchreplace", this.icon("searchreplace"), this.trans("Find and replace"), () => {
43249
43829
  this.openSearchReplace();
43250
43830
  });
43831
+ case "speechtotext": {
43832
+ if (this.options.config.speech_to_text === false) return null;
43833
+ if (!isSpeechRecognitionSupported()) {
43834
+ const btn = this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to text is not supported in this browser"), () => {
43835
+ });
43836
+ btn.classList.add("md-toolbar-btn-disabled");
43837
+ btn.setAttribute("aria-disabled", "true");
43838
+ return btn;
43839
+ }
43840
+ return this.createActionButton("speechtotext", this.icon("speechtotext"), this.trans("Speech to Text"), () => {
43841
+ this.openSpeechToText();
43842
+ });
43843
+ }
43844
+ case "dictate": {
43845
+ if (this.options.config.speech_to_text === false) return null;
43846
+ if (!isSpeechRecognitionSupported()) {
43847
+ const btn = this.createActionButton("dictate", this.icon("dictate"), this.trans("Speech to text is not supported in this browser"), () => {
43848
+ });
43849
+ btn.classList.add("md-toolbar-btn-disabled");
43850
+ btn.setAttribute("aria-disabled", "true");
43851
+ return btn;
43852
+ }
43853
+ return this.createActionButton("dictate", this.icon("dictate"), this.trans("Dictate"), () => {
43854
+ this.toggleDictation();
43855
+ });
43856
+ }
43251
43857
  case "template":
43252
43858
  return this.createTemplateDropdown();
43253
43859
  default:
@@ -43680,6 +44286,31 @@ class Toolbar {
43680
44286
  }
43681
44287
  this.searchReplace.open();
43682
44288
  }
44289
+ openSpeechToText() {
44290
+ if (!this.speechToText) {
44291
+ this.speechToText = new SpeechToText({
44292
+ editor: this.options.editor,
44293
+ trans: this.trans
44294
+ });
44295
+ }
44296
+ this.speechToText.open();
44297
+ }
44298
+ toggleDictation() {
44299
+ if (!this.dictation) {
44300
+ this.dictation = new Dictation({
44301
+ editor: this.options.editor,
44302
+ trans: this.trans,
44303
+ onStateChange: (isActive2) => {
44304
+ const btn = this.buttonElements.get("dictate");
44305
+ if (btn) {
44306
+ btn.classList.toggle("md-toolbar-btn-active", isActive2);
44307
+ btn.classList.toggle("md-toolbar-btn-dictating", isActive2);
44308
+ }
44309
+ }
44310
+ });
44311
+ }
44312
+ this.dictation.toggle();
44313
+ }
43683
44314
  openSourceCode() {
43684
44315
  if (!this.sourceEditor) {
43685
44316
  this.sourceEditor = new SourceEditor({
@@ -43728,6 +44359,10 @@ class Toolbar {
43728
44359
  this.imageUpload = null;
43729
44360
  this.searchReplace?.destroy();
43730
44361
  this.searchReplace = null;
44362
+ this.speechToText?.destroy();
44363
+ this.speechToText = null;
44364
+ this.dictation?.destroy();
44365
+ this.dictation = null;
43731
44366
  this.buttonElements.clear();
43732
44367
  this.dropdowns.clear();
43733
44368
  this.removeBodyMenus();
@@ -43750,6 +44385,8 @@ class Toolbar {
43750
44385
  this.emojiPicker?.destroy();
43751
44386
  this.imageUpload?.destroy();
43752
44387
  this.searchReplace?.destroy();
44388
+ this.speechToText?.destroy();
44389
+ this.dictation?.destroy();
43753
44390
  this.buttonElements.clear();
43754
44391
  this.dropdowns.clear();
43755
44392
  this.removeBodyMenus();
@@ -43799,6 +44436,8 @@ const DEFAULT_ICONS = {
43799
44436
  ltr: "⇐",
43800
44437
  rtl: "⇒",
43801
44438
  searchreplace: "🔍",
44439
+ speechtotext: "🎤",
44440
+ dictate: "🎙️",
43802
44441
  togglemore: "…"
43803
44442
  };
43804
44443
  const CONFAB_ICONS = {
@@ -43832,6 +44471,8 @@ const CONFAB_ICONS = {
43832
44471
  ltr: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="18" y1="5" x2="18" y2="19"/><path d="M8 5a4 4 0 0 0 0 8h4"/><polyline points="4 17 8 21 12 17"/></svg>',
43833
44472
  rtl: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="6" y1="5" x2="6" y2="19"/><path d="M16 5a4 4 0 0 1 0 8h-4"/><polyline points="20 17 16 21 12 17"/></svg>',
43834
44473
  searchreplace: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.6" y2="16.6"/></svg>',
44474
+ speechtotext: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>',
44475
+ dictate: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><circle cx="12" cy="12" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="8" r="1" fill="currentColor" stroke="none"/><circle cx="12" cy="16" r="0.5" fill="currentColor" stroke="none"/></svg>',
43835
44476
  togglemore: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" fill="currentColor"/><circle cx="5" cy="12" r="1" fill="currentColor"/><circle cx="19" cy="12" r="1" fill="currentColor"/></svg>'
43836
44477
  };
43837
44478
  const FontSize = Extension.create({
@@ -44481,7 +45122,20 @@ const en = {
44481
45122
  "Title": "Title",
44482
45123
  "Open link in...": "Open link in...",
44483
45124
  "Current window": "Current window",
44484
- "New window": "New window"
45125
+ "New window": "New window",
45126
+ "Speech to Text": "Speech to Text",
45127
+ "Dictate": "Dictate",
45128
+ "Start": "Start",
45129
+ "Stop": "Stop",
45130
+ "Clear": "Clear",
45131
+ "Language": "Language",
45132
+ "Confidence": "Confidence",
45133
+ "Listening...": "Listening...",
45134
+ "Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
45135
+ "No speech detected": "No speech detected",
45136
+ "Microphone access denied": "Microphone access denied",
45137
+ "No microphone found": "No microphone found",
45138
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44485
45139
  };
44486
45140
  const ar = {
44487
45141
  "Bold": "غامق",
@@ -44539,7 +45193,7 @@ const ar = {
44539
45193
  "Browse...": "استعراض...",
44540
45194
  "Drop image here or click to browse": "أسقط الصورة هنا أو انقر للاستعراض",
44541
45195
  "Alt text": "نص بديل",
44542
- "Insert": "إدراج",
45196
+ "Insert": "?????",
44543
45197
  "Cancel": "إلغاء",
44544
45198
  "Uploading...": "جارٍ الرفع...",
44545
45199
  "Upload failed": "فشل الرفع",
@@ -44553,7 +45207,20 @@ const ar = {
44553
45207
  "Title": "Title",
44554
45208
  "Open link in...": "Open link in...",
44555
45209
  "Current window": "Current window",
44556
- "New window": "New window"
45210
+ "New window": "New window",
45211
+ "Speech to Text": "????? ?????? ??? ??",
45212
+ "Dictate": "إملاء",
45213
+ "Start": "???",
45214
+ "Stop": "?????",
45215
+ "Clear": "???",
45216
+ "Language": "?????",
45217
+ "Confidence": "?????",
45218
+ "Listening...": "???? ????????...",
45219
+ "Speech to text is not supported in this browser": "????? ?????? ??? ?? ??? ????? ?? ??? ???????",
45220
+ "No speech detected": "?? ??? ?????? ????",
45221
+ "Microphone access denied": "?? ??? ?????? ??? ??????????",
45222
+ "No microphone found": "No microphone found",
45223
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44557
45224
  };
44558
45225
  const ca = {
44559
45226
  "Bold": "Negreta",
@@ -44625,7 +45292,20 @@ const ca = {
44625
45292
  "Title": "Title",
44626
45293
  "Open link in...": "Open link in...",
44627
45294
  "Current window": "Current window",
44628
- "New window": "New window"
45295
+ "New window": "New window",
45296
+ "Speech to Text": "Veu a text",
45297
+ "Dictate": "Dictar",
45298
+ "Start": "Iniciar",
45299
+ "Stop": "Aturar",
45300
+ "Clear": "Esborrar",
45301
+ "Language": "Idioma",
45302
+ "Confidence": "Confian�a",
45303
+ "Listening...": "Escoltant...",
45304
+ "Speech to text is not supported in this browser": "La veu a text no �s compatible amb aquest navegador",
45305
+ "No speech detected": "No s'ha detectat veu",
45306
+ "Microphone access denied": "Acc�s al micr�fon denegat",
45307
+ "No microphone found": "No microphone found",
45308
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44629
45309
  };
44630
45310
  const zh = {
44631
45311
  "Bold": "粗体",
@@ -44683,7 +45363,7 @@ const zh = {
44683
45363
  "Browse...": "浏览...",
44684
45364
  "Drop image here or click to browse": "将图片拖放到此处或点击浏览",
44685
45365
  "Alt text": "替代文本",
44686
- "Insert": "插入",
45366
+ "Insert": "??",
44687
45367
  "Cancel": "取消",
44688
45368
  "Uploading...": "上传中...",
44689
45369
  "Upload failed": "上传失败",
@@ -44697,7 +45377,20 @@ const zh = {
44697
45377
  "Title": "Title",
44698
45378
  "Open link in...": "Open link in...",
44699
45379
  "Current window": "Current window",
44700
- "New window": "New window"
45380
+ "New window": "New window",
45381
+ "Speech to Text": "?????",
45382
+ "Dictate": "听写",
45383
+ "Start": "??",
45384
+ "Stop": "??",
45385
+ "Clear": "??",
45386
+ "Language": "??",
45387
+ "Confidence": "???",
45388
+ "Listening...": "????...",
45389
+ "Speech to text is not supported in this browser": "????????????",
45390
+ "No speech detected": "??????",
45391
+ "Microphone access denied": "????????",
45392
+ "No microphone found": "No microphone found",
45393
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44701
45394
  };
44702
45395
  const cs = {
44703
45396
  "Bold": "Tučné",
@@ -44755,7 +45448,7 @@ const cs = {
44755
45448
  "Browse...": "Procházet...",
44756
45449
  "Drop image here or click to browse": "Přetáhněte obrázek sem nebo klikněte pro výběr",
44757
45450
  "Alt text": "Alternativní text",
44758
- "Insert": "Vložit",
45451
+ "Insert": "Vlo�it",
44759
45452
  "Cancel": "Zrušit",
44760
45453
  "Uploading...": "Nahrávání...",
44761
45454
  "Upload failed": "Nahrávání selhalo",
@@ -44769,7 +45462,20 @@ const cs = {
44769
45462
  "Title": "Title",
44770
45463
  "Open link in...": "Open link in...",
44771
45464
  "Current window": "Current window",
44772
- "New window": "New window"
45465
+ "New window": "New window",
45466
+ "Speech to Text": "Rec na text",
45467
+ "Dictate": "Diktovat",
45468
+ "Start": "Spustit",
45469
+ "Stop": "Zastavit",
45470
+ "Clear": "Vymazat",
45471
+ "Language": "Jazyk",
45472
+ "Confidence": "Spolehlivost",
45473
+ "Listening...": "Poslouch�m...",
45474
+ "Speech to text is not supported in this browser": "Rec na text nen� v tomto prohl�eci podporov�na",
45475
+ "No speech detected": "Nebyla detekov�na rec",
45476
+ "Microphone access denied": "Pr�stup k mikrofonu zam�tnut",
45477
+ "No microphone found": "No microphone found",
45478
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44773
45479
  };
44774
45480
  const da = {
44775
45481
  "Bold": "Fed",
@@ -44827,7 +45533,7 @@ const da = {
44827
45533
  "Browse...": "Gennemse...",
44828
45534
  "Drop image here or click to browse": "Træk billede hertil eller klik for at gennemse",
44829
45535
  "Alt text": "Alternativ tekst",
44830
- "Insert": "Indsæt",
45536
+ "Insert": "Inds�t",
44831
45537
  "Cancel": "Annuller",
44832
45538
  "Uploading...": "Uploader...",
44833
45539
  "Upload failed": "Upload mislykkedes",
@@ -44841,7 +45547,20 @@ const da = {
44841
45547
  "Title": "Title",
44842
45548
  "Open link in...": "Open link in...",
44843
45549
  "Current window": "Current window",
44844
- "New window": "New window"
45550
+ "New window": "New window",
45551
+ "Speech to Text": "Tale til tekst",
45552
+ "Dictate": "Dikter",
45553
+ "Start": "Start",
45554
+ "Stop": "Stop",
45555
+ "Clear": "Ryd",
45556
+ "Language": "Sprog",
45557
+ "Confidence": "Tillid",
45558
+ "Listening...": "Lytter...",
45559
+ "Speech to text is not supported in this browser": "Tale til tekst underst�ttes ikke i denne browser",
45560
+ "No speech detected": "Ingen tale registreret",
45561
+ "Microphone access denied": "Mikrofonadgang n�gtet",
45562
+ "No microphone found": "No microphone found",
45563
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44845
45564
  };
44846
45565
  const enGb = {
44847
45566
  "Bold": "Bold",
@@ -44913,7 +45632,20 @@ const enGb = {
44913
45632
  "Title": "Title",
44914
45633
  "Open link in...": "Open link in...",
44915
45634
  "Current window": "Current window",
44916
- "New window": "New window"
45635
+ "New window": "New window",
45636
+ "Speech to Text": "Speech to Text",
45637
+ "Dictate": "Dictate",
45638
+ "Start": "Start",
45639
+ "Stop": "Stop",
45640
+ "Clear": "Clear",
45641
+ "Language": "Language",
45642
+ "Confidence": "Confidence",
45643
+ "Listening...": "Listening...",
45644
+ "Speech to text is not supported in this browser": "Speech to text is not supported in this browser",
45645
+ "No speech detected": "No speech detected",
45646
+ "Microphone access denied": "Microphone access denied",
45647
+ "No microphone found": "No microphone found",
45648
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44917
45649
  };
44918
45650
  const fi = {
44919
45651
  "Bold": "Lihavoitu",
@@ -44971,7 +45703,7 @@ const fi = {
44971
45703
  "Browse...": "Selaa...",
44972
45704
  "Drop image here or click to browse": "Pudota kuva tähän tai napsauta selataksesi",
44973
45705
  "Alt text": "Vaihtoehtoinen teksti",
44974
- "Insert": "Lisää",
45706
+ "Insert": "Lis��",
44975
45707
  "Cancel": "Peruuta",
44976
45708
  "Uploading...": "Ladataan...",
44977
45709
  "Upload failed": "Lataus epäonnistui",
@@ -44985,7 +45717,20 @@ const fi = {
44985
45717
  "Title": "Title",
44986
45718
  "Open link in...": "Open link in...",
44987
45719
  "Current window": "Current window",
44988
- "New window": "New window"
45720
+ "New window": "New window",
45721
+ "Speech to Text": "Puhe tekstiksi",
45722
+ "Dictate": "Sanele",
45723
+ "Start": "Aloita",
45724
+ "Stop": "Lopeta",
45725
+ "Clear": "Tyhjenn�",
45726
+ "Language": "Kieli",
45727
+ "Confidence": "Luotettavuus",
45728
+ "Listening...": "Kuuntelee...",
45729
+ "Speech to text is not supported in this browser": "Puhe tekstiksi ei ole tuettu t�ss� selaimessa",
45730
+ "No speech detected": "Puhetta ei havaittu",
45731
+ "Microphone access denied": "Mikrofonin k�ytt� estetty",
45732
+ "No microphone found": "No microphone found",
45733
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
44989
45734
  };
44990
45735
  const fr = {
44991
45736
  "Bold": "Gras",
@@ -45043,7 +45788,7 @@ const fr = {
45043
45788
  "Browse...": "Parcourir...",
45044
45789
  "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
45045
45790
  "Alt text": "Texte alternatif",
45046
- "Insert": "Insérer",
45791
+ "Insert": "Ins�rer",
45047
45792
  "Cancel": "Annuler",
45048
45793
  "Uploading...": "Téléchargement...",
45049
45794
  "Upload failed": "Échec du téléchargement",
@@ -45057,7 +45802,20 @@ const fr = {
45057
45802
  "Title": "Title",
45058
45803
  "Open link in...": "Open link in...",
45059
45804
  "Current window": "Current window",
45060
- "New window": "New window"
45805
+ "New window": "New window",
45806
+ "Speech to Text": "Reconnaissance vocale",
45807
+ "Dictate": "Dicter",
45808
+ "Start": "D�marrer",
45809
+ "Stop": "Arr�ter",
45810
+ "Clear": "Effacer",
45811
+ "Language": "Langue",
45812
+ "Confidence": "Confiance",
45813
+ "Listening...": "�coute en cours...",
45814
+ "Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
45815
+ "No speech detected": "Aucune parole d�tect�e",
45816
+ "Microphone access denied": "Acc�s au microphone refus�",
45817
+ "No microphone found": "No microphone found",
45818
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45061
45819
  };
45062
45820
  const frCa = {
45063
45821
  "Bold": "Gras",
@@ -45115,7 +45873,7 @@ const frCa = {
45115
45873
  "Browse...": "Parcourir...",
45116
45874
  "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
45117
45875
  "Alt text": "Texte alternatif",
45118
- "Insert": "Insérer",
45876
+ "Insert": "Ins�rer",
45119
45877
  "Cancel": "Annuler",
45120
45878
  "Uploading...": "Téléversement...",
45121
45879
  "Upload failed": "Échec du téléversement",
@@ -45129,7 +45887,20 @@ const frCa = {
45129
45887
  "Title": "Title",
45130
45888
  "Open link in...": "Open link in...",
45131
45889
  "Current window": "Current window",
45132
- "New window": "New window"
45890
+ "New window": "New window",
45891
+ "Speech to Text": "Reconnaissance vocale",
45892
+ "Dictate": "Dicter",
45893
+ "Start": "D�marrer",
45894
+ "Stop": "Arr�ter",
45895
+ "Clear": "Effacer",
45896
+ "Language": "Langue",
45897
+ "Confidence": "Confiance",
45898
+ "Listening...": "�coute en cours...",
45899
+ "Speech to text is not supported in this browser": "La reconnaissance vocale n'est pas prise en charge dans ce navigateur",
45900
+ "No speech detected": "Aucune parole d�tect�e",
45901
+ "Microphone access denied": "Acc�s au microphone refus�",
45902
+ "No microphone found": "No microphone found",
45903
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45133
45904
  };
45134
45905
  const de = {
45135
45906
  "Bold": "Fett",
@@ -45187,7 +45958,7 @@ const de = {
45187
45958
  "Browse...": "Durchsuchen...",
45188
45959
  "Drop image here or click to browse": "Bild hierher ziehen oder klicken zum Durchsuchen",
45189
45960
  "Alt text": "Alternativtext",
45190
- "Insert": "Einfügen",
45961
+ "Insert": "Einf�gen",
45191
45962
  "Cancel": "Abbrechen",
45192
45963
  "Uploading...": "Wird hochgeladen...",
45193
45964
  "Upload failed": "Hochladen fehlgeschlagen",
@@ -45201,7 +45972,20 @@ const de = {
45201
45972
  "Title": "Title",
45202
45973
  "Open link in...": "Open link in...",
45203
45974
  "Current window": "Current window",
45204
- "New window": "New window"
45975
+ "New window": "New window",
45976
+ "Speech to Text": "Sprache zu Text",
45977
+ "Dictate": "Diktieren",
45978
+ "Start": "Starten",
45979
+ "Stop": "Stoppen",
45980
+ "Clear": "L�schen",
45981
+ "Language": "Sprache",
45982
+ "Confidence": "Zuverl�ssigkeit",
45983
+ "Listening...": "Zuh�ren...",
45984
+ "Speech to text is not supported in this browser": "Sprache-zu-Text wird in diesem Browser nicht unterst�tzt",
45985
+ "No speech detected": "Keine Sprache erkannt",
45986
+ "Microphone access denied": "Mikrofonzugriff verweigert",
45987
+ "No microphone found": "No microphone found",
45988
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45205
45989
  };
45206
45990
  const el = {
45207
45991
  "Bold": "Έντονα",
@@ -45259,7 +46043,7 @@ const el = {
45259
46043
  "Browse...": "Αναζήτηση...",
45260
46044
  "Drop image here or click to browse": "Σύρτε την εικόνα εδώ ή κάντε κλικ για αναζήτηση",
45261
46045
  "Alt text": "Εναλλακτικό κείμενο",
45262
- "Insert": "Εισαγωγή",
46046
+ "Insert": "??sa????",
45263
46047
  "Cancel": "Ακύρωση",
45264
46048
  "Uploading...": "Μεταφόρτωση...",
45265
46049
  "Upload failed": "Η μεταφόρτωση απέτυχε",
@@ -45273,7 +46057,20 @@ const el = {
45273
46057
  "Title": "Title",
45274
46058
  "Open link in...": "Open link in...",
45275
46059
  "Current window": "Current window",
45276
- "New window": "New window"
46060
+ "New window": "New window",
46061
+ "Speech to Text": "?�???a se ?e?�e??",
46062
+ "Dictate": "Υπαγόρευση",
46063
+ "Start": "??????s?",
46064
+ "Stop": "??a??p?",
46065
+ "Clear": "???a????s?",
46066
+ "Language": "G??ssa",
46067
+ "Confidence": "????p?st?a",
46068
+ "Listening...": "????e?...",
46069
+ "Speech to text is not supported in this browser": "? ?�???a se ?e?�e?? de? ?p?st????eta? se a?t?? t?? pe?????t?",
46070
+ "No speech detected": "?e? a????e????e ?�???a",
46071
+ "Microphone access denied": "? p??s�as? st? �????f??? ap????f???e",
46072
+ "No microphone found": "No microphone found",
46073
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45277
46074
  };
45278
46075
  const hu = {
45279
46076
  "Bold": "Félkövér",
@@ -45331,7 +46128,7 @@ const hu = {
45331
46128
  "Browse...": "Tallózás...",
45332
46129
  "Drop image here or click to browse": "Húzza ide a képet, vagy kattintson a tallózáshoz",
45333
46130
  "Alt text": "Alternatív szöveg",
45334
- "Insert": "Beszúrás",
46131
+ "Insert": "Besz�r�s",
45335
46132
  "Cancel": "Mégse",
45336
46133
  "Uploading...": "Feltöltés...",
45337
46134
  "Upload failed": "A feltöltés sikertelen",
@@ -45345,7 +46142,20 @@ const hu = {
45345
46142
  "Title": "Title",
45346
46143
  "Open link in...": "Open link in...",
45347
46144
  "Current window": "Current window",
45348
- "New window": "New window"
46145
+ "New window": "New window",
46146
+ "Speech to Text": "Besz�d sz�vegg�",
46147
+ "Dictate": "Diktálás",
46148
+ "Start": "Ind�t�s",
46149
+ "Stop": "Le�ll�t�s",
46150
+ "Clear": "T�rl�s",
46151
+ "Language": "Nyelv",
46152
+ "Confidence": "Megb�zhat�s�g",
46153
+ "Listening...": "Hallgat�s...",
46154
+ "Speech to text is not supported in this browser": "A besz�d sz�vegg� alak�t�s nem t�mogatott ebben a b�ng�szoben",
46155
+ "No speech detected": "Nem �szlelheto besz�d",
46156
+ "Microphone access denied": "Mikrofon hozz�f�r�s megtagadva",
46157
+ "No microphone found": "No microphone found",
46158
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45349
46159
  };
45350
46160
  const id = {
45351
46161
  "Bold": "Tebal",
@@ -45417,7 +46227,20 @@ const id = {
45417
46227
  "Title": "Title",
45418
46228
  "Open link in...": "Open link in...",
45419
46229
  "Current window": "Current window",
45420
- "New window": "New window"
46230
+ "New window": "New window",
46231
+ "Speech to Text": "Ucapan ke teks",
46232
+ "Dictate": "Dikte",
46233
+ "Start": "Mulai",
46234
+ "Stop": "Berhenti",
46235
+ "Clear": "Hapus",
46236
+ "Language": "Bahasa",
46237
+ "Confidence": "Kepercayaan",
46238
+ "Listening...": "Mendengarkan...",
46239
+ "Speech to text is not supported in this browser": "Ucapan ke teks tidak didukung di browser ini",
46240
+ "No speech detected": "Tidak ada ucapan terdeteksi",
46241
+ "Microphone access denied": "Akses mikrofon ditolak",
46242
+ "No microphone found": "No microphone found",
46243
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45421
46244
  };
45422
46245
  const it = {
45423
46246
  "Bold": "Grassetto",
@@ -45489,7 +46312,20 @@ const it = {
45489
46312
  "Title": "Title",
45490
46313
  "Open link in...": "Open link in...",
45491
46314
  "Current window": "Current window",
45492
- "New window": "New window"
46315
+ "New window": "New window",
46316
+ "Speech to Text": "Riconoscimento vocale",
46317
+ "Dictate": "Dettare",
46318
+ "Start": "Avvia",
46319
+ "Stop": "Ferma",
46320
+ "Clear": "Cancella",
46321
+ "Language": "Lingua",
46322
+ "Confidence": "Affidabilit�",
46323
+ "Listening...": "Ascolto in corso...",
46324
+ "Speech to text is not supported in this browser": "Il riconoscimento vocale non � supportato in questo browser",
46325
+ "No speech detected": "Nessun discorso rilevato",
46326
+ "Microphone access denied": "Accesso al microfono negato",
46327
+ "No microphone found": "No microphone found",
46328
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45493
46329
  };
45494
46330
  const ja = {
45495
46331
  "Bold": "太字",
@@ -45547,7 +46383,7 @@ const ja = {
45547
46383
  "Browse...": "参照...",
45548
46384
  "Drop image here or click to browse": "画像をここにドロップするかクリックして参照",
45549
46385
  "Alt text": "代替テキスト",
45550
- "Insert": "挿入",
46386
+ "Insert": "??",
45551
46387
  "Cancel": "キャンセル",
45552
46388
  "Uploading...": "アップロード中...",
45553
46389
  "Upload failed": "アップロードに失敗しました",
@@ -45561,7 +46397,20 @@ const ja = {
45561
46397
  "Title": "Title",
45562
46398
  "Open link in...": "Open link in...",
45563
46399
  "Current window": "Current window",
45564
- "New window": "New window"
46400
+ "New window": "New window",
46401
+ "Speech to Text": "????",
46402
+ "Dictate": "音声入力",
46403
+ "Start": "??",
46404
+ "Stop": "??",
46405
+ "Clear": "???",
46406
+ "Language": "??",
46407
+ "Confidence": "???",
46408
+ "Listening...": "?????...",
46409
+ "Speech to text is not supported in this browser": "????????????????????????",
46410
+ "No speech detected": "?????????????",
46411
+ "Microphone access denied": "?????????????????",
46412
+ "No microphone found": "No microphone found",
46413
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45565
46414
  };
45566
46415
  const ko = {
45567
46416
  "Bold": "굵게",
@@ -45619,7 +46468,7 @@ const ko = {
45619
46468
  "Browse...": "찾아보기...",
45620
46469
  "Drop image here or click to browse": "이미지를 여기에 끌어다 놓거나 클릭하여 찾아보기",
45621
46470
  "Alt text": "대체 텍스트",
45622
- "Insert": "삽입",
46471
+ "Insert": "??",
45623
46472
  "Cancel": "취소",
45624
46473
  "Uploading...": "업로드 중...",
45625
46474
  "Upload failed": "업로드 실패",
@@ -45633,7 +46482,20 @@ const ko = {
45633
46482
  "Title": "Title",
45634
46483
  "Open link in...": "Open link in...",
45635
46484
  "Current window": "Current window",
45636
- "New window": "New window"
46485
+ "New window": "New window",
46486
+ "Speech to Text": "?? ??",
46487
+ "Dictate": "받아쓰기",
46488
+ "Start": "??",
46489
+ "Stop": "??",
46490
+ "Clear": "???",
46491
+ "Language": "??",
46492
+ "Confidence": "???",
46493
+ "Listening...": "?? ?...",
46494
+ "Speech to text is not supported in this browser": "? ??????? ?? ??? ???? ????",
46495
+ "No speech detected": "??? ???? ?????",
46496
+ "Microphone access denied": "??? ??? ???????",
46497
+ "No microphone found": "No microphone found",
46498
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45637
46499
  };
45638
46500
  const nl = {
45639
46501
  "Bold": "Vet",
@@ -45705,7 +46567,20 @@ const nl = {
45705
46567
  "Title": "Title",
45706
46568
  "Open link in...": "Open link in...",
45707
46569
  "Current window": "Current window",
45708
- "New window": "New window"
46570
+ "New window": "New window",
46571
+ "Speech to Text": "Spraak naar tekst",
46572
+ "Dictate": "Dicteren",
46573
+ "Start": "Starten",
46574
+ "Stop": "Stoppen",
46575
+ "Clear": "Wissen",
46576
+ "Language": "Taal",
46577
+ "Confidence": "Betrouwbaarheid",
46578
+ "Listening...": "Luisteren...",
46579
+ "Speech to text is not supported in this browser": "Spraak naar tekst wordt niet ondersteund in deze browser",
46580
+ "No speech detected": "Geen spraak gedetecteerd",
46581
+ "Microphone access denied": "Toegang tot microfoon geweigerd",
46582
+ "No microphone found": "No microphone found",
46583
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45709
46584
  };
45710
46585
  const nb = {
45711
46586
  "Bold": "Fet",
@@ -45777,7 +46652,20 @@ const nb = {
45777
46652
  "Title": "Title",
45778
46653
  "Open link in...": "Open link in...",
45779
46654
  "Current window": "Current window",
45780
- "New window": "New window"
46655
+ "New window": "New window",
46656
+ "Speech to Text": "Tale til tekst",
46657
+ "Dictate": "Dikter",
46658
+ "Start": "Start",
46659
+ "Stop": "Stopp",
46660
+ "Clear": "T�m",
46661
+ "Language": "Spr�k",
46662
+ "Confidence": "P�litelighet",
46663
+ "Listening...": "Lytter...",
46664
+ "Speech to text is not supported in this browser": "Tale til tekst st�ttes ikke i denne nettleseren",
46665
+ "No speech detected": "Ingen tale oppdaget",
46666
+ "Microphone access denied": "Mikrofontilgang nektet",
46667
+ "No microphone found": "No microphone found",
46668
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45781
46669
  };
45782
46670
  const pl = {
45783
46671
  "Bold": "Pogrubienie",
@@ -45849,7 +46737,20 @@ const pl = {
45849
46737
  "Title": "Title",
45850
46738
  "Open link in...": "Open link in...",
45851
46739
  "Current window": "Current window",
45852
- "New window": "New window"
46740
+ "New window": "New window",
46741
+ "Speech to Text": "Mowa na tekst",
46742
+ "Dictate": "Dyktuj",
46743
+ "Start": "Rozpocznij",
46744
+ "Stop": "Zatrzymaj",
46745
+ "Clear": "Wyczysc",
46746
+ "Language": "Jezyk",
46747
+ "Confidence": "Pewnosc",
46748
+ "Listening...": "Nasluchiwanie...",
46749
+ "Speech to text is not supported in this browser": "Mowa na tekst nie jest obslugiwana w tej przegladarce",
46750
+ "No speech detected": "Nie wykryto mowy",
46751
+ "Microphone access denied": "Odmowa dostepu do mikrofonu",
46752
+ "No microphone found": "No microphone found",
46753
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45853
46754
  };
45854
46755
  const pt = {
45855
46756
  "Bold": "Negrito",
@@ -45921,7 +46822,20 @@ const pt = {
45921
46822
  "Title": "Title",
45922
46823
  "Open link in...": "Open link in...",
45923
46824
  "Current window": "Current window",
45924
- "New window": "New window"
46825
+ "New window": "New window",
46826
+ "Speech to Text": "Voz para texto",
46827
+ "Dictate": "Ditar",
46828
+ "Start": "Iniciar",
46829
+ "Stop": "Parar",
46830
+ "Clear": "Limpar",
46831
+ "Language": "Idioma",
46832
+ "Confidence": "Confian�a",
46833
+ "Listening...": "Ouvindo...",
46834
+ "Speech to text is not supported in this browser": "Voz para texto n�o � suportado neste navegador",
46835
+ "No speech detected": "Nenhuma fala detectada",
46836
+ "Microphone access denied": "Acesso ao microfone negado",
46837
+ "No microphone found": "No microphone found",
46838
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45925
46839
  };
45926
46840
  const ro = {
45927
46841
  "Bold": "Îngroșat",
@@ -45979,7 +46893,7 @@ const ro = {
45979
46893
  "Browse...": "Răsfoiește...",
45980
46894
  "Drop image here or click to browse": "Trage imaginea aici sau dă clic pentru a răsfoi",
45981
46895
  "Alt text": "Text alternativ",
45982
- "Insert": "Inserează",
46896
+ "Insert": "Inserare",
45983
46897
  "Cancel": "Anulează",
45984
46898
  "Uploading...": "Se încarcă...",
45985
46899
  "Upload failed": "Încarcare eșuată",
@@ -45993,7 +46907,20 @@ const ro = {
45993
46907
  "Title": "Title",
45994
46908
  "Open link in...": "Open link in...",
45995
46909
  "Current window": "Current window",
45996
- "New window": "New window"
46910
+ "New window": "New window",
46911
+ "Speech to Text": "Voce �n text",
46912
+ "Dictate": "Dictare",
46913
+ "Start": "Pornire",
46914
+ "Stop": "Oprire",
46915
+ "Clear": "?tergere",
46916
+ "Language": "Limba",
46917
+ "Confidence": "�ncredere",
46918
+ "Listening...": "Ascultare...",
46919
+ "Speech to text is not supported in this browser": "Voce �n text nu este acceptata �n acest browser",
46920
+ "No speech detected": "Nu a fost detectata nicio voce",
46921
+ "Microphone access denied": "Accesul la microfon a fost refuzat",
46922
+ "No microphone found": "No microphone found",
46923
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
45997
46924
  };
45998
46925
  const ru = {
45999
46926
  "Bold": "Полужирный",
@@ -46051,7 +46978,7 @@ const ru = {
46051
46978
  "Browse...": "Обзор...",
46052
46979
  "Drop image here or click to browse": "Перетащите изображение сюда или нажмите для обзора",
46053
46980
  "Alt text": "Альтернативный текст",
46054
- "Insert": "Вставить",
46981
+ "Insert": "????????",
46055
46982
  "Cancel": "Отмена",
46056
46983
  "Uploading...": "Загрузка...",
46057
46984
  "Upload failed": "Ошибка загрузки",
@@ -46065,7 +46992,20 @@ const ru = {
46065
46992
  "Title": "Title",
46066
46993
  "Open link in...": "Open link in...",
46067
46994
  "Current window": "Current window",
46068
- "New window": "New window"
46995
+ "New window": "New window",
46996
+ "Speech to Text": "????? ? ?????",
46997
+ "Dictate": "Диктовать",
46998
+ "Start": "??????",
46999
+ "Stop": "??????????",
47000
+ "Clear": "????????",
47001
+ "Language": "????",
47002
+ "Confidence": "????????",
47003
+ "Listening...": "??????...",
47004
+ "Speech to text is not supported in this browser": "????????? ???? ?? ?????????????? ? ???? ????????",
47005
+ "No speech detected": "???? ?? ??????????",
47006
+ "Microphone access denied": "?????? ? ????????? ????????",
47007
+ "No microphone found": "No microphone found",
47008
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46069
47009
  };
46070
47010
  const sr = {
46071
47011
  "Bold": "Подебљано",
@@ -46123,7 +47063,7 @@ const sr = {
46123
47063
  "Browse...": "Претражи...",
46124
47064
  "Drop image here or click to browse": "Превуците слику овде или кликните за претрагу",
46125
47065
  "Alt text": "Алтернативни текст",
46126
- "Insert": "Уметни",
47066
+ "Insert": "?????",
46127
47067
  "Cancel": "Откажи",
46128
47068
  "Uploading...": "Отпремање...",
46129
47069
  "Upload failed": "Отпремање није успело",
@@ -46137,7 +47077,20 @@ const sr = {
46137
47077
  "Title": "Title",
46138
47078
  "Open link in...": "Open link in...",
46139
47079
  "Current window": "Current window",
46140
- "New window": "New window"
47080
+ "New window": "New window",
47081
+ "Speech to Text": "????? ? ?????",
47082
+ "Dictate": "Диктирање",
47083
+ "Start": "???????",
47084
+ "Stop": "????????",
47085
+ "Clear": "??????",
47086
+ "Language": "?????",
47087
+ "Confidence": "??????????",
47088
+ "Listening...": "??????...",
47089
+ "Speech to text is not supported in this browser": "????? ? ????? ???? ??????? ? ???? ??????????",
47090
+ "No speech detected": "????? ???? ????????",
47091
+ "Microphone access denied": "??????? ????????? ???????",
47092
+ "No microphone found": "No microphone found",
47093
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46141
47094
  };
46142
47095
  const sl = {
46143
47096
  "Bold": "Krepko",
@@ -46209,7 +47162,20 @@ const sl = {
46209
47162
  "Title": "Title",
46210
47163
  "Open link in...": "Open link in...",
46211
47164
  "Current window": "Current window",
46212
- "New window": "New window"
47165
+ "New window": "New window",
47166
+ "Speech to Text": "Govor v besedilo",
47167
+ "Dictate": "Narekovanje",
47168
+ "Start": "Zacni",
47169
+ "Stop": "Ustavi",
47170
+ "Clear": "Pocisti",
47171
+ "Language": "Jezik",
47172
+ "Confidence": "Zaupanje",
47173
+ "Listening...": "Poslu�am...",
47174
+ "Speech to text is not supported in this browser": "Govor v besedilo ni podprt v tem brskalniku",
47175
+ "No speech detected": "Govor ni bil zaznan",
47176
+ "Microphone access denied": "Dostop do mikrofona zavrnjen",
47177
+ "No microphone found": "No microphone found",
47178
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46213
47179
  };
46214
47180
  const es = {
46215
47181
  "Bold": "Negrita",
@@ -46281,7 +47247,20 @@ const es = {
46281
47247
  "Title": "Title",
46282
47248
  "Open link in...": "Open link in...",
46283
47249
  "Current window": "Current window",
46284
- "New window": "New window"
47250
+ "New window": "New window",
47251
+ "Speech to Text": "Voz a texto",
47252
+ "Dictate": "Dictar",
47253
+ "Start": "Iniciar",
47254
+ "Stop": "Detener",
47255
+ "Clear": "Borrar",
47256
+ "Language": "Idioma",
47257
+ "Confidence": "Confianza",
47258
+ "Listening...": "Escuchando...",
47259
+ "Speech to text is not supported in this browser": "La voz a texto no es compatible con este navegador",
47260
+ "No speech detected": "No se detect� voz",
47261
+ "Microphone access denied": "Acceso al micr�fono denegado",
47262
+ "No microphone found": "No microphone found",
47263
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46285
47264
  };
46286
47265
  const sv = {
46287
47266
  "Bold": "Fet",
@@ -46353,7 +47332,20 @@ const sv = {
46353
47332
  "Title": "Title",
46354
47333
  "Open link in...": "Open link in...",
46355
47334
  "Current window": "Current window",
46356
- "New window": "New window"
47335
+ "New window": "New window",
47336
+ "Speech to Text": "Tal till text",
47337
+ "Dictate": "Diktera",
47338
+ "Start": "Starta",
47339
+ "Stop": "Stoppa",
47340
+ "Clear": "Rensa",
47341
+ "Language": "Spr�k",
47342
+ "Confidence": "Tillf�rlitlighet",
47343
+ "Listening...": "Lyssnar...",
47344
+ "Speech to text is not supported in this browser": "Tal till text st�ds inte i denna webbl�sare",
47345
+ "No speech detected": "Inget tal detekterat",
47346
+ "Microphone access denied": "Mikrofon�tkomst nekad",
47347
+ "No microphone found": "No microphone found",
47348
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46357
47349
  };
46358
47350
  const zhTw = {
46359
47351
  "Bold": "粗體",
@@ -46411,7 +47403,7 @@ const zhTw = {
46411
47403
  "Browse...": "瀏覽...",
46412
47404
  "Drop image here or click to browse": "將圖片拖放至此處或點擊瀏覽",
46413
47405
  "Alt text": "替代文字",
46414
- "Insert": "插入",
47406
+ "Insert": "??",
46415
47407
  "Cancel": "取消",
46416
47408
  "Uploading...": "上傳中...",
46417
47409
  "Upload failed": "上傳失敗",
@@ -46425,7 +47417,20 @@ const zhTw = {
46425
47417
  "Title": "Title",
46426
47418
  "Open link in...": "Open link in...",
46427
47419
  "Current window": "Current window",
46428
- "New window": "New window"
47420
+ "New window": "New window",
47421
+ "Speech to Text": "?????",
47422
+ "Dictate": "聽寫",
47423
+ "Start": "??",
47424
+ "Stop": "??",
47425
+ "Clear": "??",
47426
+ "Language": "??",
47427
+ "Confidence": "???",
47428
+ "Listening...": "????...",
47429
+ "Speech to text is not supported in this browser": "????????????",
47430
+ "No speech detected": "??????",
47431
+ "Microphone access denied": "????????",
47432
+ "No microphone found": "No microphone found",
47433
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46429
47434
  };
46430
47435
  const th = {
46431
47436
  "Bold": "ตัวหนา",
@@ -46483,7 +47488,7 @@ const th = {
46483
47488
  "Browse...": "เรียกดู...",
46484
47489
  "Drop image here or click to browse": "ลากรูปภาพมาที่นี่หรือคลิกเพื่อเรียกดู",
46485
47490
  "Alt text": "ข้อความทดแทน",
46486
- "Insert": "แทรก",
47491
+ "Insert": "????",
46487
47492
  "Cancel": "ยกเลิก",
46488
47493
  "Uploading...": "กำลังอัปโหลด...",
46489
47494
  "Upload failed": "อัปโหลดล้มเหลว",
@@ -46497,7 +47502,20 @@ const th = {
46497
47502
  "Title": "Title",
46498
47503
  "Open link in...": "Open link in...",
46499
47504
  "Current window": "Current window",
46500
- "New window": "New window"
47505
+ "New window": "New window",
47506
+ "Speech to Text": "????????????????",
47507
+ "Dictate": "เขียนตามคำบอก",
47508
+ "Start": "?????",
47509
+ "Stop": "????",
47510
+ "Clear": "????",
47511
+ "Language": "????",
47512
+ "Confidence": "?????????????",
47513
+ "Listening...": "????????...",
47514
+ "Speech to text is not supported in this browser": "?????????????????????????????????????????",
47515
+ "No speech detected": "?????????????",
47516
+ "Microphone access denied": "???????????????????????????",
47517
+ "No microphone found": "No microphone found",
47518
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46501
47519
  };
46502
47520
  const tr = {
46503
47521
  "Bold": "Kalın",
@@ -46569,7 +47587,20 @@ const tr = {
46569
47587
  "Title": "Title",
46570
47588
  "Open link in...": "Open link in...",
46571
47589
  "Current window": "Current window",
46572
- "New window": "New window"
47590
+ "New window": "New window",
47591
+ "Speech to Text": "Konusmayi metne �evir",
47592
+ "Dictate": "Dikte et",
47593
+ "Start": "Baslat",
47594
+ "Stop": "Durdur",
47595
+ "Clear": "Temizle",
47596
+ "Language": "Dil",
47597
+ "Confidence": "G�venilirlik",
47598
+ "Listening...": "Dinliyor...",
47599
+ "Speech to text is not supported in this browser": "Bu tarayicida konusmayi metne �evirme desteklenmiyor",
47600
+ "No speech detected": "Konusma algilanmadi",
47601
+ "Microphone access denied": "Mikrofon erisimi reddedildi",
47602
+ "No microphone found": "No microphone found",
47603
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46573
47604
  };
46574
47605
  const vi = {
46575
47606
  "Bold": "In đậm",
@@ -46627,7 +47658,7 @@ const vi = {
46627
47658
  "Browse...": "Duyệt...",
46628
47659
  "Drop image here or click to browse": "Kéo thả hình ảnh vào đây hoặc nhấp để duyệt",
46629
47660
  "Alt text": "Văn bản thay thế",
46630
- "Insert": "Chèn",
47661
+ "Insert": "Ch�n",
46631
47662
  "Cancel": "Hủy",
46632
47663
  "Uploading...": "Đang tải lên...",
46633
47664
  "Upload failed": "Tải lên thất bại",
@@ -46641,7 +47672,20 @@ const vi = {
46641
47672
  "Title": "Title",
46642
47673
  "Open link in...": "Open link in...",
46643
47674
  "Current window": "Current window",
46644
- "New window": "New window"
47675
+ "New window": "New window",
47676
+ "Speech to Text": "Gi?ng n�i th�nh van b?n",
47677
+ "Dictate": "Đọc chính tả",
47678
+ "Start": "B?t d?u",
47679
+ "Stop": "D?ng",
47680
+ "Clear": "X�a",
47681
+ "Language": "Ng�n ng?",
47682
+ "Confidence": "�? tin c?y",
47683
+ "Listening...": "�ang nghe...",
47684
+ "Speech to text is not supported in this browser": "Gi?ng n�i th�nh van b?n kh�ng du?c h? tr? trong tr�nh duy?t n�y",
47685
+ "No speech detected": "Kh�ng ph�t hi?n gi?ng n�i",
47686
+ "Microphone access denied": "Quy?n truy c?p micr� b? t? ch?i",
47687
+ "No microphone found": "No microphone found",
47688
+ "Network error - speech recognition requires internet": "Network error - speech recognition requires internet"
46645
47689
  };
46646
47690
  const locales = {
46647
47691
  en,
@@ -46782,7 +47826,8 @@ class HTMLEditor {
46782
47826
  format_empty_lines: config.format_empty_lines ?? true,
46783
47827
  toolbar_narrow_breakpoint: config.toolbar_narrow_breakpoint,
46784
47828
  toolbar_priority: config.toolbar_priority,
46785
- paste_from_office: config.paste_from_office ?? true
47829
+ paste_from_office: config.paste_from_office ?? true,
47830
+ speech_to_text: config.speech_to_text ?? true
46786
47831
  };
46787
47832
  }
46788
47833
  createEditor() {
@@ -47205,6 +48250,7 @@ exports.CHAR_MAP = CHAR_MAP;
47205
48250
  exports.CONFAB_ICONS = CONFAB_ICONS;
47206
48251
  exports.CharacterMap = CharacterMap;
47207
48252
  exports.DEFAULT_ICONS = DEFAULT_ICONS;
48253
+ exports.Dictation = Dictation;
47208
48254
  exports.EMOJI_CATEGORIES = EMOJI_CATEGORIES;
47209
48255
  exports.EmojiPicker = EmojiPicker;
47210
48256
  exports.FontSize = FontSize;
@@ -47216,6 +48262,7 @@ exports.PasteFromOffice = PasteFromOffice;
47216
48262
  exports.SearchReplace = SearchReplace;
47217
48263
  exports.SignatureBlock = SignatureBlock;
47218
48264
  exports.SourceEditor = SourceEditor;
48265
+ exports.SpeechToText = SpeechToText;
47219
48266
  exports.TRANSLATION_KEYS = TRANSLATION_KEYS;
47220
48267
  exports.TextDirection = TextDirection;
47221
48268
  exports.Toolbar = Toolbar;
@@ -47225,6 +48272,7 @@ exports.fontNames = fontNames;
47225
48272
  exports.getGetFileSrc = getGetFileSrc;
47226
48273
  exports.getLocale = getLocale;
47227
48274
  exports.getTranslate = getTranslate;
48275
+ exports.isSpeechRecognitionSupported = isSpeechRecognitionSupported;
47228
48276
  exports.resetTranslate = resetTranslate;
47229
48277
  exports.setGetFileSrc = setGetFileSrc;
47230
48278
  exports.setTranslate = setTranslate;