
    gi<                        d dl mZ d dl d dlmZ d dlmZ d dlmZ d dl	Z	d dl
Z
d dlmZ d dlmZ d dlZd dlZd dlZ G d	 d
ej$                        Zy)    abort)*)fields)cmf_documenthtmldiffN)BeautifulSoup)floorc            	           e Zd Zej                  j
                  g dz   Zedefd       Zede	fd       Z
d Zd Zd Zed)d	       Zeded
edefd       Zeded
edefd       Zededededefd       Z fdZed        Zed        Zd Zed        Zd Zd Zd Zd Zd Zd Zd Zd*dZed        Z d+dZ!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z' fd%Z(d& Z)ed'        Z*d( Z+ xZ,S ),CmfDocument)likeupdate_text_inline_commentsupdate_text_macros_parametersupdate_text_draft_task_link!update_text_draft_inline_commentsupdate_text_task_linkpatch_inline_comment_data_idshighlight_inline_commenttextc                 P   dd l }i }t        j                  t        j                  dt        j                        |       D ]a  }|j                  |j                               }|j                         }t        t        d| dd            }| j                  ||      } |||<   c || fS )Nr   z(<svg\b[^<>]*>[\s\S]*?<\/svg>)flagsz<div class="svg-replace" id="z"></div>html.parser)hashlibrefindallcompileDOTALLmd5encode	hexdigeststrr
   replace)r   r   svg_replacesvgr    md5sumkeys          ./cmf/models/cmf_document.pyget_all_drawio_svgzCmfDocument.get_all_drawio_svg   s    ::bjj)JRTR[R[\^bc 	#C++cjjl+C]]_Fm&CF88$TVcdeC<<S)D"K	# D      returnc                  ~    ddl m } m} t        | j                  |j                        j                  d      dd       S )u?   Генерирует номер версии документаr   datetimetimezonez%Y%m%d%H%M%S%fN)r/   r0   intnowutcstrftimer.   s     r)   calc_doc_versionzCmfDocument.calc_doc_version'   s2     	08<<-667GH"MNNr+   c                     | j                   j                  }t        j                  j	                  dd| j
                  gg dgdgddgddg	      }|r)| j                  |d
   j                   j                  |      }d| d| j                   d}|S )N	parent_id==)approvedr9   Tz-cmf_versioncmf_versionr         )filterorder_byr   slicer      Изменения: , <a href="   ">посмотреть</a>)r   valuemodelsCmfDocumentHistorylistid	html_diffhref)selfr   doc_historys      r)   _get_history_diffzCmfDocument._get_history_diff-   s    yy//44k4QUQXQX=Y<T=V>L=M<I6;R[\]^Z_ 5 a >>+a."5"5";";TBD%dV;tyykA[\r+   c           
         t         j                         5  | j                  | j                  j                  | j
                  j                        }d| d| j                   d}t        j                  j                  dd| j                  j                  gdd| j                  gg dg dg	      }|st        j                  j                  d
d      }t        j                  | j                  || dd|d      }|j                  j                          |j                          |j                  j                          |j                          n't        j!                  ||      j                  d       d d d        y # 1 sw Y   y xY w)NrA   rB   rC   responsible_idr9   r8   logic_prefixr9   ztask.doc_need_approvecache_status_typez!=CLOSED)r>   ztask.doc_need_approve:defaultT)codecache_inmemory	9_disableu8   Необходимо выпустить документ)responsible
logic_typeparentfull_search_typenamer   r:   )rZ   r   F)notify)cmfutildisable_aclrI   r   rD   
text_draftrJ   rE   CmfTaskget	cmf_ownerrH   CmfLogicType
alarm_dateset_nowsave
CmfComment)rK   text_diff_content	text_difftaskrY   s        r)   _create_publish_taskz CmfDocument._create_publish_task:   sU     " 	R $tyy@U@U V./@.ATYYKWqrI>>%%/?t~~GXGX.Y/:D$''.J.].S.U% VD #0044:Yjn4o
~~$..Z`d  xC+elu  AE & F'')		'')		 !!I!>CC5CQ+	R 	R 	Rs   EE==Fc                 V   t         j                         5  t        j                  j	                  dd| j
                  j                  gdd| j                  gg dg dgdg      }|r0|j                  j                  d      |_	        |j                          d d d        y # 1 sw Y   y xY w)	NrO   r9   r8   rP   rR   workflow)r>   r   rT   )r^   r_   rE   ra   rb   rc   rH   rn   get_default_statusstatusrg   )rK   rk   s     r)   _delete_publish_taskz CmfDocument._delete_publish_taskR   s      " 	>>%%/?t~~GXGX.Y/:D$''.J.].S.U _i]i & kD "mm>>xH			 	 	s   BBB(c                 4    |xs d}|xs d}t        |||      S )uz   
        Используем единую тулзу для анализа изменений документа
         r   )clsablimits       r)   rI   zCmfDocument.html_diff\   s%    
 GG1e$$r+   r`   c                    t        dd       i }t        j                  dt        j                        }|j	                  |       rXt        | d      }|j                  dddi      D ]5  }|j                  dd	d
i      D ]  }|j                  d      s|||d   <    7 i }t        j                  dt        j                        }|j	                  |      rXt        |d      }|j                  dddi      D ]5  }|j                  dd	d
i      D ]  }|j                  d      s|||d   <    7 |}	|j                         |j                         z
  D ]  }
t        ||
         |	z   }	 |	S )u1  
        Получаем черновик с инлайн-задачами

        :param text: Оригинальный текст документа с инлайн-задачами
        :param text_draft: Черновик
        :return: Черновик с инлайн-задачами
        DEV: deprecatedTr   zdata-mentions-taskr   lxmlspanru   zdata-mention-typerk   data-object-id)
	cmf_alertr   r   Isearchr
   find_allhas_keykeysr#   )r   r`   tasks_in_textre1	soup_textr{   ru   tasks_in_draftsoup_text_draftresult_text	task_spans              r)   handle_inline_taskzCmfDocument.handle_inline_taske   s    	#40jj.bdd;::d%dF3I!**64H$3OP As-@&,IJ AAyy!12<@a(8&9:AA
 jj.bdd;::j!+J?O'00:NPT9UV Bs-@&,IJ BAyy!12=Aq)9':;BB
 !&++-0C0C0EE 	FImI67+EK	F r+   c           	      
   t        j                  dt         j                        }t        j                  dt         j                        }|j                  |       r|j                  |       s$|j                  |      r|j                  |      s|S d}t	        | d      }i }|j                  dddi      D ]  }|||j                  d      <    t        j                  j                  |      \  }}t	        |d      }	|	j                  dddi      D ]V  }|j                  |j                  d            r"|j                  |j                  d      d       Ed	}|j                          X i }
|r\d
j                  |	j                  j                  D cg c]  }t        |       c}      }|D ]  }|j!                  |||         } |}|S |}|j#                         D ]l  \  }}| j%                  |      }| j'                  |j(                  j+                         d|      }| j-                  dd|      }| j%                  d|      t/        d      z   }| d| j-                  d      t/        d      z   }|| |d j%                  d      z   }t        j                  d| || ddd         }|r||j1                         z
  n|}| || }t        j                  d| ||       }|r||j1                         z   n|}| || }| |dz
  | dk(  }| ||dz    dk(  }|rt        j2                  dd|      }|rt        j2                  dd|      }||j(                  z   |z   }|
j                  |g dg      \  }}|s1t5        t        j6                  ||            }t/        |      }||g|
|<   |s|t/        |      k  r||   } n|d   } |d| j1                          j-                  d      t/        d      z   }!| j9                         || j9                         d j%                  d      z   }"d}#t        j2                  dd| ||       }$t        j2                  dd||!| j1                                }%|$j;                         }&|&r|&d   nd
}'t        j2                  dd
|'      }'|%j!                  |d      j;                         }(|(r|(d   nd
})|'|)k7  r|'|vrd	}#|#rt/        |      }*t/        |      |*z
  t/        |j(                  j+                               z
  }+||dz
  g|
|<   | j1                         |*z   },| j9                         |+z
  }-|d|, t        |      z   ||-d z   }o |S c c}w )ua  
        Получаем черновик с комментариями-пометками

        :param text: Оригинальный текст документа с комментариями-пометками
        :param text_draft: Черновик
        :return: Черновик с комментариями-пометками
        data-mark-annotation-typer   inlineCommentFrz   r{   rH   NTrs   r   z<span</span>z<p>z</p>z\s|>z\s|<   z&nbsp;z\&nbsp; z<br />z<br/>r<   )r   r   r~   r   r
   r   rb   rE   r   r*   popunwrapjoinbodychildrenr#   r$   itemsfindcountr   striprfindlenstartsubrG   finditerendsplit).r   r`   r   re2is_remove_commentsoup_text_commentid_commentsr{   svg_tagsr   	dict_textxr(   r   
id_commentposition_commentidx_position_textstart_commentend_comment	start_rowend_rowmatch_start_wordposition_start_wordword_beforematch_end_wordposition_end_word
word_afterhave_nbsp_beforehave_nbsp_afterword	text_listnumbermatchstart_row_draftend_row_draftis_near_not_matchtext_to_splittext_draft_to_split	near_wordlast_near_wordnear_word_draftlast_near_word_draftshift_start	shift_endresult_start
result_ends.                                                 r)   handle_inline_commentz!CmfDocument.handle_inline_comment   s_    jj5RTTBjj)6

4 SZZ%5ZZ
+

:0F!)$7%..v8SUd7ef 	/D*.K'	/  &11DDZP*'
F;#,,V6QSb5cd 	Dtxx~.5 %)!	 	/2F2F2O2O!PQ#a&!PQJ D'//Xc]C
D$KR O %K$/$5$5$7 E` 
D#'99Z#8 $(JJtyy/@!EU$V! $

7A7G H"ii	3CDs9~U -066u=E
J	%[\(:(?(?(GG#%99VT)M5RSWUWSW5X#Y Rbm6F6L6L6N&Nhq# ##6}E!#64G3L!MLZK.2F2F2H$H`g!!+.?@
 $((9-#HH#T "&{;?"Cx"O $"$&&C"EK"!#	3
!CJ#dii/*<$-MM$Q$@!	6  $R[[{%C DI ^F'0&&9IdO$s9~5%&78E%bME"-nu{{}"="C"CE"JSQVZ"W %		k%))+,.G.L.LV.T T$)!
 !#y'4	-;X Y&(ffY_]b]h]h]jAk&l#)//1	2;2!#	2~!F"5"="=dC"H"N"N"P>Mr':SU$!%99nTX>X(,%$!+.I3c$))//:K6LL	#,fqj"9	$${{}{:"YY[94
)-<83t9D{S]S^G__KE`L Y "Qs   U	macros_idmacros_parametersc                 `   t         j                  j                  |       \  }} t        j                  |t        j
                        }|j                  |       r0t        | d      }|j                  |      }|r||d<   t        |      } |D ]  }| j                  |||         }  t              S )Nr   r   )rH   zdata-macros-parameters)rE   r   r*   r   r   r~   r   r
   r   r#   r$   )r   r   r   r   r   r   table_filtersr(   s           r)   handle_macros_parametersz$CmfDocument.handle_macros_parameters   s    ++>>tD$jj"$$/::d%dM:I%NNiN8M:K67y>D 	4C<<Xc]3D	49~r+   c                 *    t         |          g dz   S )N)person_signsperson_viewspublish_approved_onlyr:   rZ   r   r`   )supersave_preload_fields)rK   	__class__s    r)   r   zCmfDocument.save_preload_fields
  s     w*, 0F F 	Fr+   c                    t        | d      }t        j                  |      }|j                         D ]\  }|r|j                  s|j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  d	d       t        |j                        D ]0  }|j                  d
      s|j                  j	                  |d       2 d|j                  j	                  dg       v sd|j                  v sM|j                          _ |j                         D ]\  }|r|j                  s|j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  d	d       t        |j                        D ]0  }|j                  d
      s|j                  j	                  |d       2 d|j                  j	                  dg       v sd|j                  v sM|j                          _ |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  dd       |j                  j	                  d	d       t        |j                        D ]0  }|j                  d
      s|j                  j	                  |d       2 |j                  j	                  dd       t        |j                        } | dd } | dd } t        |      }| j                  dd      j                  dd      j                  dd      } |j                  dd      j                  dd      j                  dd      }| |k(  rt        dd       d}t        dt        |      dz         D ]*  }| d| |d| k7  r n| |dz
     dk(  r|}| |dz
     dk(  s)d}, dz  }|r|dz
  }|dkD  r
| |d } ||d }d}t        dt        |      dz         D ](  }| | d || d k7  r n| |    dk(  r|}| |    dk(  s'd}* |dz  }|r|dz
  }|dkD  r| d|  } |d|  }d| d}t        | d      }t        |d      }	|	j                  j                  }
t        |	j                  j                        dk(  rRt        |	j                  j                  j                        dk(  r&|	j                         D ]  }|r|j                  s|}
 t        |j                  j                        dk7  r$t        d|j                  j                   d       |j                  j                  j                  |
j                  k7  r;t        d |j                  j                  j                   d!|
j                   d       |j                  j                  j                  }t!        |j#                               t!        g d"      z
  rt        d#| d       |j%                  d$d      S )%u   
        Проверяем, что в текст добавлен только inline-кмментарий.
        Дополнительно здесь мы находим id спана добавленного комментария
        rz   classNzdata-renderedstylerelzdata-mce-srczdata-mce-stylezdata-mce-hrefz	data-mce-zmacros-panelzdata-macrosrJ   r       r   
rs   u+   Не передан комментарий!Tr   r<   <>r   z<span>r   r=   uO   DEV: переданы неверные данные в комментарий: uV   DEV: обрамленный комментарием текст отличается: z != )r   rH   r   data-mark-typedata-idr|   u^   DEV: у inline-комментария передан неизвестный аттрибут: r|   )r
   copyr   attrsr   rG   
startswith	decomposer#   r   r$   r}   ranger   r{   contentssetr   rb   )new_texttext_elementsoup_text_with_inlineelem	attr_nameexisted_textinside_tag_posispan_with_commented_datacommented_datacommented_data_body_span
span_attrss               r)   _verify_inline_commentz"CmfDocument._verify_inline_comment  s    !.h ?yy.
 *224 	!DtzzJJNN7D)JJNN?D1JJNN7D)JJNN5$'JJNN>40JJNN+T2JJNN?D1!$**- 4	''4JJNN9d34
 !<<QUQ[Q[@[ !	!" !))+ 	!DtzzJJNN7D)JJNN?D1JJNN7D)JJNN5$'JJNN>40JJNN+T2JJNN?D1!$**- 4	''4JJNN9d34 !<<QUQ[Q[@[ 	!  	w-5w-ud+~t4/65l001 	8I##K0""&&y$7	8 	vt,,112AB<CR=<( ##FC088rBJJ4QST#++FC8@@rJRRSWY[\|#C4P q#l+A-. 	&A||BQ//!}#!"!}#!%	& 	
Q"Aq5|H'+L q#l+A-. 	&A}aRS 11|s"!"|s"!%	& 	
Q"Aq5!}H'!,L  ~W5#06#B &|V< $2#6#6#;#; ~""++,1c.:M:M:R:R:[:[6\`a6a&//1 04::+/(0
 ',,556!;g  iA  iF  iF  iO  iO  hP  Q  Y]  ^#((--66:R:[:[[ 277<<EEFdKcKlKlJmovz|-2277==
z !C  )D  %E  E $'.24~~.55r+   c                 	   t         j                  j                  |      \  }}t        |d      }|j	                  d| i      }t        |d      }	|	j	                  d|i      }
t        |d      }|j	                  d| i      }|s(t        j                  ||      }||k(  rt        d       |S ||k(  r|j                  |	j                  j                  d          dj                  |j                  j                  D cg c]  }t        |       c}      }|D ]  }|j                  |||         } |S t        j                  dt        |
            d   }|j                  d	d
      }t        |      j                  d	d
      }t        |      j                  d	d
      }|j!                  |      }|j!                  |      }|dk(  rt        |j#                  d|
j$                              d d }|j	                  |      }|d | }||z  }||||t'        |      z    z  }|dz  }|||t'        |      z   d  z  }|j                  |       dj                  |j                  j                  D cg c]  }t        |       c}      }|D ]  }|j                  |||         } |S |dkD  r||k(  rzd}d}d}|j	                  ||      x}dk\  r\|t'        |      z   }||dz
     dk(  r&||t'        |      z   |t'        |      z   dz    dk(  r|}n|dz  }|j	                  ||      x}dk\  r\t        |j#                  d|
j$                              d d }d}t)        d|dz         D ]"  }|j	                  ||      }|t'        |      z   }$ |d  }||z  }||||t'        |      z    z  }|dz  }|||t'        |      z   d  z  }|j                  |       dj                  |j                  j                  D cg c]  }t        |       c}      }|D ]  }|j                  |||         } |S |dkD  rn	 |j#                  d|
j$                        }d|_        |j-                  |       dj                  |j                  j                  D cg c]  }t        |       c}      }|D ]  }|j                  |||         } |S c c}w c c}w c c}w c c}w )Nrz   r   r   r|   u   В новой версии документа данный абзац отсутствует, в будущем добавленный комментарий Вы сможете посмотерть в истории комментариев.r   rs   z^[^>]*>(.*)</span>$r   r   r<   r{   r   r   r      #)rE   r   r*   r
   r   r   r}   replace_withr   r   r   r   r#   r$   r   r   r   new_tagr   r   r   stringappend)data_idcomment_span_idr   html_node_textorig_text_element	text_mainr   r   r   r   comment_span_elementsoup_text_maintext_main_elementresr   r(   inline_comment_contenttext_element_strtext_main_element_strcontent_countcontent_main_countinserted_span_tagins_postext_element_str_new	find_skip	_find_pos
_find_skip_pos_orphan_comments                                 r)   _merge_inline_commentz!CmfDocument._merge_inline_comment  se   ++>>tD$!$/	 ~~Y,@~A -nf E499AQSb@c9d&y&9*//y'6J/K 33ItDCd{ r sJ ,,%%&;&@&@&I&I!&LM''9>>+B+BCa3q6CDC 6kk#x}56J "$,BCH\D]!^_`!a!7!?!?!L|,44VSA #$5 6 > >vs K(../EF2889OPA #I$5$5fDXD^D^$5$_ `adbd e '++,BCG#3HW#=  $55  $4WWSI_E`=`$aa  I-  $4WSAW=X5X5Y$ZZ %%&:;''9>>+B+BCa3q6CDC 6kk#x}56JQ=4F#F IIJ/445KYWWD\]] 3'=#>>	(a0C71$s;Q7R2RSWX[\rXsSstuSuv  {D  D *Ia
 0445KYWWD\]] !$I$5$5fDXD^D^$5$_ `adbd e I1ik* B*//0F	R#c*@&AA	B $4HW#=  $55  $4WWSI_E`=`$aa  I-  $4WSAW=X5X5Y$ZZ %%&:;''9>>+B+BCa3q6CDC 6kk#x}56JQ  #**69M9S9S*T #N+ww	(?(?@1A@A 	4C<<Xc]3D	4e D: DD D  As   =R=*S0SSc                 H    i  fd}|dk(  r) j                   j                  j                        \  }}n>|dk(  r) j                   j                  j                        \  }}nt	        d| d       t        d      }|D ]  } |||      } |j                  }	|	r|	j                          |j                  }
|
r|
j                          |dk(  r0 j                  |       _         j                  ||       _        y |dk(  r j                  |       _        y y )Nc                 8   |d   }|d   }|d   }|d   }| j                  d|i      }g }|j                  }|D ]$  }	t        |	t              s|j	                  |	       & |vrj                  ||i       |   }
|
s| S |
|   }||v r|j                  |      }||   d | }||   || }||   |d  }| j                  d      }d|d<   |d	<   d
|d<   d|d<   j                         |d<   ||_	        | | | }t        |d      }||   j                  |       | S )Ntext_node_idx	start_posend_posr   r   r{   inline-highlightr   r|   
annotationr   r   r   r   )r   r   
isinstancer#   r   updateindexr   get_data_idr   r
   r   )r   paramr  r  r  r   r   
text_nodesnodesnodesrc_nodesrc_node_txtbefore_spaninside_span
after_spannew_span_tagresultsp
comment_idrK   text_nodes_tmps                     r)   wrap_span_inlinez?CmfDocument._highlight_inline_comment.<locals>.wrap_span_inline  s   !/2Mk*II&GI&G$>>G0D>ELJ ))E ,dC(%%d+, n,%%w
&;< &g.H  #M2Lz) * 0 0 >$]3JY?K$]3IgFK#M278<J$,,V4L$6L!-7L)*-9L)*8GL45&*&6&6&8L#"-L#}\N:,?Fv}5B}%2226r+   r   r`   /   DEV: не поддерживается version=Tr   rz   )r*   r   rD   r`   r}   r
   htmlr   r   place_all_drawio_svg!_merge_highlighted_inline_comment)rK   versiondatar-  r/  r   text_without_svgr   r!  html_tagbody_tagr.  s   `  `       @r)   _highlight_inline_commentz%CmfDocument._highlight_inline_comment  s   -	^ f)-)@)@)Q&H&$)-)@)@AVAV)W&H&GyQY]^!"2F;	 	;E(E:I	; >>OO>>OOf11(IFDI"DDT:WghDO$"77)LDO %r+   c                     dj                  |j                  D cg c]  }t        |       c}      }| D ]  }|j                  || |         } |S c c}w )Nrs   )r   r   r#   r$   )r   r   r   r   r(   s        r)   r2  z CmfDocument.place_all_drawio_svgM  sR    ww	(:(:;1A;< 	4C<<Xc]3D	4 <s   Ac           	          d }dd}dd}d } fd}d }	d }
|j                  dd	      }t        |d
      } j                   j                  j                        \  }}|j                  dd	      }t        |d
      }|D ]  }|d   }|d   }|d   }|d   }|j                  d|i      }|j                  d|i      }|sC ||      } ||      } |||   || d      } |||   d| dd      }|D ]g  }g }g }d}d} |||      }|rt        |      dk(  r?|d   d   } |||      }|rt        |      dk(  r	|d   d   }n|t        |      dz
     d   }n |||   |      }t        |      D ]1  \  } }!|!d   |cxk  r	|!d   k  sn | t        |      k  s*||    d   }3  |||      }|rbt        |      dk(  r	|d   d   }nK|t        |      dz
     d   }n6 |||      }|r+t        |      dk(  r	|d   d   }n|t        |      dz
     d   }|	 |	||      }|	 |	||      }|||t        |      z
  }|||t        |      z   }|| ||||||      }hj  |j                  }"|"r|"j                          |j                  }#|#r|#j                          t        |      }$ j                  |$|      s j                  S  j                  ||      S )u|   
        Предыдущая реализация
        todo: удалить после тестирования
        c                 t    g }| j                   }|D ]$  }t        |t              s|j                  |       & |S Nr   r  r#   r   r   r"  r#  r$  s       r)   get_text_nodeszHCmfDocument.old_merge_highlighted_inline_comment.<locals>.get_text_nodesZ  sA    J ))E ,dC(%%d+, r+   c           	      8   | j                         }t        |      |k  r| S |rx|| d  }dj                  |D cg c]  }dt        j                  |        c}      }t        j
                  |dz   |       }|r|j                  d      S dj                  |      S |d | }ddj                  |D cg c]  }t        j                  |       c}      z   dz   }t        j
                  ||       }|r|j                  d      S dj                  |      S c c}w c c}w )	Nrs   z.*?\s*$r   r   ^\s*\s+\s*)r   r   r   r   escaper   group)r   words_countfrom_endwordsselected_wordsr   patternr   s           r)   	get_wordszCCmfDocument.old_merge_highlighted_inline_comment.<locals>.get_wordsc  s    JJLE5zK'!&|}!5''~"VtS4(9#:"VW		'G"3T:).u{{1~LCHH^4LL "'|!4!FKK^0\T40\$]]`ff		'40).u{{1~LCHH^4LL #W 1]s   D0D
c                 x    | j                         }|rdj                  || d        S dj                  |d |       S )Nr   )r   r   )r   rH  rI  rJ  s       r)   tmp_get_wordszGCmfDocument.old_merge_highlighted_inline_comment.<locals>.tmp_get_wordsv  s>    JJLExx{lm 45588E,;/00r+   c                     dd l }t         |j                   |j                  |      |             }|sg S |D cg c]"  }|j	                         |j                         f$ }}|S c c}w )Nr   )r   rG   r   rF  r   r   )r   	substringr   matchesr   	positionss         r)   find_all_substring_entrieszTCmfDocument.old_merge_highlighted_inline_comment.<locals>.find_all_substring_entries}  s_    ;2;;yryy';TBCG	CJK%%++-5KIK Ls   'A$c                     |dz  }|d | }||| }||d  }| j                  d      }d|d<   ||d<   d|d<   d|d	<   j                         |d
<   ||_        | | | }	t        |	d      }
|j	                  |
       | S )Nr<   r{   r  r   r|   r  r   r   r   r   r   )r   r   r   r
   r   )r   	text_noder  r  r-  r'  r(  r)  r*  r+  r,  rK   s              r)   wrap_text_to_spanzKCmfDocument.old_merge_highlighted_inline_comment.<locals>.wrap_text_to_span  s    qLG#JY/K#Ig6K"78,J*226:L$6L!-7L)*-9L)*8GL45&*&6&6&8L#"-L#}\N:,?Fv}5B""2&""r+   c                    d }d }| j                         }|j                         }|d d }|d d }|D ]  }||v s|j                  |      } n |1d}	t        |      D ]  \  }
}|
|k7  r|	t        |      z  }	|	|
z  }	 n |	}|S )N   r   )r   r  	enumerater   )_3wordstext_draft_nodepositionspan_start_positionwords_text1words_text2three_words_text1three_words_text2r   posidxs              r)   fallback_heuristic_searchzSCmfDocument.old_merge_highlighted_inline_comment.<locals>.fallback_heuristic_search  s    
 H"&!--/K)//1K !,BQ +BQ * ,,066t<H
 #!*+<!= IChs4y(s
 '*#&&r+   c                     g }| j                   D ]2  }t        |t              s|j                  |j	                                4 |S r=  )descendantsr  r#   r   r   )elementr"  childs      r)   collect_text_nodeszLCmfDocument.old_merge_highlighted_inline_comment.<locals>.collect_text_nodes  sB    J ,, 5eS)%%ekkm45 r+   r   r   rz   r   r  r  r  r   r   rY  NT)rI  r<   r   F)r$   r
   r*   r`   rD   r   r   rZ  r1  r   r   r#   _check_for_broken_draftr2  )%rK   r5  r-  original_text_without_svgr@  rM  rO  rT  rW  re  rj  r   r   text_draft_without_svgr   r!  r   r  r  r  r   text_draft_elementr"  text_draft_nodesstart3words	end3wordsr\  start_positionsend_positionsr^  span_end_positionsrc_positionsrd  rc  r7  r8  new_text_drafts%   `                                    r)   $old_merge_highlighted_inline_commentz0CmfDocument.old_merge_highlighted_inline_commentT  s   		M&	1		#( 	'D	 %>$E$Efc$R!!";VD	+/+B+B4??CXCX+Y((!7!?!?!L'(>G Q	EI&Gk*II&G!/2M$>>G0D>EL!0!5!5Y<P!5!Q%'\BJ-;MN $J}$=i$PRSTK!*]";HW"EqSWXI#3 >"$ "&*#$(!"<_k"Z"?+q0.=a.@.C+(B?T](^("=1Q64A!4DQ4G 14A#mBTUVBV4WXY4Z 1 )C:mC\^i(j(1-(@ RHC"1v<c!f<#&_)=#=:I#:Nq:Q$7R
 )C?T](^("=1Q64A!4DQ4G 14A#mBTUVBV4WXY4Z 1$>PY$ZM$}-20=a0@0C-0=c->PQR>R0STU0V-&.*CKQ`*a'$,(A)_(]% '.3D3P*;c)n*L' '27H7P(;c+>N(N%&27H7T&7Zm  pA  CM  'NO }>'Q	h #''OO"''OO_-++NJG??"((?CCr+   c           
      6	   1234 d }d d}d!1 4fd	}d!d}d }d }	d	 }
d
 }d 3d"23fd	}d 2|j                  dd      }t        |d      } j                   j                  j                        \  }}|j                  dd      }t        |d      } j                   j
                  j                        \  }} j
                  j                  j                  dd      }d}d}d}|s7|t        |      |z
  k\  r04d   s1d   sn4d   s14}n	1d   s41} ||41|      }n |||t        |      |z
         }|d   }|d   } |
|      } |	|d   |d   g|      }|d   }|d   } || || k  r||j                  d|d   i      }!|j                  d|d   i      }" ||!      }# ||"      }$|$s|dz  }d}% ||#|d      |d   |d    d      }&|d   |d   k(  rt        |&      dkD  rt        |&      }% ||$|d      |d   |d    dd|%      }'d }(t        |&      dk  r*|d   |d   k(  r 2|#|d      |d   |d         \  })}*}+}(|+}&|+}'|(rdnd} |||d   |d   g      }d}, |||&|,|(      4d}4d   rt        4d         dkD  r; ||4d   ||d         }|r#|t        4d         kD  rt        4d         dz
  }n|dz
  }|d   |d   k(  r6t        4d         dkD  r%|d   |d   k(  r|d   |d   k(  rd},n4d   |   d   },n4d   |   d   },|s |||'|,|(      11d   r|d   |d   k7  r1d   j                          d}t        1d         dkD  rU ||1d   ||d   d      }|s|dz  }|r#|t        1d         kD  rt        1d         dz
  }n|dz
  }n4d   r|}41nddi1|t        4d          z  }|t        1d          z  }4d    xs 1d    }-|-s8 |||41|||      }d}n& j                  S ||dz  }n| |dz  }n
|dz  }|dz  }|s7|j                  }.|.r|.j                          |j                  }/|/r|/j                          t        |      }0 j                  |0|      s j                  S  j                  ||      S )#Nc                 t    g }| j                   }|D ]$  }t        |t              s|j                  |       & |S )uS   
            Формируем список текстовых нод
            r>  r?  s       r)   r@  zECmfDocument._merge_highlighted_inline_comment.<locals>.get_text_nodes1  sC     J ))E ,dC(%%d+, r+   Fr   c           	      ^   | |d j                         }t        |      |k  r|s| S |r|| d }ddj                  |D cg c]  }t        j                  |       c}      z   dz   }t        j
                  ||       }|r|j                  d      j                         S dj                  |      S |d| }ddj                  |D cg c]  }t        j                  |       c}      z   dz   }t        j
                  ||       }|r|j                  d      S dj                  |      S c c}w c c}w )uT   
            Находим (<=3 слов) start3words или end3words
            NrE  rD  rB  r   r   rC  )r   r   r   r   rF  r   rG  r   )	r   rH  rI  offsetrJ  rK  r   rL  r   s	            r)   rM  z@CmfDocument._merge_highlighted_inline_comment.<locals>.get_words<  s    M'')E5zK'!&|}!5 6;;N/[D		$/[#\\_ff		'4016u{{1~++-TCHH^<TT "'|!4!FKK^0\T40\$]]`ff		'40).u{{1~LCHH^4LL 0\ 1]s   D%
D*
c                 p   |d   |   d   }|d   |   d   }	|d   |   d   }
|d   |   d   }d}d}t        |      D ]  \  }}||k(  rd}|s||k(  r||
k(  rd   |   d   }	d   |   d   }d}nL||k(  r%d   |   d   }	|rd   |   d   }n.t        |      }n"||
k(  rd	}	d   |   d   }d}nd	}	t        |      }|d
|	 }||	| }||d
 }| j                  d      }d|d<   ||d<   d|d<   d|d<   j                         |d<   ||_        | | | }t        |d      }|j                  |       |s | S  | S )ui   
            Оборачиваем текстовые ноды в хайлайт спаны
            occurrences
start_noder]  end_nodeFTstart_offset
end_offsetr   Nr{   r  r   r|   r  r   r   r   r   r   )rZ  r   r   r   r   r
   r   )soupr"  r   r   start_pend_pr-  fragmentr  r  r  r  start_highlightstop_highlightrd  rV  r'  r(  r)  r*  r+  r,  end_occurrencesrK   start_occurrencess                         r)   wrap_text_nodes_to_spanzNCmfDocument._merge_highlighted_inline_comment.<locals>.wrap_text_nodes_to_spanT  s    }-g6|DJm,W5jAI=)%0<H-(/
;G#O"N"+J"7 *Y*$&*O"j(Z8-C$5m$DW$Mn$]	"1-"@"G"U)-
*$5m$DW$Mn$]	#&7&Fw&OP\&]G&))nG$%	"1-"@"G"U)-$%	"%i."+JY"7K"+Ig">K!*78!4J#'<<#7L,>L)5?L!125AL!12@OL!<=.2.>.>.@L+*5L' +}\N:,GF 'v}=B**2.%KW*V Kr+   c                 4   |j                         }t        | d      }|j                  d|i      }t        j                  dd|j                               j                         j                         }t        t        |      d      }|j                  ddd|i	      }	d
}
t        j                  dd|	j                               j                         j                         }t        |      }|	j                  |
       t        j                  dd|j                               j                         j                         }|j                  |
j                               }|}||z   }|r|dz
  }n|}t        j                  t        j                  |      |      D cg c]  }|j                          }}|syt        |      D ])  \  }}||cxk  r|t        |      z   dz
  k  s!n $|dz   c S  t        |      D ]  \  }}||k  s|dz   c S  t        |      S c c}w )z
            
            r   r   r   z
[\n\r\t ]+r   r{   r  r|   )class_r   ___HIGHLIGHT_MARKER___r<   N)lowerr
   r   r   r   get_textr   r#   r   r   r   rF  r   rZ  )r1  phraser-  start_data_idr   r  start_elementnormalized_fulltmptmp_highlightmarkerhighlight_normalizedhighlight_lentmp_text
marker_poshighlight_starthighlight_endanchormr  rd  rc  s                         r)   find_occurrence_positionzOCmfDocument._merge_highlighted_inline_comment.<locals>.find_occurrence_position  s    \\^F }5D IIY,FIGM !ff]C9O9O9QRXXZ``bO  M 2MBCHHV4FO_akNlHmM-F#%66-m>T>T>V#W#]#]#_#e#e#g  45M&&v.vvmS#,,.AGGIOOQH!v||~6J(O&6M
 &*( /1kk"))F:K_.]^1779^K^ &k2 #S&9C#f+$5$997N# &k2 #SC<7N#
 {### _s   Hc                    g }|d   }|d   }||k(  r=| j                  d|i      }|r%|j                  d      D cg c]
  }|dk7  s	| }}|S | j                  d      }d}|D ]  }|dk7  s	|s|j                  d|i      }		rd}|j                  |       |s7|j                  sD|j                  j                  d      s`|j                  j                  d      }
|
|k(  s |S  |S c c}w )	uY   
            Собираем текстовые ноды между data-id
            r   r<   r   r   Tr   r   F)r   r   find_parentsr   rZ   rb   )r  rc  r"  r  end_data_idrZ   r$  all_text_nodesstart_foundparent_with_data_idr   s              r)   get_all_text_nodeszICmfDocument._merge_highlighted_inline_comment.<locals>.get_all_text_nodes  s    JFMa&K+)])CD39???3M!^4QUY]Q]$!^J!^!!!]]]5NK& &4<&.2.?.?yR_F`.?.a+*&*"))$/";;4;;??9+E&*kkooi&@G&+5 %& ) "_s   
C,C,c                    d}d}| d   | d   k(  rddgS g }|j                         D ]T  \  }}| d   |k(  r||vr|j                  |       |}| d   |k(  s.t        |      dkD  s=||vsB|j                  |       |}V t        |      dk(  r9|j                         D ]&  \  }}| d   |k(  s||vs|j                  |       |}( ||ddgS |||dgS ||d|gS ||gS )u  
            Поиск элементов - возвращает список позиций
            Возможные варианты:
            - [None, None] - оба элемента не найдены
            - [pos1, None] - найден только первый элемент
            - [None, pos2] - найден только второй элемент  
            - [pos1, pos2] - оба элемента найдены
            Nr   r<   )r   r   r   )	ext_nodesdraft_data_idspos1pos2found_nodesrc  r$  s          r)   find_ext_nodeszECmfDocument._merge_highlighted_inline_comment.<locals>.find_ext_nodes  s=    DD|y|+1v !!/!5!5!7 #IC |t+K0G#**40" |t+K0@10DU`I`#**40"# {#q(%3%9%9%; '	T$Q<4/D4K'..t4#&D' <DL $<'%$, $<'\d&6 $<' !$<'r+   c                 :    i dg fd |        S )ua   
            Собираем все data-id в правильном порядке 
            r   c                    t        | t              st        | d      sy | j                  dk(  rd| j	                  dg       v ry | j	                  d      r!j                  | d          | d   <   dz  | j                  D ]
  } |        | j	                  d      r!j                          rd   <   dz  y y y )Nr\   r{   r  r   r   r<   r   )r  r#   hasattrr\   rb   r   r   r   )r$  ri  data_idsrd  process_nodestacks     r)   r  zYCmfDocument._merge_highlighted_inline_comment.<locals>.get_data_ids.<locals>.process_node  s     dC(f0E
 99&+='SUAV+V 88I&LLi1$(OHSM1HC "]] (E '( 88I&IIK(-b	q  'r+    )r  r  rd  r  r  s    @@@@r)   get_data_idszCCmfDocument._merge_highlighted_inline_comment.<locals>.get_data_ids  s(     HCE!> Or+   c                 ^    | d   | d   g}t        |       dkD  r| t        |       dz
     |d<   |S )uW   
            Крайние ноды по параметрам, переданных с фронта
            0 - всегда начало, len(data)-1 - всегда конец, если это не так, это баг фронта
            если хайлайт в одной ноде, то начало = конец
            r   r<   r   )r5  r  s     r)   param_ext_nodeszFCmfDocument._merge_highlighted_inline_comment.<locals>.param_ext_nodes;  s=     a$q'*I4y1}#CIaK0	!r+   c                     ddl m}m} t               }t	        dt        |       dz         D ]=  } || |      D ]/  } ||      D ]"  }|j                  dj                  |             $ 1 ? t        |d       S )u   Все возможные вариации: комбинации + перестановки
            
            ['мишки', 'были', 'пчелами']
            ['были', 'мишки', 'пчелами']
            ..
            ['пчелами']

            r   )combinationspermutationsr<   r   c                     t        |        | fS r=  r  )r   s    r)   <lambda>z[CmfDocument._merge_highlighted_inline_comment.<locals>.get_all_variations.<locals>.<lambda>Z  s    c!fWaL r+   )r(   )		itertoolsr  r  r   r   r   addr   sorted)	word_listr  r  
variationsrcomboperms          r)   get_all_variationszICmfDocument._merge_highlighted_inline_comment.<locals>.get_all_variationsF  s}     =J 1c)nq01 7))Q7 7E ,U 3 7"sxx~6777 **@AAr+   c           
         dg d}dj                  |       j                         }|j                         }|s|S g }|}	 |j                  ||      }|dk(  rn |j                  |       |t	        |      z   }8|s |j                               }	|	D ]  }
|r n|}	 |j                  |
|      }|dk(  r"|
}t	        |
      dk  r |||t	        |
      z   dz
        \  }}}}||
k7  r|t	        |      z   }[|j                  |       |
}|t	        |      z   }| |s|S g }t        |      D ]  \  }}d}d	}d	}d}d}t        |       D ]f  \  }}t	        |      }||||z   k  r|}|r||z
  |d   z   }n||z
  }|t	        |      z   }|"|||z   k  r|}|r||d   z   |d   z
  }n||z
  } n||z  }h |j                  ||||||d
        d|t	        |      |dS )u   
            Находит все вхождения фразы в списке текстовых нод и возвращает массив повторов с позициями
            F)foundr  rs   Tr   rY  r<   r   N)occurrence_indexr]  r  r  r  r  )r  r  r   r  )r   r  r   r   r   r   rZ  )r#  r  start_search_posfragment_posoccurrences_not_found	full_textrS  r  
phrase_posphrasesphrtmp_start_posexpanded_highlight	new_startnew_endfpr  	pos_indexcurrent_posr  r  r  r  r   r$  node_lengthend_phrase_posexpand_highlight_to_non_alnumr  s                              r)   find_phrase_in_nodeszKCmfDocument._merge_highlighted_inline_comment.<locals>.find_phrase_in_nodes\  s    /4B$G! ,,.I\\^F,,I(I&^^FI>
#  ,&V4	  ,V\\^<" AC $4M%.^^C%G
%+!-0*s8q=Ifgpr|  I  LO  PS  LT  T  UV  V  JWFIw0BB-4,6V,DM$!((4!$(2S[(@ 	A( ,, K)29)= %%	:!
 
(/ /GAt"%d)K ")j;;T.T%&
'+5+ClSTo+UL+5+CL &0#f+%=N'NkK>W,W#$')5Q)G,WX/)YJ)7+)EJ;.K+/. ""(1 *", ($0",$ =%P  Y*	 r+   c                 "   d}t        |dz
  dd      D ]  }| |   j                         r|} n |dk(  rd}n|dz   }t        |       }t        |t        |             D ]  }| |   j                         r|} n |}| || }||z
  }	||z
  }
||||	|
ffS )u  
            Расширяет хайлайт до любых символов, не являющихся буквами или цифрами,
            возвращает расширенный диапазон, расширенный текст и позицию фрагмента в слове
            это позволяет нам более точно находить короткие слова (<= 3х символов)
            r   r<   r   )r   isalnumr   )r   r  r  
left_boundr   r  right_boundr  expanded_textfragment_in_word_startfragment_in_word_ends              r)   r  zTCmfDocument._merge_highlighted_inline_comment.<locals>.expand_highlight_to_non_alnum  s     J9q="b1 Aw(!"J
 R	&N	 d)K7CI. Aw("#K
 "G 73M &/%:"#*Y#6 g}7MOc6dddr+   r   r   r   r  r<   r   r   rk  r  r  r  rY  T)rI  r}  r  r  r  )r   )Fr   rl  )r   N)r$   r
   r*   r`   rD   r   r   r   reverser2   r1  r   r   r#   rm  r2  )5rK   r5  r-  rn  r@  rM  r  r  r  r  r  r  r  r   r   ro  r   r  text_with_highlightleft_node_boundright_node_boundhighlight_foundend_occurrences_posstart_occurrences_posdraft_text_nodesr  r  start_ext_nodeend_ext_noder  draft_ext_nodesstart_draft_ext_node_idxend_draft_ext_node_idxtext_element_starttext_element_endtext_nodes_starttext_nodes_endr}  rr  rs  r  r  r  r  r  need_new_boundsr7  r8  rx  r  r  r  r  s5   `                                                @@@@r)   r3  z-CmfDocument._merge_highlighted_inline_comment/  s   			M06	p7	$r	B)	(V(	T			B,`	D 	eF %>$E$Efc$R!!";]K	+/+B+B4??CXCX+Y((!7!?!?!L'(>N!%!8!8!I"iioo55fcB!#d).>">>(1/':R*73(7%,?)(1&7O*?'"9#%57H/[p  sF  HR  T\#  (_SYGW=W(XYI&q\N$Q<L */:N,nY.GV_I`-acqrO (7q'9$%4Q%7"'38N8Z+/EE *3y.YbJc>d)e&'0~~YU^H_<`~'a$'5CU'V$%3AQ%RN)(A-( F"+()HI.YdJeftu~f  A  CD#EK &i0L4KKPST_P`cdPd!$[!1 )&|O'DElS^F_`lmv`wxz{  GK  TZ![I $(L;'1,	1Jl[dNe1eOl,^O-LM*;7*95PL	7,> '9$6	'3tH (:/N[dLegst}g~K  (A$'($ )==M{\lnz({%,-)(10?@1D 5MM`bst|b}  @J  LZ  [d  Le  5f149NQTUfgtUuQv9v8;<Mm<\8]`a8a 58MPQ8Q 5 *)4Y8OOTWXijwXxTy|}T}-k:l;>WW\jkt\u  zF  GP  zQ  ]Q34 03D]3STi3jkw3x 0/@/OPe/fgs/t,# +??OQZ\lnz*{*73-i8L<SS / > F F H23/"?=#ABQF6NObdst|d}  @J  LX  Yb  Lc  im  7n 3':$4$9$4$,#6;NQTUderUsQt;t:=om>\:]`a:a$7 ;NPQ:Q$7,W52G/.?O/6.>O $s/@/I+I'JJO$0H,H(II$*;G*D&D&dO\cLdHdO**A+-=?PRacx  {N  PZ  \d+ +/  ??* *5 A% '31$  1$ A% E "J #''OO"''OO_-++NJG??"((?CCr+   c                 x   t        |d      }|j                  dd|i      }|D ]3  }|j                         }|j                  |       |j	                          5 t        |      }| j                  | j                  j                        \  }}	|	j                  dd      }	t        |	d      }
t        |
      }	|	|k(  ryy)um   
        Проверка, что вставкой inline коммента не сломали draft
        r   r{   r|   r   r   TF)
r
   r   r  r   r   r#   r*   r`   rD   r$   )rK   rx  r-  r  spansr{   text_contentcleaned_text_draftr   original_text_draftsoup_original_text_drafts              r)   rm  z#CmfDocument._check_for_broken_draft  s     ^];f'7&DE  	D==?Ll+NN		 !Y )-(?(?@U@U(V%%199&#F
 $11Dm#T !":;"44r+   c                 X   | j                  g d       | j                  r2t        j                  | j                        }|j	                  d|        	 | j                  |||       t        j                         5  | j                  d	       d d d        y # t        $ r~}t        j                  d| j                   d| d| d|        t        j                  |       t        j                  t        j                                t        dd	
       Y d }~d }~ww xY w# 1 sw Y   y xY w)Nr   r`   
project_idPPP-COM-ADDobjAdd inline comment bug: id=
, version=z, comment_id=z, data=   Ошибка при добавлении комментария. Пожалуйста, обратитесь в Техническую поддержку!Tr   	only_data)load_fieldsr   APPget_cache_projectcheck_project_role_accessr9  	ExceptiongdebugrH   	traceback
format_excr}   r^   r_   rg   )rK   r4  r5  r-  projectes         r)   r   z$CmfDocument.highlight_inline_comment  s   =>??++DOO<G--m-F	**7D*E   " 	&III%	& 	&  	GG1$''*WI][eZffmnrmstuGGAJGGI((*+  r  z~    			& 	&%   B :D 	DA4DD D)c                 0   |dk(  r| j                   j                  }n,|dk(  r| j                  j                  }nt        d| d       | j	                        \  }}t        |d      }|j                  d|i      }|st        d	| d       | j                  ||      }t        |d      }	|j                  |	j                  j                  d
          dj                  |j                  j                  D 
cg c]  }
t        |
       c}
      }|D ]  }|j                  |||         } |dk(  r|| _         n|dk(  r|| _        |dk(  rF| j                  ||| j                  j                  ||| j                   j                        }|| _        |S c c}
w )Nr   r`   r0  Tr   rz   r   r   uD   DEV: в документе не найден элемент data-id=r   rs   )r  )r   rD   r`   r}   r*   r
   r   r   r   r   r   r   r   r#   r$   r  )rK   r4  r   	data_htmlr   r%   r   r   r   r   r   r   r(   draft_new_texts                 r)   _add_inline_commentzCmfDocument._add_inline_comment  s   f99??D$??((DGyQY]^ 33D9T!$/	 ~~Y,@~A\]d\efnrs55iN -i @!!"7"<"<"E"Ea"HI 77INN,C,CDqCFDE 	?C''[-=>H	?f DI$&DOf!77RVRaRaRgRg8A<[_[d[d[j[j 8 lN,DO Es   8Fc                 X   | j                  g d       | j                  r2t        j                  | j                        }|j	                  d|        	 | j                  |||       t        j                         5  | j                  d	       ddd       y# t        $ r~}t        j                  d| j                   d| d| d|        t        j                  |       t        j                  t        j                                t        dd	
       Y d}~d}~ww xY w# 1 sw Y   yxY w)u  
        html_node_text - всегда один html-элемент, близжайший верхний parent-элемент с data-id для комментария
        Этот метод может вызываться несколько раз для одного и того же comment_id, если выбрали несколько нод
        comment_id (CmfComment равен id элемента span с комментарием)
        r  r  r  r  r  z
, data_id=z, data_html=r  Tr   Nr  )r	  r   r
  r  r  r  r  r  r  rH   r  r  r}   r^   r_   rg   )rK   r4  r   r  r  r  s         r)   add_inline_commentzCmfDocument.add_inline_comment  s    	=>??++DOO<G--m-F	$$WgyA   " 	&III%	& 	&  	GG1$''*WIZX_W``lmvlwxyGGAJGGI((*+  r  z~    			& 	&r  c                    | j                  g d       t        j                  j                  |ddg      }|st	        d| d       d|_        |j                          | j                  | j                  j                        \  }}| j                  | j                  j                        \  }}t        |d	      }t        |d	      }g d
}	d}
|	D ]^  }|j                  ||i      D ]E  }|j                  dj                  |j                  D cg c]  }t!        |       c}             d}
G ` |
r_dj                  |j"                  j                  D cg c]  }t!        |       c}      }|D ]  }|j%                  |||         } || _        d}
|	D ]^  }|j                  ||i      D ]E  }|j                  dj                  |j                  D cg c]  }t!        |       c}             d}
G ` |
r_dj                  |j"                  j                  D cg c]  }t!        |       c}      }|D ]  }|j%                  |||         } || _
        | j                  d       y c c}w c c}w c c}w c c}w )N)r   r`   r  rZ   r  rZ   )rH   r   u)   Не найден комментарий Tr   closedrz   )r|   zdata-refrH   Fr   rs   r  )r	  rE   rh   rb   r}   rp   rg   r*   r   rD   r`   r
   r   r   r   r   r#   r   r$   )rK   data_comment_idcommentsvg_tags_textr   svg_tags_text_draftr`   r   r   comment_id_attr_listchangedcomment_id_attrr   r   r(   text_element_drafts                   r)   delete_inline_commentz!CmfDocument.delete_inline_comment  sj   DE ##''?IxCX'YA/ARS[_` ""55diiooFt*.*A*A$//BWBW*X'Z!$/	'
F;  D3 	O ) 2 2/?9[ 2 \  ))"''<CXCX2Ya3q62Y*Z[	 77INN,C,CDqCFDED$ =||Cs);<=DI 3 	O&5&>&>oWfEg&>&h ""//I[IdId8eAQ8e0fg	
 /2F2F2O2O!PQ#a&!PQJ* O'//5H5MN
O(DO		D	!+ 3Z E 9f "Qs   I+I0I5I:c                    | j                  ddg       | j                  | j                  k(  rg| j                  d       | j                  | _        t        j                  | j                  d|       }|j                          | j                  d       y |dk(  r$| j                  d       | j                  d       y |dk(  r$| j                  d       | j                  d       y y )Nr   r`   F)r   r:   rZ   Tr  )r	  r   r`   _set_data_idsrE   rF   rg   )rK   r4  fix_dublicatehistorys       r)   r   z)CmfDocument.patch_inline_comment_data_idsM  s    &,/099'|,DI//T__u]a/bGLLNIII%v&III%$ |,III% %r+   c            "      H   dddddddddddd	d
dddd	dddddddddddddddd
dddddddddddddddddddddddddddddddddddddd d!d!d"ddddddddd#d$d%d&d'dd(d)d*d+dd(d)d,d-dd$d.d/d0dd1d2d3d4ddd5d5d6d6ddd5d5d7d7ddd8d8d9d9ddd:d:d;d;dddd d<d<d=dddd>d<d<d?ddd@dAdBdBdCddDdEdFdGdHdIdg} | D ]  }|dJ   }|j                  dK|      }|dL   }|j                  dMdN      }|dO   }|j                  dPdQ      }|j                  dRdQ      }|j                  dS|      }	t        j                  j                  dTg dUV      }
||
_        ||
_        |rdQt
        _        |rg t        _        	 |
j                  dJ||       |rdt
        _        t        dY|        |
j                  j                  |k7  r%t        dZ|
j                  j                   d[|        |
j                  j                  |	k7  r%t        d\|
j                  j                   d[|	        |r t        j                  g k(  rt        d]       t        dW        y # t        $ rB}|r'g t        _        dt
        _        t        dW       Y d }~t        dX|        Y d }~d }~ww xY w)^NTfgs41gCqEYvnRz#<p data-id="Tfgs41gCqEYvnR">qwe</p>z<p data-id="Tfgs41gCqEYvnR">qw<span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:a5b02aac-da09-11ed-9a90-0242ac110002">e</span></p>)r   r   r  r+  z)qwe<p data-id="Tfgs41gCqEYvnR">qwe</p>qwez0<p data-id="Tfgs41gCqEYvnR">q<span>w</span>e</p>z=<p>qwe</p><p data-id="Tfgs41gCqEYvnR">q<span>w</span>e</p>qwe2zB<p data-id="1">qwe</p><p data-id="2">qwe</p><p data-id="3">qwe</p>z#<p data-id="2">q<span>w</span>e</p>zO<p data-id="1">qwe</p><p data-id="2">q<span>w</span>e</p><p data-id="3">qwe</p>z#<p data-id="2"><span>qwe</span></p>zO<p data-id="1">qwe</p><p data-id="2"><span>qwe</span></p><p data-id="3">qwe</p>ze<p data-id="1">qwe</p><p data-id="2">qw<b>e</b><a href="/qwe">h<i>i</i></a></p><p data-id="3">qwe</p>zF<p data-id="2"><span>qw<b>e</b><a href="/qwe">h<i>i</i></a></span></p>zr<p data-id="1">qwe</p><p data-id="2"><span>qw<b>e</b><a href="/qwe">h<i>i</i></a></span></p><p data-id="3">qwe</p>z<p data-id="2">qwe</p>T)r   r   r  error3z$<p data-id="2">q<span>ww</span>e</p>z5<p data-id="2">q<span onclick="alert()">w</span>e</p>z&<p data-id="2">q<span>w</span>e</p>rtyz&<p data-id="2">q<span>w</span>erty</p>1z<p data-id="1">qwe</p>z#<p data-id="1">q<span>w</span>e</p>)r   r   r`   r  r+  z<p data-id="1">qwe</p>HI!z&<p data-id="1">q<span>w</span>e</p>HI!)r   r   r`   r  r+  result_draftz<p data-id="1">qwe2</p>z-<p data-id="1">q<span id="com1">w</span>e</p>z.<p data-id="1">q<span id="com1">w</span>e2</p>)r   r   r`   r  r+  alertr0  BnnahcxvEX3XKdu%  <p data-id="BnnahcxvEX3XKd">Токен подписывается очень надежным алгоритмом хеширования SHA-256 (например, используется в подписях https-сертификатов у сайтов, подписях почтовых сообщений, защищенных каналах связи, Bitcoin) и явно удостоверяет права пользователя. подписанного jwt токена производится на отдельном строго защищенном account сервере, ваш пароль не хранится в открытом виде и не передается в открытом виде даже через ssl, а хешируется сразу в браузере.</p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight inline-highlight-active" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Токен</span>&nbsp;подписывается очень надежным алгоритмом хеширования SHA-256 (например, используется в подписях https-сертификатов у сайтов, подписях почтовых сообщений, защищенных каналах связи, Bitcoin) и явно удостоверяет права пользователя. подписанного jwt токена производится на отдельном строго защищенном account сервере, ваш пароль не хранится в открытом виде и не передается в открытом виде даже через ssl, а хешируется сразу в браузере.</p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным алгоритмом хеширования SHA-256 (например, используется в подписях https-сертификатов у сайтов, подписях почтовых сообщений, защищенных каналах связи, Bitcoin) и явно удостоверяет права пользователя. подписанного jwt токена производится на отдельном строго защищенном account сервере, ваш пароль не хранится в открытом виде и не передается в открытом виде даже через ssl, а хешируется сразу в браузере.</p>RoHr5PpeuMz9qxuM  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight" data-id="RjECb1pICX1QMq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным</p><p data-id="RoHr5PpeuMz9qx">Параграф 2</p>u   <p data-id="RoHr5PpeuMz9qx">Параграф&nbsp;<span class="inline-highlight inline-highlight-active" id="CmfComment:dd365430-ddc2-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">2</span></p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight" data-id="RjECb1pICX1QMq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным</p><p data-id="RoHr5PpeuMz9qx">Параграф <span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:dd365430-ddc2-11ed-9a90-0242ac110002">2</span></p>u   <p data-id="RoHr5PpeuMz9qx"><span class="inline-highlight inline-highlight-active" id="CmfComment:624f4ece-ddc3-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Параграф&nbsp;2</span></p>u  <p data-id="BnnahcxvEX3XKd"><span class="inline-highlight" data-id="RjECb1pICX1QMq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:7a950418-ddc0-11ed-9a90-0242ac110002">Токен</span> подписывается очень надежным</p><p data-id="RoHr5PpeuMz9qx"><span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:624f4ece-ddc3-11ed-9a90-0242ac110002">Параграф 2</span></p>ua   <p data-id="BnnahcxvEX3XKd">Токен подписывается очень надежным</p>u  <p data-id="BnnahcxvEX3XKd">Токен<span class="inline-highlight inline-highlight-active" id="CmfComment:b32f901a-ddc3-11ed-9a90-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment"> подписывается очень </span>надежным</p>u  <p data-id="BnnahcxvEX3XKd">Токен<span class="inline-highlight inline-highlight-active" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:b32f901a-ddc3-11ed-9a90-0242ac110002"> подписывается очень </span>надежным</p>Tfla06iMmYtsnou  <p data-id="Tfgs41gCqEYvnR"><span class="inline-highlight inline-highlight-active" data-id="JGS0snIzoehAHE" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:d5ef19ec-de89-11ed-bae7-0242ac110002">2. Каждая клиентская установка находится в изолированном виртуальной машине (аналоге физического компьютера).  Никто кроме клиента туда не может получить доступ. </span></p><p data-id="Tfla06iMmYtsno">2. Для контроля доступа в сервисы <span class="inline-highlight inline-highlight-active" data-id="I8sHTtp5rEd1Vq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:c438b2d0-de89-11ed-bae7-0242ac110002">Eva используется jwt-токен</span>, который получает пользователь после вводе пароля, без него доступ получить невозможно. Jwt-токен для доступа может получить только тот, кого Вы пригласили. </p><span class="macros-panel mentions-macros" contenteditable="false" data-mentions-task="" data-rendered="true" style="display: inline-flex; flex-direction: column; position: relative;"> <span class="extension-container" contenteditable="false" data-layout="default"> <span class="extension-title">@Упоминания <span class="excerpt-title">| TEM-1625012435</span></span> <span class="macros-actions"> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewbox="0 0 18 18"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span> </span> <span class="ak-renderer-wrapper"> <a class="external" data-internal-link="1" data-link-type="link" data-macros="mentions" data-mention-type="task" data-object-id="CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002" data-params='{"code":"TEM-1625012435","ui_name":"Task"}' href="/project/Document/DOC-001679?popup=CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002#auzere" rel="noopener" style="font: var(--wiki-text-font);"><svg style="width: 20px; height: 20px; margin-bottom: -4px; margin-left: -7px;" viewbox="0 0 24 24"><path d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z" fill="#0053a0"></path></svg> TEM-1625012435  TO DO аузере #Не назначено </a> </span> </span>u?  <p data-id="Tfla06iMmYtsno">2.&nbsp;Для контроля доступа в сервисы&nbsp;<span data-id="I8sHTtp5rEd1Vq" class="inline-highlight" id="CmfComment:c438b2d0-de89-11ed-bae7-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Eva используется jwt-токен</span>, который получает пользователь после вводе пароля, без него доступ получить невозможно. Jwt-токен для доступа может получить только тот, кого Вы пригласили<span data-id="JMAUxDPbnbMqUw" class="inline-highlight inline-highlight-active" id="CmfComment:d9e7d4f8-de89-11ed-bae7-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">.&nbsp;</span></p>u  <p data-id="Tfgs41gCqEYvnR"><span class="inline-highlight inline-highlight-active" data-id="JGS0snIzoehAHE" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:d5ef19ec-de89-11ed-bae7-0242ac110002">2. Каждая клиентская установка находится в изолированном виртуальной машине (аналоге физического компьютера).  Никто кроме клиента туда не может получить доступ. </span></p><p data-id="Tfla06iMmYtsno">2. Для контроля доступа в сервисы <span class="inline-highlight" data-id="I8sHTtp5rEd1Vq" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:c438b2d0-de89-11ed-bae7-0242ac110002">Eva используется jwt-токен</span>, который получает пользователь после вводе пароля, без него доступ получить невозможно. Jwt-токен для доступа может получить только тот, кого Вы пригласили<span class="inline-highlight inline-highlight-active" data-id="JMAUxDPbnbMqUw" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:d9e7d4f8-de89-11ed-bae7-0242ac110002">. </span></p><span class="macros-panel mentions-macros" contenteditable="false" data-mentions-task="" data-rendered="true" style="display: inline-flex; flex-direction: column; position: relative;"> <span class="extension-container" contenteditable="false" data-layout="default"> <span class="extension-title">@Упоминания <span class="excerpt-title">| TEM-1625012435</span></span> <span class="macros-actions"> <span class="macros-delete"> <svg class="ng-star-inserted" style="width: 14px; height: 14px; color: #222222;" viewbox="0 0 18 18"><path class="ng-star-inserted" d="M16.5 3H12.75V1.5C12.75 1.10218 12.592 0.720644 12.3107 0.43934C12.0294 0.158035 11.6478 0 11.25 0L6.75 0C6.35218 0 5.97064 0.158035 5.68934 0.43934C5.40804 0.720644 5.25 1.10218 5.25 1.5V3H1.5V4.5H3V15.75C3 16.3467 3.23705 16.919 3.65901 17.341C4.08097 17.7629 4.65326 18 5.25 18H12.75C13.3467 18 13.919 17.7629 14.341 17.341C14.7629 16.919 15 16.3467 15 15.75V4.5H16.5V3ZM6.75 1.5H11.25V3H6.75V1.5ZM13.5 15.75C13.5 15.9489 13.421 16.1397 13.2803 16.2803C13.1397 16.421 12.9489 16.5 12.75 16.5H5.25C5.05109 16.5 4.86032 16.421 4.71967 16.2803C4.57902 16.1397 4.5 15.9489 4.5 15.75V4.5H13.5V15.75Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M8.25 7.5H6.75V13.5H8.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path><path class="ng-star-inserted" d="M11.25 7.5H9.75V13.5H11.25V7.5Z" fill="#222" stroke="none" stroke-width="1"></path></svg> </span> </span> </span> <span class="ak-renderer-wrapper"> <a class="external" data-internal-link="1" data-link-type="link" data-macros="mentions" data-mention-type="task" data-object-id="CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002" data-params='{"code":"TEM-1625012435","ui_name":"Task"}' href="/project/Document/DOC-001679?popup=CmfTask:25c3a1a6-dcfd-11ed-9a90-0242ac110002#auzere" rel="noopener" style="font: var(--wiki-text-font);"><svg style="width: 20px; height: 20px; margin-bottom: -4px; margin-left: -7px;" viewbox="0 0 24 24"><path d="M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z" fill="#0053a0"></path></svg> TEM-1625012435  TO DO аузере #Не назначено </a> </span> </span>z'<p data-id="1">q<strong>w</strong>e</p>z4<p data-id="1">q<span><strong>w</strong></span>e</p>z4<p data-id="1">q<strong><span>w</span></strong>e</p>z1<p data-id="1">q<span data-id="qwe">w</span>e</p>z><p data-id="1">q<span><span data-id="qwe">w</span></span>e</p>z2<p data-id="1">q<span data-id="qwe2">w</span>e</p>z?<p data-id="1">q<span data-id="qwe2"><span>w</span></span>e</p>z7<p data-id="1">q<span id="CmfComment:123">w</span>e</p>z8<p data-id="1">q<span id="CmfComment:123">w</span>e2</p>z<p data-id="1">22q2we2</p>z;<p data-id="1">22q2<span id="CmfComment:123">w</span>e2</p>z<p data-id="1">qqq</p>z<p data-id="1">2qqq2</p>z7<p data-id="1">q<span id="CmfComment:123">q</span>q</p>z9<p data-id="1">2q<span id="CmfComment:123">q</span>q2</p>OKMwlzdbVdo67ou   <p data-id="OKMwlzdbVdo67o">1. Провайдим на уровне компонента и вызываем только в нём</p>u   <p data-id="OKMwlzdbVdo67o">1. Провайдим на уровне компонента и вызы2ваем только в нём##</p>um  <p data-id="OKMwlzdbVdo67o">1.&nbsp;<span data-id="1HKljVrmlZFaDi" class="inline-highlight inline-highlight-active" id="CmfComment:9f614c7e-e050-11ed-845f-0242ac110002" data-mark-type="annotation" data-mark-annotation-type="inlineComment">Провайдим&nbsp;на</span>&nbsp;уровне&nbsp;компонента и вызываем только в нём</p>u]  <p data-id="OKMwlzdbVdo67o">1. <span class="inline-highlight inline-highlight-active" data-id="1HKljVrmlZFaDi" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:9f614c7e-e050-11ed-845f-0242ac110002">Провайдим на</span> уровне компонента и вызываем только в нём</p>u\  <p data-id="OKMwlzdbVdo67o">1. <span class="inline-highlight inline-highlight-active" data-id="1HKljVrmlZFaDi" data-mark-annotation-type="inlineComment" data-mark-type="annotation" id="CmfComment:9f614c7e-e050-11ed-845f-0242ac110002">Провайдим на</span> уровне компонента и вызы2ваем только в нём##</p>r   r`   r  r+  rs   r   r-  Fr1  r0  z
DOC-001679)r   r`   r  )rU   r   OKuA   ERROR! Ошибка добавления комментария: u+   ERROR! Должна быть ошибка! u(   ERROR! Отличается текст!
r   u@   ERROR! Отличается текст новой версии!
u   ERROR! Нет alert)rb   rE   r   r   r`   configDEBUGr  r1  r  r  printrD   )	test_datar5  r   r`   r  r+  r   r-  r1  r0  docr  s               r)   _test_add_inline_commentz$CmfDocument._test_add_inline_commentb  sc    ,= z y	 ,CMY	 \@k	 \@k	 c O	 03	 0@	 0A	 0R	 0C	 0C	 06@? 09@? H 07JI P 06@? 8	 , @ A |	 , h N d	 , h N d	 ,{ x w	 , G8 ] C;	 AGQP AGQP KQ[Z LR\[ 07TS Z 0:TS ] 08TS [ , j k K ~ !Cm~
	~  &	D<D,5J9oGXXh+F9oGHHWe,EHHWe,E88NF;L$$((lCd(eCCH'CN$	&&vw@ #CD6JKxx~~'A#((..AQQSTZS[\]~~##|3YZ]ZhZhZnZnYooqr~q  A  B77b=/1$KM&	$   AG#'FL$KYZ[Y\]^s   :I	J!#JJJ!c                    d }| j                  ddg       |dk(  r.| j                  sy t        | j                  j                  d      }nC|dk(  r.| j                  sy t        | j                  j                  d      }nt        d| d       j                         D ]%  }d|j                  vs |       |j                  d<   ' i }|j                         D ]3  }|j                  j                  d      }||vrd	||<   ||xx   d
z  cc<   5 |j                         D ]S  \  }}|d
kD  s|j                         D ]5  }|j                  j                  d      |k(  s" |       |j                  d<   7 U |dk(  rBdj                  |j                  j                  D cg c]  }t        |       c}      | _        y |dk(  rBdj                  |j                  j                  D cg c]  }t        |       c}      | _        y y c c}w c c}w )Nc                      dt        t        j                         dz        } t        | dz        }| dz  }|   |   z   }|dj                  fdt        d      D              z   }|S )Nz@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/i   @   rs   c              3   H   K   | ]  }t        j                          y wr=  )randomchoice).0r  alphabets     r)   	<genexpr>zCCmfDocument._set_data_ids.<locals>.gen_random_id.<locals>.<genexpr>S  s     "Nq6==#:"Ns   "   )r   timer   r   )totalr   jprefix_idrD  s        @r)   gen_random_idz0CmfDocument._set_data_ids.<locals>.gen_random_idM  sh    YH$))+12Eebj!A
Aa[8A;.F277"NE"I"NNNCJr+   r   r`   rz   r0  Tr   r   r   r<   rs   )r	  r   r
   rD   r`   r}   r   r   rb   r   r   r   r   r#   )	rK   r4  rL  r   r   idsr   r   r   s	            r)   r'  zCmfDocument._set_data_idsK  s   	 	&,/0f99%diioov>I$??%doo&;&;VDIGyQY]^%..0 	@L 2 220=""9-	@
 %..0 	L"((,,Y7Gc! GLAL		
 "iik 	HNGUqy$-$6$6$8 HL#))--i8GC8E**95H	H f1H1H IAQ IJDI$ ggy~~7N7N&O!s1v&OPDO % !J&Os   H"Hc                     t        dd       | j                  ddg       || _        t        j	                  | j                  j
                  | j                  j
                        | _         | j                  |ddd|S )NDEV: depricatedTr   r`   r   r   r  depth)r}   r	  r   r   r   rD   r`   rg   rK   in_textargskwargss       r)   r   z'CmfDocument.update_text_inline_commentsx  sg    #40,/0	%;;DIIOOT__MbMbctyy$$aB6BBr+   c                 T    t        dd       || _         | j                  |ddd|S )NrO  Tr   r   rP  r}   r`   rg   rR  s       r)   r   z-CmfDocument.update_text_draft_inline_comments  .    #40!tyy$$aB6BBr+   c                 x    | j                  dg       | | j                   | _         | j                  |ddi|S )Nr`   rQ  r   )r	  r`   rg   rR  s       r)   r   z!CmfDocument.update_text_task_link  sD    ,($Idoo%67
 tyy$2a2622r+   c                 T    t        dd       || _         | j                  |ddd|S )Nry   Tr   r   rP  rW  rR  s       r)   r   z'CmfDocument.update_text_draft_task_link  rX  r+   c                    | j                  ddg       t        j                  | j                  j                  ||      | _        t        j                  | j
                  j                  ||      | _         | j                  |ddd|S )Nr   r`   Tr   rP  )r	  r   r   r   rD   r`   rg   )rK   r   r   rT  rU  s        r)   r   z)CmfDocument.update_text_macros_parameters  sp    &,/088)Ufg	%>>t?T?TV_arstyy$$aB6BBr+   c                    | j                  | j                  j                  ||      | _        | j                  | j                  j                  ||      | _        | j                  | j                  j                  ||      | _        y r=  )_replace_attach_urlr   rD   r`   text_render)rK   attach
new_attachs      r)   _replace_attachmentzCmfDocument._replace_attachment  se    ,,TYY__fjQ	224??3H3H&R\]33D4D4D4J4JFT^_r+   c                     t        |   |i |}|j                          |j                          |j	                          |S r=  )r   r   _clean_highlight_comments_process_draft_is_changed
do_publish)rK   rT  rU  r  r   s       r)   r   zCmfDocument.copy  sA    glD+F+ 	%%' 	%%'
r+   c                     ddl m} | j                  j                  r" || j                  j                        | _        y y )Nr   )markup_html_clean)cmf.util.cmf_clean_textrg  r`   
is_changedrD   )rK   rT  rU  rg  s       r)   _clean_textzCmfDocument._clean_text  s-    =??%%/0E0EFDO &r+   c                 V    | j                  ddg      D ]  }|j                           | S )Nr1  r   )r   r   )r  tags     r)   unwrap_html_body_tagsz!CmfDocument.unwrap_html_body_tags  s-    ==&&!12 	CJJL	r+   c                    d}d}| j                   | j                  d} |j                         D ]|  \  }}|s	||j                  v st	        |j                  d      }|j                  d|      D ]9  }|j                          t        | |t        | j                  |                   d}; ~ |r| j                  d       y	y	)
uM   
        Очищеает все инлайн-комментарии
        r  F)r   r`   rz   r{   )r  Tr  N)r   r`   r   rD   r
   r   r   setattrr#   rm  rg   )rK   	highlight	need_saver   
field_namefieldr  r{   s           r)   rc  z%CmfDocument._clean_highlight_comments  s     '		 II//

 ". 	#Jekk1$U[[&9 MM&MC #DKKMD*c$2L2LT2R.ST"I	#	# III% r+   )   rl  r  )-__name__
__module____qualname__r   r   api_methodsstaticmethodr#   r*   r2   r6   rM   rl   rq   classmethodrI   r   r   r   r   r   r  r9  r2  ry  r3  rm  r   r  r  r%  r   r<  r'  r   r   r   r   r   ra  r   rj  rm  rc  __classcell__)r   s   @r)   r   r      s   **66 	:
 	
K 	! 	! 	! OC O O
R0 % % " "# "# " "H mC mS mS m m^ s s s WZ  F C6 C6J j jXJMX  YDvr	Dh<&&%N&08"t&* f fP+QZCC
3C
C`

G
  
&r+   r   )osr   cmf.includecmfr   
cmf.fieldsr   cmf.utilr	   r   r   bs4r
   mathr   rG  rA  r  r   r  r+   r)   <module>r     s=       #  	      }&,** }&r+   