a `@sdZddlZddlZddlmZmZddlZddlZddlZddl m Z m Z ddl Z ddlmZeZddZedejZd d Zed Zdd dZddZGdddejZdddZejZGdddeZe jZ ej!Z!ej"Z"ej#Z#ej$Z$ej%Z%ej&Z&dS)z babel.util ~~~~~~~~~~ Various utility classes and functions. :copyright: (c) 2013-2021 by the Babel Team. :license: BSD, see LICENSE for more details. N) timedeltatzinfo)izipimap) localtimeccs0t}t|D]}||vr|V||qdS)aYield all items in an iterable collection that are distinct. Unlike when using sets for a similar effect, the original ordering of the items in the collection is preserved by this function. >>> print(list(distinct([1, 2, 1, 3, 4, 4]))) [1, 2, 3, 4] >>> print(list(distinct('foobar'))) ['f', 'o', 'b', 'a', 'r'] :param iterable: the iterable collection providing the data N)setiteradd)iterableseenitemr ./usr/lib/python3.9/site-packages/babel/util.pydistincts  rs([ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)c Cs"|}|dz|}|tj}|r@|ttjd}t|}|szddl }| | dWnt t tfyYn0|}t|}|r|r|d d}|dkrt d|W||dS|r|d dW||SW||dSW||n ||0dS)a/Deduce the encoding of a source file from magic comment. It does this in the same way as the `Python interpreter`__ .. __: https://docs.python.org/3.4/reference/lexical_analysis.html#encoding-declarations The ``fp`` argument should be a seekable file object. (From Jeff Dairiki) rNlatin-1zutf-8zencoding problem: {0} with BOM)tellseekreadline startswithcodecsBOM_UTF8lenPYTHON_MAGIC_COMMENT_rematchastparsedecode ImportError SyntaxErrorUnicodeEncodeErrorgroupformat)fpposZline1Zhas_bommrZline2Zmagic_comment_encodingr r rparse_encoding1sH        r&z'from\s+__future__\s+import\s+\(*(.+)\)*rc Csddl}|}|dd}z||}tdd|}tdd|}tdd|}t|D]B}d d | d  d D}|D]}t ||d} | r|| j O}qqbW||n ||0|S) zRParse the compiler flags by :mod:`__future__` from the given Python code. rNzimport\s*\([\r\n]+zimport (z ,\s*[\r\n]+z, z \\\s*[\r\n]+ cSsg|]}|dqS)z())strip).0xr r r }z&parse_future_flags..r,) __future__rrreadrresubPYTHON_FUTURE_IMPORT_refinditerr!splitgetattrZ compiler_flag) r#encodingr.r$flagsbodyr%namesnameZfeaturer r rparse_future_flagsgs"  r;cCsddddddd}|dr0dg}|d d }n"|d rNdg}|d d }ng}ttd |D]4\}}|d r|||qb|rb|t|qbtd|d|t j d}|d uS)aExtended pathname pattern matching. This function is similar to what is provided by the ``fnmatch`` module in the Python standard library, but: * can match complete (relative or absolute) path names, and not just file names, and * also supports a convenience pattern ("**") to match files at any directory level. Examples: >>> pathmatch('**.py', 'bar.py') True >>> pathmatch('**.py', 'foo/bar/baz.py') True >>> pathmatch('**.py', 'templates/index.html') False >>> pathmatch('./foo/**.py', 'foo/bar/baz.py') True >>> pathmatch('./foo/**.py', 'bar/baz.py') False >>> pathmatch('^foo/**.py', 'foo/bar/baz.py') True >>> pathmatch('^foo/**.py', 'bar/baz.py') False >>> pathmatch('**/templates/*.html', 'templates/index.html') True >>> pathmatch('**/templates/*.html', 'templates/foo/bar.html') False :param pattern: the glob pattern :param filename: the path name of the file to match against z[^/]z[^/]/z[^/]+z[^/]+/z (?:.+/)*?z(?:.+/)*?[^/]+)?z?/*z*/z**/z**^rNz./z ([?*]+/?)$/) r enumerater0r4appendescaperjoinreplaceossep)patternfilenameZsymbolsbufidxpartrr r r pathmatchs*'   rOc@seZdZedZdS) TextWrapperz((\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))N)__name__ __module__ __qualname__r0compileZ wordsep_rer r r rrPsrPFr@cCst|||dd}||S)aSimple wrapper around the ``textwrap.wrap`` function in the standard library. This version does not wrap lines on hyphens in words. :param text: the text to wrap :param width: the maximum line width :param initial_indent: string that will be prepended to the first line of wrapped output :param subsequent_indent: string that will be prepended to all lines save the first of wrapped output F)widthinitial_indentsubsequent_indentZbreak_long_words)rPwrap)textrVrWrXwrapperr r rwraptexts r\c@sBeZdZdZdddZddZddZd d Zd d Zd dZ dS)FixedOffsetTimezonez&Fixed offset in minutes east from UTC.NcCs&t|d|_|durd|}||_dS)N)Zminutesz Etc/GMT%+d)r_offsetzone)selfoffsetr:r r r__init__s zFixedOffsetTimezone.__init__cCs|jSNr_r`r r r__str__szFixedOffsetTimezone.__str__cCsd|j|jfS)Nz)r_r^rer r r__repr__szFixedOffsetTimezone.__repr__cCs|jSrc)r^r`Zdtr r r utcoffsetszFixedOffsetTimezone.utcoffsetcCs|jSrcrdrhr r rtznameszFixedOffsetTimezone.tznamecCstSrc)ZEROrhr r rdstszFixedOffsetTimezone.dst)N) rQrRrS__doc__rbrfrgrirjrlr r r rr]s r])r)rUr@r@)'rmr collectionsZdatetimerrrHr0textwrapZ babel._compatrrZpytzZ_pytzZbabelrobjectmissingrrTVERBOSErr&r2r;rOrPr\ OrderedDictZodictr]ZutcZUTCZLOCALTZZ get_localzoneZ STDOFFSETZ DSTOFFSETZDSTDIFFrkr r r rs>  2 A