3
͸W]p              
   @   sh  d Z ddlmZ ddlZddlZddlZddlZddlm	Z	 ej
 Zejd dd Zeed	d
ddZeeddddZeeddddZej  ejZejZi ZejejejdZejejdZejejej ej!ej"ej#ej$ej%ej&d	Z'ej(ej)ej*dZ+dd Z,dd Z-dd Z.dd  Z/d0d"d#Z0G d$d% d%e1Z2G d&d' d'e1Z3d(d) Z4d*d+ Z5d,d- Z6d.d/ Z7dS )1z
    weasyprint.text
    ---------------

    Interface with Pango to decide where to do line breaks and to draw text.

    :copyright: Copyright 2011-2014 Simon Sapin and contributors, see AUTHORS.
    :license: BSD, see LICENSE for details.

    )divisionN   )
basestringa>  
    typedef enum {
        PANGO_STYLE_NORMAL,
        PANGO_STYLE_OBLIQUE,
        PANGO_STYLE_ITALIC
    } PangoStyle;

    typedef enum {
        PANGO_WEIGHT_THIN = 100,
        PANGO_WEIGHT_ULTRALIGHT = 200,
        PANGO_WEIGHT_LIGHT = 300,
        PANGO_WEIGHT_BOOK = 380,
        PANGO_WEIGHT_NORMAL = 400,
        PANGO_WEIGHT_MEDIUM = 500,
        PANGO_WEIGHT_SEMIBOLD = 600,
        PANGO_WEIGHT_BOLD = 700,
        PANGO_WEIGHT_ULTRABOLD = 800,
        PANGO_WEIGHT_HEAVY = 900,
        PANGO_WEIGHT_ULTRAHEAVY = 1000
    } PangoWeight;

    typedef enum {
        PANGO_VARIANT_NORMAL,
        PANGO_VARIANT_SMALL_CAPS
    } PangoVariant;

    typedef enum {
        PANGO_STRETCH_ULTRA_CONDENSED,
        PANGO_STRETCH_EXTRA_CONDENSED,
        PANGO_STRETCH_CONDENSED,
        PANGO_STRETCH_SEMI_CONDENSED,
        PANGO_STRETCH_NORMAL,
        PANGO_STRETCH_SEMI_EXPANDED,
        PANGO_STRETCH_EXPANDED,
        PANGO_STRETCH_EXTRA_EXPANDED,
        PANGO_STRETCH_ULTRA_EXPANDED
    } PangoStretch;

    typedef enum {
        PANGO_WRAP_WORD,
        PANGO_WRAP_CHAR,
        PANGO_WRAP_WORD_CHAR
    } PangoWrapMode;

    typedef enum {
        PANGO_TAB_LEFT
    } PangoTabAlign;

    typedef unsigned int guint;
    typedef int gint;
    typedef gint gboolean;
    typedef void* gpointer;
    typedef ... cairo_t;
    typedef ... PangoLayout;
    typedef ... PangoContext;
    typedef ... PangoFontMetrics;
    typedef ... PangoLanguage;
    typedef ... PangoTabArray;
    typedef ... PangoFontDescription;
    typedef ... PangoLayoutIter;
    typedef ... PangoAttrList;
    typedef ... PangoAttrClass;
    typedef struct {
        const PangoAttrClass *klass;
        guint start_index;
        guint end_index;
    } PangoAttribute;
    typedef struct {
        PangoLayout *layout;
        gint         start_index;
        gint         length;
        /* ... */
    } PangoLayoutLine;

    double              pango_units_to_double               (int i);
    int                 pango_units_from_double             (double d);
    void                g_object_unref                      (gpointer object);
    void                g_type_init                         (void);


    PangoLayout * pango_cairo_create_layout (cairo_t *cr);
    void pango_layout_set_width (PangoLayout *layout, int width);
    void pango_layout_set_attributes(
        PangoLayout *layout, PangoAttrList *attrs);
    void pango_layout_set_text (
        PangoLayout *layout, const char *text, int length);
    void pango_layout_set_tabs (
        PangoLayout *layout, PangoTabArray *tabs);
    void pango_layout_set_font_description (
        PangoLayout *layout, const PangoFontDescription *desc);
    void pango_layout_set_wrap (
        PangoLayout *layout, PangoWrapMode wrap);


    PangoFontDescription * pango_font_description_new (void);

    void pango_font_description_free (PangoFontDescription *desc);

    void pango_font_description_set_family (
        PangoFontDescription *desc, const char *family);

    void pango_font_description_set_variant (
        PangoFontDescription *desc, PangoVariant variant);

    void pango_font_description_set_style (
        PangoFontDescription *desc, PangoStyle style);

    void pango_font_description_set_stretch (
        PangoFontDescription *desc, PangoStretch stretch);

    void pango_font_description_set_weight (
        PangoFontDescription *desc, PangoWeight weight);

    void pango_font_description_set_absolute_size (
        PangoFontDescription *desc, double size);


    PangoAttrList *     pango_attr_list_new             (void);
    void                pango_attr_list_unref           (PangoAttrList *list);
    void                pango_attr_list_insert          (
        PangoAttrList *list, PangoAttribute *attr);

    PangoAttribute *    pango_attr_letter_spacing_new   (int letter_spacing);
    void                pango_attribute_destroy         (PangoAttribute *attr);

    PangoTabArray *     pango_tab_array_new_with_positions (
        gint size, gboolean positions_in_pixels, PangoTabAlign first_alignment,
        gint first_position, ...);
    void pango_tab_array_free (PangoTabArray *tab_array);

    PangoLayoutIter * pango_layout_get_iter (PangoLayout *layout);
    void pango_layout_iter_free (PangoLayoutIter *iter);

    gboolean pango_layout_iter_next_line (PangoLayoutIter *iter);

    PangoLayoutLine * pango_layout_iter_get_line_readonly (
        PangoLayoutIter *iter);

    int pango_layout_iter_get_baseline (PangoLayoutIter *iter);


    typedef struct  {
        int x;
        int y;
        int width;
        int height;
    } PangoRectangle;

    void pango_layout_line_get_extents (
        PangoLayoutLine *line,
        PangoRectangle *ink_rect, PangoRectangle *logical_rect);

    PangoContext *      pango_layout_get_context    (PangoLayout *layout);
    PangoFontMetrics *  pango_context_get_metrics   (
        PangoContext *context, const PangoFontDescription *desc,
        PangoLanguage *language);

    void    pango_font_metrics_unref            (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_ascent       (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_descent      (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_approximate_char_width
                                                (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_approximate_digit_width
                                                (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_underline_thickness
                                                (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_underline_position
                                                (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_strikethrough_thickness
                                                (PangoFontMetrics *metrics);
    int     pango_font_metrics_get_strikethrough_position
                                                (PangoFontMetrics *metrics);

    void pango_cairo_update_layout (cairo_t *cr, PangoLayout *layout);
    void pango_cairo_show_layout_line (cairo_t *cr, PangoLayoutLine *line);

c             G   s<   x,|D ]$}y
| j |S  tk
r(   Y qX qW | j |d S )z@Try various names for the same library, for different platforms.r   )dlopenOSError)ffinamesname r
   O/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/weasyprint/text.pyr      s    


r   zgobject-2.0zlibgobject-2.0-0zlibgobject-2.0.sozlibgobject-2.0.dylibz	pango-1.0zlibpango-1.0-0zlibpango-1.0.sozlibpango-1.0.dylibzpangocairo-1.0zlibpangocairo-1.0-0zlibpangocairo-1.0.sozlibpangocairo-1.0.dylib)normalZobliqueZitalic)r   z
small-caps)	zultra-condensedzextra-condensedZ	condensedzsemi-condensedr   zsemi-expandedZexpandedzextra-expandedzultra-expanded)Z	WRAP_WORDZ	WRAP_CHARWRAP_WORD_CHARc             C   s   | j d| jdS )Nzutf-8)encodedecode)stringZslice_r
   r
   r   
utf8_slice  s    r   c             C   s"   | j djdd}tjd||fS )zoReturn ``(pointer, bytestring)``.

    The byte string must live at least as long as the pointer is used.

    utf8        zchar[])r   replacer   new)r   
bytestringr
   r
   r   unicode_to_char_p  s    r   c             C   sL   t jd}tj| t j| t|jt|j }}|jdkrD||j7 }||fS )NzPangoRectangle *r   )	r   r   pangopango_layout_line_get_extentsNULLunits_to_doublewidthheightletter_spacing)linestyleZlogical_extentsr   r   r
   r
   r   get_size  s    


r"   c             C   s.   t jd}tj| |t j t|jt|jfS )NzPangoRectangle *)r   r   r   r   r   r   xy)r    Zink_extentsr
   r
   r   get_ink_position  s    
r%   Fc             C   s  | j }|r|t|jd8 }n|rt|t|}	|r>|	jd}	|j|	jdd t|j	 d } | d k	rl| j nd}d}
d|	krxVt
t|jjdD ]>}x8||
 d t|	k r|	||
 d  dkr|
d7 }
qP qW qW ||
d 7 }t| |\}}ttjtjtj|jtj}||||||fS )Nr       ­ r   r      )lengthlenr   r   slicerstripset_textr   next
iter_linesrange
text_bytesr   r"   r   r   Zpango_layout_iter_get_baseliner   gcpango_layout_get_iterlayoutpango_layout_iter_free)
first_linetextr5   	resume_atspace_collapser!   
hyphenatedZhyphenation_characterr*   first_line_textZsoft_hyphensir   r   Zbaseliner
   r
   r   first_line_metrics"  s.    




r>   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )Layoutz2Object holding PangoLayout-related cdata pointers.c             C   s  |rt jt jt jddnt jt jd dd| _tjtj	tj
d| jjtj| _tjtj tj | _}t|jt stdtdj|j\}}tj|| tj|t|j  tj|t|j  tj |t!|j"  tj#||j$ tj%|t&| tj'| j| d S )Nr   z	cairo_t *zfont_family should be a list,)(cairoZContextZImageSurfaceZFORMAT_ARGB32Z
PDFSurfaceZdummy_contextr   r3   
pangocairoZpango_cairo_create_layoutcast_pointergobjectZg_object_unrefr5   r   Zpango_font_description_newZpango_font_description_freefont
isinstanceZfont_familyr   AssertionErrorr   joinZ!pango_font_description_set_familyZ"pango_font_description_set_variantPANGO_VARIANTZfont_variantZ pango_font_description_set_stylePANGO_STYLEZ
font_styleZ"pango_font_description_set_stretchPANGO_STRETCHZfont_stretchZ!pango_font_description_set_weightZfont_weightZ(pango_font_description_set_absolute_sizeunits_from_doubleZ!pango_layout_set_font_description)selfhinting	font_sizer!   rF   Zfamily_pfamilyr
   r
   r   __init__C  s.    
zLayout.__init__c             c   s:   t jtj| jtj}xtj|V  tj|sd S qW d S )N)r   r3   r   r4   r5   r6   Z#pango_layout_iter_get_line_readonlyZpango_layout_iter_next_line)rN   Zlayout_iterr
   r
   r   r0   ^  s    

zLayout.iter_linesc             C   s,   t |\}}|| _|| _tj| j|d d S )Nr   )r   r8   r2   r   Zpango_layout_set_textr5   )rN   r8   r   r
   r
   r   r.   g  s    zLayout.set_textc             C   s   t j| j}t|| jS )N)r   Zpango_layout_get_contextr5   FontMetricsrF   )rN   contextr
   r
   r   get_font_metricsm  s    zLayout.get_font_metricsc             C   s   t j| j| d S )N)r   Zpango_layout_set_wrapr5   )rN   Z	wrap_moder
   r
   r   set_wrapq  s    zLayout.set_wrapc             C   s   t |jtrRtd|j|d}|jd|j  |j \}t||\}}tt|}n|jj	}t
jtjddtj|ppdtj}tj| j| d S )NF)rO   rP   r!   r&   r   T)rG   tab_sizeintr?   rP   r.   r0   r"   roundvaluer   r3   r   Z"pango_tab_array_new_with_positionsZPANGO_TAB_LEFTZpango_tab_array_freeZpango_layout_set_tabsr5   )rN   r!   r5   r    r   _arrayr
   r
   r   set_tabst  s    
zLayout.set_tabsN)
__name__
__module____qualname____doc__rR   r0   r.   rV   rW   r^   r
   r
   r
   r   r?   A  s   	r?   c               @   s$   e Zd Zdd Zdd Zdd ZdS )rT   c             C   s    t jtj||t jtj| _d S )N)r   r3   r   Zpango_context_get_metricsr   Zpango_font_metrics_unrefmetrics)rN   rU   rF   r
   r
   r   rR     s    zFontMetrics.__init__c             C   s   ddddddddgS )	NZascentZdescentZapproximate_char_widthZapproximate_digit_widthZunderline_thicknessZunderline_positionZstrikethrough_thicknessZstrikethrough_positionr
   )rN   r
   r
   r   __dir__  s    zFontMetrics.__dir__c             C   s(   |t | kr$tttd| | jS d S )NZpango_font_metrics_get_)dirr   getattrr   rc   )rN   keyr
   r
   r   __getattr__  s    zFontMetrics.__getattr__N)r_   r`   ra   rR   rd   rh   r
   r
   r
   r   rT     s   rT   c                s  t ||j|}|j|  |dk	r:|dk r:tj|jt| |j}|j}|dkrRd}| r|dksf|dkrt|}t|| }tj	   fdd}|j
}	|dt|	d | |	jd	}
x,|
dkr||
|
d | |	jd	|
d }
qW tj|j  tj  |jd
kr|j| |S )a]  Return an opaque Pango layout with default Pango line-breaks.

    :param text: Unicode
    :param style: a :class:`StyleDict` of computed values
    :param hinting: whether to enable text hinting or not
    :param max_width:
        The maximum available width in the same unit as ``style.font_size``,
        or ``None`` for unlimited width.

    Nr)      r   r   c                s&   t j|}| |_||_t j | d S )N)r   Zpango_attr_letter_spacing_newstart_indexZ	end_indexZpango_attr_list_insert)startendspacingattr)	attr_listr
   r   add_attr  s    
zcreate_layout.<locals>.add_attrr          i    rS   )r?   rP   r.   r   pango_layout_set_widthr5   rM   word_spacingr   Zpango_attr_list_newr2   r+   findZpango_layout_set_attributesZpango_attr_list_unrefrX   r^   )r8   r!   rO   	max_widthr5   rt   r   Zspace_spacingrp   r2   positionr
   )ro   r   create_layout  s2    




rx   c       -   	      s6  |j dk}|j dk}|rd}n|dk	r.|d9 }d}|rt||j d }|t| k rt| d| |||}|j }	t|	d}
t|	d}|dkrd}|dkrt| |||}|j }	t|	d}
t|	d}|dkrdn|j}|dkrt|
| ||||S t	|
|\}}|dkr$||kr$t|
| ||||S ||krT|j}t
| t|}t
| t|d}nd	}| }|jd
dd   r|r|  }|j| |j }	t|	d}
t|	d}t	|
|\}}|dkr||krt|jdd }|t| jdkrd}t|
| ||||S n|rt|
| ||||S |j}|jo6tj|j}|j\}}}d}d}|dkrt |krt	|
|\}}|| }|jjdkr||jj d }n|jj}||ks|dk r|dkrh|j|r6d
|kr,|jd
d\} d
   t||||}|j }	t|	d}
t|	d}t|d
 jd}n
d	| } dd tj| D }|j   fdd|D }nb|dkr|r||||f}tj|}|dkrtj|||d}|t|< dd |j D }ng }|rx|D ]} ||  }||j  }!t|!|||}"|"j }#t|#d}$t|#d}%t	|$|\}&}||& }'|%dkr|'dksN| |d  krd}|"}|$}
|%}t|jd}| t| |kr|t|jd7 }P qW | r| rd}t|!||d}|j }	t|	d}
t|	d}t|jd}| t| |kr|t|jd7 }| rb|j|rbd}||j  }!t|!||d}|j }	t|	d}
t|	d}t|jd}|j!}(t	|
|\}}|| }|(dkr|dk rd}t| |||})|)j"t#d  |)j }*t|*d t|*d}+|+dkrt| jdn|+j},|,}t
| t|,}t||||}|j }	t|	d}
t|
| ||||||j S )!a  Fit as much as possible in the available width for one line of text.

    Return ``(layout, length, resume_at, width, height, baseline)``.

    ``layout``: a pango Layout with the first line
    ``length``: length in UTF-8 bytes of the first line
    ``resume_at``: The number of UTF-8 bytes to skip for the next line.
                   May be ``None`` if the whole text fits in one line.
                   This may be greater than ``length`` in case of preserved
                   newline characters.
    ``width``: width in pixels of the first line
    ``height``: height in pixels of the first line
    ``baseline``: baseline in pixels of the first line

    prenowrapr   pre-lineNr   g&.>g      @r(   r&   r   zutf-8Fr'   Znone%g      Y@Zmanualr   c             S   s   g | ]}|j  qS r
   )rk   ).0matchr
   r
   r   
<listcomp>S  s    z$split_first_line.<locals>.<listcomp>c                s   g | ]} d |d  qS )Nr   r
   )r}   r=   )	next_wordr
   r   r   W  s    auto)langleftrightc             S   s   g | ]\}}|qS r
   r
   )r}   rk   rl   r
   r
   r   r   a  s    Tz
break-wordr   )ry   rz   )r   rz   r{   g0D   ?rS   )$Zwhite_spacerY   rP   r+   rx   r0   r/   rj   r>   r"   r   r,   splitr.   r   hyphensr   pyphenZlanguage_fallbackZhyphenate_limit_charsZhyphenate_limit_zoneZunitr[   endswithrsplitrefinditerreversePYPHEN_DICTIONARY_CACHEgetZPyphenZiterateZhyphenate_characteroverflow_wraprW   PANGO_WRAP_MODE)-r8   r!   rO   rv   
line_widthZ	text_wrapr:   r5   Zexpected_lengthlinesr7   Zsecond_liner9   Zfirst_line_widthr\   Zsecond_line_indexr<   Zsecond_line_textZnew_first_line_textr   r   totalr   r   r;   Zsoft_hyphenspaceZ
limit_zoneZsoft_hyphen_indexesZdictionary_iterationsZdictionary_key
dictionaryZfirst_word_partZhyphenated_first_line_textZ
new_layoutZ	new_linesZnew_first_lineZnew_second_lineZnew_first_line_widthZ	new_spacer   Ztemp_layoutZ
temp_linesZtemp_second_lineZtemp_second_line_indexr
   )r   r   split_first_line  s2   






























r   c             c   s8   t | |||}x$|j D ]}t||\}}|V  qW dS )zReturn the width for each line.N)rx   r0   r"   )r8   r!   Zenable_hintingr   r5   r    Z_heightr
   r
   r   line_widths  s    r   c             C   sF   t jd| j} |r tj| |j tj|jd tj| t	|j
  dS )z1Draw the given ``line`` to the Cairo ``context``.z	cairo_t *r   NrS   )r   rC   rD   rB   Zpango_cairo_update_layoutr5   r   rs   Zpango_cairo_show_layout_liner/   r0   )rU   Zpango_layoutrO   r
   r
   r   show_first_line  s    r   )FN)8rb   
__future__r   r   ZcffiZ	cairocffirA   r   compatr   ZFFIr   Zcdefr   rE   r   rB   Zg_type_initZpango_units_to_doubler   Zpango_units_from_doublerM   r   ZPANGO_STYLE_NORMALZPANGO_STYLE_OBLIQUEZPANGO_STYLE_ITALICrK   ZPANGO_VARIANT_NORMALZPANGO_VARIANT_SMALL_CAPSrJ   ZPANGO_STRETCH_ULTRA_CONDENSEDZPANGO_STRETCH_EXTRA_CONDENSEDZPANGO_STRETCH_CONDENSEDZPANGO_STRETCH_SEMI_CONDENSEDZPANGO_STRETCH_NORMALZPANGO_STRETCH_SEMI_EXPANDEDZPANGO_STRETCH_EXPANDEDZPANGO_STRETCH_EXTRA_EXPANDEDZPANGO_STRETCH_ULTRA_EXPANDEDrL   ZPANGO_WRAP_WORDZPANGO_WRAP_CHARZPANGO_WRAP_WORD_CHARr   r   r   r"   r%   r>   objectr?   rT   rx   r   r   r   r
   r
   r
   r   <module>   sd    1








F4 l