
    i<                        d dl mZ d dlT 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dS )    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 ]y}|                    |                                          }|                                }t          t          d| dd                    }| 
                    ||          } |||<   z|| 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    :bj)JRTR[\\\^bcc 	# 	#C++cjjll++C]]__Fm$TF$T$T$TVcddeeC<<S))D"KD      returnc                      ddl m } m} t          |                     |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'   sP     	0///////8<<--667GHH"MNNNr+   c                     | j         j        }t          j                            dd| j        gg dgdgddgddg	          }|r&|                     |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    y/44k4QUQX=Y<T<T<T=V>L=M<I6;R[\]^Z_ 5 a a  	C>>+a."5";TBBD\d\\ty\\\r+   c           
         t                                           5  |                     | j        j        | j        j                  }d| d| j         d}t          j        	                    dd| j
        j        gdd| j        gg dg dg	          }|st          j        	                    d
d          }t                              | j
        || dd|d          }|j                                         |                                 |j                                         |                                 n0t                              ||                              d           d d d            d S # 1 swxY w Y   d S )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:   s     "" 	R 	R $ty@U V Vr/@rrTYrrrI>%%/?t~GX.Y/:D$'.J.].].].S.S.S.U% V VD  R#044:Yjn4oo
~~$.Z`d  xC+elu  AE & F F'')))		'')))		 !!I!>>CC5CQQQ+	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	Rs   E
E11E58E5c                 R   t                                           5  t          j                            dd| j        j        gdd| j        gg dg dgdg          }|r3|j                            d          |_	        |
                                 d d d            d S # 1 swxY w Y   d S )	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~GX.Y/:D$'.J.].].].S.S.S.U _i]i & k kD  "m>>xHH			 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A5BB #B    c                 4    |pd}|p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                  }|                    |           rft          | d          }|                    dddi          D ]=}|                    dd	d
i          D ]"}|                    d          r|||d         <   #>i }t          j        dt          j                  }|                    |          rft          |d          }|                    dddi          D ]=}|                    dd	d
i          D ]"}|                    d          r|||d         <   #>|}	|                                |                                z
  D ]}
t          ||
                   |	z   }	|	S )u1  
        Получаем черновик с инлайн-задачами

        :param text: Оригинальный текст документа с инлайн-задачами
        :param text_draft: Черновик
        :return: Черновик с инлайн-задачами
        DEV: deprecatedTr   zdata-mentions-taskr   lxmlspanrv   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|   rv   tasks_in_draftsoup_text_draftresult_text	task_spans              r)   handle_inline_taskzCmfDocument.handle_inline_taske   s    	#40000j.bd;;;::d 	A%dF33I!**64H$3OPP A As-@&,IJJ A AAyy!122 A<@a(8&9:A j.bd;;;::j!! 	B+J??O'00:NPT9UVV B Bs-@&,IJJ B BAyy!122 B=Aq)9':;B !&++--0C0C0E0EE 	F 	FImI677+EKKr+   c           	      Z   t          j        dt           j                  }t          j        dt           j                  }|                    |           r|                    |           s,|                    |          r|                    |          s|S d}t	          | d          }i }|                    dddi          D ]}|||                    d          <   t          j        	                    |          \  }}t	          |d          }	|	                    dddi          D ]j}|                    |                    d                    r*|
                    |                    d          d           Td	}|                                 ki }
|rNd
                    d |	j        j        D                       }|D ]}|                    |||                   }|}nF|}|                                D ].\  }}|                     |          }|                     |j                                        d|          }|                     dd|          }|                     d|          t-          d          z   }| d|                             d          t-          d          z   }|| |d                             d          z   }t          j        d| ||         ddd                   }|r||                                z
  n|}| ||         }t          j        d| ||                   }|r||                                z   n|}| ||         }| |dz
  |         dk    }| ||dz            dk    }|rt          j        dd|          }|rt          j        dd|          }||j        z   |z   }|
                    |g dg          \  }}|s8t3          t          j        ||                    }t-          |          }||g|
|<   |s|t-          |          k     r	||         }n|d         }|d|                                                             d          t-          d          z   } |                                ||                                d                             d          z   }!d}"t          j        dd| ||                   }#t          j        dd|| |                                                   }$|#                                }%|%r|%d         nd
}&t          j        dd
|&          }&|$                    |d                                          }'|'r|'d         nd
}(|&|(k    r|&|vrd	}"|"rt-          |          })t-          |          |)z
  t-          |j                                                  z
  }*||dz
  g|
|<   |                                |)z   }+|                                |*z
  },|d|+         t;          |          z   ||,d         z   }0|S )ua  
        Получаем черновик с комментариями-пометками

        :param text: Оригинальный текст документа с комментариями-пометками
        :param text_draft: Черновик
        :return: Черновик с комментариями-пометками
        data-mark-annotation-typer   inlineCommentFr{   r|   rH   NTrt   c                 ,    g | ]}t          |          S  r#   .0xs     r)   
<listcomp>z5CmfDocument.handle_inline_comment.<locals>.<listcomp>       !P!P!PQ#a&&!P!P!Pr+   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$   itemsfindcountr   striprfindlenstartsubrG   finditerendsplitr#   )-r   r`   r   re2is_remove_commentsoup_text_commentid_commentsr|   svg_tagsr   	dict_textr(   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`    j5RTBBBj)666

4   	SZZ%5%5 	ZZ
++	03

:0F0F	!)$77%..v8SUd7eff 	/ 	/D*.K''%1DDZPP*'
F;;#,,V6QSb5cdd 	 	Dtxx~~.. 5555 %)!	 L	`!P!P/2F2O!P!P!PQQJ D D'//Xc]CC

$KK$K$/$5$5$7$7 E` E` 
D#'99Z#8#8 $(JJty/@/@!EU$V$V! $

7A7G H H"ii	3CDDs9~~U -066u==E

J	%[\\(:(?(?(G(GG#%9VT)M:Q5RSWSWUWSW5X#Y#Y Rb&qm6F6L6L6N6N&N&Nhq# ##6}#DE!#64G8K3L!M!MLZ$gK.2F2F2H2H$H$H`g!!+.?"?@
 $((9-(G#HH#T "&{;?'B"Cx"O $ F"$&C"E"EK" D!#	3
!C!CJ#di/*<$-MM$Q$@$@!	6  : $R[{%C%C D DI ^^F'0&&9IdO $s9~~55%&78EE%bME"-nu{{}}n"="C"CE"J"JSQVZZ"W %		k%))++,,.G.L.LV.T.T T$)!
 !#y'4	-@W;X Y Y&(fY_]b]h]h]j]jMjAk&l&l#)//11	2;!C2!#	2~!F!F"5"="=dC"H"H"N"N"P"P>M'Ur':':SU$!%999nTX>X>X(,%$ !+..II3c$)//:K:K6L6LL	#,fqj"9	$${{}}{:"YY[[94
)-<-83t99D{S]S^S^G__r+   	macros_idmacros_parametersc                    t           j                            |           \  }} t          j        |t          j                  }|                    |           r<t          | d          }|                    |          }|r||d<   t          |          } |D ]}| 
                    |||                   } 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D$j"$///::d 	"%dM::I%NNiN88M L:K67y>>D 	4 	4C<<Xc]33DD9~~r+   c                 N    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
  s4    ww**,, 0F 0F 0F F 	Fr+   c                    t          | d          }t          j        |          }|                                D ]K}|r|j        s|j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            d	d           t          |j                  D ]2}|                    d
          r|j                            |d           3d|j                            dg           v s	d|j        v r|                                 M|                                D ]K}|r|j        s|j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            d	d           t          |j                  D ]2}|                    d
          r|j                            |d           3d|j                            dg           v s	d|j        v r|                                 M|j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            dd           |j                            d	d           t          |j                  D ]2}|                    d
          r|j                            |d           3|j                            dd           t          |j	                  } | dd         } | dd         } t          |          }| 
                    dd          
                    dd          
                    dd          } |
                    dd          
                    dd          
                    dd          }| |k    rt          dd           d}t          dt          |          dz             D ]<}| d|         |d|         k    r n#| |dz
           dk    r|}| |dz
           dk    rd}=|dz  }|r|dz
  }|dk    r| |d         } ||d         }d}t          dt          |          dz             D ]:}| | d         || d         k    r n| |          dk    r|}| |          dk    rd};|dz  }|r|dz
  }|dk    r| d|          } |d|          }d| d}t          | d          }t          |d          }	|	j	        j        }
t          |	j	        j                  dk    rEt          |	j	        j        j                  dk    r#|	                                D ]}|r|j        s|}
t          |j	        j                  dk    rt          d|j	        j         d           |j	        j        j        |
j        k    r+t          d |j	        j        j         d!|
j         d           |j	        j        j        }t!          |                                          t!          g d"          z
  rt          d#| d           |                    d$d          S )%u   
        Проверяем, что в текст добавлен только inline-кмментарий.
        Дополнительно здесь мы находим id спана добавленного комментария
        r{   classNzdata-renderedstylerelzdata-mce-srczdata-mce-stylezdata-mce-hrefz	data-mce-zmacros-panelzdata-macrosrJ   r       r   
rt   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 ? ?y..
 *2244 	! 	!D tz JNN7D)))JNN?D111JNN7D)))JNN5$'''JNN>4000JNN+T222JNN?D111!$*-- 4 4	''44 4JNN9d333 !<!<<<QUQ[@[@[    ))++ 	! 	!D tz JNN7D)))JNN?D111JNN7D)))JNN5$'''JNN>4000JNN+T222JNN?D111!$*-- 4 4	''44 4JNN9d333!<!<<<QUQ[@[@[   w---555w---ud+++~t444/666555l011 	8 	8I##K00 8"&&y$777vt,,,,122ABB<CRC=<(( ##FC0088rBBJJ4QSTT#++FC88@@rJJRRSWY[\\|##C4PPPP q#l++A-.. 	& 	&A||BQB///!}##!"!}##!%	Q 	#"Aq55|H'+L q#l++A-.. 	& 	&A}aRSS 111|s""!"|s""!%	Q 	#"Aq55!}H'!,L 6555#06#B#B &|V<< $2#6#; ~"+,,11c.:M:R:[6\6\`a6a6a&//11 0 0 4: +/((',566!;;  Q  iA  iF  iO  Q  Q  Y]  ^  ^  ^  ^#(-6:R:[[[ o27<Eo oKcKlo ovz| | | |-27=
z  !!C  )D  )D  )D  %E  %E  E 	4 '$' '.24 4 4 4~~.555r+   c                 
   t           j                            |          \  }}t          |d          }|                    d| i          }t          |d          }	|	                    d|i          }
t          |d          }|                    d| i          }|s2t                              ||          }||k    rt          d           |S ||k    rq|                    |	j        j	        d                    d
                    d |j        j        D                       }|D ]}|                    |||                   }|S t          j        d	t          |
                    d         }|                    d
d          }t          |                              d
d          }t          |                              d
d          }|                    |          }|                    |          }|dk    rt          |                    d|
j                            d d         }|                    |          }|d |         }||z  }||||t'          |          z            z  }|dz  }|||t'          |          z   d          z  }|                    |           d
                    d |j        j        D                       }|D ]}|                    |||                   }|S |dk    r||k    rd}d}d}|                    ||          x}dk    rv|t'          |          z   }||dz
           dk    r4||t'          |          z   |t'          |          z   dz            dk    r|}n!|dz  }|                    ||          x}dk    vt          |                    d|
j                            d d         }d}t)          d|dz             D ]*}|                    ||          }|t'          |          z   }+|d |         }||z  }||||t'          |          z            z  }|dz  }|||t'          |          z   d          z  }|                    |           d
                    d |j        j        D                       }|D ]}|                    |||                   }|S |dk    rn	 |                    d|
j                  }d|_        |                    |           d
                    d |j        j        D                       }|D ]}|                    |||                   }|S )Nr{   r   r   r}   u   В новой версии документа данный абзац отсутствует, в будущем добавленный комментарий Вы сможете посмотерть в истории комментариев.r   rt   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument._merge_inline_comment.<locals>.<listcomp>      CCCa3q66CCCr+   z^[^>]*>(.*)</span>$r   r   r<   r|   r   r   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument._merge_inline_comment.<locals>.<listcomp>  r  r+   r      c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument._merge_inline_comment.<locals>.<listcomp>  r  r+   #c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument._merge_inline_comment.<locals>.<listcomp>  s    @@@1A@@@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(   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  s   +>>tDD$!$//	 ~~Y,@~AA -nf E E499AQSb@c9dd&y&99*//y'6J/KK  	33ItDDCd{{ r s s sJ ,,,%%&;&@&I!&LMMM''CC9>+BCCCDDC 6 6kk#x}55J "$,BCH\D]D]!^!^_`!a!7!?!?!L!L|,,44VSAA #$5 6 6 > >vs K K(../EFF2889OPPA #I$5$5fDXD^$5$_$_ ` `adbdad e '++,BCCG#3HWH#=  $55  $4WWSI_E`E`=`5`$aa  I-  $4WSAW=X=X5X5Y5Y$ZZ %%&:;;;''CC9>+BCCCDDC 6 6kk#x}55JQ=4F#F#F IIJ/445KYWWWD\]]] 3'=#>#>>	(a0C771$s;Q7R7R2RSWX[\rXsXsSstuSu2uv  {D  D  D *Ia
 0445KYWWWD\]]] !$I$5$5fDXD^$5$_$_ ` `adbdad e I1ik** B B*//0F	RR#c*@&A&AA		#3HWH#=  $55  $4WWSI_E`E`=`5`$aa  I-  $4WSAW=X=X5X5Y5Y$ZZ %%&:;;;''CC9>+BCCCDDC 6 6kk#x}55JQ  #**69M9S*TT #N+++ww@@	(?@@@AA 	4 	4C<<Xc]33DDr+   c                 d    i  fd}|dk    r#                       j        j                  \  }}n=|dk    r#                       j        j                  \  }}nt	          d| d           t          |d          }|D ]} |||          }|j        }	|	r|	                                 |j        }
|
r|
                                 |dk    r9 	                    ||           _         
                    ||           _        d S |dk    r 	                    ||           _        d S d S )Nc                    |d         }|d         }|d         }|d         }|                      d|i          }g }|j        }|D ],}	t          |	t                    r|                    |	           -|vr                    ||i           |         }
|
s| S |
|         }||v r|                    |          }||         d |         }||         ||         }||         |d          }|                     d          }d|d<   |d	<   d
|d<   d|d<                                   |d<   ||_	        | | | }t          |d          }||                             |           | 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>EELJ )E , ,dC(( ,%%d+++n,,%%w
&;<<< &g.H !  #M2Lz)) * 0 0 > >$]3JYJ?K$]3Ig4EFK#M2788<J$,,V44L$6L!-7L)*-9L)*8GL45&*&6&6&8&8L#"-L#?\?:??Fv}55B}%222666r+   r   r`   /   DEV: не поддерживается version=Tr   r{   )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)Q&H&&$$)-)@)@AV)W)W&H&&QQQY]^^^^!"2F;;	 	; 	;E((E::II > 	OO> 	OOf11(IFFDI"DDT:WghhDOOO$$"77)LLDOOO %$r+   c                     d                     d |j        D                       }| D ]}|                    || |                   }|S )Nrt   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z4CmfDocument.place_all_drawio_svg.<locals>.<listcomp>O  s    ;;;1A;;;r+   )r   r   r$   )r   r   r   r(   s       r)   r?  z CmfDocument.place_all_drawio_svgM  sR    ww;;	(:;;;<< 	4 	4C<<Xc]33DDr+   c           	      6    d }dd}dd}d } fd}d }	d }
|                     d	d
          }t          |d          }                      j        j                  \  }}|                     d	d
          }t          |d          }|D ]}|d         }|d         }|d         }|d         }|                    d|i          }|                    d|i          }|sV ||          } ||          } |||         ||         d          } |||         d|         dd          }|D ]}g }g }d}d} |||          }|r%t          |          dk    r_|d         d         } |||          }|rAt          |          dk    r|d         d         }n!|t          |          dz
           d         }n |||         |          }t          |          D ]B\  } }!|!d         |cxk    r|!d         k    r$n !| t          |          k     r||          d         }C |||          }|r@t          |          dk    r|d         d         }nm|t          |          dz
           d         }nN |||          }|r@t          |          dk    r|d         d         }n|t          |          dz
           d         }| |	||          }| |	||          }|||t          |          z
  }|||t          |          z   }|| ||||||          }|j        }"|"r|"	                                 |j
        }#|#r|#	                                 t          |          }$                     |$|          s j        S                      ||          S )u|   
        Предыдущая реализация
        todo: удалить после тестирования
        c                 v    g }| j         }|D ],}t          |t                    r|                    |           -|S Nr   r*  r#   r
  r   r/  r0  r1  s       r)   get_text_nodeszHCmfDocument.old_merge_highlighted_inline_comment.<locals>.get_text_nodesZ  sK    J )E , ,dC(( ,%%d+++r+   Fc                    |                                  }t          |          |k     r| S |rn|| d          }d                    d |D                       }t          j        |dz   |           }|r|                    d          nd                    |          S |d |         }dd                    d |D                       z   d	z   }t          j        ||           }|r|                    d          nd                    |          S )
Nrt   c                 <    g | ]}d t          j        |           S )z.*?r   escaper   r   s     r)   r   zWCmfDocument.old_merge_highlighted_inline_comment.<locals>.get_words.<locals>.<listcomp>l  s)    "V"V"Vt#:4#:#:"V"V"Vr+   \s*$r   r   ^\s*\s+c                 6    g | ]}t          j        |          S r   rQ  rS  s     r)   r   zWCmfDocument.old_merge_highlighted_inline_comment.<locals>.get_words.<locals>.<listcomp>r       0\0\0\T40\0\0\r+   \s*)r   r   r   r   r   group)r   words_countfrom_endwordsselected_wordspatternr   s          r)   	get_wordszCCmfDocument.old_merge_highlighted_inline_comment.<locals>.get_wordsc  s
   JJLLE5zzK'' M!&|}}!5''"V"V~"V"V"VWW	'G"3T::).Lu{{1~~~CHH^4L4LL "'||!4!FKK0\0\^0\0\0\$]$]]`ff	'400).Lu{{1~~~CHH^4L4LLr+   c                     |                                  }|rd                    || d                    S d                    |d |                   S )Nr   )r   r   )r   r[  r\  r]  s       r)   tmp_get_wordszGCmfDocument.old_merge_highlighted_inline_comment.<locals>.tmp_get_wordsv  sO    JJLLE 6xx{lmm 455588E,;,/000r+   c                     dd l }t           |j         |j        |          |                     }|sg S d |D             }|S )Nr   c                 ^    g | ]*}|                                 |                                f+S r   )r   r   )r   r   s     r)   r   zhCmfDocument.old_merge_highlighted_inline_comment.<locals>.find_all_substring_entries.<locals>.<listcomp>  s-    KKK%%++--5KKKr+   )r   rG   r   rR  )r   	substringr   matches	positionss        r)   find_all_substring_entrieszTCmfDocument.old_merge_highlighted_inline_comment.<locals>.find_all_substring_entries}  sX    III;2;yry';';TBBCCG 	KK7KKKIr+   c                 6   |dz  }|d |         }|||         }||d          }|                      d          }d|d<   ||d<   d|d<   d|d	<                                   |d
<   ||_        | | | }	t          |	d          }
|                    |
           | S )Nr<   r|   r(  r   r}   r)  r   r   r   r   r   )r  r-  r	  r
   r  )r   	text_noder&  r'  r:  r4  r5  r6  r7  r8  r9  rK   s              r)   wrap_text_to_spanzKCmfDocument.old_merge_highlighted_inline_comment.<locals>.wrap_text_to_span  s    qLG#JYJ/K#Ig$56K"788,J*226::L$6L!-7L)*-9L)*8GL45&*&6&6&8&8L#"-L#?\?:??Fv}55B""2&&&""r+   c                 8   d }d }|                                  }|                                 }|d d         }|d d         }|D ]}||v r|                    |          } n|7d}	t          |          D ]#\  }
}|
|k    r|	t          |          z  }	|	|
z  }	 |	}|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)//11K !,BQB +BQB *  ,,,066t<<HE - #!*+<!=!=  IChs4yy(s
&)#&&r+   c                     g }| j         D ]>}t          |t                    r'|                    |                                           ?|S rK  )descendantsr*  r#   r
  r   )elementr/  childs      r)   collect_text_nodeszLCmfDocument.old_merge_highlighted_inline_comment.<locals>.collect_text_nodes  sN    J , 5 5eS)) 5%%ekkmm444r+   r   r   r{   r   r&  r'  r%  r   r   rm  NT)r\  r<   r   F)r$   r
   r*   r`   rD   r   r   rn  r>  r   r   r#   _check_for_broken_draftr?  )%rK   rB  r:  original_text_without_svgrN  r`  rb  rh  rk  ry  r~  r   r   text_draft_without_svgr   r.  r  r&  r'  r%  r   text_draft_elementr/  text_draft_nodesstart3words	end3wordsrp  start_positionsend_positionsrr  span_end_positionsrc_positionsrx  rw  rD  rE  new_text_drafts%   `                                    r)   $old_merge_highlighted_inline_commentz0CmfDocument.old_merge_highlighted_inline_commentT  s    	 	 		M 	M 	M 	M&	1 	1 	1 	1	 	 		# 	# 	# 	# 	#( 	'  	'  	'D	 	 	 %>$E$Efc$R$R!!";VDD	+/+B+B4?CX+Y+Y((!7!?!?!L!L'(>GG Q	 Q	EI&Gk*II&G!/2M$>>G0D>EEL!0!5!5Y<P!5!Q!Q% '\BBBJ-~;MNNN $)J}$=i>O$PRSTTK!	*]";HWH"EqSWXXXI#3 > >"$ "&*#$(!"<"<_k"Z"Z" #W?++q00.=a.@.C+(B(B?T](^(^( ["=11Q664A!4DQ4G 1 14A#mBTBTUVBV4WXY4Z 1 )C(B:mC\^i(j(j(1-(@(@ R RHC"1v<<<<c!f<<<<<#&_)=)=#=#=:I#:Nq:Q$7(B(B?T](^(^( ["=11Q664A!4DQ4G 1 14A#mBTBTUVBV4WXY4Z 1$>$>PY$Z$ZM$ W}--220=a0@0C--0=c->P>PQR>R0STU0V-&.*C*CKQ`*a*a'$,(A(A)_(](]% '.3D3P*;c)nn*L' '27H7P(;c+>N>N(N%&27H7T&7&7Zm  pA  CM  'N  'NOO }>B #' 	OO"' 	OO_--++NJGG 	#?"((?CCCr+   c           
         1234 d }d d}d!1 4fd	}d!d}d }d }	d	 }
d
 }d 3d"23fd	}d 2|                     dd          }t          |d          }                      j        j                  \  }}|                     dd          }t          |d          }                      j        j                  \  }} j        j                             dd          }d}d}d}|s||t          |          |z
  k    r?4d         s
1d         snT4d         s14|}n1d         s41|} |||41||||          }n' |||t          |          |z
                     }|d         }|d         } |
|          } |	|d         |d         g|          }|d         }|d         } || || k    r|                    d|d         i          }!|                    d|d         i          }" ||!          }# ||"          }$|$s|dz  }*d}% ||#|d                  |d         |d                  d          }&|d         |d         k    r"t          |&          dk    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k    rS ||4d         ||d                   }|r2|t          4d                   k    rt          4d                   dz
  }n|dz
  }|d         |d         k    rUt          4d                   dk    r<|d         |d         k    r|d         |d         k    rd},n)4d         |         d         },n4d         |         d         },|s |||'|,|(          11d         r|d         |d         k    r1d                                          d}t          1d                   dk    r^ ||1d         ||d         d          }|s|dz  }|r2|t          1d                   k    rt          1d                   dz
  }n|dz
  }n4d         r|}41nddi1|t          4d                    z  }|t          1d                    z  }4d          p1d          }-|-s |||41||||          }d}n! j        S ||dz  }n| |dz  }n
|dz  }|dz  }|||j
        }.|.r|.                                 |j        }/|/r|/                                 t          |          }0                     |0|          s j        S                      ||          S )#Nc                 v    g }| j         }|D ],}t          |t                    r|                    |           -|S )uS   
            Формируем список текстовых нод
            rL  rM  s       r)   rN  zECmfDocument._merge_highlighted_inline_comment.<locals>.get_text_nodes1  sM     J )E , ,dC(( ,%%d+++r+   Fr   c                 R   | |d                                          }t          |          |k     r|s| S |r|| d         }dd                    d |D                       z   dz   }t          j        ||           }|r'|                    d                                          nd                    |          S |d|         }dd                    d	 |D                       z   dz   }t          j        ||           }|r|                    d          nd                    |          S )
uT   
            Находим (<=3 слов) start3words или end3words
            NrY  rV  c                 6    g | ]}t          j        |          S r   rQ  rS  s     r)   r   zTCmfDocument._merge_highlighted_inline_comment.<locals>.get_words.<locals>.<listcomp>I  s     /[/[/[D	$/[/[/[r+   rT  r   r   rU  c                 6    g | ]}t          j        |          S r   rQ  rS  s     r)   r   zTCmfDocument._merge_highlighted_inline_comment.<locals>.get_words.<locals>.<listcomp>P  rX  r+   )r   r   r   r   r   rZ  r   )r   r[  r\  offsetr]  r^  r_  r   s           r)   r`  z@CmfDocument._merge_highlighted_inline_comment.<locals>.get_words<  s0    M''))E5zzK''' M!&|}}!5 6;;/[/[N/[/[/[#\#\\_ff	'40016Tu{{1~~++---CHH^<T<TT "'||!4!FKK0\0\^0\0\0\$]$]]`ff	'400).Lu{{1~~~CHH^4L4LLr+   c                 p   |d         |         d         }|d         |         d         }	|d         |         d         }
|d         |         d         }d}d}t          |          D ]O\  }}||k    rd}|r>||k    r1||
k    r+d         |         d         }	d         |         d         }d}nq||k    r;d         |         d         }	|rd         |         d         }n@t          |          }n0||
k    rd	}	d         |         d         }d}nd	}	t          |          }|d
|	         }||	|         }||d
         }|                     d          }d|d<   ||d<   d|d<   d|d<                                   |d<   ||_        | | | }t          |d          }|                    |           |r nQ| S )ui   
            Оборачиваем текстовые ноды в хайлайт спаны
            occurrences
start_noderq  end_nodeFTstart_offset
end_offsetr   Nr|   r(  r   r}   r)  r   r   r   r   r   )rn  r   r  r-  r	  r
   r  )soupr/  r   r   start_pend_pr:  fragmentr  r&  r  r'  start_highlightstop_highlightrx  rj  r4  r5  r6  r7  r8  r9  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"7 * *Y*$$&*O" &j((Z8-C-C$5m$DW$Mn$]	"1-"@"G"U)-
**$5m$DW$Mn$]	# 5&7&Fw&OP\&]GG&))nnGG$%	"1-"@"G"U)-$%	"%i.."+JYJ"7K"+Ig,=">K!*788!4J#'<<#7#7L,>L)5?L!125AL!12@OL!<=.2.>.>.@.@L+*5L' +G\G:GGF 'v}==B**2...% Kr+   c                    |                                 }t          | d          }|                    d|i          }t          j        dd|                                                                                                           }t          t          |          d          }|                    ddd|i	          }	d
}
t          j        dd|	                                                                                                           }t          |          }|		                    |
           t          j        dd|                                                                                                           }|                    |
                                           }|}||z   }|r|dz
  }n|}d t          j
        t          j        |          |          D             }|sdS t          |          D ]/\  }}||cxk    r|t          |          z   dz
  k    r
n (|dz   c S 0t          |          D ]\  }}||k     r|dz   c S t          |          S )z
            
            r   r   r   z
[\n\r\t ]+r   r|   r(  r}   )class_r   ___HIGHLIGHT_MARKER___r<   c                 6    g | ]}|                                 S r   )r   )r   ms     r)   r   zcCmfDocument._merge_highlighted_inline_comment.<locals>.find_occurrence_position.<locals>.<listcomp>  s     ^^^17799^^^r+   N)lowerr
   r   r   r   get_textr   r#   r   r  r   rR  rn  )r>  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anchorr  rx  rw  s                        r)   find_occurrence_positionzOCmfDocument._merge_highlighted_inline_comment.<locals>.find_occurrence_position  s`    \\^^F }55D IIY,FIGGM !f]C9O9O9Q9QRRXXZZ``bbO  M 2 2MBBCHHV4FO_akNlHmmM-F#%6-m>T>T>V>V#W#W#]#]#_#_#e#e#g#g  455M&&v...vmS#,,..AAGGIIOOQQH!v||~~66J(O&6M
  )&*( _^bk")F:K:K_.].]^^^K t &k22 # #S&9999C#f++$5$9999997NNN : &k22 # #SC<<7NNN   {###r+   c                    g }|d         }|d         }||k    r<|                      d|i          }|r d |                    d          D             }|S |                     d          }d}|D ]}|d	k    rx|s|                    d|i          }	|	rd}|                    |           |rC|j        r<|j                            d          r"|j                            d          }
|
|k    r n|S )
uY   
            Собираем текстовые ноды между data-id
            r   r<   r   r   c                     g | ]
}|d k    |S )r   r   )r   r1  s     r)   r   z]CmfDocument._merge_highlighted_inline_comment.<locals>.get_all_text_nodes.<locals>.<listcomp>  s$    !^!^!^4QUY]Q]Q]$Q]Q]Q]r+   Tr   Fr   )r   r   find_parentsr
  rZ   rb   )r  rw  r/  r  end_data_idrZ   all_text_nodesstart_foundr1  parent_with_data_idr  s              r)   get_all_text_nodeszICmfDocument._merge_highlighted_inline_comment.<locals>.get_all_text_nodes  s6    JFMa&K++)])CDD _!^!^6???3M3M!^!^!^J!!!]]]55NK& & &4<<& b.2.?.?yR_F`.?.a.a+* 0&*"))$///" &; &4;??9+E+E &&*kooi&@&@G&+55 %r+   c                    d}d}| d         | d         k    rddgS g }|                                 D ]f\  }}| d         |k    r||vr|                    |           |}| d         |k    r.t          |          dk    r||vr|                    |           |}gt          |          dk    rA|                                 D ],\  }}| d         |k    r||vr|                    |           |}-||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_nodesrw  r1  s          r)   find_ext_nodeszECmfDocument._merge_highlighted_inline_comment.<locals>.find_ext_nodes  sv    DD|y|++1v !!/!5!5!7!7 # #IC |t++K0G0G#**4000" |t++K0@0@10D0DU`I`I`#**4000"{##q((%3%9%9%;%; ' '	T$Q<4//D4K4K'..t444#&D <DL $<'%$, $<'\d&6 $<' !$<'r+   c                 @    i dg fd |            S )ua   
            Собираем все data-id в правильном порядке 
            r   c                    t          | t                    st          | d          sd S | j        dk    rd|                     dg           v rd S |                     d          r+                    | d                    | d         <   dz  | j        D ]} |           |                     d          r(                                 rd         <   dz  d S d S d S )Nr\   r|   r(  r   r   r<   r   )r*  r#   hasattrr\   rb   r
  r   r   )r1  r}  data_idsrx  process_nodestacks     r)   r  zYCmfDocument._merge_highlighted_inline_comment.<locals>.get_data_ids.<locals>.process_node  s    dC(( f0E0E F
 9&&+='SUAVAV+V+VF 88I&& LLi111$(OHSM1HC "] ( (E L'''' 88I&& !IIKKK !(-b	q! !! !r+   r   )r  r  rx  r  r  s    @@@@r)   get_data_idszCCmfDocument._merge_highlighted_inline_comment.<locals>.get_data_ids  sV     HCE! ! ! ! ! ! ! !> LOr+   c                     | d         | d         g}t          |           dk    r| t          |           dz
           |d<   |S )uW   
            Крайние ноды по параметрам, переданных с фронта
            0 - всегда начало, len(data)-1 - всегда конец, если это не так, это баг фронта
            если хайлайт в одной ноде, то начало = конец
            r   r<   r   )rB  r  s     r)   param_ext_nodeszFCmfDocument._merge_highlighted_inline_comment.<locals>.param_ext_nodes;  sC     a$q'*I4yy1}}#CIIaK0	!r+   c                 "   ddl m}m} t                      }t	          dt          |           dz             D ]G} || |          D ]8} ||          D ]*}|                    d                    |                     +9Ht          |d           S )u   Все возможные вариации: комбинации + перестановки
            
            ['мишки', 'были', 'пчелами']
            ['были', 'мишки', 'пчелами']
            ..
            ['пчелами']

            r   )combinationspermutationsr<   r   c                 &    t          |            | fS rK  r  )r   s    r)   <lambda>z[CmfDocument._merge_highlighted_inline_comment.<locals>.get_all_variations.<locals>.<lambda>Z  s    c!ffWaL 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)nnq011 7 7)\)Q77 7 7E ,U 3 3 7 7"sxx~~666677
 **@*@AAAAr+   c           
      f   dg d}d                     |                                           }|                                }|s|S g }|}	 |                    ||          }|dk    rn(|                    |           |t	          |          z   }E|s |                                          }	|	D ]}
|r n|}	 |                    |
|          }|dk    rn}|
}t	          |
          dk    r% |||t	          |
          z   dz
            \  }}}}||
k    r|t	          |          z   }q|                    |           |
}|t	          |          z   }|s|S g }t          |          D ]\  }}d}d	}d	}d}d}t          |           D ]y\  }}t	          |          }|!|||z   k     r|}|r||z
  |d         z   }n||z
  }|t	          |          z   }|)|||z   k    r |}|r||d         z   |d         z
  }n||z
  } n||z  }z|                    ||||||d
           d|t	          |          |dS )u   
            Находит все вхождения фразы в списке текстовых нод и возвращает массив повторов с позициями
            F)foundr  rt   Tr   rm  r<   r   N)occurrence_indexrq  r  r  r  r  )r  r  r   r  )r   r  r   r
  r   r   rn  )r0  r  start_search_posfragment_posoccurrences_not_found	full_textrg  r&  
phrase_posphrasesphrtmp_start_posexpanded_highlight	new_startnew_endfpr  	pos_indexcurrent_posr  r  r  r  r   r1  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\  sS    /4B$G$G! ,,..I\\^^F -,,I(I5&^^FI>>
##  ,,,&V4	5  A,,V\\^^<<" A AC  $4MA%.^^C%G%G
%++!-0*s88q==IfIfgpr|  I  LO  PS  LT  LT  T  UV  V  JW  JWFIw0BB-44,6V,DM$!((444!$(2S[[(@A "  -,, K)29)=)= % %%	:!
 
(// / /GAt"%d))K ")j;;T.T.T%&
' D+5+ClSTo+ULL+5+CL &0#f++%=N'NkK>W,W,W#$' F)5Q)G,WX/)YJJ)7+)EJ;.KK""(1 *", ($0",$ $      Y*	  r+   c                 b   d}t          |dz
  dd          D ] }| |                                         s|} n!|dk    rd}n|dz   }t          |           }t          |t          |                     D ] }| |                                         s|} 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1  Aw(( !"JE R		&N	 d))K7CII..  Aw(( "#KE "G 7!23M &/%:"#*Y#6 g}7MOc6dddr+   r   r   r   r  r<   r   r   r  r%  r&  r'  rm  T)r\  r  r  r  r  )r   )Fr   r  )r   N)r$   r
   r*   r`   rD   r   r   r   reverser2   r>  r   r   r#   r  r?  )5rK   rB  r:  r  rN  r`  r  r  r  r  r  r  r  r   r   r  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  r  r  r  r  r  r  r  need_new_boundsrD  rE  r  r  r  r  r  s5   `                                                @@@@r)   r@  z-CmfDocument._merge_highlighted_inline_comment/  s@	   		 		 			M 	M 	M 	M06	 6	 6	 6	 6	 6	 6	 6	p7	$ 7	$ 7	$ 7	$r	 	 	B)	( )	( )	(V(	 (	 (	T		 		 			B 	B 	B,`	 `	 `	 `	 `	 `	 `	D 	e  	e  	eF %>$E$Efc$R$R!!";]KK	+/+B+B4?CX+Y+Y((!7!?!?!L!L'(>NN!%!8!8!I!I"io55fcBB! b	&#d)).>">>>(1 @/':R @*73 @(7%,?))(1 @&7O*?'"9"9#%57H/[p  sF  HR  T\# #  (_SYYGW=W-W(XYYI&q\N$Q<L *\/::N,nnY.GV_I`-acqrrO (7q'9$%4Q%7"'38N8Z+/EEE *3y.YbJc>d)e)e&'0~~YU^H_<`~'a'a$'5~CU'V'V'V$%3^AQ%R%R%RN) !(A-( F"+)()HI.YdJeftu~fJ  A  CD#E #EK &i0L4KKKPST_P`P`cdPdPd!$[!1!1 )	&|O'DElS^F_`lmv`wFwxz{  GK  TZ![ ![ ![I $(L;''1,,	1Jl[dNe1e1eOlOl,^O-LM*;7*95P PL	7,> '9$6	'3>ttH (:'9/N[dLegst}g~K  (A  (A$'($ )=(<=M{\lnz({({%,-)(1 u0?@@1DD 5M4LM`bst|b}  @J  LZ  [d  Le  5f  5f14 R9NQTUfgtUuQvQv9v9v8;<Mm<\8]8]`a8a 5 58MPQ8Q 5 *)4Y8OOOTWXijwXxTyTy|}T}T}-k:l;>WWW\jkt\u  zF  GP  zQ  ]Q  ]Q34 0 03D]3STi3jkw3x 0 0/@/OPe/fgs/t,# ? +?*>?OQZ\lnz*{*{*73 R-i8L<SSS / > F F H H H23/"?=#ABBQFF6N6NObdst|d}  @J  LX  Yb  Lc  im  7n  7n  7n 3': !-$4$9$4$,#6 !R;NQTUderUsQtQt;t;t:=om>\:]:]`a:a$7$7 ;NPQ:Q$7,W5 ?2G/.?OO/6.>O $s/@/I+I'J'JJO$0H,H(I(II$*;G*D&D&dO\cLdHdO* /*A*A+-=?PRacx  {N  PZ  \d+ + +/  ?* *5 A%  '31$  1$ A% E " b	&J #' 	OO"' 	OO_--++NJGG 	#?"((?CCCr+   c                    t          |d          }|                    dd|i          }|D ]?}|                                }|                    |           |                                 @t          |          }|                     | j        j                  \  }}	|		                    dd          }	t          |	d          }
t          |
          }	|	|k    rdS dS )um   
        Проверка, что вставкой inline коммента не сломали draft
        r   r|   r}   r   r   TF)
r
   r   r  r  r   r#   r*   r`   rD   r$   )rK   r  r:  r  spansr|   text_contentcleaned_text_draftr   original_text_draftsoup_original_text_drafts              r)   r  z#CmfDocument._check_for_broken_draft  s     ^];;f'7&DEE  	 	D==??Ll+++NN YY )-(?(?@U(V(V%%199&#FF
 $11Dm#T#T !":;;"4444ur+   c                    |                      g d           | j        r6t                              | j                  }|                    d|            	 |                     |||           n# t          $ r}t                              d| j	         d| d| d|            t                              |           t                              t          j                               t          dd	
           Y d }~nd }~ww xY wt                                          5  |                     d	           d d d            d S # 1 swxY w Y   d S )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_accessrF  	ExceptiongdebugrH   	traceback
format_excr~   r^   r_   rg   )rK   rA  rB  r:  projectes         r)   r   z$CmfDocument.highlight_inline_comment  s   ===>>>? 	G++DO<<G--m-FFF	**7D*EEEE 	 	 	GGt$'ttWtt[ettnrttuuuGGAJJJGGI(**+++  r  z~                  		   "" 	& 	&III%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&+   A. .
D8BC>>DEE
Ec                    |dk    r| j         j        }n'|dk    r| j        j        }nt          d| d           |                     |          \  }}t          |d          }|                    d|i          }|st          d	| d           |                     ||          }t          |d          }	|                    |	j	        j
        d
                    d                    d |j	        j        D                       }
|D ]}|
                    |||                   }
|dk    r|
| _         n|dk    r|
| _        |dk    r6|                     ||| j        j        ||| j         j                  }|| _        |S )Nr   r`   r=  Tr   r{   r   r   uD   DEV: в документе не найден элемент data-id=r   rt   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z3CmfDocument._add_inline_comment.<locals>.<listcomp>      DDDqCFFDDDr+   )r  )r   rD   r`   r~   r*   r
   r   r   r  r   r   r   r   r$   r"  )rK   rA  r  	data_htmlr   r%   r   r   r  r   r   r(   draft_new_texts                r)   _add_inline_commentzCmfDocument._add_inline_comment  s   f9?DD$$?(DDQQQY]^^^^ 33D99T!$//	 ~~Y,@~AA 	tf]dffnrssss55iNN -i @ @!!"7"<"Ea"HIII 77DDIN,CDDDEE 	? 	?C''[-=>>HHf DII$$&DOf!77RVRaRg8A<[_[d[j 8 l lN,DOr+   c                    |                      g d           | j        r6t                              | j                  }|                    d|            	 |                     |||           n# t          $ r}t                              d| j	         d| d| d|            t                              |           t                              t          j                               t          dd	
           Y d}~nd}~ww xY wt                                          5  |                     d	           ddd           dS # 1 swxY w Y   dS )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#  r1  r$  r%  r&  rH   r'  r(  r~   r^   r_   rg   )rK   rA  r  r/  r)  r*  s         r)   add_inline_commentzCmfDocument.add_inline_comment  s    	===>>>? 	G++DO<<G--m-FFF	$$WgyAAAA 	 	 	GGx$'xxWxxX_xxmvxxyyyGGAJJJGGI(**+++  r  z~                  		   "" 	& 	&III%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&r+  c                    |                      g d           t          j                            |ddg          }|st	          d| d           d|_        |                                 |                     | j        j	                  \  }}|                     | j
        j	                  \  }}t          |d	          }t          |d	          }g d
}	d}
|	D ]V}|                    ||i          D ];}|                    d                    d |j        D                                  d}
<W|
rQd                    d |j        j        D                       }|D ]}|                    |||                   }|| _        d}
|	D ]V}|                    ||i          D ];}|                    d                    d |j        D                                  d}
<W|
rQd                    d |j        j        D                       }|D ]}|                    |||                   }|| _
        |                     d           d S )N)r   r`   r)  rZ   r)  rZ   )rH   r   u)   Не найден комментарий Tr   closedr{   )r}   zdata-refrH   Fr   rt   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument.delete_inline_comment.<locals>.<listcomp>6  s    2Y2Y2Ya3q662Y2Y2Yr+   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument.delete_inline_comment.<locals>.<listcomp>9  r.  r+   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument.delete_inline_comment.<locals>.<listcomp>C  s    8e8e8eAQ8e8e8er+   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z5CmfDocument.delete_inline_comment.<locals>.<listcomp>F  r   r+   r  )r   rE   rh   rb   r~   rp   rg   r*   r   rD   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(   text_element_drafts                  r)   delete_inline_commentz!CmfDocument.delete_inline_comment  s   DDDEEE #''?IxCX'YY 	aS/SS[_```` ""55dioFFt*.*A*A$/BW*X*X'Z!$//	'
F;;  DCC3 	 	O ) 2 2/?9[ 2 \ \   ))"''2Y2Y<CX2Y2Y2Y*Z*Z[[[  	77DDIN,CDDDEED$ = =||Cs);<<DI 3 	 	O&5&>&>oWfEg&>&h&h  ""//8e8eI[Id8e8e8e0f0fggg  	)!P!P/2F2O!P!P!PQQJ* O O'//5H5MNN

(DO		D	!!!!!r+   Fc                    |                      ddg           | j        | j        k    ro|                     d           | j        | _        t                              | j        d|           }|                                 |                     d           d S |dk    r-|                     d           |                     d           d S |dk    r-|                     d           |                     d           d S d S )Nr   r`   F)r   r:   rZ   Tr  )r   r   r`   _set_data_idsrE   rF   rg   )rK   rA  fix_dublicatehistorys       r)   r   z)CmfDocument.patch_inline_comment_data_idsM  s   &,/0009''|,,,DI//T_u]a/bbGLLNNNIII%%%%%v&&&III%%%%%$$ |,,,III%%%%% %$r+   c            "      ~   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         }|                     dK|          }|dL         }|                     dMdN          }|dO         }|                     dPdQ          }|                     dRdQ          }|                     dS|          }	t          j                             dTg dUV          }
||
_        ||
_        |rdQt
          _        |rg t          _        	 |
	                    dJ||           nY# t          $ rL}|r-g t          _        dt
          _        t          dW           Y d }~(t          dX|            Y d }~@d }~ww xY w|r dt
          _        t          dY|            j|
j        j        |k    rt          dZ|
j        j         d[|            |
j        j        |	k    rt          d\|
j        j         d[|	            |r!t          j        g k    rt          d]           t          dW           d S )^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;  r8  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;  r8  z<p data-id="1">qwe</p>HI!z&<p data-id="1">q<span>w</span>e</p>HI!)r  r   r`   r;  r8  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;  r8  alertrM  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;  r8  rt   r  rJ  FrN  rM  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%  rN  r3  r$  printrD   )	test_datarB  r   r`   r;  r8  r  rJ  rN  rM  docr*  s               r)   _test_add_inline_commentz$CmfDocument._test_add_inline_commentb  s{    ,= 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,55J9oGXXh++F9oGHHWe,,EHHWe,,E88NF;;L$((lCdCdCd(eeCCH'CN %$ 	&&vw@@@@     AG#'FL$KKKHHHH]Z[]]^^^  #JDJJKKKx~''\#(.\\TZ\\]]]~#|33  AZ]ZhZn  A  Ar~  A  A  B  B  B 7b==0111$KKKKM&	 &	s   F00
H:)H)HHc                    d }|                      ddg           |dk    r$| j        sd S t          | j        j        d          }n>|dk    r$| j        sd S t          | j        j        d          }nt          d| d           |                                D ]}d|j        vr |            |j        d<   i }|                                D ]5}|j                            d          }||vrd	||<   ||xx         d
z  cc<   6|	                                D ]R\  }}|d
k    rG|                                D ]2}|j                            d          |k    r |            |j        d<   3S|dk    r0d
                    d |j        j        D                       | _        d S |dk    r0d
                    d |j        j        D                       | _        d S d S )Nc                     dt          t          j                    dz            } t          | dz            }| dz  }|         |         z   }|d                    fdt          d          D                       z   }|S )Nz@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/i   @   rt   c              3   @   K   | ]}t          j                  V  d S rK  )randomchoice)r   r   alphabets     r)   	<genexpr>zCCmfDocument._set_data_ids.<locals>.gen_random_id.<locals>.<genexpr>S  s-      "N"Nq6=#:#:"N"N"N"N"N"Nr+      )r   timer   r   )totalr   jprefix_idr`  s        @r)   gen_random_idz0CmfDocument._set_data_ids.<locals>.gen_random_idM  s    YH$)++122Eebj!!A
Aa[8A;.F277"N"N"N"NE"II"N"N"NNNNCJr+   r   r`   r{   r=  Tr   r   r   r<   rt   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z-CmfDocument._set_data_ids.<locals>.<listcomp>t  s     I I IAQ I I Ir+   c                 ,    g | ]}t          |          S r   r   r   s     r)   r   z-CmfDocument._set_data_ids.<locals>.<listcomp>v  s    &O&O&O!s1vv&O&O&Or+   )r   r   r
   rD   r`   r~   r   r   rb   r   r   r   r   )rK   rA  rh  r   r   idsr  r   s           r)   rD  zCmfDocument._set_data_idsK  s3   	 	 	 	&,/000f9 %diov>>II$$? %do&;VDDIIQQQY]^^^^%..00 	@ 	@L 2220="9- %..00 	 	L"(,,Y77Gc!! GLLLALLLL!iikk 	H 	HNGUqyy$-$6$6$8$8 H HL#)--i88GCC8E*95f I I1H I I IJJDIII$$ gg&O&Oy~7N&O&O&OPPDOOO %$r+   c                     t          dd           |                     ddg           || _        t                              | 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  st    #40000,/000	%;;DIOT_Mbccty$$aBB6BBBr+   c                 R    t          dd           || _         | j        |ddd|S )Nrm  Tr   r   rn  r~   r`   rg   rp  s       r)   r   z-CmfDocument.update_text_draft_inline_comments  ;    #40000!ty$$aBB6BBBr+   c                 l    |                      dg           | | j         | _         | j        |ddi|S )Nr`   ro  r   )r   r`   rg   rp  s       r)   r   z!CmfDocument.update_text_task_link  sJ    ,((($7do77
 ty$2a26222r+   c                 R    t          dd           || _         | j        |ddd|S )Nrz   Tr   r   rn  ru  rp  s       r)   r   z'CmfDocument.update_text_draft_task_link  rv  r+   c                     |                      ddg           t                              | j        j        ||          | _        t                              | j        j        ||          | _         | j        |ddd|S )Nr   r`   Tr   rn  )r   r   r   r   rD   r`   rg   )rK   r   r   rr  rs  s        r)   r   z)CmfDocument.update_text_macros_parameters  sw    &,/00088)Ufgg	%>>t?TV_arssty$$aBB6BBBr+   c                     |                      | j        j        ||          | _        |                      | j        j        ||          | _        |                      | j        j        ||          | _        d S rK  )_replace_attach_urlr   rD   r`   text_render)rK   attach
new_attachs      r)   _replace_attachmentzCmfDocument._replace_attachment  se    ,,TY_fjQQ	224?3H&R\]]33D4D4JFT^__r+   c                      t                      j        |i |}|                                 |                                 |                                 |S rK  )r   r   _clean_highlight_comments_process_draft_is_changed
do_publish)rK   rr  rs  r  r   s       r)   r   zCmfDocument.copy  sZ    egglD+F++ 	%%''' 	%%'''
r+   c                 b    ddl m} | j        j        r || j        j                  | _        d S d S )Nr   )markup_html_clean)cmf.util.cmf_clean_textr  r`   
is_changedrD   )rK   rr  rs  r  s       r)   _clean_textzCmfDocument._clean_text  sI    ======?% 	G//0EFFDOOO	G 	Gr+   c                 b    |                      ddg          D ]}|                                 | S )Nr>  r   )r   r   )r  tags     r)   unwrap_html_body_tagsz!CmfDocument.unwrap_html_body_tags  s6    ==&&!122 	 	CJJLLLLr+   c                    d}d}| j         | j        d} |j                    D ]\  }}|r||j        v rvt	          |j        d          }|                    d|          D ]I}|                                 t          | |t          | 	                    |                               d}J|r| 
                    d           d	S d	S )
uM   
        Очищеает все инлайн-комментарии
        r(  F)r   r`   r{   r|   )r  Tr  N)r   r`   r   rD   r
   r   r   setattrr#   r  rg   )rK   	highlight	need_saver   
field_namefieldr  r|   s           r)   r  z%CmfDocument._clean_highlight_comments  s     '		 I/
 

 ". 	# 	#J #ek11$U[&99 MM&MCC # #DKKMMMD*c$2L2LT2R2R.S.STTT"II 	&III%%%%%	& 	&r+   )rr   r  r  )-__name__
__module____qualname__r   r   api_methodsstaticmethodr#   r*   r2   r6   rM   rl   rq   classmethodrI   r   r   r   r   r   r"  rF  r?  r  r@  r  r   r1  r3  rB  r   rY  rD  r   r   r   r   r   r  r   r  r  r  __classcell__)r   s   @r)   r   r      s       *6 	:
 	:
 	:
 	
K 	! 	! 	! 	! \	! OC O O O \O
  R R R0   % % % [% " "# "# " " " \"H mC mS mS m m m \m^ s s s WZ    \F F F F F C6 C6 \C6J j j \jXJM JM JMX   \YD YD YDvr	D r	D r	Dh  <& & &&% % %N& & &08" 8" 8"t& & & &* f f \fP+Q +Q +Q +QZC C CC C C
3 3 3C C C
C C C` ` `

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