Ë
    oj#  ã                   óB   — d Z d
d„Zd„ Zd„ Zdd„ZeZd„ Zd„ Zd„ Zdd„Z	y	)z'
Miscellany of text-munging functions.
c                 óf  — d}g }t        | «      t        u r‘d}| j                  «       D ]{  \  }}t        ||dz   «      }t	        |«      r4t        |«      r|dt        d«        }|j                  |› d|› d|› �«       ŒT|j                  |› d|› d|t        |«      d	z   d › �«       Œ} n›t        | «      t        u st        | «      t        u rOt        | «      t        u rd
}nd}| D ]3  }t        ||dz   «      }|j                  |j                  «       dz   «       Œ5 n*t        |fd„t        | «      j                  d«      «      |dd |s|j                  |«       |r.||d   z   |d   t        |«      dz   d z   |d<   |d   |d   z   |d<   dj                  |«      }t	        |«      rt        |«      s|dz   }|S )al  
    Expansive string formatting for sequence types.

    C{list.__str__} and C{dict.__str__} use C{repr()} to display their
    elements.  This function also turns these sequence types
    into strings, but uses C{str()} on their elements instead.

    Sequence elements are also displayed on separate lines, and nested
    sequences have nested indentation.
    Ú z{}z   Nú
ú z:
z: é   z()z[]ú,c                 ó   — || z   S ©N© )ÚsÚis     ú5/usr/lib/python3/dist-packages/twisted/python/text.pyú<lambda>zstringyString.<locals>.<lambda>/   s
   € ¨Q°©U€ ó    é    é   éÿÿÿÿ)ÚtypeÚdictÚitemsÚstringyStringÚisMultilineÚendsInNewlineÚlenÚappendÚtupleÚlistÚrstripÚmapÚstrÚsplitÚjoin)ÚobjectÚindentationÚbracesÚslÚkeyÚvalueÚelementr   s           r   r   r      sÅ  € ð €FØ	€BäˆFƒ|”tÑØˆØ Ÿ,™,›.ò 	S‰JˆC�Ü! %¨°uÑ)<Ó=ˆEÜ˜5Ô!Ü  Ô'Ø! ,¤S¨£Y JÐ/�EØ—	‘	˜[˜M¨¨3¨%¨s°5°'Ð:Õ;ð —	‘	˜[˜M¨¨3¨%¨r°%¼¸KÓ8HÈ1Ñ8LÐ8NÐ2OÐ1PÐQÕRñ	Sô 
ˆf‹œÑ	¤$ v£,´$Ñ"6Ü�‹<œ5Ñ Ø‰FàˆFàò 	.ˆGÜ# G¨[¸3Ñ->Ó?ˆGØ�I‰I�g—n‘nÓ&¨Ñ,Õ-ñ	.ô  Ò2´C¸³K×4EÑ4EÀdÓ4KÓLˆ‰1ˆáØ
�	‰	�+ÔáØ˜f Q™iÑ'¨"¨Q©%´°KÓ0@À1Ñ0DÐ0FÐ*GÑGˆˆ1‰Ø�B‘˜& ™*Ñ$ˆˆ2‰à�	‰	�"‹€Aä�1„~œm¨AÔ.Ø�‰Hˆà€Hr   c                 ó*   — | j                  d«      dk7  S )z=
    Returns C{True} if this string has a newline in it.
    r   r   )Úfind©r   s    r   r   r   @   s   € ð �6‰6�$‹<˜2ÑÐr   c                 ó&   — | t        d«       d dk(  S )z;
    Returns C{True} if this string ends in a newline.
    r   N)r   r+   s    r   r   r   G   s   € ð Œc�$‹iˆZˆ\ˆ?˜dÑ"Ð"r   c                 óò  — g }| j                  d«      dk\  r9| j                  d«      }|D ]!  }|j                  t        ||«      dgz   «       Œ# |S | j                  «       }d}d}|r‘|t	        ||   «      z   }|dz   }||kD  r:|dk(  rn|dz
  }|d| ||d }}|j                  dj                  |«      «       d}d}n9t	        |«      |kD  s&|j                  dj                  |«      «       |dd…= n|dz   }|rŒ‘|S )a  
    Given a string and a column width, return a list of lines.

    Caveat: I'm use a stupid greedy word-wrapping
    algorythm.  I won't put two spaces at the end
    of a sentence.  I don't do full justification.
    And no, I've never even *heard* of hypenation.
    z

r   r   r   Nr   )r*   r    ÚextendÚ
greedyWrapr   r   r!   )	ÚinStringÚwidthÚoutLinesÚ
paragraphsÚparaÚinWordsÚcolumnÚptr_lineÚls	            r   r/   r/   N   s  € ð €Hð ‡}�}�VÓ Ò!Ø—^‘^ FÓ+ˆ
Øò 	<ˆDØ�O‰OœJ t¨UÓ3°r°dÑ:Õ;ð	<àˆØ�n‰nÓ€Gà€FØ€HÙ
Øœ#˜g hÑ/Ó0Ñ0ˆØ˜a‘<ˆà�EŠ>Ø˜1Š}àð $ a™<�Ø# A hÐ/°¸¸Ð1C�ˆQØ�O‰O˜CŸH™H Q›KÔ(àˆHØ‰FÜ�g“, Ò)à�O‰O˜CŸH™H WÓ-Ô.Øš‘
ð ˜a‘ZˆFò- ð2 €Or   c                 ó`   — g }| D ]&  }|s|j                  «       sŒ|j                  |«       Œ( |S r	   )Ústripr   )ÚlinesÚretÚlines      r   ÚremoveLeadingBlanksr>   ƒ   s4   € Ø
€CØò ˆÙ�$—*‘*•,Ø�J‰J�tÕðð €Jr   c                 ó´   — t        | j                  d«      «      }|j                  «        t        |«      }|j                  «        dj                  |«      dz   S )Nr   )r>   r    Úreverser!   )r   r;   s     r   ÚremoveLeadingTrailingBlanksrA   ‹   sD   € Ü §¡¨£Ó.€EØ	‡M�M„OÜ Ó&€EØ	‡M�M„OØ�9‰9�UÓ˜dÑ"Ð"r   c                 ó:  — g }d}d}| j                  «       D ]�  }|€|r|d   dv r|d   }|dd }g }|€|j                  |«       Œ.|rA|d   |k(  r9|dd }|j                  |«       |j                  dj                  |«      «       d}Œq|j                  |«       Œƒ |S )a=  
    Like a string split, but don't break substrings inside quotes.

    >>> splitQuoted('the "hairy monkey" likes pie')
    ['the', 'hairy monkey', 'likes', 'pie']

    Another one of those "someone must have a better solution for
    this" things.  This implementation is a VERY DUMB hack done too
    quickly.
    Nr   )ú"ú'r   r   r   )r    r   r!   )r   ÚoutÚquotÚphraseÚwords        r   ÚsplitQuotedrI   “   s·   € ð €CØ€DØ€FØ—‘“	ò $ˆØˆ>Ù˜˜a™ JÑ.Ø˜A‘w�Ø˜A˜B�x�Ø�àˆ>Ø�J‰J�tÕá˜˜b™ TÒ)Ø˜C˜R�y�Ø—‘˜dÔ#Ø—
‘
˜3Ÿ8™8 FÓ+Ô,Ø‘à—‘˜dÕ#ð!$ð$ €Jr   c                 óf  —  t        | «      «       }t        t        | «      d«      }|s| j                  «       } 	 |j	                  |t        | «      z
  «      }|s|j                  «       }t        |«      }|dk(  ryt        |«      |z   |z
  }|dk  r||z   }n||d |z   }|j                  | «      dk7  ryŒz)z[
    Find whether string C{p} occurs in a read()able object C{f}.

    @rtype: C{bool}
    i   r   FNr   T)r   Úmaxr   ÚlowerÚreadr*   )ÚpÚfÚcaseSensitiveÚbufÚbuf_lenÚrÚ
bytes_readr8   s           r   ÚstrFilerU   ¶   s´   € ð Œ$ˆq‹'‹)€CÜ”#�a“&˜*Ó%€GÙØ�G‰G‹IˆØ
Ø�F‰F�7œS ›VÑ#Ó$ˆÙØ—‘“	ˆAÜ˜“Vˆ
Ø˜Š?ØÜ�‹H�zÑ! GÑ+ˆØ�Š6Ø˜‘'‰Cà�a�b�'˜A‘+ˆCØ�8‰8�A‹;˜"ÒØð r   N)r   )éP   )T)
Ú__doc__r   r   r   r/   ÚwordWrapr>   rA   rI   rU   r
   r   r   ú<module>rY      s<   ðñó
2òjò#ó/ðd €òò#ò ôFr   