U
    {yd9                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ 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T d dlmZ d	Zd
Zee ZdZG dd dZdS )    N)Path)TemporaryDirectory)Dict)parse)datetime)*)RFilei  i  100%c                   @   s   e Zd ZdZeedddZedddZeddd	Zeed
ddZ	e
eedddZe
eedddZe
dd ZedddZdTddZe
ddddZdd ZddddZe
d d! Zddd"d#Ze
ddd$d%Ze
ddd&d'Ze
eeed(d)d*Zeed
d+d,Zeed-d.d/Ze
eedd0d1d2Ze
eedd3d4d5Zeedd6d7d8Zeedd9d:d;Zeedd<d=d>Zddd?d@Z e
eeeddAdBdCZ!dUeeeedEdFdGZ"e
dVeeeeedHdIdJZ#e
eedKdLdMZ$eddNdOZ%dPdQ Z&dRdS Z'dS )WCmfPluginConvertMixinuO   
    Используется в классах CmfDocument, CmfAttachment
    )content	extensionc              	   C   s   | j  d| j d| }tj| dd}tj|sBt| tj||}t|d}|	| W 5 Q R X tjd|  d|}t
|S )up  
        Метод сохраняет файл директорию объекта и возвращает путь для скачивания
        :param content: Контент в байт
        :param extension: Расширение файла
        :return: file_path: Строка пути с кодированием символов для URL
        _.TZexportwbfiles)namecodeospathjoinZget_files_direxistsmakedirsopenwriter   Zquote)selfr   r   	file_nameZfull_export_pathZfile_full_pathfile	file_path r   +./common/models/cmf_plugin_convert_mixin.py_save_export_file   s    
z'CmfPluginConvertMixin._save_export_file)returnc                 O   sD   t d |  }| t|dddd}| |dd}| |d}|S )	u   
        Сохраняет HTML -> PDF
        Используется преобразование через DOCX, из-за этого нет разрыва страниц.

        :return: Данные pdf в виде строки base64
        !   УСТАРЕВШАЯ ВЕРСИЯutf-8encoding.htmldocx:MS Word 2007 XML.docxpdf:writer_pdf_Exportpdf	cmf_alert_handle_htmlobj_to_formatbytesr    )r   argskwargshtml
docx_bytes	pdf_bytesurl_file_pathr   r   r   save_to_pdf2   s    z!CmfPluginConvertMixin.save_to_pdfc                 O   s6   t d |  }| t|dddd}| |d}|S )uu   
        Сохраняет HTML -> DOCX

        :return: Данные docx в виде строки base64
        r"   r#   r$   r&   r'   docxr+   )r   r0   r1   r2   r3   r5   r   r   r   save_to_docxB   s
    z"CmfPluginConvertMixin.save_to_docx)	html_textr!   c           	   
   C   s~   ddl m} ddlm} | }| }t J}| ||}||| t }|	| |
d | W  5 Q R  S Q R X dS )ud   
        Преобразует HTML -> DOCX

        :return: Данные в байтах
        r   )Document)
HtmlToDocxN)r7   r:   Zhtmldocxr;   r   _handle_view_htmlZadd_html_to_documentioBytesIOsaveseekgetvalue)	r   r9   r:   r;   ZdocumentZ
new_parsertmp_dir_namer2   	docx_filer   r   r   html_to_docxP   s    

z"CmfPluginConvertMixin.html_to_docx)r   r!   c                 C   s   t |  S )up   
        Преобразует байты в строку base64

        :return: Строка base64
        )base64Z	b64encodedecode)r   r   r   r   _get_base64d   s    z!CmfPluginConvertMixin._get_base64)valuer!   c                 C   sD   |  dr(td t|  dd }nt|  ddt }|S )u?  
        Метод масштабирует значение ширины под формат А4 и переводит его в пиксели
        :param value: Строка значения ширины в % или пикселях
        :return: pixels: Число с плавающей точкой
        %d    px)endswithA4_PAGE_WIDTH_PXfloatstripreplaceSCALE_A4)rH   Zpixelsr   r   r   _get_value_in_pixelsm   s    
z*CmfPluginConvertMixin._get_value_in_pixelsc                 C   sx   t | jd dd}t | jd dd}||krt|| }|d }| d| jd< ||  d| jd< dS )u   
        Метод масштабирует изображение под ширину ячейки таблицы
        :param img: Тег изображения
        :param cell_width: Ширина ячейки
        widthrL   rK   heightg)\(@N)rO   attrsgetrP   rQ   )imgZ
cell_widthZ	img_widthZ
img_heightproportion_ratior   r   r   _auto_size_img_for_cellz   s    z-CmfPluginConvertMixin._auto_size_img_for_cellc                 C   s  |   }|jddD ]}||d q|dD ]"}t|jdk r4||d q4| | | | | 	| | 
| | | | | | | |jddd}|jd	d
d}d|_|d|d |j|jddd |j| ||d |j| t|S )u   
        Обработка страницы html для сохранения

        :param html_text: Страница html
        :return: Обработанная страница html
        spoiler-iconclass_p   brr2   zru-RU)langstyletext/csstypea  
        @page { size: 21.0cm 29.7cm; margin: 1cm }
        body {
            font-family: Arial, Helvetica, FreeSans, 'Liberation Sans', sans-serif;
            font-size: 10pt;
            line-height: 1.2;
        }
        td { page-break-inside: avoid !important; }
        tr { page-break-after: avoid !important; }
        td p { margin-top: 0.2cm; margin-bottom: 0.2cm }
        r   headmetazUTF-8)charsetbody)handle_include_pagefind_allreplace_withnew_taglencontentsappend_handle_html_card_preview_handle_html_svg_to_png_handle_html_img_handle_html_infopanel_handle_html_layout_handle_html_table_handle_html_cleanstringinsertrf   ri   str)r   soupspanr^   r2   rb   r   r   r   r-      s,    






z"CmfPluginConvertMixin._handle_htmlNc           
      C   s   ddl m} |dkrt }| dg | jjr6| jjnd}||d}|}|| jj |jddD ]V}|j	
d	}|r||krtjj
|d
}|r||}	||	 q|  qb|  qb|S )u  
        Подгружает html text из Include страницы
        :param parent_pages: ID родителей страницы для проверки на зацикливание
        :return: bs4.BeautifulSoup soup: Объект библиотеки
        r   BeautifulSoupNtextrK   zhtml.parserzmacros-include-pager\   zdata-param-pageid)id)bs4r~   setload_fieldsr   rH   addr   rk   rV   rW   modelsZCmfDocumentrj   rl   	decompose)
r   Zparent_pagesr~   r9   r{   ZpagesZinclude_pageZpage_idZinclude_documentZinclude_htmlr   r   r   rj      s$    



z)CmfPluginConvertMixin.handle_include_pagec                 C   s   | j ddD ]z}|d}d|jd< |jdd| d}|jdd| d}| d}|| || || || qd	S )
u  
        Метод парсит DIV вложения и оставляет в нем только нужные теги: изображение, имя файла и дата

        :param bs4.BeautifulSoup soup: Объект библиотеки
        zapp-tinymce-card-previewr\   rX   Z150pxrT   zapp-tinymce-file-name-viewdivzapp-tinymce-file-create-viewN)rk   findrV   wraprm   rp   rl   )r{   ZpreviewrX   r   Zfile_creater   r   r   r   rq      s    





z/CmfPluginConvertMixin._handle_html_card_previewc              	   C   s  ddl }ddlm} |dD ]Z}z$d}|jdd }rz|jd}dd	d
| jjgdd
| dgg}t	j
j|dgd}|r|jd|jjd}	n|jd}
|jd}|jd}|r| }|d |jd< |d |jd< |jt|d}| |}|
r|s|t|}	|	j\}
}|jdd| t|
t|d}	||	 W q tk
rx   dt| }t| Y qX qdS )ud  
        Метод заменяет тег SVG тегом IMG с изображением в PNG.
        Конвертирует SVG в PNG, если SVG в диаграммах DrawIO, то сначала пытается найти готовый PNG диаграммы
        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   NImagesvgzdrawio-contentr\   zdata-drawio-titleZANDZ	parent_id==r   z.pngurlfilterZfieldsrX   )srcrT   rU   viewbox      )Z
bytestringzdata:image/png;base64,)r   rT   rU   u3   Не удалось заменить SVG на PNG: )cairosvgPILr   rk   find_parentrV   rW   r   rH   r   CmfAttachmentrm   r   splitZsvg2pngrz   rG   r   r=   r>   sizerl   	Exceptionlogging	exception)r   r{   r   r   r   
attachmentZdrawioZdrawio_titler   rX   rT   rU   r   Zsvg_sizeZimg_byteZ
img_base64err_msgr   r   r   rr      s>     

 z-CmfPluginConvertMixin._handle_html_svg_to_pngc                 C   sx  ddl m} ddl}| P}|dD ]<}|jd}|jd}|r|drttd t	|
 dd	 }nt	|
 d
d	}|r|drtd t	|
 dd	 }nt	|
 d
d	}|jd}|sq*|dtj s|dtj dr.|dtj d	}|dtj dd	}|dr:|dd}t|}	tjjdd|	gdgd}
|
rzt|
j}nt|	dtj}| sttjd }z\||}|j\}}t|d4}| | }|j }d| d| |jd< W 5 Q R X W n8 tk
r8   ||j  t!"d| d Y q*Y nX |drhzt#j|dd}|j$dkr||%d d! d }|d"krd#}| |j&}d| d| |jd< t| d$t'( d%d | }t|d&}|)|j& W 5 Q R X ||}|j\}}W nh tk
rf } zH|*d'}d(d)i|_d*|_+|| t!"d+ t,d,|  W Y q*W 5 d}~X Y nX |r|s|| }|| }|r|s|| }|| }|s|s|}|}|| }|t- }|| }|t.ks|dkr|rt.| nd!}t.}|t/|9 }| d
|jd< | d
|jd< |d(r*d-|d( kr*|j*d.d/d0}|j*d1|j}|0| || q*W 5 Q R X dS )2u#  
        Метод заменяет адрес картинки на base64 и масштабирует размер изображения под формат А4 относительно исходного

        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   r   NrX   rT   rU   rI   rJ   rK   rL   r   zhttps://zhttp://z:8080/z%25r   r   r   r   /files/common/static/file-outline.pngrbdata:image/z;base64,u	   Файл u/    не является изображениемhttp)r_      )timeout   r   r_   )ZpngZbmpZgifZtiffZtifZjpegZjpgz/imgz%Y%m%d-%H%M%Szwb+r^   rb   z0color: red; font-style: italic; font-size: 10pt;u?   Не удалось отобразить изображениеuL   Не удалось скачать изображения документаuN   Не удалось скачать изображения документа: zmargin-left: auto;r|   z text-align: center; width: 100%;rb   )rX   )1r   r   tempfiler   rk   rV   rW   rM   WEB_PAGE_WIDTH_PXrO   rP   rQ   
startswithconfigZAPP_FQDNr   unquoter   r   r   full_path_file
UPLOAD_DIRr   PROJECT_DIRr   r   rG   readformatlowerr   rl   r   r   r   requestsstatus_coderfindr   r   Znowr   rm   rx   r,   rR   rN   absrp   )r   r{   r   r   tmp_dirZimg_tagrT   rU   r   url_pathr   Zattach_pathrX   Zwidth_originalZheight_originalZattachment_byteZattach_base64Z	mime_typeresZextension_imgr   fpeZtag_iZscalerY   coefficientZimg_wrapperZ	clone_imgr   r   r   rs     s    

*




$






 
z&CmfPluginConvertMixin._handle_html_imgc                 C   s  | j ddD ]}| jdddddd}|| jddd	 |j| jd
dd |jj| jddd	 |jd}|dkrd|jjjd< nx|dkrd|jjjd< n`|dkrd|jjjd< nH|dkrd|jjjd< n0|dkrd|jjjd< n|dkrd|jjjd< |jdd}d|jjd< d|jjd< |jdd}|jjj	|j |jjj	d  |jjj	| jd!d"d#d$ |jjj	j
|j	j || qd%S )&u   
        Подменяет инфопанели. Создает панели в виде table вместо div
        :param bs4.BeautifulSoup soup: Объект библиотеки
        :return:
        zak-editor-panelr\   tabler	   0zbackground: transparent)rT   cellpaddingcellspacingrb   trr   td)rT   r^   z$orphans: 0; widows: 0; margin: 0.2cmzdata-panel-typeZnotez/background: #eae6ff; border: none; padding: 0cmrb   infoz/background: #deebff; border: none; padding: 0cmsuccessz/background: #e3fcef; border: none; padding: 0cmalarmz/background: #ffebe6; border: none; padding: 0cmerrorZwarningz/background: #fffae6; border: none; padding: 0cmzak-editor-panel__iconZ	absmiddleZalignborderzak-editor-panel__content font3zfont-size: 12pt)r   rb   N)rk   rm   rp   r   r   rV   rW   r   rX   r^   r   rx   rl   )r{   Zpanelr   Z
panel_typeZiconr   r   r   r   rt     s6    
z,CmfPluginConvertMixin._handle_html_infopanelc                 C   s  ddddddddd	d
dddddddddd}| dD ]}i }|jddd}|r\|| |dddD ]&}|rn|d\}}| || < qn|dr|ddtkr|dt}	|dttkr|	|d< n
t |d< d|d< |dsd|d< |d sd|d < |d!s"d"|d!< |d#s>|d#d$|d#< i }
|jd%k	rt	|jj
d&d'D ]P\}}|jdddD ]0}d|krz|d\}}| |}||
|< qzq^|j  t|
 }| d(D ]}d&}d)}| |d}	| d*d+gD ]}i }d,|d!< |d-r4|jd-}|||d.< |dddD ]*}|rF|d\}}| || < qF|tkrd/}n|
s|dp|d }r| |}nX|
| }|d0 }r t|d& t|| D ]}||
| 7 }q|t|7 }n|d&7 }|r~|  }d1}|D ](}|jrt|jd2kr|} qHq| d3|d< |	|8 }	| d4D ]}| || qhn|d&7 }q|d)kr|	| }|j d*dd%id5D ]2}| d3|d< | d4D ]}| || qʐqqq6d%S )6u  
        Функция добавляет стиль для таблиц
        Для конвертирования таблиц в LibreOffice используем inline style

        :param bs4.BeautifulSoup soup: Объект библиотеки
        z#e3fcefz#e6fcffz#b3d4ffz#fffae6z#ffebe6z#eae6ffz#f4f5f7z#b3f5ffz#abf5d1z#ffc400z#fff0b3z#ffbdadz#c0b6f2z#b3bac5z#4c9affz#79e2f2z#57d9a3z#ff8f73z#998dd9)zLight greenz
Light tealZBluezLight yellowz	Light redzLight purplez
Light grayZTealZGreenzDark yellowZYellowZRedZPurpleZGrayz	Dark Bluez	Dark tealz
Dark greenzDark redzDark purpler   r   ztableView-content-wrapr\   rb   rK   ;:rT   r   r   r   Zbordercolorz#eeeeeer   1Nr_   )startr   r   r   thZnonezdata-highlight-colorZbgcolor   colspan
   z[<br/>]rL   rX   )rV   )rk   r   rl   rW   r   rP   FULL_SCREEN_VALUErN   Zcolgroup	enumeratechildrenrV   rS   r   sumvaluesZhas_attrrangeintro   rz   rZ   )r   r{   Zcell_colorsr   Zstyle_table_dictparentparamsr   rH   Ztable_widthZ
cols_widthZcol_numcolZwidth_pxZcols_sumr   	nums_colsZ
table_cellZtd_styleZtable_cell_color_nameZtd_widthr   iZtable_cell_childrenZtable_cell_widthZtable_cell_childrX   r   r   r   rv     s    









z(CmfPluginConvertMixin._handle_html_tablec                    s   ddl m  | dddiD ]}d|d< d|_| d	} fd
d|jD }t|}td| d}|D ]*}d|_|d| d|d< |	| qf|	| qdS )u   
        Функция добавляет стиль для макета, используем table, так как flex не поддерживается в LibreOffice

        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   Tagr   zdata-layout-sectiontruer	   rT   r   r   c                    s   g | ]}t | r|qS r   )
isinstance.0elr   r   r   
<listcomp>4  s     
 z=CmfPluginConvertMixin._handle_html_layout.<locals>.<listcomp>rJ   r   r   zdata-column-widthrI   N)
r   r   rk   r   rm   r   rn   roundrW   rp   )r{   Zlayoutr   columnsr   Zwidth_columncolumnr   r   r   ru   &  s    
z)CmfPluginConvertMixin._handle_html_layoutc                 C   s"   | j ddgdD ]}|  qdS )u   
        Метод очищает HTML от лишних тегов

        :param bs4.BeautifulSoup soup: Объект библиотеки
        ztable-context-menuzcell-dropbox-buttonr\   N)rk   r   )r{   tagr   r   r   rw   =  s    z(CmfPluginConvertMixin._handle_html_clean)r9   tmp_pathr!   c           !   
   C   s  ddl m}m} ddlm} || }g }|dD ]>}d|jddkrZ|t	|dd	 |jd
s2d|jd
< q2|dD ]}|t	|dd	 q||dD ]}|
  q|dD ]}|
  qt|D ]\}}	|	d }|jdd}
|jdd}|jd}|dr|d\}}|dd}|dd}t|d| d|  }t|d$}|t| t||jd< W 5 Q R X |dr
t|}tjjddtjgdgd}|rt|j}nt|dtj}| r
t||jd< |
s
||}|j\}
}d}tdd d! t|
D }|d"rBttj d# }|!d$d%kr\t"|n|!d$}||!d| }t#|}|j$d&kr4t|}|d'| |  % }t|d}||j& W 5 Q R X z>||}|j\}
}t||jd< |r|n|
r|
n|}W n$ |k
r0   t||jd< Y nX nt||jd< ||krP|n|}|r|| rj|| nd(}||jd< tdd)d! t|D } t| | |jd< qt|S )*u   
        Функция заменяет адрес картинки, файла на фактический

        :return: HTML с фактическими адресами картинок, файлов
        r   )r   UnidentifiedImageErrorr}   azcmf-fileclassrK   r   )objre   ZhrefrX   Zimagerb   titler   rT   rU   r   z
data:image,r   z;base64Zfile_r   r   r   r   r   r   r   i  c                 s   s   | ]}|  r|V  qd S Nisdigitr   r   r   r   	<genexpr>  s      z:CmfPluginConvertMixin._handle_view_html.<locals>.<genexpr>r   r   ?r   Zname_r_   c                 s   s   | ]}|  r|V  qd S r   r   r   r   r   r   r     s      )'r   r   r   r   r~   rk   rV   rW   rp   dictr   r   r   r   rQ   r   r   r   rE   Z	b64decoderz   r   r   r   r   r   r   r   r   r   r   r   r   r   rn   r   r   Zresolver   )!r9   r   r   r   r~   r{   r   r   indexZ_filerT   rU   Zfull_urlZtype_imgZb64dataZ	name_fileZfile_imgr   r   Zattachment_pathrX   Zwidth_defaultZwidth_valueZpath_defaultZend_nameZfile_extensionZresponser   filepathr   Z	width_newr   Zheight_valuer   r   r   r<   G  s    





"



z'CmfPluginConvertMixin._handle_view_htmlc              
   C   s  ddl m}m} ddlm} tjd||fd}tj	tj
tjtdd}tj
|ddd	d
dd}| }d|_|  |dd| |d ||}|dD ]}	d|	jd< q|dD ]}	d|	jd< d|	jd< qt 0}
|| | |
 t| W  5 Q R  S Q R X dS )uw   
        Конвертирует HTML -> PDF

        :return: Возвращает байты PDF файла
        r   )FPDF	HTMLMixinr}   	_HTML2PDF)basesz..modulesZappZassetsZfontsz	noto-sanszNotoSans-Regular.ttfr#   ZNotoSansrK   r   r	   rT   r   Z100r   r   N)Zfpdfr   r   r   r~   types	new_classr   r   abspathr   dirname__file__Zcore_fonts_encodingZadd_pageZadd_fontZset_fontZfindAllrV   r   Z
write_htmlr<   Zprettifyr/   output)r   r9   r   r   r~   r   Z	path_fontr*   r{   r   rB   r   r   r   html_to_pdf  s&     

z!CmfPluginConvertMixin.html_to_pdf)	path_docxr!   c              
   C   sH   ddl m} tj|rDt|d}||}|jW  5 Q R  S Q R X dS )u7   
        Конвертирует DOCX -> HTML
        r   )convert_to_htmlr   N)Zmammothr
  r   r   r   r   rH   )r   r	  r
  rC   resultr   r   r   docx_to_html  s
    z"CmfPluginConvertMixin.docx_to_html)path_imgr4   r!   c                 C   s   t | | dS u5   
        Конвертирует PDF -> PNG
        N)r   pdf_bytes_to_imgr  r4   r   r   r   r    s    z&CmfPluginConvertMixin.pdf_bytes_to_img)path_pdfr  r!   c                 C   s   t | | dS r  )r   
pdf_to_img)r  r  r   r   r   r    s    z CmfPluginConvertMixin.pdf_to_img)	path_htmlr  r!   c              	   C   sB   t j|r>t|d"}| | }| j||d W 5 Q R X dS )u6   
        Конвертирует HTML -> PNG
        rr  N)r   r   r   r   r  r   r  )r   r  r  	file_htmlr4   r   r   r   html_to_img  s    z!CmfPluginConvertMixin.html_to_img)	path_xlsxr  r!   c                 C   s   ddl m } ||| dS )u7   
        Конвертирует XLSX -> HTML
        r   	xlsx2htmlNr  )r   r  r  r  r   r   r   xlsx_to_html  s    z"CmfPluginConvertMixin.xlsx_to_html)r  path_pngr!   c                 C   s$   ddl m} ||}|| dS )u<   
        Сохранение в формате PNG
        r   r   N)r   r   r   r?   )r   r  r  r   rX   r   r   r   save_img  s    
zCmfPluginConvertMixin.save_imgc              
      s  ddl m} ddlm} ddlm  ddlm ||ddd}| }| }tt	|D ]}|
|| }	|dkr|j}
|| |
_n|j|| d}
|	jD ]*}|\}}}}|
j|d	 ||d	 |d
 q fddt|	jD ],}|
fdd|	j||	|dD  qqZ|| dS )u6   
        Конвертирует XLS -> XLSX
        r   )workbook)open_workbook)XL_CELL_DATE)xldate_as_tupleT)Zformatting_infoZragged_rows)r   r_   )Z	start_rowZend_rowZstart_columnZ
end_columnc                    sJ   | j }| j krF|d}|dd dkr>tj|dd   }nt| }|S )Nr   r   )r   r   r   )rH   Zctyper   time)cellrH   Zdatetime_tup)r  r   r   r   _get_xlrd_cell_value  s    

z?CmfPluginConvertMixin.xls_to_xlsx.<locals>._get_xlrd_cell_valuec                 3   s   | ]} |V  qd S r   r   )r   r"  )r#  r   r   r     s   z4CmfPluginConvertMixin.xls_to_xlsx.<locals>.<genexpr>)Zend_colxN)Zopenpyxlr  Zxlrdr  r  r   ZWorkbooksheet_namesr   rn   Zsheet_by_nameZactiver   Zcreate_sheetZmerged_cellsZmerge_cellsZnrowsrp   Z	row_sliceZrow_lenr?   )r   Zpath_xlsr  r  r  Zbook_xlsZ	book_xlsxr$  Zsheet_indexZ	sheet_xlsZ
sheet_xlsxZcrangeZrloZrhiZcloZchirowr   )r  r#  r   r   xls_to_xlsx  s2    
 
z!CmfPluginConvertMixin.xls_to_xlsx)dataoutput_pathsuffixr!   c                 C   s   t | || dS )u(  
        Конвертация данных в PDF через libreoffice
        :param data: Данные файла в виде байт
        :param output_path: Путь сохранения итогового pdf файла
        :param suffix: Расширение файла
        N)r   
obj_to_pdf)r'  r(  r)  r   r   r   r*     s    z CmfPluginConvertMixin.obj_to_pdfrK   )r'  r)  mimetyper!   c              
   C   sZ  ddl }ddlm} | ||d|}| @}t|d }t|d}	|	| | t	|}
W 5 Q R X W 5 Q R X |j
|
ddd	d
}|dd}||}|d}|rR|d}|rR| }|jddD ]}|dd}d}|d D ]T}|d| }|||d d d }|||d d }|||| 7 }q||  |d< qt	|S )u  
        Конвертация данных в HTML через libreoffice

        :param data: Данные файла источника в виде байт
        :param suffix: Расширение файла источника

        :return: Строка HTML
        r   Nr}   r2   z	file.htmlr   ignore)errors u   �u   rK   rf   rb   Tr\   r   r   {r_   })r   r   r~   r.   r   r   r   r   get_encoding_typerz   rF   rQ   r   Zget_textrk   rW   )r   r'  r)  r+  r   r~   Z
bytes_htmlr   Zfull_path_htmlr  r%   r9   r{   rf   rb   Z
style_textr   	style_tagZstyle_classZ	class_tagZstart_pos_classZstyle_startZ	style_endr   r   r   obj_to_html*  s4    	

"

z!CmfPluginConvertMixin.obj_to_html)r'  r)  	to_formatr+  r!   c              
   C   s\   zt | |||}W nB tk
rV } z$t|drBtddd n|W 5 d}~X Y nX |S )u*  
        Конвертация данных в HTML через libreoffice
        :param data: Данные файла в виде байт
        :param suffix: Расширение файла
        :param to_format: Формат файла который хотим получить
        u8   Не удалось конвертировать в htmlua   Импорт документов данного формата не поддерживаетсяT)abortN)r   r.   r   rz   r   r,   )r'  r)  r4  r+  Zconverted_dataerrr   r   r   r.   R  s    z#CmfPluginConvertMixin.obj_to_format)	path_filer!   c              
   C   s   ddl m} | }t| d8}|D ]$}|| |jr"|jdr" qHq"|  W 5 Q R X |jd}|sddddd	d
dg}|D ]d}zFtj| d|d,}|	  |
d |}W 5 Q R  W  qW 5 Q R X W q tk
r   d}Y qX q|S )u   
        Определяем кодировку файла

        :param path_file: Путь к файлу
        :return: Кодировка файла
        r   )UniversalDetectorr   r%   r#   zwindows-1251zwindows-1250zwindows-1252asciiz
iso-8859-1latin1r  r$   )Zchardet.universaldetectorr8  r   ZfeedZdoner  rW   closer=   	readlinesr@   UnicodeDecodeError)r7  r8  Zdetectorr   liner%   	encodingsZformat_encodingr   r   r   r1  e  s*    

z'CmfPluginConvertMixin.get_encoding_typec                 C   s   ddl m} | dg || jj}|d}|jddd}d|_|j| |jj	| |j
d	d
D ]}||d qh|
dD ]"}t|jdk r||d q| | | | | | | | | | | | | | t|S )Nr   r}   text_renderrf   rb   rc   rd   zg@page { size: 21.0cm 29.7cm } td,th { padding: 0.45cm; } td p,th p { margin: 0;word-break: break-all; }r[   r\   r^   r_   r`   )r   r~   r   r@  rH   rm   rx   r2   rp   rf   rk   rl   rn   ro   rq   rr   rs   rt   ru   rv   rw   rz   )r   r~   r{   Zhead_tagr2  r|   r^   r   r   r   prepare_document_to_docx  s*    







z.CmfPluginConvertMixin.prepare_document_to_docxc                 C   s<   |   }| t|dddd}| |dd}| |d}|S )Nr#   r$   r&   r'   r(   r)   r*   rA  r.   r/   r    )r   prepared_htmlr3   r4   r5   r   r   r   export_to_pdf  s
    z#CmfPluginConvertMixin.export_to_pdfc                 C   s.   |   }| t|dddd}| |d}|S )Nr#   r$   r&   r'   r7   rB  )r   rC  r3   r5   r   r   r   export_to_docx  s    z$CmfPluginConvertMixin.export_to_docx)N)rK   )rK   )(__name__
__module____qualname____doc__r/   rz   r    r6   r8   rD   staticmethodrG   rO   rS   rZ   r-   rj   rq   rr   rs   rt   rv   ru   rw   r<   r  r  r  r  r  r  r  r&  r*  r3  r.   r1  rA  rD  rE  r   r   r   r   r
      s\   
2
!)p
%v	[		+	(!#r
   )rE   Zhashlibr=   pathlibr   r   r   typingr   Zurllibr   r   r  r   Zcmf.includeZrdiskr   r   rN   rR   r   r
   r   r   r   r   <module>   s    