tweb/public/458.05455564683cc3681625.chunk.js.map
Eduard Kuzmenko 5625eda42b Build
2022-08-20 13:32:46 +02:00

1 line
39 KiB
Plaintext

{"version":3,"file":"458.05455564683cc3681625.chunk.js","mappings":"0NAoBA,IAAIA,EAAO,KACTC,SAASC,iBAAiB,SAAUC,IAClC,MAAMC,GAAQ,EAAAC,EAAA,GAAgBF,EAAEG,OAAQ,0BACxC,IAAIF,EACF,OAGF,MAAMG,IAAiBH,EAAMI,QAAQD,aAErC,IAAIE,EAAcC,EADlBP,EAAEQ,iBAIF,IAAIC,GAAqBT,EAAEU,eAAiBV,GAAGW,cAAcC,QAAQ,cACjEC,GAAe,EAGfC,GAAgBd,EAAEU,eAAiBV,GAAGW,cAAcC,QAAQ,aAEhE,MAAMG,EAAgBf,GAA6B,uBAARA,EAAEgB,GAAuC,2BAARhB,EAAEgB,IAAmCZ,EACjH,GAAGA,EAAc,CACf,MAAMa,EAAS,UACfR,EAAYA,EAAUS,QAAQD,EAAQ,IACtCH,EAAOA,EAAKI,QAAQD,EAAQ,IAG9B,GAAGH,EAAKK,OAAQ,CACdL,EAAOA,EAAKI,QAAQ,2BAA4B,IAChDJ,EAAOA,EAAKI,QAAQ,mBAAoB,IAExC,MAAME,EAAQN,EAAKM,MAAM,2BACtBA,IACDN,EAAOM,EAAM,GAAGD,QAGlB,MAAME,EAAoBvB,SAASwB,cAAc,QACjDD,EAAKE,UAAYT,EAEjB,IAAIU,EAAWH,EAAKI,WACpB,KAAMD,GAAU,CACd,MAAME,EAAcF,EAASE,YACJ,IAAtBF,EAASG,WACNH,EAASI,UAAUT,QACrBK,EAASK,UAIbL,EAAWE,EAGb,MAAMI,GAAY,EAAAC,EAAA,GAAaV,GAAM,GACrC,GAAGS,EAAUE,MAAMd,QAAQ,MAAO,IAAIe,SAAWxB,EAAUS,QAAQ,MAAO,IAAIe,OAAQ,CACpF3B,EAAOwB,EAAUE,MACjBzB,EAAWuB,EAAUvB,SACrBM,GAAe,EAEf,IAAIqB,GAAY,EAAAC,EAAA,GAAc7B,GAC9B4B,EAAYA,EAAUE,OAAOrB,IAC7B,EAAAsB,EAAA,GAAc9B,EAAU2B,IAIzBrB,IACDP,EAAOG,EACPF,GAAW,EAAA4B,EAAA,GAAc7B,GACzBC,EAAWA,EAAS6B,OAAOrB,IAG7B,MAAMuB,GAAW,EAAAC,EAAA,GAAcjC,EAAM,CAACC,SAAAA,IACtCD,GAAO,EAAAkC,EAAA,GAAuBF,GAE9BG,OAAO3C,SAAS4C,YAAY,cAAc,EAAOpC,MAGnDT,EAAO,MAoBT,IAAY8C,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,IAAAA,EAAU,KAuBP,MAAMC,EAUnBC,YAAmBC,EAA6B,IAA7B,KAAAA,QAAAA,EACjBC,KAAKC,UAAYlD,SAASwB,cAAc,OACxCyB,KAAKC,UAAUC,UAAUC,IAAI,eAE7BH,KAAKI,SAAWL,EAAQK,SACxBJ,KAAKK,SAAWN,EAAQM,cAECC,IAAtBP,EAAQQ,gBAAoDD,IAAzBP,EAAQS,eAC5CT,EAAQS,aAAeC,KAAKC,IAAI,GAAID,KAAKE,MAAMZ,EAAQQ,UAAY,KAGrE,MAAM,YAACK,EAAW,UAAEL,EAAS,aAAEC,EAAY,KAAEK,EAAI,UAAEnD,EAAS,YAAEoD,GAAc,EAAI,aAAEC,GAAgBhB,EAC5FiB,EAAQjB,EAAQiB,OAASjB,EAAQkB,UAEjCC,EAAsC,GAC5C,IAAIhE,EA+CJ,GA9CIQ,GA4BFsC,KAAKC,UAAUzB,UAAY,8BACNqC,EAAO,SAASA,KAAU,oBAAoBE,MAAAA,EAAAA,EAAgB,UAAUC,EAAQ,cAAgB,wCAGrH9D,EAAQ8C,KAAKC,UAAUkB,oBA/BpBrE,GACDA,IAGFkD,KAAKC,UAAUzB,UAAY,iCACH4C,SAASN,+CAGjC5D,EAAQ8C,KAAKC,UAAUkB,kBASvBD,EAAiBG,MAAK,MAEjB,EAAAC,EAAA,GAAapE,KACdA,EAAMqE,YAAc,QAe1BrE,EAAMsE,aAAa,MAAO,QAEvBzB,EAAQ0B,YACTvE,EAAMuE,UAAY1B,EAAQ0B,WAGzBb,IACD,QAAM1D,EAAO0D,OAAaN,EAAW,eAGpCU,GAASJ,EAAa,CACvB,MAAMc,EAAS3E,SAASwB,cAAc,OACtCmD,EAAOxB,UAAUC,IAAI,sBACrBH,KAAKC,UAAU0B,OAAOD,GASxB,GANGV,IACDhB,KAAKgB,MAAQjE,SAASwB,cAAc,SACpCyB,KAAK4B,WACL5B,KAAKC,UAAU0B,OAAO3B,KAAKgB,QAG1BT,EAAW,CACZ,MAAMsB,EAAU7B,KAAKC,UAAU6B,iBAC/B,IAAIC,GAAgB,EAEpB,MAAMC,EAAU,KACd,MAAMC,EAAW/E,EAAMgD,UAAUgC,SAAS,SAEpCC,EAAczE,EAAaR,EAA2B+B,MAAMC,OAAS,KAAI,EAAAF,EAAA,GAAa9B,GAAO,GAAO+B,OAAOC,OAC3GkD,EAAO7B,EAAY4B,EACnBE,EAAUD,EAAO,EACvBlF,EAAMgD,UAAUoC,OAAO,QAASD,GAI7BA,GAAWD,GAAQ5B,GACpBR,KAAK4B,WACLC,EAAQF,OAAO,KAAKpB,EAAY4B,MAC5BJ,IAAeA,GAAgB,KAC1BE,IAAaI,GAAYN,KAClC/B,KAAK4B,WACLG,GAAgB,IAIpBb,EAAiBG,KAAKW,IAGFjC,EAAQwC,iBACV7E,IAClBR,EAAMI,QAAQD,aAAe,IAC7BH,EAAMF,iBAAiB,YAAaC,IAClC,GAAa,UAAVA,EAAEuF,IAEH,OADAvF,EAAEQ,kBACK,MAKVyD,EAAiBhC,QAClBhC,EAAMF,iBAAiB,SAAS,KAC9BkE,EAAiBuB,SAASC,GAAaA,SAI3C1C,KAAK9C,MAAQA,EAGRyF,SACD3C,KAAKf,QAINe,KAAKD,QAAQrC,UACbsC,KAAK9C,MAA2ByF,SChRxB,SAA+BC,GAC5C,MAAMC,EAAQ9F,SAAS+F,cACvBD,EAAME,mBAAmBH,GACzB,MAAMI,EAAMtD,OAAOuD,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD6QTO,CAAsBpD,KAAK9C,QAIxB0E,WACL5B,KAAKgB,MAAMO,YAAc,GACtBvB,KAAKD,QAAQkB,WACd,EAAAoC,EAAA,GAAarD,KAAKgB,MAAOhB,KAAKD,QAAQkB,WAEtCjB,KAAKgB,MAAMW,QAAO,QAAK3B,KAAKD,QAAQiB,MAAOhB,KAAKD,QAAQuD,eAIxDrE,YACF,OAAOe,KAAKD,QAAQrC,UAAasC,KAAK9C,MAA2B+B,OAAQ,EAAAD,EAAA,GAAagB,KAAK9C,OAAO,GAAO+B,MAIvGA,UAAMA,GACRe,KAAKuD,iBAAiBtE,GAAO,IAE7B,OAAce,KAAK9C,MAAO,SAGrBqG,iBAAiBtE,EAAeuE,GAClCxD,KAAKD,QAAQrC,UACbsC,KAAK9C,MAA2B+B,MAAQA,EAEzCe,KAAK9C,MAAMsB,UAAYS,EAIpBwE,YACL,OAAOzD,KAAKf,QAAUe,KAAK0D,cAGtBC,UACL,OAAQ3D,KAAK9C,MAAMgD,UAAUgC,SAAS,YAClClC,KAAKK,UAAYL,KAAKK,eACtBL,KAAKI,YAAa,EAAAkB,EAAA,GAAatB,KAAK9C,QAGnC0G,kBACL,OAAO5D,KAAK2D,WAAa3D,KAAKyD,YAGzBI,cAAc5E,EAAQ,GAAI6E,GAC3B9D,KAAKD,QAAQrC,YACfuB,GAAQ,EAAAQ,EAAA,IAAuB,EAAAD,EAAA,GAAcP,KAG5C6E,EACD9D,KAAKuD,iBAAiBtE,GAAO,GAE7Be,KAAKf,MAAQA,EAIV8E,iBAAiB9E,EAAqC,GAAI6E,GAC/D9D,KAAK0D,cAAgBzE,EACrBe,KAAK6D,cAAc5E,EAAO6E,GAGrBE,SAASC,EAAmBjD,GAC9BA,GACDhB,KAAKgB,MAAMO,YAAc,GACzBvB,KAAKgB,MAAMW,QAAO,QAAKX,EAAOhB,KAAKD,QAAQuD,gBAE3CtD,KAAK4B,WAGP5B,KAAK9C,MAAMgD,UAAUoC,OAAO,WAAY2B,EAAQrE,EAAWsE,QAC3DlE,KAAK9C,MAAMgD,UAAUoC,OAAO,WAAY2B,EAAQrE,EAAWuE,QAGtDC,SAASpD,GACdhB,KAAKgE,SAASpE,EAAWsE,MAAOlD,M,8CE7VrB,SAASvB,EAAuBF,GAC7C,OAAO8E,MAAMC,KAAK/E,EAASgF,YAAYC,KAAKC,GACjB,IAAlBA,EAAK7F,UAAiB,OAAe6F,EAAKlD,aAAgBkD,EAAiBC,YACjFC,KAAK,M,eCCK,SAASxH,EAAgByF,EAASgC,GAC/C,OAAOhC,EAAGiC,QAAQ,IAAID,M,0DCajB,MAAME,EAAsD,CACjEC,KAAM,CACJ1G,MAAO,+IACP2G,WAAY,qBAEdC,UAAW,CACT5G,MAAO,+BACP2G,WAAY,0BAEdE,OAAQ,CACN7G,MAAO,2BACP2G,WAAY,uBAEdG,UAAW,CACT9G,MAAO,iDACP2G,WAAY,qBAEdI,cAAe,CACb/G,MAAO,0CACP2G,WAAY,uBAEdK,KAAM,CACJhH,MAAO,iBACP2G,WAAY,wBAEdM,YAAa,CACXjH,MAAO,WACP2G,WAAY,4BAEdO,QAAS,CACPlH,MAAO,qBACP2G,WAAY,yBAoBVQ,EAAkB,IAAIC,IAAI,CAC9B,MACA,IACA,KACA,KACA,UACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGa,SAASC,EAAoBjB,EAAmBkB,EAAiBC,EAAgBC,EAAgBC,EAAoBtI,EAA4BuI,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlBtB,EAAK7F,SAAgB,CACtB,MAAMC,EAAY4F,EAAK5F,UAevB,GANGgH,IAAYpB,EACbmB,EAAKvE,KAAKxC,EAAUmH,OAAO,EAAGF,GAAa,IAASjH,EAAUmH,OAAOF,IAErEF,EAAKvE,KAAKxC,GAGTrB,GAAYqB,EAAUK,QACpBuF,EAAKwB,WAAY,CAClB,MAAMC,EAAgBzB,EAAKyB,cAG3B,IAAI,MAAMC,KAAQrB,EAAc,CAC9B,MAAMsB,EAAMtB,EAAaqB,GACnBtB,EAAUqB,EAAcrB,QAAQuB,EAAI/H,MAAQ,uBACF,QAA7CwG,MAAAA,OAAO,EAAPA,EAASwB,aAAa,sBAUH,yBAAnBD,EAAIpB,WACLxH,EAAS6D,KAAK,CACZpD,EAAGmI,EAAIpB,WACPsB,IAAMzB,EAA8B0B,KACpCR,OAAQA,EAAOA,OACf7G,OAAQL,EAAUK,SAEO,6BAAnBkH,EAAIpB,WACZxH,EAAS6D,KAAK,CACZpD,EAAGmI,EAAIpB,WACPe,OAAQA,EAAOA,OACf7G,OAAQL,EAAUK,OAClBsH,QAAU3B,EAAwBvH,QAAQmJ,OAAOC,aAGnDlJ,EAAS6D,KAAK,CACZpD,EAAGmI,EAAIpB,WACPe,OAAQA,EAAOA,OACf7G,OAAQL,EAAUK,WAQ5B,YADA6G,EAAOA,QAAUlH,EAAUK,QAI7B,GAAqB,IAAlBuF,EAAK7F,SACN,OAGF,MAAM+H,EAAad,IAAYpB,EACzBmC,EAAUpB,EAAgBqB,IAAIpC,EAAKqC,SACzC,GAAGF,GAAWhB,EAAK1G,OACjByG,EAAMtE,KAAKuE,EAAKjB,KAAK,KACrBiB,EAAKmB,OAAO,EAAGnB,EAAK1G,UAClB6G,EAAOA,YACJ,GAAGtB,aAAgBuC,iBAAkB,CAC1C,MAAMC,EAAMxC,EAAKwC,IACdA,IACDrB,EAAKvE,KAAK4F,GACVlB,EAAOA,QAAUkB,EAAI/H,QAItByH,IAAeb,GAChBF,EAAKvE,KAAK,KAGZ,MAAM6F,EAAczC,EAAK0C,QArHH,iCAsHhBC,EAAoB5J,MAAAA,OAAQ,EAARA,EAAU0B,OAEpC,IAAIT,EAAWgG,EAAK/F,WACpB,KAAMD,GACJiH,EAAoBjH,EAAUkH,EAAOC,EAAMC,EAASC,EAAWtI,EAAUuI,GACzEtH,EAAWA,EAASE,YAOtB,GAJGgI,GAAcb,GACfF,EAAKvE,KAAK,KAGT6F,GAAezC,EAAK9F,cACrBiH,EAAKvE,KAAK,OACR0E,EAAOA,YAGgBzF,IAAtB8G,GACD,IAAI,IAAIC,EAAID,EAAmBlI,EAAS1B,EAAS0B,OAAQmI,EAAInI,IAAUmI,IACnE7J,EAAS6J,GAAGnI,OAKpB,MAAMoI,EAAY1B,EAAK1G,OACpB0H,GAAWU,IACZ3B,EAAMtE,KAAKuE,EAAKjB,KAAK,KACrBiB,EAAKmB,OAAO,EAAGO,KACbvB,EAAOA,QAGRuB,GAA8B,MAAjB7C,EAAKqC,SAAmBrC,EAAK9F,cAC3CgH,EAAMtE,KAAK,MACT0E,EAAOA,U,2EC7LE,SAAS/G,EAAauI,EAAoBC,GAAe,GACtE,MAAM7B,EAAkB,GAClBC,EAAiB,GAEjBpI,EAA4BgK,EAAe,QAAKlH,GACtD,OAAoBiH,EAAO5B,EAAOC,OAAMtF,OAAWA,EAAW9C,GAC3DoI,EAAK1G,QACNyG,EAAMtE,KAAKuE,EAAKjB,KAAK,KAGvB,IAAI1F,EAAQ0G,EAAMhB,KAAK,MAkBvB,OAjBA1F,EAAQA,EAAMd,QAAQ,UAAW,MAE9BX,MAAAA,OAAQ,EAARA,EAAU0B,WASX,OAAoB1B,IACpB,OAAaA,IAKR,CAACyB,MAAAA,EAAOzB,SAAAA,GAGjB,kBAA8BwB,G,8CCxCf,SAASsC,EAAamG,GACnC,OAAGA,EAAQC,aAAa,oBAA0C,UAApBD,EAAQX,UAI5C,OAAaW,GAAS,GAAOxI,MAAMb,QAElCqJ,EAA6BxI,MAAMb,S,eCTjC,SAASuJ,EAAeC,EAAmBnD,GACxD,GAAoB,iBAAX,EAEP,YADAmD,EAAKpJ,UAAYiG,GAKnB,MAAM/F,EAAakJ,EAAKlJ,WACrBA,EACEkJ,EAAKC,YAAcnJ,EACpBA,EAAWoJ,YAAYrD,IAEvBmD,EAAKrG,YAAc,GACnBqG,EAAKjG,OAAO8C,IAGdmD,EAAKjG,OAAO8C,G,gCChBD,SAASpB,EAAauE,EAAe7J,GAClD6J,EAAKpG,aAAa,MAAO,QACL,iBAAX,EACHzD,EACC6J,EAAKpJ,UAAYT,EADZ6J,EAAKrG,YAAc,IAG7BqG,EAAKrG,YAAc,GACnBqG,EAAKjG,OAAO5D,I,kDCLhB,MAAMgK,EAAgD,IAAItC,IAAI,CAC5D,oBACA,sBACA,oBACA,mBACA,yBACA,sBACA,0BACA,yBAEa,SAASuC,EAAoBxK,GAE1C,IAAI,IAAI6J,EAAI,EAAGA,EAAI7J,EAAS0B,SAAUmI,EAAG,CACvC,MAAMY,EAASzK,EAAS6J,GAExB,IAAIa,GAAiB,EACrB,GAKE,GAJAA,EAAgB1K,EAAS2K,WAAU,CAAClL,EAAGmL,IAC9BL,EAAqBlB,IAAI5J,EAAEgB,IAAMmK,IAAOf,GAAKpK,EAAEgB,IAAMgK,EAAOhK,GAAMhB,EAAE8I,OAASkC,EAAO/I,SAAY+I,EAAOlC,UAG1F,IAAnBmC,EAAsB,CACvB,MAAMG,EAAa7K,EAAS0K,GAC5BD,EAAO/I,QAAUmJ,EAAWnJ,OAC5B1B,EAASuJ,OAAOmB,EAAe,WAER,IAAnBA,M,8CCzBZ,MAAMI,EAA2C,IAAI7C,IAAI,CAAC,mBAAoB,sBAE/D,SAAS8C,EAAsBC,EAAkCC,GAC9E,IAAIC,GAAa,EACjB,OAAOF,EAAgBG,MAAMC,IACxBN,EAAgBzB,IAAI+B,EAAc3K,KACnCyK,EAAYE,EAAc7C,OAAS6C,EAAc1J,QAGhDuJ,EAAU1C,OAAS2C,IAAc,SAA8BD,EAAUxK,KAIjDwK,EAAUxK,IAAM2K,EAAc3K,IACvD,SAA8BwK,EAAUxK,KAAO,SAA8B2K,EAAc3K,MAMjEwK,EAAU1C,QAAU6C,EAAc7C,QAC3D0C,EAAUvJ,OAASuJ,EAAU1C,QAAY6C,EAAc1J,OAAS0J,EAAc7C,a,wDCpBtE,SAASzG,EAAckJ,EAAkCK,GACtE,MAAMC,EAAWD,EAAYxJ,QAAQpC,KAC3B,OAAsBuL,EAAiBvL,KAGjDuL,EAAgBnH,QAAQyH,IACxB,OAAaN,GAOb,IAAI,IAAInB,EAAI,EAAGA,EAAImB,EAAgBtJ,SAAUmI,EAAG,CAC9C,MAAMY,EAASO,EAAgBnB,GAC/B,GAAgB,uBAAbY,EAAOhK,EAA4B,CACpC,MAAMoK,EAAaG,EAAgBnB,EAAI,GACpCgB,GAA6DA,EAAWtC,OAAUkC,EAAOlC,OAASkC,EAAO/I,SAC1G+I,EAAO/I,OAASmJ,EAAWtC,OAASkC,EAAOlC,SAMjD,OAAOyC,I,eChCM,SAASO,EAAavL,GACnCA,EAASwL,MAAK,CAACC,EAAGC,IACRD,EAAElD,OAASmD,EAAEnD,QAAYmD,EAAEhK,OAAS+J,EAAE/J,S,gECKnC,SAASM,EAAcjC,EAAcwC,EAE/C,IACH,OAAIxC,GAIG,OAAaA,EAAM,CACxBC,SAAUuC,EAAQvC,SAClB2L,SAAS,EACTC,eAAe,EACfC,aAAc,CACZC,sBAAsB,EACtBC,0BAA0B,MATrB,OAAa","sources":["webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValue.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport simulateEvent from '../helpers/dom/dispatchEvent';\r\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\r\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\r\nimport getRichValue from '../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\r\nimport selectElementContents from '../helpers/dom/selectElementContents';\r\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\r\nimport {MessageEntity} from '../layer';\r\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\r\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\r\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\r\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\r\n if(!input) {\r\n return;\r\n }\r\n\r\n const noLinebreaks = !!input.dataset.noLinebreaks;\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\r\n if(noLinebreaks) {\r\n const regExp = /[\\r\\n]/g;\r\n plainText = plainText.replace(regExp, '');\r\n html = html.replace(regExp, '');\r\n }\r\n\r\n if(html.trim()) {\r\n html = html.replace(/<style([\\s\\S]*)<\\/style>/, '');\r\n html = html.replace(/<!--([\\s\\S]*)-->/, '');\r\n\r\n const match = html.match(/<body>([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n const span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like <p>asd</p>\\n<p>zxc</p>\r\n const nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n\r\n let entities2 = parseEntities(text);\r\n entities2 = entities2.filter(filterEntity);\r\n mergeEntities(entities, entities2);\r\n }\r\n }\r\n\r\n if(usePlainText) {\r\n text = plainText;\r\n entities = parseEntities(text);\r\n entities = entities.filter(filterEntity);\r\n }\r\n\r\n const fragment = wrapDraftText(text, {entities});\r\n text = documentFragmentToHTML(fragment);\r\n\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey,\r\n label?: LangPackKey,\r\n labelOptions?: any[],\r\n labelText?: string | DocumentFragment,\r\n name?: string,\r\n maxLength?: number,\r\n showLengthOn?: number,\r\n plainText?: true,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean,\r\n inputMode?: 'tel' | 'numeric',\r\n withLinebreaks?: boolean,\r\n autocomplete?: string\r\n};\r\n\r\nexport default class InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\r\n const label = options.label || options.labelText;\r\n\r\n const onInputCallbacks: Array<() => void> = [];\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n <div contenteditable=\"${String(!!canBeEdited)}\" class=\"input-field-input\"></div>\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n // const observer = new MutationObserver(() => {\r\n // //checkAndSetRTL(input);\r\n\r\n // if(processInput) {\r\n // processInput();\r\n // }\r\n // });\r\n\r\n onInputCallbacks.push(() => {\r\n // * because if delete all characters there will br left\r\n if(isInputEmpty(input)) {\r\n input.textContent = '';\r\n }\r\n });\r\n\r\n // ! childList for paste first symbol\r\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n } else {\r\n this.container.innerHTML = `\r\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"${autocomplete ?? 'off'}\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n // input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(options.inputMode) {\r\n input.inputMode = options.inputMode;\r\n }\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n const onInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n onInputCallbacks.push(onInput);\r\n }\r\n\r\n const noLinebreaks = !options.withLinebreaks;\r\n if(noLinebreaks && !plainText) {\r\n input.dataset.noLinebreaks = '1';\r\n input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if(onInputCallbacks.length) {\r\n input.addEventListener('input', () => {\r\n onInputCallbacks.forEach((callback) => callback());\r\n });\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n setInnerHTML(this.label, this.options.labelText);\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n // return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, true);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fromSet?: boolean) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') &&\r\n (!this.validate || this.validate()) &&\r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent?: boolean) {\r\n if(!this.options.plainText) {\r\n value = documentFragmentToHTML(wrapDraftText(value));\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false);\r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n } else {\r\n this.setLabel();\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === 3 ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null)\r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MessageEntity} from '../../layer';\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract<MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityCode' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler'>;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\r\n entityName: 'messageEntityCode'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n\r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {MessageEntity} from '../../layer';\r\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\r\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\r\nimport getRichElementValue from './getRichElementValue';\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n combineSameEntities(entities);\r\n sortEntities(entities);\r\n }\r\n\r\n // console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from './getRichValue';\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment) {\r\n elem.setAttribute('dir', 'auto');\r\n if(typeof(html) === 'string') {\r\n if(!html) elem.textContent = '';\r\n else elem.innerHTML = html;\r\n } else {\r\n elem.textContent = '';\r\n elem.append(html);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\n\nconst CAN_COMBINE_ENTITIES: Set<MessageEntity['_']> = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PASS_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set<MessageEntity['_']> = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n}> = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n return wrapRichText(text, {\n entities: options.entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n}\n"],"names":["init","document","addEventListener","e","input","findUpAttribute","target","noLinebreaks","dataset","text","entities","preventDefault","plainText","originalEvent","clipboardData","getData","usePlainText","html","filterEntity","_","regExp","replace","trim","match","span","createElement","innerHTML","curChild","firstChild","nextSibling","nodeType","nodeValue","remove","richValue","getRichValue","value","length","entities2","parseEntities","filter","mergeEntities","fragment","wrapDraftText","documentFragmentToHTML","window","execCommand","InputState","InputField","constructor","options","this","container","classList","add","required","validate","undefined","maxLength","showLengthOn","Math","min","round","placeholder","name","canBeEdited","autocomplete","label","labelText","onInputCallbacks","firstElementChild","String","push","isInputEmpty","textContent","setAttribute","inputMode","border","append","setLabel","labelEl","lastElementChild","showingLength","onInput","wasError","contains","inputLength","diff","isError","toggle","withLinebreaks","key","forEach","callback","select","el","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","setInnerHTML","labelOptions","setValueSilently","fromSet","isChanged","originalValue","isValid","isValidToChange","setDraftValue","silent","setOriginalValue","setState","state","Error","Valid","setError","Array","from","childNodes","map","node","outerHTML","join","attribute","closest","markdownTags","bold","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","lines","line","selNode","selOffset","offset","substr","parentNode","parentElement","type","tag","getAttribute","url","href","user_id","follow","toUserId","isSelected","isBlock","has","tagName","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","i","wasLength","field","withEntities","element","hasAttribute","replaceContent","elem","lastChild","replaceWith","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","find","currentEntity","newEntities","filtered","sortEntities","sort","a","b","noLinks","wrappingDraft","passEntities","messageEntityTextUrl","messageEntityMentionName"],"sourceRoot":""}