B
    'f                 @   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dZG dd dZdS )    N)Path)TemporaryDirectory)Dict)parse)datetime)*)RFilei  i  gHzG?z100%c               @   s,  e Zd ZdZddddg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dXd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/d0Zeed1d2d3Zeeedd4d5d6Zeeedd7d8d9Zeedd:d;d<Zeedd=d>d?Zeedd@dAdBZ dd	dCdDZ!eeeeddEdFdGZ"dYeeeedIdJdKZ#edZeeeeedLdMdNZ$eeedOdPdQZ%ed	dRdSZ&dTdU Z'dVdW Z(dS )[CmfPluginConvertMixinuO   
    Используется в классах CmfDocument, CmfAttachment
    save_to_pdfsave_to_docxexport_to_docxexport_to_pdf)content	extensionc       	   	   C   s   ddl m} tj| jj}|| d| j d| }t	j
| dd}t	j
|sbt	| t	j
||}t|d}|| W dQ R X t	j
d	|  d|}t|S )
up  
        Метод сохраняет файл директорию объекта и возвращает путь для скачивания
        :param content: Контент в байт
        :param extension: Расширение файла
        :return: file_path: Строка пути с кодированием символов для URL
        r   )cmfutil_.TZexportwbNfiles)Zcmf.utilr   modelsCmfDocumentZ_get_filenamenamevalueZtranslit_stripcodeospathjoinZget_files_direxistsmakedirsopenwriter   Zquote)	selfr   r   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
        u!   УСТАРЕВШАЯ ВЕРСИЯzutf-8)encodingz.htmlzdocx:MS Word 2007 XMLz.docxz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&   r
   ;   s    z!CmfPluginConvertMixin.save_to_pdfc             O   s6   t d |  }| t|dddd}| |d}|S )uu   
        Сохраняет HTML -> DOCX

        :return: Данные docx в виде строки base64
        u!   УСТАРЕВШАЯ ВЕРСИЯzutf-8)r)   z.htmlzdocx:MS Word 2007 XMLdocx)r+   r,   r-   r.   r'   )r!   r/   r0   r1   r2   r4   r%   r%   r&   r   K   s
    z"CmfPluginConvertMixin.save_to_docx)	html_textr(   c       	   	   C   sr   ddl m} ddlm} | }| }t >}| ||}||| t }|	| |
d | S Q R X dS )ud   
        Преобразует HTML -> DOCX

        :return: Данные в байтах
        r   )Document)
HtmlToDocxN)r5   r7   Zhtmldocxr8   r   _handle_view_htmlZadd_html_to_documentioBytesIOsaveseekgetvalue)	r!   r6   r7   r8   ZdocumentZ
new_parsertmp_dir_namer1   	docx_filer%   r%   r&   html_to_docxY   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_base64m   s    z!CmfPluginConvertMixin._get_base64)r   r(   c             C   s   |  dr(td t|  dd }n\|  drPt|  ddt t }n4|  drtt|  ddt }ntdt t }|S )u?  
        Метод масштабирует значение ширины под формат А4 и переводит его в пиксели
        :param value: Строка значения ширины в % или пикселях
        :return: pixels: Число с плавающей точкой
        %d    ptpx)endswithA4_PAGE_WIDTH_PXfloatstripreplacePT_TO_PXSCALE_A4)r   Zpixelsr%   r%   r&   _get_value_in_pixelsv   s    


z*CmfPluginConvertMixin._get_value_in_pixelsc             C   s   | j dr| j dsdS t| j d dd}t| j d dd}||kr|| }|d }| d| j d< ||  d| j d< dS )u   
        Метод масштабирует изображение под ширину ячейки таблицы
        :param img: Тег изображения
        :param cell_width: Ширина ячейки
        widthheightNrI   rG   g)\(@)attrsgetrL   rM   rN   )imgZ
cell_widthZ	img_widthZ
img_heightproportion_ratior%   r%   r&   _auto_size_img_for_cell   s    z-CmfPluginConvertMixin._auto_size_img_for_cellc             C   s   |   }x$|jddD ]}||d qW x0|dD ]"}t|jdk r:||d q:W | | | | | 	| | 
| | | | | | | |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
        zspoiler-icon)class_p   brr1   zru-RU)langstylez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insertr`   rc   str)r!   soupspanrZ   r1   r^   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 xf|jddD ]V}|j	
d	}|r||krtjj
|d
}|r||}	||	 q|  qd|  qdW |S )u  
        Подгружает html text из Include страницы
        :param parent_pages: ID родителей страницы для проверки на зацикливание
        :return: bs4.BeautifulSoup soup: Объект библиотеки
        r   )BeautifulSoupNtextrG   zhtml.parserzmacros-include-page)rY   zdata-param-pageid)id)bs4rw   setload_fieldsrx   r   addry   re   rT   rU   r   r   rd   rf   	decompose)
r!   Zparent_pagesrw   r6   ru   ZpagesZinclude_pageZpage_idZinclude_documentZinclude_htmlr%   r%   r&   rd      s$    


z)CmfPluginConvertMixin.handle_include_pagec             C   s   x| j ddD ]z}|d}d|jd< |jdd| d}|jdd| d}| d}|| || || || qW d	S )
u  
        Метод парсит DIV вложения и оставляет в нем только нужные теги: изображение, имя файла и дата

        :param bs4.BeautifulSoup soup: Объект библиотеки
        zapp-tinymce-card-preview)rY   rV   Z150pxrR   zapp-tinymce-file-name-viewdivzapp-tinymce-file-create-viewN)re   findrT   wraprg   rj   rf   )ru   ZpreviewrV   r"   Zfile_creater   r%   r%   r&   rk      s    





z/CmfPluginConvertMixin._handle_html_card_previewc          	   C   s  ddl }ddlm} x|dD ]}yld}|jdd}|r~|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< d}xB|jdt|idD ](}|jd}d}t||||jd< qW |jt|d}| |}|
rP|sj|t|}	|	j\}
}|jdd| t|
t|d}	||	 W q" tk
r   dt| }t| Y q"X q"W dS )ud  
        Метод заменяет тег SVG тегом IMG с изображением в PNG.
        Конвертирует SVG в PNG, если SVG в диаграммах DrawIO, то сначала пытается найти готовый PNG диаграммы
        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   N)Imagesvgzdrawio-content)rY   zdata-drawio-titleZANDZ	parent_idz==r   z.pngurl)filterfieldsrV   )srcrR   rS   viewbox      z"rgb\((\d+)[\s,]+(\d+)[\s,]+(\d+)\)fill)rT   zrgb(\1, \2, \3))Z
bytestringzdata:image/png;base64,)r   rR   rS   u3   Не удалось заменить SVG на PNG: )cairosvgPILr   re   find_parentrT   rU   ry   r   r   CmfAttachmentrg   r   splitrecompilesubZsvg2pngrt   rD   r   r:   r;   sizerf   	Exceptionlogging	exception)r!   ru   r   r   r   
attachmentZdrawioZdrawio_titler   rV   rR   rS   r   Zsvg_sizepatternZtag_with_fillZrgbreplZimg_byteZ
img_base64Zerr_msgr%   r%   r&   rl     sF     

z-CmfPluginConvertMixin._handle_html_svg_to_pngc       "      C   s|  ddl m} ddl}| T}xJ|dD ]:}|jd}|jd}|rtdd|	d	d
}|
drtd t|	dd }nt|}|rtdd|	d	d
}|
drtd t|	dd }nt|}|jd}|sq.|dtj s|dtj dr>|	dtj d}|	dtj dd}|dr|jd}	|	dd}t|}
t|
j}|	rtjj|	dgd}n*ddd|gdd|
jgg}tjj|dgd}|rt|j}nt|	dtj}| sttjd }y\||}|j\}}t|d4}| | }|j  }d| d| |jd< W dQ R X W n6 t!k
r   |"|j# t$%d| d  w.Y nX |d!ryt&j|d"d#}|j'd$kst(d%|j' ||)d
d& d }|d'krd(}| |j*}d| d| |jd< t| d)t+, d*d
| }t|d+}|-|j* W dQ R X ||}|j\}}W nb t!k
r } zB|.d,}d-d.i|_d/|_/|"| t$%d0 t0d1|  w.W dd}~X Y nX |d2rjy6td3d|}t12|}|t34|}|j\}}W nb t!k
rh } zB|.d,}d-d.i|_d/|_/|"| t$%d4 t0d5|  w.W dd}~X Y nX |r|s|| }|| }|r|s|| }|| }|s|s|}|}|| }|t5 }|| }|t6ks|dkr|rt6| nd&}t6}|t7|9 }| d6|jd< | d6|jd< |d-r.d7|d- kr.|j.d8d9d:} |j.d;|j}!| 8|! |"|  q.W W dQ R X dS )<u#  
        Метод заменяет адрес картинки на base64 и масштабирует размер изображения под формат А4 относительно исходного

        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   )r   NrV   rR   rS   z[^0-9|%|\.]rG   ,r   rE   rF   r   zhttps://zhttp://z:8080/zdata-attach-idz%25r   )ry   r   ORr   z==)r   r   z/files/zcommon/static/file-outline.pngrbzdata:image/z;base64,u	   Файл u/    не является изображениемhttp)r[      )Ztimeout   u2   Код статуса ответа сервера r[   )ZpngZbmpZgifZtiffZtifZjpegZjpgz/imgz%Y%m%d-%H%M%Szwb+rZ   r^   z0color: red; font-style: italic; font-size: 10pt;u?   Не удалось отобразить изображениеuL   Не удалось скачать изображения документаuN   Не удалось скачать изображения документа: z
data:imagez^data:image/.+;base64,uG   Не удалось конвертировать изображениеuI   Не удалось конвертировать изображение: rI   zmargin-left: auto;rv   z text-align: center; width: 100%;)r^   )rV   )9r   r   tempfiler   re   rT   rU   r   r   rN   rJ   WEB_PAGE_WIDTH_PXrL   
startswithconfigZAPP_FQDNr   Zurlparseunquoter   r   r   r   full_path_file
UPLOAD_DIRr   PROJECT_DIRr   r   rD   readformatlowerr   rf   r   r   r   requestsstatus_codeAssertionErrorrfindr   r   Znowr    rg   rr   r+   rB   	b64decoder:   r;   rP   rK   absrj   )"r!   ru   r   r   tmp_dirZimg_tagrR   rS   r   Z	attach_idr   Zurl_path_unquoter   Z_filterZattach_pathrV   Zwidth_originalZheight_originalZattachment_byteZattach_base64Z	mime_typeZresZextension_imgr$   fpeZtag_iZimg_base64_dataZimg_byte_dataZscalerW   coefficientZimg_wrapperZ	clone_imgr%   r%   r&   rm   1  s    

*




$











z&CmfPluginConvertMixin._handle_html_imgc             C   s  x| j ddD ]t}| jddddd}|jd}|dkrHd	|jd
< nb|dkr\d|jd
< nN|dkrpd|jd
< n:|dkrd|jd
< n&|dkrd|jd
< n|dkrd|jd
< || jddd |j| jdddd |jdd}|dk	r |jr d|jjd< d|jjd< |jj	|jd g |jd!d}| jddd"d}| jd#d$d%d&}|	d'd( |j
D  |	|g |j	|g || qW dS ))u   
        Подменяет инфопанели. Создает панели в виде table вместо div
        :param bs4.BeautifulSoup soup: Объект библиотеки
        :return:
        zak-editor-panel)rY   tablez100%0)rR   cellpaddingcellspacingzdata-panel-typeZnotez/background: #eae6ff; border: none; padding: 0cmr^   infoz/background: #deebff; border: none; padding: 0cmsuccessz/background: #e3fcef; border: none; padding: 0cmalarmz/background: #feece5; border: none; padding: 0cmerrorZwarningz/background: #fffae6; border: none; padding: 0cmtrzbackground: transparent)r^   tdtopz1width: 36px; orphans: 0; widows: 0; margin: 0.2cm)Zvalignr^   zak-editor-panel__iconNZ	absmiddleZalignborder zak-editor-panel__contentz$orphans: 0; widows: 0; margin: 0.2cmZfont3zfont-size: 12pt)r   r^   c             S   s   g | ]}|d kr|qS )
r%   ).0r   r%   r%   r&   
<listcomp>  s    z@CmfPluginConvertMixin._handle_html_infopanel.<locals>.<listcomp>)re   rg   rT   rU   rj   r   r   rV   r   extendri   rf   )ru   Zpanelr   Z
panel_typeZiconZpanel_contentZtd_tagZtag_fontr%   r%   r&   rn     s<    

z,CmfPluginConvertMixin._handle_html_infopanelc              C   s  dd l }dddddddd	d
ddddddddddd}x|dD ]}i }|jddd}|rh|| x<|dddD ]&}|r||d\}}	|	 || < q|W |dr|ddtkr|dt}
|dttkr|
|d< n
t |d< d|d< |dsd |d< |d!s d |d!< |d"s4d#|d"< |d$sP|d$d%|d$< i }|j	d k	rzg }| 
|d}
t|j	d&}xt|j	jd'd(D ]\}}i }t||jjsqxB|jdddD ]*}|r|d\}}	|	 || < qW |d}	|	r&| 
|	}|||< |
|8 }
nd ||< || qW t|dkrp|
t| }x|D ]}|||< q^W |j	  tt| }xP|d)D ]@}d'}d}| 
|d}
x|d*d+gD ]}i }d,|d"< |d-r |jd-}|||d.< x@|dddD ]*}|r|d\}}	|	 || < qW |tkrRd/}n|s|dpl|d}|r| 
|}np||}|d0}|r|rx8t|d' t|| D ]}||krP ||| 7 }qW |t|7 }n|d'7 }|rj| }d1}x,|D ]$}|jrt|jd2kr|}P qW | d3|d< |
|8 }
x*|d4D ]}| || qRW n|d'7 }qW |dkr|
| }xL|jd*dd id5D ]6}| d3|d< x |d4D ]}| || qW qW qW qBW d S )6Nr   z#e3fcefz#e6fcffz#b3d4ffz#fffae6z#feece5z#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-wrap)rY   r^   rG   ;:rR   r   r   r   Zbordercolorz#eeeeeer   1colr[   )startr   r   thZnonezdata-highlight-colorZbgcolor   colspan
   z[<br/>]rI   rV   )rT   )rz   re   r   rf   rU   r   rM   FULL_SCREEN_VALUErK   ZcolgrouprQ   rh   	enumeratechildren
isinstanceelementTagrT   rj   r~   roundsumvaluesZhas_attrrangeintri   rt   rX   ) r!   ru   rz   Zcell_colorsr   Zstyle_table_dictparentparamsr   r   Ztable_widthZ
cols_widthZcol_without_widthZ	col_countZcol_numr   Zstyle_col_dictZwidth_pxcZcols_sumr   	nums_colsZ
table_cellZtd_styleZtable_cell_color_nameZtd_widthr   iZtable_cell_childrenZtable_cell_widthZtable_cell_childrV   r%   r%   r&   rp     s    













z(CmfPluginConvertMixin._handle_html_tablec                s   ddl m  x| dddiD ]}d|d< d|_| d	} fd
d|jD }t|}td| d}x2|D ]*}d|_|d| d|d< |	| qjW |	| qW dS )u   
        Функция добавляет стиль для макета, используем table, так как flex не поддерживается в LibreOffice

        :param bs4.BeautifulSoup soup: Объект библиотеки
        r   )r   r   zdata-layout-sectiontruez100%rR   r   r   c                s   g | ]}t | r|qS r%   )r   )r   el)r   r%   r&   r     s    z=CmfPluginConvertMixin._handle_html_layout.<locals>.<listcomp>rF   r   r   zdata-column-widthrE   N)
rz   r   re   r   rg   r   rh   r   rU   rj   )ru   Zlayoutr   columnsr   Zwidth_columncolumnr%   )r   r&   ro   r  s    

z)CmfPluginConvertMixin._handle_html_layoutc             C   s&   x | j ddgdD ]}|  qW dS )u   
        Метод очищает HTML от лишних тегов

        :param bs4.BeautifulSoup soup: Объект библиотеки
        ztable-context-menuzcell-dropbox-button)rY   N)re   r~   )ru   tagr%   r%   r&   rq     s    z(CmfPluginConvertMixin._handle_html_clean)r6   tmp_pathr(   c       !   
   C   s  ddl m}m} ddlm} || }g }xL|dD ]>}d|jddkr\|t	|dd	 |jd
s4d|jd
< q4W x$|dD ]}|t	|dd	 qW x|dD ]}|
  qW x|dD ]}|
  qW xt|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 d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#rVttj d$ }|!d%d&krpt"|n|!d%}||!d| }t#|}|j$d'krHt|}|d(| |  % }t|d}||j& W dQ R X y>||}|j\}
}t||jd< |r|n|
r|
n|}W n$ |k
rD   t||jd< Y nX nt||jd< ||krd|n|}|r|| r~|| nd)}||jd< tdd*d" t|D } t| | |jd< qW t|S )+u   
        Функция заменяет адрес картинки, файла на фактический

        :return: HTML с фактическими адресами картинок, файлов
        r   )r   UnidentifiedImageError)rw   azcmf-fileclassrG   r#   )objr_   ZhrefrV   Zimager^   titler   rR   rS   r   z
data:imager   zdata:image/z;base64Zfile_r   r   Nz/files/r   z==r   )r   r   i  c             s   s   | ]}|  r|V  qd S )N)isdigit)r   r   r%   r%   r&   	<genexpr>  s    z:CmfPluginConvertMixin._handle_view_html.<locals>.<genexpr>r   zcommon/static/file-outline.png?r   Zname_r[   c             s   s   | ]}|  r|V  qd S )N)r   )r   r   r%   r%   r&   r     s    )'r   r   r   rz   rw   re   rT   rU   rj   dictr~   r   r   r   rN   r   r   r    rB   r   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   r   Zresolver   )!r6   r   r   r   rw   ru   r   r   indexZ_filerR   rS   Zfull_urlZtype_imgZb64dataZ	name_fileZfile_imgZurl_pathr   Zattachment_pathrV   Zwidth_defaultZwidth_valueZpath_defaultZend_nameZfile_extensionZresponser   filepathr#   Z	width_newr   Zheight_valuer%   r%   r&   r9     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 ||}x|dD ]}	d|	jd< qW x&|dD ]}	d|	jd< d|	jd< qW t $}
|| | |
 t| S Q R X dS )uw   
        Конвертирует HTML -> PDF

        :return: Возвращает байты PDF файла
        r   )FPDF	HTMLMixin)rw   	_HTML2PDF)basesz..modulesZappZassetsZfontsz	noto-sanszNotoSans-Regular.ttfzutf-8ZNotoSansrG   r   z100%rR   r   Z100r   r   N)Zfpdfr   r   rz   rw   types	new_classr   r   abspathr   dirname__file__Zcore_fonts_encodingZadd_pageZadd_fontZset_fontZfindAllrT   r   Z
write_htmlr9   Zprettifyr.   output)r!   r6   r   r   rw   r   Z	path_fontr*   ru   r   r?   r%   r%   r&   html_to_pdf  s&     

z!CmfPluginConvertMixin.html_to_pdf)	path_docxr(   c          	   C   s<   ddl m} tj|r8t|d}||}|jS Q R X dS )u7   
        Конвертирует DOCX -> HTML
        r   )convert_to_htmlr   N)Zmammothr  r   r   r   r   r   )r!   r   r  r@   resultr%   r%   r&   docx_to_html  s
    z"CmfPluginConvertMixin.docx_to_html)path_imgr3   r(   c             C   s   t | | dS )u5   
        Конвертирует PDF -> PNG
        N)r   pdf_bytes_to_img)r  r3   r%   r%   r&   r    s    z&CmfPluginConvertMixin.pdf_bytes_to_img)path_pdfr  r(   c             C   s   t | | dS )u5   
        Конвертирует PDF -> PNG
        N)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 dQ R X dS )u6   
        Конвертирует HTML -> PNG
        r)r  r3   N)r   r   r   r   r   r   r  )r!   r  r  	file_htmlr3   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   )	xlsx2htmlN)r  )r!   r  r  r  r%   r%   r&   xlsx_to_html0  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   rV   r%   r%   r&   save_img8  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}| }| }xtt	|D ]}|
|| }	|dkr|j}
|| |
_n|j|| d}
x4|	jD ]*}|\}}}}|
j|d	 ||d	 |d
 qW  fddx:t|	jD ],}|
fdd|	j||	|dD  qW q\W || 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   )r   Zctyper   Ztime)cellr   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 )Nr%   )r   r  )r  r%   r&   r   g  s   z4CmfPluginConvertMixin.xls_to_xlsx.<locals>.<genexpr>)Zend_colxN)Zopenpyxlr  Zxlrdr  r  r  ZWorkbooksheet_namesr   rh   Zsheet_by_nameZactiver   Zcreate_sheetZmerged_cellsZmerge_cellsZnrowsrj   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_xlsxA  s.    

"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  l  s    z CmfPluginConvertMixin.obj_to_pdfrG   )r  r  mimetyper(   c          
   C   sb  ddl }ddlm} | ||d|}| @}t|d }t|d}	|	| | t	|}
W dQ R X W dQ R X |j
|
ddd	d
}|dd}||}|d}|rZ|d}|rZ| }x|jddD ]}|dd}d}x`|d D ]T}|d| }|||d d d }|||d d }|||| 7 }qW ||  |d< qW t	|S )u  
        Конвертация данных в HTML через libreoffice

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

        :return: Строка HTML
        r   N)rw   r1   z	file.htmlr   ignore)errors u   �u   rG   r`   r^   T)rY   r   r   {r[   })r   rz   rw   r-   r   r   r   r    get_encoding_typert   rC   rN   r   Zget_textre   rU   )r!   r  r  r  r   rw   Z
bytes_htmlr   Zfull_path_htmlr
  r)   r6   ru   r`   r^   Z
style_textr   	style_tagZstyle_classZ	class_tagZstart_pos_classZstyle_startZ	style_endr%   r%   r&   obj_to_htmlv  s4    	

"

z!CmfPluginConvertMixin.obj_to_html)r  r  	to_formatr  r(   c          
   C   sH   yt | |||}W n. tk
rB } zt|  W dd}~X Y nX |S )u*  
        Конвертация данных в HTML через libreoffice
        :param data: Данные файла в виде байт
        :param suffix: Расширение файла
        :param to_format: Формат файла который хотим получить
        N)r   r-   r   gdebug)r  r  r'  r  Zconverted_dataerrr%   r%   r&   r-     s    
z#CmfPluginConvertMixin.obj_to_format)	path_filer(   c          
   C   s   ddl m} | }t| d:}x*|D ]"}|| |jr$|jdr$P q$W |  W dQ R X |jd}|sdddd	d
ddg}x^|D ]V}y8tj| d|d}|	  |
d |}P W dQ R X W q tk
r   d}Y qX qW |S )u   
        Определяем кодировку файла

        :param path_file: Путь к файлу
        :return: Кодировка файла
        r   )UniversalDetectorr   r)   Nzutf-8zwindows-1251zwindows-1250zwindows-1252asciiz
iso-8859-1latin1r	  )r)   )Zchardet.universaldetectorr,  r   ZfeedZdoner  rU   closer:   	readlinesr=   UnicodeDecodeError)r+  r,  Zdetectorr#   liner)   	encodingsZformat_encodingr%   r%   r&   r$    s*    



z'CmfPluginConvertMixin.get_encoding_typec             C   s  ddl m} | dg || jjp$d}|d}|jddd}d	|_|jd| |jj	
| x$|jd
dD ]}||d qpW x0|dD ]"}t|jdk r|
|d qW | | | | | | | | | | | | | | t|S )Nr   )rw   text_renderz<p></p>r`   r^   ztext/css)r_   zg@page { size: 21.0cm 29.7cm } td,th { padding: 0.45cm; } td p,th p { margin: 0;word-break: break-all; }zspoiler-icon)rY   rZ   r[   r\   )rz   rw   r|   r4  r   rg   rr   r1   rs   r`   rj   re   rf   rh   ri   rk   rl   rm   rn   ro   rp   rq   rt   )r!   rw   ru   Zhead_tagr%  rv   rZ   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 )Nzutf-8)r)   z.htmlzdocx:MS Word 2007 XMLz.docxzpdf:writer_pdf_Exportr*   )r5  r-   r.   r'   )r!   prepared_htmlr2   r3   r4   r%   r%   r&   r     s
    z#CmfPluginConvertMixin.export_to_pdfc             C   s.   |   }| t|dddd}| |d}|S )Nzutf-8)r)   z.htmlzdocx:MS Word 2007 XMLr5   )r5  r-   r.   r'   )r!   r6  r2   r4   r%   r%   r&   r     s    z$CmfPluginConvertMixin.export_to_docx)N)rG   )rG   ))__name__
__module____qualname____doc__Zapi_methodsr.   rt   r'   r
   r   rA   staticmethodrD   rL   rQ   rX   r,   rd   rk   rl   rm   rn   rp   ro   rq   r9   r   r  r  r  r  r  r  r  r  r&  r-   r$  r5  r   r   r%   r%   r%   r&   r	      sd   2
!0 + 	[		+	(!#r	   )rB   Zhashlibr:   Zpathlibr   r   r   typingr   Zurllibr   r   r   r   Zcmf.includeZrdiskr   r   rK   rP   rO   r   r	   r%   r%   r%   r&   <module>   s"   