3
g!+                 @   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	Z	d dl
Z
ye e W n ek
rt   eZeZY nX G dd deZdS )    N)OrderedDict   )Source)Configurationc               @   s   e Zd ZdZG dd deZdddZdd	 Zdd
dZdddZ	e
dd ZdddZdd Zdd Zdd Zdd Zdd ZdS ) PDFKita,  
    Main class that does all generation routine.

    :param url_or_file: str - either a URL, a path to a file or a string containing HTML
                       to convert
    :param type_: str - either 'url', 'file' or 'string'
    :param options: dict (optional) with wkhtmltopdf options, with or w/o '--'
    :param toc: dict (optional) - toc-specific wkhtmltopdf options, with or w/o '--'
    :param cover: str (optional) - url/filename with a cover html page
    :param configuration: (optional) instance of pdfkit.configuration.Configuration()
    c               @   s    e Zd ZdZdd Zdd ZdS )zPDFKit.ImproperSourceErrorz!Wrong source type for stylesheetsc             C   s
   || _ d S )N)msg)selfr    r	   K/var/www/tester-filtro-web/env/lib/python3.6/site-packages/pdfkit/pdfkit.py__init__#   s    z#PDFKit.ImproperSourceError.__init__c             C   s   | j S )N)r   )r   r	   r	   r
   __str__&   s    z"PDFKit.ImproperSourceError.__str__N)__name__
__module____qualname____doc__r   r   r	   r	   r	   r
   ImproperSourceError    s   r   NFc
       
      C   s   t ||| _|d krt n|| _y| jjjd| _W n tk
rR   | jj| _Y nX t | _| jj	 rx| jj
| j| | jj| _|d k	r| jj
| |d kri n|| _|| _|| _|	| _|| _g | _d S )Nzutf-8)r   sourcer   configurationwkhtmltopdfdecodeAttributeErrorr   optionsisStringupdate_find_options_in_metaenvirontoccovercover_firstverbosecssZstylesheets)
r   Zurl_or_filetype_r   r   r   r    r   r   r   r	   r	   r
   r   )   s&    

zPDFKit.__init__c             c   sp   xj| j |D ]\\}}|V  t|ttfrbt|dkrD|d rD|d sLtd|d V  |d V  q|V  qW dS )z
        Generator of args parts based on options specification.

        Note: Empty parts will be filtered out at _command generator
           r   r   zFOption value can only be either a string or a (tuple, list) of 2 itemsN)_normalize_options
isinstancelisttuplelenAssertionError)r   optsZoptkeyoptvalr	   r	   r
   _genargsD   s    $
zPDFKit._genargsc             c   s  | j r| j| j  | jV  | js0| jjddi x| j| jD ]}|r>|V  q>W | jrj| jrjdV  | jV  | j	rdV  x| j| j	D ]}|r|V  qW | jr| j rdV  | jV  | j
j s| j
j rdV  n4t| j
j
tr| j
j V  nx| j
j
D ]
}|V  qW |r|V  ndV  dS )z0
        Generator of all command parts
        z--quiet r   r   -N)r    _prepend_cssr   r   r   r   r+   r   r   r   r   r   	isFileObjr$   
basestringto_s)r   pathZargpartsr	   r	   r
   _commandT   s8    


zPDFKit._commandc             C   s   t | j|S )N)r%   r4   )r   r2   r	   r	   r
   command   s    zPDFKit.commandc             C   s|   | dkrd S |j  }t|dkr8|j  d j dkr8d S d|krLtd| d|kr`td| |pfd	}td
j| |d S )Nr   r   r"   Donezcannot connect to X serverz%s
You will need to run wkhtmltopdf within a "virtual" X server.
Go to the link below for more information
https://github.com/JazzCore/python-pdfkit/wiki/Using-wkhtmltopdf-without-X-serverErrorzwkhtmltopdf reported an error:
zUnknown Errorz5wkhtmltopdf exited with non-zero code {0}. error:
{1})
splitlinesr'   stripIOErrorformat)	exit_codestderrZstderr_lines	error_msgr	   r	   r
   handle_error   s     zPDFKit.handle_errorc             C   s  | j |}tjdkrTtj }| jtjO  _tj|_tj	|tj
tj
tj
| j|d}ntj	|tj
tj
tj
| jd}| jj s| jj r| jr| jj jd}n"| jj r| jjj jd}nd }|j|d\}}|p|pd}|jddd}|j}| j|| d	|krtjj| |s|S yDtj|dd
,}	|	jd}
|
dkrRtddj| dS Q R X W n> ttfk
r } ztddj||f W Y d d }~X nX d S )Nwin32)stdinstdoutr>   envstartupinfo)rB   rC   r>   rD   zutf-8)input    replace)errorsz--quiet)encoding   r,   zBCommand failed: %s
Check whhtmltopdf output without 'quiet' option TzFCommand failed: %s
Check whhtmltopdf output without 'quiet' option
%s )r5   sysplatform
subprocessZSTARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWZSW_HIDEZwShowWindowPopenPIPEr   r   r   isFiler    r1   encoder/   readcommunicater   
returncoder@   rC   writecodecsopenr;   joinOSError)r   r2   argsrE   resultrF   rC   r>   r=   ftexter	   r	   r
   to_pdf   sT    







zPDFKit.to_pdfc             c   s   xt |j D ]z\}}d|kr.d| j| }n
| j|}t|t tfr`x@|D ]}||fV  qLW qt|trndn|}||rt|n|fV  qW dS )ah   Generator of 2-tuples (option-key, option-value).
        When options spec is a list, generate a 2-tuples per list item.

        :param options: dict {option name: value}

        returns:
          iterator (option-key, option-value)
          - option names lower cased and prepended with
          '--' if necessary. Non-empty values cast to str
        z--z--%sr,   N)r%   items_normalize_argr$   r&   boolunicode)r   r   keyvalueZnormalized_keyr*   Znormalized_valuer	   r	   r
   r#      s    

zPDFKit._normalize_optionsc             C   s   |j  S )N)lower)r   argr	   r	   r
   rc      s    zPDFKit._normalize_argc             C   s   d| S )Nz<style>%s</style>r	   )r   Z
stylesheetr	   r	   r
   _style_tag_for   s    zPDFKit._style_tag_forc             C   s"  | j j st| j j tr"| jdt|ts2|g}g }x4|D ],}tj|dd}|j|j  W d Q R X q<W dj	|}| j j
 rtj| j j dd}|j }W d Q R X t|jd| j|d d| _ nV| j j rd| j j kr| j j jd| j|d | j _ n| j|| j j  | j _ d S )Nz6CSS files can be added only to a single file or stringzUTF-8)rJ   
z</head>string)r   ZisUrlr$   r%   r   rX   rY   appendrT   rZ   rR   r1   r   rH   rj   r   )r   r2   Zcss_datapr^   inpr	   r	   r
   r.      s(    






zPDFKit._prepend_cssc             C   s~   t |tjs|jjdkr |j }i }xTtjd|D ]D}tjd| j	j
 |r2tjd| j	j
 |d }tjd|d ||< q2W |S )zReads 'content' and extracts options encoded in HTML meta tags

        :param content: str or file-like object - contains HTML to parse

        returns:
          dict: {config option: value}
        StreamReaderWriterz<meta [^>]*>zname=["']%szname=["']%s([^"']*)r   zcontent=["']([^"']*))r$   ioIOBase	__class__r   rT   refindallsearchr   Zmeta_tag_prefix)r   contentfoundxnamer	   r	   r
   r     s    zPDFKit._find_options_in_meta)NNNNNFF)N)N)N)r   r   r   r   	Exceptionr   r   r+   r4   r5   staticmethodr@   ra   r#   rc   rj   r.   r   r	   r	   r	   r
   r      s   	 

0

Ar   )rt   rO   rM   collectionsr   r   r   r   r   rq   rX   r0   re   	NameErrorstrobjectr   r	   r	   r	   r
   <module>   s   
