PageSourceSearch

https://discours.netlify.app/scripts/simple-editor-shared-fb964cad.js

js discours.netlify.app collected 2026-10-03 10:40:11 UTC 18,887 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkdiscours_io_frontend=globalThis.webpackChunkdiscours_io_frontend||[]).push([[137],{19370(t,e,o){var n=o(88484),i=o(63552);const a=[{name:"Часто",emojis:["👍","❤️","🔥","😀","😍","🤔","😂","😅","👎","🥲","✨","🎉","👏","🙏","💪","😊"]},{name:"Лица",emojis:["😃","😄","😁","😆","😉","😌","😎","🤩","😏","😒","😞","😢","😭","🤡","🤯","🥳"]},{name:"Жесты",emojis:["👋","🤚","✋","🖖","🤞","✌️","🤟","🤙","👌","🤌","☝️","👆","👇","👈","👉","🫶"]},{name:"Символы",emojis:["💯","💬","💭","🗯️","❗","❓","⭐","🌟","💡","📌","✅","❌","⚡","🎯","🏆","🎵"]}];angular.module("discours.directives").directive("tiptapSimpleEditor",["$timeout","$compile","apiClient","Notification","s3UploaderService",function(t,e,s,l,r){"undefined"!=typeof window&&window;return{restrict:"E",require:"?ngModel",scope:{placeholder:"@",preset:"@",editable:"=?",editorInstance:"=?",onFocus:"&?",onBlur:"&?",onSubmit:"&?",showEmoji:"<?"},template:'<div class="tiptap-simple-editor-wrapper">  <div class="tiptap-simple-loading" ng-if="isLoading">    <i class="fas fa-circle-notch fa-spin"></i> Загрузка...  </div>  <div class="tiptap-simple-error" ng-if="loadError">    <span>{{loadError}}</span>    <button type="button" class="tiptap-retry-btn" ng-click="retryLoad()">      <i class="fas fa-redo"></i> Попробовать снова    </button>  </div>  <div class="tiptap-simple-editor-box" ng-hide="loadError || isLoading" ng-class="{\'album-mode\': isAlbumPreset}">    <div class="tiptap-simple-container"></div>  </div></div>',link:function(c,p,d,u){function m(t){if(!t)return"";if(w&&w.cleanHtml)return w.cleanHtml(t);if(y&&y.basicSanitizeHtml)return y.basicSanitizeHtml(t);try{const e=t.replace((0,i.i)(),function(t,e,o){const n=o.trim();return n?"<"+e+" "+n+"></"+e+">":"<"+e+"></"+e+">"}),o=(new DOMParser).parseFromString(e,"text/html");o.querySelectorAll("script, style, object, embed, iframe, form, meta, link").forEach(function(t){t.remove()});const n="javascript:";return o.querySelectorAll("*").forEach(function(t){Array.from(t.attributes).forEach(function(e){(e.name.startsWith("on")||"string"==typeof e.value&&e.value.trim().toLowerCase().startsWith(n))&&t.removeAttribute(e.name)})}),o.body.innerHTML||""}catch(t){return""}}function g(){Promise.all([Promise.all([o.e(272),o.e(929),o.e(411),o.e(753),o.e(68),o.e(1)]).then(o.bind(o,36090)),Promise.all([o.e(272),o.e(929),o.e(411),o.e(753),o.e(68),o.e(474)]).then(o.bind(o,80058))]).then(([o,i])=>{h||(w=o,y=i,t(()=>{c.isLoading=!1,c.loadError=null,function(){if(h)return;(function(){c.isAlbumPreset="album"===(c.preset||"comments");const o=angular.element(c.isAlbumPreset?'<div class="tiptap-simple-toolbar tiptap-album-toolbar" ng-mousedown="$event.preventDefault()">  <button type="button" class="tiptap-btn" ng-class="{active: isBold}"           ng-mousedown="toggleBold($event)" data-title="жирный"><i class="df-editor-bold"></i></button>  <button type="button" class="tiptap-btn" ng-class="{active: isItalic}"           ng-mousedown="toggleItalic($event)" data-title="курсив"><i class="df-editor-italic"></i></button>  <div class="tiptap-dropdown" ng-class="{open: formatDropdownOpen}">    <button type="button" class="tiptap-btn tiptap-dropdown-toggle"             ng-mousedown="toggleDropdown(\'formatDropdownOpen\', $event)" data-title="форматирование текста">      <i class="df-editor-text-tools"></i>    </button>    <div class="tiptap-dropdown-menu" ng-show="formatDropdownOpen">      <button type="button" class="tiptap-btn" ng-class="{active: isH2}"               ng-mousedown="execCommand(\'h2\', $event)" data-title="заголовок H2"><i class="df-editor-h1"></i></button>      <button type="button" class="tiptap-btn" ng-class="{active: isH3}"               ng-mousedown="execCommand(\'h3\', $event)" data-title="заголовок H3"><i class="df-editor-h2"></i></button>      <button type="button" class="tiptap-btn" ng-class="{active: isLead}"               ng-mousedown="execCommand(\'lead\', $event)" data-title="лид"><i class="fa fa-paragraph"></i></button>      <button type="button" class="tiptap-btn" ng-class="{active: isHighlight}"               ng-mousedown="execCommand(\'highlight\', $event)" data-title="хайлайт"><svg class="highlighter-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 544 512" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M0 479.98L99.92 512l35.45-35.45-67.04-67.04L0 479.98zm124.61-240.01a36.592 36.592 0 0 0-10.79 38.1l13.05 42.83-50.93 50.94 96.23 96.23 50.86-50.86 42.74 13.08a36.46 36.46 0 0 0 38.09-10.79l94.12-114.14-159.2-159.2-114.17 93.81zm287.07-18.96L527.95 105.5c21.4-21.4 21.4-56.13 0-77.53l-43.91-43.91c-21.4-21.4-56.13-21.4-77.53 0L290.95 99.52l120.73 121.49z"/></svg></button>      <button type="button" class="tiptap-btn" ng-class="{active: isBlockquote}"               ng-mousedown="execCommand(\'blockquote\', $event)" data-title="ударная цитата"><i class="df-editor-quote"></i></button>    </div>  </div>  <div class="tiptap-dropdown" ng-class="{open: wrapperDropdownOpen}">    <button type="button" class="tiptap-btn tiptap-dropdown-toggle"             ng-mousedown="toggleDropdown(\'wrapperDropdownOpen\', $event)" data-title="подвёрстки">
1      <span class="btn-icon-frame"></span>    </button>    <div class="tiptap-dropdown-menu" ng-show="wrapperDropdownOpen">      <button type="button" class="tiptap-btn" ng-class="{active: isTaSelectionFrame}"               ng-mousedown="execCommand(\'taSelectionFrame\', $event)" data-title="рамка"><span class="btn-icon-frame"></span></button>      <button type="button" class="tiptap-btn" ng-class="{active: isTaSub}"               ng-mousedown="execCommand(\'taSub\', $event)" data-title="подвёрстка"><span class="btn-icon-sub"></span></button>      <button type="button" class="tiptap-btn" ng-class="{active: isTaBorderSub}"               ng-mousedown="execCommand(\'taBorderSub\', $event)" data-title="подвёрстка с рамкой"><span class="btn-icon-border-sub"></span></button>      <button type="button" class="tiptap-btn" ng-class="{active: isTaQuotation}"               ng-mousedown="execCommand(\'taQuotation\', $event)" data-title="цитата из источника"><span class="btn-icon-quotation"></span></button>      <button type="button" class="tiptap-btn" ng-class="{active: isTaEpigraph}"               ng-mousedown="execCommand(\'taEpigraph\', $event)" data-title="эпиграф"><span class="btn-icon-epigraph"></span></button>    </div>  </div>  <button type="button" class="tiptap-btn" ng-class="{active: isLink}"           ng-mousedown="toggleLink($event)" data-title="ссылка"><i class="df-editor-link"></i></button>  <button type="button" class="tiptap-btn" ng-class="{active: isFootnote}"           ng-mousedown="execCommand(\'footnote\', $event)" data-title="сноска"><i class="df-editor-footnote"></i></button>  <button type="button" class="tiptap-btn"           ng-mousedown="uploadImage($event)" data-title="картинка"><i class="df-editor-image"></i></button>  <input type="file" class="tiptap-file-input" accept="image/*" style="display:none" /></div>':'<div class="tiptap-simple-toolbar">  <button type="button" class="tiptap-btn tiptap-btn-bold" ng-class="{active: isBold}"           ng-mousedown="toggleBold($event)" data-title="жирный"><i class="df-editor-bold"></i></button>  <button type="button" class="tiptap-btn tiptap-btn-italic" ng-class="{active: isItalic}"           ng-mousedown="toggleItalic($event)" data-title="курсив"><i class="df-editor-italic"></i></button>  <button type="button" class="tiptap-btn tiptap-btn-link" ng-class="{active: isLink}"           ng-mousedown="toggleLink($event)" data-title="ссылка"><i class="df-editor-link"></i></button>  <button type="button" class="tiptap-btn tiptap-btn-image"           ng-mousedown="uploadImage($event)" data-title="картинка"><i class="df-editor-image"></i></button>  <button type="button" class="tiptap-btn tiptap-btn-emoji" ng-if="showEmoji" ng-class="{active: emojiPickerOpen}"           ng-mousedown="toggleEmojiPicker($event)" data-title="эмодзи"           aria-haspopup="dialog" aria-expanded="{{emojiPickerOpen}}"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M8 14s1.5 2 4 2 4-2 4-2"/><line x1="9" y1="9" x2="9.01" y2="9"/><line x1="15" y1="9" x2="15.01" y2="9"/></svg></button>  <div class="tiptap-emoji-picker" ng-if="showEmoji" ng-class="{\'is-open\': emojiPickerOpen}"        role="dialog" aria-label="Эмодзи" aria-hidden="{{!emojiPickerOpen}}">    <div class="tiptap-emoji-tabs" role="tablist">      <button type="button" class="tiptap-emoji-tab" ng-repeat="cat in emojiCategories"               ng-class="{active: emojiActiveTab === $index}" role="tab"               aria-selected="{{emojiActiveTab === $index}}"               ng-mousedown="setEmojiTab($index, $event)">{{cat.name}}</button>    </div>    <div class="tiptap-emoji-grid" role="grid" aria-label="Эмодзи">      <button type="button" class="tiptap-emoji-item" ng-repeat="em in emojiCategories[emojiActiveTab].emojis"               ng-class="{\'tiptap-emoji-item--focused\': $index === emojiF
1ocusIndex}"               ng-mousedown="insertEmoji(em, $event)" role="gridcell">{{em}}</button>    </div>  </div>  <input type="file" class="tiptap-file-input" accept="image/*" style="display:none" /></div>'),n=e(o)(c);angular.element(E).append(n),k=p[0].querySelector(".tiptap-file-input"),k&&(A=function(t){const e=t.target.files[0];e&&(e.type.startsWith("image/")?e.size>10485760?l.error("Изображение слишком большое (макс. 10 МБ)"):(function(t){l.info("Загрузка изображения..."),r.upload(t,"image",!1).then(t=>{t&&v&&!h?(v.chain().focus().setImage({src:t}).run(),l.success("Изображение загружено")):h||l.error("Ошибка загрузки изображения")}).catch(t=>{h||l.error("Ошибка загрузки изображения")})}(e),k.value=""):l.error("Пожалуйста, выберите изображение"))},k.addEventListener("change",A)),P=function(e){p[0].contains(e.target)||(S&&t.cancel(S),S=t(()=>{S=null,h||c.closeAllDropdowns()}))},document.addEventListener("click",P,!0)})();const{Editor:o}=w;if(!o)return c.loadError="Редактор не найден в модуле",void l.error("Не удалось инициализировать редактор");const i=c.preset||"comments",a=y.getPreset(i);if(!a)return c.loadError=`Пресет "${i}" не найден`,void l.error("Не удалось инициализировать редактор");const g=a.getExtensions({placeholder:(0,n.t)(c.placeholder||"Написать комментарий..."),uploadService:s,notificationService:l}),L=m(u&&u.$viewValue||"");try{v=new o({element:j,extensions:g,content:L,editable:!1!==c.editable,onUpdate:({editor:e})=>{f||h||t(()=>{u&&!h&&u.$setViewValue(e.getHTML())})},onSelectionUpdate:()=>{b()},onFocus:()=>{p.addClass("tiptap-focused"),c.onFocus&&t(()=>{try{c.onFocus()}catch(t){}})},onBlur:()=>{p.removeClass("tiptap-focused"),t(()=>{c.closeAllDropdowns()},150),c.onBlur&&t(()=>{try{c.onBlur()}catch(t){}})}}),x=function(e){if((e.ctrlKey||e.metaKey)&&!e.shiftKey&&!e.altKey&&"KeyA"===e.code){if(v)try{v.commands.setTextSelection({from:0,to:v.state.doc.content.size});try{const t=document.getSelection(),e=v.view&&v.view.dom;t&&e&&e.childNodes.length>0&&t.setBaseAndExtent(e,0,e,e.childNodes.length)}catch(t){}e.preventDefault(),e.stopImmediatePropagation()}catch(t){try{v.commands.selectAll(),e.preventDefault(),e.stopImmediatePropagation()}catch(t){}}return!1}if((e.ctrlKey||e.metaKey)&&("k"===e.key||"K"===e.key||"л"===e.key||"Л"===e.key))return e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),c.toggleLink(e),!1;if(((e.ctrlKey||e.metaKey)&&"Enter"===e.key||e.altKey&&"Enter"===e.key)&&(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),c.onSubmit&&t(()=>{try{c.onSubmit()}catch(t){}})),c.emojiPickerOpen){const t=c.emojiCategories[c.emojiActiveTab].emojis,o=t.length,n=c.emojiFocusIndex,i=function(){const t=p[0].querySelector(".tiptap-emoji-picker .tiptap-emoji-grid");if(!t||"undefined"==typeof window||!window.getComputedStyle)return I;const e=window.getComputedStyle(t),o=e&&e.gridTemplateColumns?e.gridTemplateColumns:"";if(!o)return I;return o.split(" ").filter(Boolean).length||I}();let a=!0;switch(e.key){case"ArrowRight":c.emojiFocusIndex=n<o-1?n+1:0;break;case"ArrowLeft":c.emojiFocusIndex=n>0?n-1:o-1;break;case"ArrowDown":c.emojiFocusIndex=n<0?0:n+i<o?n+i:n;break;case"ArrowUp":c.emojiFocusIndex=n<0?o-1:n-i>=0?n-i:n;break;case"Enter":n>=0&&n<o&&c.insertEmoji(t[n],e);break;case"Escape":c.emojiPickerOpen=!1,c.emojiFocusIndex=-1;break;default:a=!1}if(a)return e.preventDefault(),e.stopPropagation(),c.$applyAsync(),!1}"Escape"===e.key&&((c.formatDropdownOpen||c.wrapperDropdownOpen)&&(e.stopPropagation(),e.preventDefault()),t(()=>{c.closeAllDropdowns()}))},v.view.dom.addEventListener("keydown",x,!0),D=function(){c.emojiPickerOpen&&t(()=>{c.closeAllDropdowns()})},v.view.dom.addEventListener("mousedown",D),u&&(u.$render=function(){if(v&&void 0!==u.$viewValue&&!h&&v.getHTML()!==u.$viewValue){f=!0;const t=m(u.$viewValue||"");v.commands.setContent(t,!1),f=!1}}),c.$watch("editable",t=>{v&&!h&&v.setEditable(!1!==t)}),void 0===c.editorInstance&&void 0===d.editorInstance||(c.editorInstance=v),p[0]._tiptapEditor=v}catch(t){c.loadError="Ошибка инициализации редактора",l.error("Не удалось инициализировать редактор")}}()}))}).catch(e=>{t(()=>{c.isLoading=!1,c.loadError="Не удалось загрузить редактор",l.error("Ошибка загрузки редактора")})})}function b(){v&&!h&&(L&&t.cancel(L),L=t(()=>{L=null,v&&!h&&(c.isBold=v.isActive("bold"),c.isItalic=v.isActive("italic"),c.isLink=v.isActive("link"),
1c.isAlbumPreset&&(c.isH2=v.isActive("heading",{level:2}),c.isH3=v.isActive("heading",{level:3}),c.isLead=v.isActive("lead"),c.isHighlight=v.isActive("highlight"),c.isBlockquote=v.isActive("blockquote"),c.isFootnote=v.isActive("footnote"),c.isTaQuotation=v.isActive("taQuotation"),c.isTaSub=v.isActive("taSub"),c.isTaBorderSub=v.isActive("taBorderSub"),c.isTaEpigraph=v.isActive("taEpigraph"),c.isTaSelectionFrame=v.isActive("taSelectionFrame")))},c.isAlbumPreset?C:T))}let v=null,f=!1,h=!1,w=null,y=null,k=null;const j=p[0].querySelector(".tiptap-simple-container"),E=p[0].querySelector(".tiptap-simple-editor-box");let A=null,x=null,D=null,P=null,S=null;c.isLoading=!0,c.loadError=null,c.isAlbumPreset=!1,c.isBold=!1,c.isItalic=!1,c.isLink=!1,c.isH2=!1,c.isH3=!1,c.isLead=!1,c.isHighlight=!1,c.isBlockquote=!1,c.isFootnote=!1,c.isTaQuotation=!1,c.isTaSub=!1,c.isTaBorderSub=!1,c.isTaEpigraph=!1,c.isTaSelectionFrame=!1,c.formatDropdownOpen=!1,c.wrapperDropdownOpen=!1,c.retryLoad=function(){h||(c.isLoading=!0,c.loadError=null,g())};let L=null;const T=50,C=100;c.closeAllDropdowns=function(){c.formatDropdownOpen=!1,c.wrapperDropdownOpen=!1,c.emojiPickerOpen=!1,c.emojiFocusIndex=-1},c.toggleDropdown=function(t,e){e&&(e.preventDefault(),e.stopPropagation());const o=c[t];c.closeAllDropdowns(),c[t]=!o},c.execCommand=function(t,e){if(e&&(e.preventDefault(),e.stopPropagation()),v){switch(c.closeAllDropdowns(),t){case"h2":v.chain().focus().toggleHeading({level:2}).run();break;case"h3":v.chain().focus().toggleHeading({level:3}).run();break;case"lead":v.chain().focus().toggleLead().run();break;case"highlight":v.chain().focus().toggleHighlight().run();break;case"blockquote":v.chain().focus().toggleBlockquote().run();break;case"footnote":Promise.all([o.e(753),o.e(68)]).then(o.bind(o,61849)).then(t=>{const{$from:e}=v.state.selection,o=e.nodeAfter,n=e.nodeBefore;let i="",a=!1;o&&"footnote"===o.type.name?(i=o.attrs.content||"",a=!0):n&&"footnote"===n.type.name&&(i=n.attrs.content||"",a=!0),t.openFootnoteEditor({initialContent:i,isEdit:a,onSave:t=>{t&&(a?v.chain().focus().updateFootnote({content:t}).run():v.chain().focus().insertFootnote({content:t}).run())},onCancel:()=>{v.chain().focus().run()}})}).catch(t=>{l.error("Не удалось загрузить редактор сносок")});break;case"taQuotation":v.chain().focus().toggleTaQuotation().run();break;case"taSub":v.chain().focus().toggleTaSub().run();break;case"taBorderSub":v.chain().focus().toggleTaBorderSub().run();break;case"taEpigraph":v.chain().focus().toggleTaEpigraph().run();break;case"taSelectionFrame":v.chain().focus().toggleTaSelectionFrame().run()}b()}},c.toggleBold=function(t){t.preventDefault(),t.stopPropagation(),c.closeAllDropdowns(),v&&(v.chain().focus().toggleBold().run(),b())},c.toggleItalic=function(t){t.preventDefault(),t.stopPropagation(),c.closeAllDropdowns(),v&&(v.chain().focus().toggleItalic().run(),b())},c.toggleLink=function(t){if(t.preventDefault(),t.stopPropagation(),c.closeAllDropdowns(),!v)return;const e=v.getAttributes("link").href,n=!!e;Promise.all([o.e(272),o.e(753),o.e(68)]).then(o.bind(o,2260)).then(t=>{t.openLinkInlineEditor({initialUrl:e||"",showRemove:n,tiptapEditor:v,onSave:t=>{v.chain().focus().extendMarkRange("link").setLink({href:t}).run(),b()},onRemove:()=>{v.chain().focus().unsetLink().run(),b()},onCancel:()=>{v.chain().focus().run()}})}).catch(t=>{l.error("Не удалось загрузить редактор ссылок")})},c.uploadImage=function(t){t.preventDefault(),t.stopPropagation(),c.closeAllDropdowns(),k&&k.click()},c.emojiPickerOpen=!1,c.emojiCategories=a,c.emojiActiveTab=0,c.emojiFocusIndex=-1;const I=8;c.toggleEmojiPicker=function(t){t.preventDefault(),t.stopPropagation();const e=c.emojiPickerOpen;c.closeAllDropdowns(),c.emojiPickerOpen=!e,c.emojiPickerOpen&&(c.emojiFocusIndex=0)},c.setEmojiTab=function(t,e){e.preventDefault(),e.stopPropagation(),c.emojiActiveTab=t,c.emojiFocusIndex=0},c.insertEmoji=function(t,e){e.preventDefault(),e.stopPropagation(),v&&v.chain().focus().insertContent(t).run(),c.emojiPickerOpen=!1,c.emojiFocusIndex=-1},g(),c.$on("$destroy",()=>{h=!0,delete p[0]._tiptapEditor,L&&(t.cancel(L),L=null),S&&(t.cancel(S),S=null),P&&(document.removeEventListener("click",P,!0),P=null),A&&k&&(k.removeEventListener("change",A),A=null),x&&v&&v.view&&v.view.dom&&(v.view.dom.removeEventListener("keydown",x,!0),x=null),D&&v&&v.view&&v.view.dom&&(v.view.dom.removeEventListener("mousedown",D),D=null),v&&(v.destroy(),v=null)})}}}])}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.