ccl
4 years ago
1891 changed files with 311724 additions and 6 deletions
@ -0,0 +1,76 @@ |
|||
# This file must be used with "source bin/activate" *from bash* |
|||
# you cannot run it directly |
|||
|
|||
deactivate () { |
|||
# reset old environment variables |
|||
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then |
|||
PATH="${_OLD_VIRTUAL_PATH:-}" |
|||
export PATH |
|||
unset _OLD_VIRTUAL_PATH |
|||
fi |
|||
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then |
|||
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" |
|||
export PYTHONHOME |
|||
unset _OLD_VIRTUAL_PYTHONHOME |
|||
fi |
|||
|
|||
# This should detect bash and zsh, which have a hash command that must |
|||
# be called to get it to forget past commands. Without forgetting |
|||
# past commands the $PATH changes we made may not be respected |
|||
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then |
|||
hash -r |
|||
fi |
|||
|
|||
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then |
|||
PS1="${_OLD_VIRTUAL_PS1:-}" |
|||
export PS1 |
|||
unset _OLD_VIRTUAL_PS1 |
|||
fi |
|||
|
|||
unset VIRTUAL_ENV |
|||
if [ ! "$1" = "nondestructive" ] ; then |
|||
# Self destruct! |
|||
unset -f deactivate |
|||
fi |
|||
} |
|||
|
|||
# unset irrelevant variables |
|||
deactivate nondestructive |
|||
|
|||
VIRTUAL_ENV="/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv" |
|||
export VIRTUAL_ENV |
|||
|
|||
_OLD_VIRTUAL_PATH="$PATH" |
|||
PATH="$VIRTUAL_ENV/bin:$PATH" |
|||
export PATH |
|||
|
|||
# unset PYTHONHOME if set |
|||
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) |
|||
# could use `if (set -u; : $PYTHONHOME) ;` in bash |
|||
if [ -n "${PYTHONHOME:-}" ] ; then |
|||
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" |
|||
unset PYTHONHOME |
|||
fi |
|||
|
|||
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then |
|||
_OLD_VIRTUAL_PS1="${PS1:-}" |
|||
if [ "x(bots-venv) " != x ] ; then |
|||
PS1="(bots-venv) ${PS1:-}" |
|||
else |
|||
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then |
|||
# special case for Aspen magic directories |
|||
# see http://www.zetadev.com/software/aspen/ |
|||
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" |
|||
else |
|||
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" |
|||
fi |
|||
fi |
|||
export PS1 |
|||
fi |
|||
|
|||
# This should detect bash and zsh, which have a hash command that must |
|||
# be called to get it to forget past commands. Without forgetting |
|||
# past commands the $PATH changes we made may not be respected |
|||
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then |
|||
hash -r |
|||
fi |
@ -0,0 +1,37 @@ |
|||
# This file must be used with "source bin/activate.csh" *from csh*. |
|||
# You cannot run it directly. |
|||
# Created by Davide Di Blasi <davidedb@gmail.com>. |
|||
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com> |
|||
|
|||
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' |
|||
|
|||
# Unset irrelevant variables. |
|||
deactivate nondestructive |
|||
|
|||
setenv VIRTUAL_ENV "/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv" |
|||
|
|||
set _OLD_VIRTUAL_PATH="$PATH" |
|||
setenv PATH "$VIRTUAL_ENV/bin:$PATH" |
|||
|
|||
|
|||
set _OLD_VIRTUAL_PROMPT="$prompt" |
|||
|
|||
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then |
|||
if ("bots-venv" != "") then |
|||
set env_name = "bots-venv" |
|||
else |
|||
if (`basename "VIRTUAL_ENV"` == "__") then |
|||
# special case for Aspen magic directories |
|||
# see http://www.zetadev.com/software/aspen/ |
|||
set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` |
|||
else |
|||
set env_name = `basename "$VIRTUAL_ENV"` |
|||
endif |
|||
endif |
|||
set prompt = "[$env_name] $prompt" |
|||
unset env_name |
|||
endif |
|||
|
|||
alias pydoc python -m pydoc |
|||
|
|||
rehash |
@ -0,0 +1,75 @@ |
|||
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) |
|||
# you cannot run it directly |
|||
|
|||
function deactivate -d "Exit virtualenv and return to normal shell environment" |
|||
# reset old environment variables |
|||
if test -n "$_OLD_VIRTUAL_PATH" |
|||
set -gx PATH $_OLD_VIRTUAL_PATH |
|||
set -e _OLD_VIRTUAL_PATH |
|||
end |
|||
if test -n "$_OLD_VIRTUAL_PYTHONHOME" |
|||
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME |
|||
set -e _OLD_VIRTUAL_PYTHONHOME |
|||
end |
|||
|
|||
if test -n "$_OLD_FISH_PROMPT_OVERRIDE" |
|||
functions -e fish_prompt |
|||
set -e _OLD_FISH_PROMPT_OVERRIDE |
|||
functions -c _old_fish_prompt fish_prompt |
|||
functions -e _old_fish_prompt |
|||
end |
|||
|
|||
set -e VIRTUAL_ENV |
|||
if test "$argv[1]" != "nondestructive" |
|||
# Self destruct! |
|||
functions -e deactivate |
|||
end |
|||
end |
|||
|
|||
# unset irrelevant variables |
|||
deactivate nondestructive |
|||
|
|||
set -gx VIRTUAL_ENV "/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv" |
|||
|
|||
set -gx _OLD_VIRTUAL_PATH $PATH |
|||
set -gx PATH "$VIRTUAL_ENV/bin" $PATH |
|||
|
|||
# unset PYTHONHOME if set |
|||
if set -q PYTHONHOME |
|||
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME |
|||
set -e PYTHONHOME |
|||
end |
|||
|
|||
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" |
|||
# fish uses a function instead of an env var to generate the prompt. |
|||
|
|||
# save the current fish_prompt function as the function _old_fish_prompt |
|||
functions -c fish_prompt _old_fish_prompt |
|||
|
|||
# with the original prompt function renamed, we can override with our own. |
|||
function fish_prompt |
|||
# Save the return status of the last command |
|||
set -l old_status $status |
|||
|
|||
# Prompt override? |
|||
if test -n "(bots-venv) " |
|||
printf "%s%s" "(bots-venv) " (set_color normal) |
|||
else |
|||
# ...Otherwise, prepend env |
|||
set -l _checkbase (basename "$VIRTUAL_ENV") |
|||
if test $_checkbase = "__" |
|||
# special case for Aspen magic directories |
|||
# see http://www.zetadev.com/software/aspen/ |
|||
printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) |
|||
else |
|||
printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) |
|||
end |
|||
end |
|||
|
|||
# Restore the return status of the previous command. |
|||
echo "exit $old_status" | . |
|||
_old_fish_prompt |
|||
end |
|||
|
|||
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" |
|||
end |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from setuptools.command.easy_install import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from setuptools.command.easy_install import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from markdown.__main__ import run |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(run()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pelican.__main__ import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pelican.tools.pelican_import import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pelican.plugins._utils import list_plugins |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(list_plugins()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pelican.tools.pelican_quickstart import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pelican.tools.pelican_themes import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pip._internal import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pip._internal import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pip._internal import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from pygments.cmdline import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1 @@ |
|||
python3 |
@ -0,0 +1 @@ |
|||
/usr/bin/python3 |
@ -0,0 +1,23 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $ |
|||
# Author: David Goodger <goodger@python.org> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing HTML. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
|
|||
description = ('Generates (X)HTML documents from standalone reStructuredText ' |
|||
'sources. ' + default_description) |
|||
|
|||
publish_cmdline(writer_name='html', description=description) |
@ -0,0 +1,26 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2html4.py 7994 2016-12-10 17:41:45Z milde $ |
|||
# Author: David Goodger <goodger@python.org> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing (X)HTML. |
|||
|
|||
The output conforms to XHTML 1.0 transitional |
|||
and almost to HTML 4.01 transitional (except for closing empty tags). |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
|
|||
description = ('Generates (X)HTML documents from standalone reStructuredText ' |
|||
'sources. ' + default_description) |
|||
|
|||
publish_cmdline(writer_name='html4', description=description) |
@ -0,0 +1,35 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf8 -*- |
|||
# :Copyright: © 2015 Günter Milde. |
|||
# :License: Released under the terms of the `2-Clause BSD license`_, in short: |
|||
# |
|||
# Copying and distribution of this file, with or without modification, |
|||
# are permitted in any medium without royalty provided the copyright |
|||
# notice and this notice are preserved. |
|||
# This file is offered as-is, without any warranty. |
|||
# |
|||
# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause |
|||
# |
|||
# Revision: $Revision: 8410 $ |
|||
# Date: $Date: 2019-11-04 22:14:43 +0100 (Mo, 04. Nov 2019) $ |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing HTML 5 documents. |
|||
|
|||
The output also conforms to XHTML 1.0 transitional |
|||
(except for the doctype declaration). |
|||
""" |
|||
|
|||
try: |
|||
import locale # module missing in Jython |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except locale.Error: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
description = (u'Generates HTML 5 documents from standalone ' |
|||
u'reStructuredText sources ' |
|||
+ default_description) |
|||
|
|||
publish_cmdline(writer_name='html5', description=description) |
@ -0,0 +1,26 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2latex.py 5905 2009-04-16 12:04:49Z milde $ |
|||
# Author: David Goodger <goodger@python.org> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing LaTeX. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline |
|||
|
|||
description = ('Generates LaTeX documents from standalone reStructuredText ' |
|||
'sources. ' |
|||
'Reads from <source> (default is stdin) and writes to ' |
|||
'<destination> (default is stdout). See ' |
|||
'<http://docutils.sourceforge.net/docs/user/latex.html> for ' |
|||
'the full reference.') |
|||
|
|||
publish_cmdline(writer_name='latex', description=description) |
@ -0,0 +1,26 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# Author: |
|||
# Contact: grubert@users.sf.net |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
man.py |
|||
====== |
|||
|
|||
This module provides a simple command line interface that uses the |
|||
man page writer to output from ReStructuredText source. |
|||
""" |
|||
|
|||
import locale |
|||
try: |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
from docutils.writers import manpage |
|||
|
|||
description = ("Generates plain unix manual documents. " + default_description) |
|||
|
|||
publish_cmdline(writer=manpage.Writer(), description=description) |
@ -0,0 +1,30 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2odt.py 5839 2009-01-07 19:09:28Z dkuhlman $ |
|||
# Author: Dave Kuhlman <dkuhlman@rexx.com> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A front end to the Docutils Publisher, producing OpenOffice documents. |
|||
""" |
|||
|
|||
import sys |
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline_to_binary, default_description |
|||
from docutils.writers.odf_odt import Writer, Reader |
|||
|
|||
|
|||
description = ('Generates OpenDocument/OpenOffice/ODF documents from ' |
|||
'standalone reStructuredText sources. ' + default_description) |
|||
|
|||
|
|||
writer = Writer() |
|||
reader = Reader() |
|||
output = publish_cmdline_to_binary(reader=reader, writer=writer, |
|||
description=description) |
|||
|
@ -0,0 +1,67 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2odt_prepstyles.py 8346 2019-08-26 12:11:32Z milde $ |
|||
# Author: Dave Kuhlman <dkuhlman@rexx.com> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
Fix a word-processor-generated styles.odt for odtwriter use: Drop page size |
|||
specifications from styles.xml in STYLE_FILE.odt. |
|||
""" |
|||
|
|||
# Author: Michael Schutte <michi@uiae.at> |
|||
|
|||
from __future__ import print_function |
|||
|
|||
from lxml import etree |
|||
import sys |
|||
import zipfile |
|||
from tempfile import mkstemp |
|||
import shutil |
|||
import os |
|||
|
|||
NAMESPACES = { |
|||
"style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0", |
|||
"fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" |
|||
} |
|||
|
|||
|
|||
def prepstyle(filename): |
|||
|
|||
zin = zipfile.ZipFile(filename) |
|||
styles = zin.read("styles.xml") |
|||
|
|||
root = etree.fromstring(styles) |
|||
for el in root.xpath("//style:page-layout-properties", |
|||
namespaces=NAMESPACES): |
|||
for attr in el.attrib: |
|||
if attr.startswith("{%s}" % NAMESPACES["fo"]): |
|||
del el.attrib[attr] |
|||
|
|||
tempname = mkstemp() |
|||
zout = zipfile.ZipFile(os.fdopen(tempname[0], "w"), "w", |
|||
zipfile.ZIP_DEFLATED) |
|||
|
|||
for item in zin.infolist(): |
|||
if item.filename == "styles.xml": |
|||
zout.writestr(item, etree.tostring(root)) |
|||
else: |
|||
zout.writestr(item, zin.read(item.filename)) |
|||
|
|||
zout.close() |
|||
zin.close() |
|||
shutil.move(tempname[1], filename) |
|||
|
|||
|
|||
def main(): |
|||
args = sys.argv[1:] |
|||
if len(args) != 1: |
|||
print(__doc__, file=sys.stderr) |
|||
print("Usage: %s STYLE_FILE.odt\n" % sys.argv[0], file=sys.stderr) |
|||
sys.exit(1) |
|||
filename = args[0] |
|||
prepstyle(filename) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main() |
@ -0,0 +1,23 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $ |
|||
# Author: David Goodger <goodger@python.org> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing pseudo-XML. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
|
|||
description = ('Generates pseudo-XML from standalone reStructuredText ' |
|||
'sources (for testing purposes). ' + default_description) |
|||
|
|||
publish_cmdline(description=description) |
@ -0,0 +1,24 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2s5.py 4564 2006-05-21 20:44:42Z wiemann $ |
|||
# Author: Chris Liechti <cliechti@gmx.net> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing HTML slides using |
|||
the S5 template system. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
|
|||
description = ('Generates S5 (X)HTML slideshow documents from standalone ' |
|||
'reStructuredText sources. ' + default_description) |
|||
|
|||
publish_cmdline(writer_name='s5', description=description) |
@ -0,0 +1,27 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2xetex.py 7847 2015-03-17 17:30:47Z milde $ |
|||
# Author: Guenter Milde |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing Lua/XeLaTeX code. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline |
|||
|
|||
description = ('Generates LaTeX documents from standalone reStructuredText ' |
|||
'sources for compilation with the Unicode-aware TeX variants ' |
|||
'XeLaTeX or LuaLaTeX. ' |
|||
'Reads from <source> (default is stdin) and writes to ' |
|||
'<destination> (default is stdout). See ' |
|||
'<http://docutils.sourceforge.net/docs/user/latex.html> for ' |
|||
'the full reference.') |
|||
|
|||
publish_cmdline(writer_name='xetex', description=description) |
@ -0,0 +1,23 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rst2xml.py 4564 2006-05-21 20:44:42Z wiemann $ |
|||
# Author: David Goodger <goodger@python.org> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing Docutils XML. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
|
|||
description = ('Generates Docutils-native XML from standalone ' |
|||
'reStructuredText sources. ' + default_description) |
|||
|
|||
publish_cmdline(writer_name='xml', description=description) |
@ -0,0 +1,25 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
|
|||
# $Id: rstpep2html.py 4564 2006-05-21 20:44:42Z wiemann $ |
|||
# Author: David Goodger <goodger@python.org> |
|||
# Copyright: This module has been placed in the public domain. |
|||
|
|||
""" |
|||
A minimal front end to the Docutils Publisher, producing HTML from PEP |
|||
(Python Enhancement Proposal) documents. |
|||
""" |
|||
|
|||
try: |
|||
import locale |
|||
locale.setlocale(locale.LC_ALL, '') |
|||
except: |
|||
pass |
|||
|
|||
from docutils.core import publish_cmdline, default_description |
|||
|
|||
|
|||
description = ('Generates (X)HTML from reStructuredText-format PEP files. ' |
|||
+ default_description) |
|||
|
|||
publish_cmdline(reader_name='pep', writer_name='pep_html', |
|||
description=description) |
@ -0,0 +1,10 @@ |
|||
#!/home/ccl/Documents/bots-as-digital-infrapunctures/bots-venv/bin/python3 |
|||
# -*- coding: utf-8 -*- |
|||
import re |
|||
import sys |
|||
|
|||
from unidecode.util import main |
|||
|
|||
if __name__ == '__main__': |
|||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) |
|||
sys.exit(main()) |
@ -0,0 +1 @@ |
|||
pip |
@ -0,0 +1,28 @@ |
|||
Copyright 2007 Pallets |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are |
|||
met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above copyright |
|||
notice, this list of conditions and the following disclaimer in the |
|||
documentation and/or other materials provided with the distribution. |
|||
|
|||
3. Neither the name of the copyright holder nor the names of its |
|||
contributors may be used to endorse or promote products derived from |
|||
this software without specific prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
|||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
|||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,106 @@ |
|||
Metadata-Version: 2.1 |
|||
Name: Jinja2 |
|||
Version: 2.11.2 |
|||
Summary: A very fast and expressive template engine. |
|||
Home-page: https://palletsprojects.com/p/jinja/ |
|||
Author: Armin Ronacher |
|||
Author-email: armin.ronacher@active-4.com |
|||
Maintainer: Pallets |
|||
Maintainer-email: contact@palletsprojects.com |
|||
License: BSD-3-Clause |
|||
Project-URL: Documentation, https://jinja.palletsprojects.com/ |
|||
Project-URL: Code, https://github.com/pallets/jinja |
|||
Project-URL: Issue tracker, https://github.com/pallets/jinja/issues |
|||
Platform: UNKNOWN |
|||
Classifier: Development Status :: 5 - Production/Stable |
|||
Classifier: Environment :: Web Environment |
|||
Classifier: Intended Audience :: Developers |
|||
Classifier: License :: OSI Approved :: BSD License |
|||
Classifier: Operating System :: OS Independent |
|||
Classifier: Programming Language :: Python |
|||
Classifier: Programming Language :: Python :: 2 |
|||
Classifier: Programming Language :: Python :: 2.7 |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.5 |
|||
Classifier: Programming Language :: Python :: 3.6 |
|||
Classifier: Programming Language :: Python :: 3.7 |
|||
Classifier: Programming Language :: Python :: 3.8 |
|||
Classifier: Programming Language :: Python :: Implementation :: CPython |
|||
Classifier: Programming Language :: Python :: Implementation :: PyPy |
|||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content |
|||
Classifier: Topic :: Software Development :: Libraries :: Python Modules |
|||
Classifier: Topic :: Text Processing :: Markup :: HTML |
|||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* |
|||
Description-Content-Type: text/x-rst |
|||
Requires-Dist: MarkupSafe (>=0.23) |
|||
Provides-Extra: i18n |
|||
Requires-Dist: Babel (>=0.8) ; extra == 'i18n' |
|||
|
|||
Jinja |
|||
===== |
|||
|
|||
Jinja is a fast, expressive, extensible templating engine. Special |
|||
placeholders in the template allow writing code similar to Python |
|||
syntax. Then the template is passed data to render the final document. |
|||
|
|||
It includes: |
|||
|
|||
- Template inheritance and inclusion. |
|||
- Define and import macros within templates. |
|||
- HTML templates can use autoescaping to prevent XSS from untrusted |
|||
user input. |
|||
- A sandboxed environment can safely render untrusted templates. |
|||
- AsyncIO support for generating templates and calling async |
|||
functions. |
|||
- I18N support with Babel. |
|||
- Templates are compiled to optimized Python code just-in-time and |
|||
cached, or can be compiled ahead-of-time. |
|||
- Exceptions point to the correct line in templates to make debugging |
|||
easier. |
|||
- Extensible filters, tests, functions, and even syntax. |
|||
|
|||
Jinja's philosophy is that while application logic belongs in Python if |
|||
possible, it shouldn't make the template designer's job difficult by |
|||
restricting functionality too much. |
|||
|
|||
|
|||
Installing |
|||
---------- |
|||
|
|||
Install and update using `pip`_: |
|||
|
|||
.. code-block:: text |
|||
|
|||
$ pip install -U Jinja2 |
|||
|
|||
.. _pip: https://pip.pypa.io/en/stable/quickstart/ |
|||
|
|||
|
|||
In A Nutshell |
|||
------------- |
|||
|
|||
.. code-block:: jinja |
|||
|
|||
{% extends "base.html" %} |
|||
{% block title %}Members{% endblock %} |
|||
{% block content %} |
|||
<ul> |
|||
{% for user in users %} |
|||
<li><a href="{{ user.url }}">{{ user.username }}</a></li> |
|||
{% endfor %} |
|||
</ul> |
|||
{% endblock %} |
|||
|
|||
|
|||
Links |
|||
----- |
|||
|
|||
- Website: https://palletsprojects.com/p/jinja/ |
|||
- Documentation: https://jinja.palletsprojects.com/ |
|||
- Releases: https://pypi.org/project/Jinja2/ |
|||
- Code: https://github.com/pallets/jinja |
|||
- Issue tracker: https://github.com/pallets/jinja/issues |
|||
- Test status: https://dev.azure.com/pallets/jinja/_build |
|||
- Official chat: https://discord.gg/t6rrQZH |
|||
|
|||
|
@ -0,0 +1,61 @@ |
|||
Jinja2-2.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
|||
Jinja2-2.11.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 |
|||
Jinja2-2.11.2.dist-info/METADATA,sha256=5ZHRZoIRAMHsJPnqhlJ622_dRPsYePYJ-9EH4-Ry7yI,3535 |
|||
Jinja2-2.11.2.dist-info/RECORD,, |
|||
Jinja2-2.11.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 |
|||
Jinja2-2.11.2.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 |
|||
Jinja2-2.11.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 |
|||
jinja2/__init__.py,sha256=0QCM_jKKDM10yzSdHRVV4mQbCbDqf0GN0GirAqibn9Y,1549 |
|||
jinja2/__pycache__/__init__.cpython-37.pyc,, |
|||
jinja2/__pycache__/_compat.cpython-37.pyc,, |
|||
jinja2/__pycache__/_identifier.cpython-37.pyc,, |
|||
jinja2/__pycache__/asyncfilters.cpython-37.pyc,, |
|||
jinja2/__pycache__/asyncsupport.cpython-37.pyc,, |
|||
jinja2/__pycache__/bccache.cpython-37.pyc,, |
|||
jinja2/__pycache__/compiler.cpython-37.pyc,, |
|||
jinja2/__pycache__/constants.cpython-37.pyc,, |
|||
jinja2/__pycache__/debug.cpython-37.pyc,, |
|||
jinja2/__pycache__/defaults.cpython-37.pyc,, |
|||
jinja2/__pycache__/environment.cpython-37.pyc,, |
|||
jinja2/__pycache__/exceptions.cpython-37.pyc,, |
|||
jinja2/__pycache__/ext.cpython-37.pyc,, |
|||
jinja2/__pycache__/filters.cpython-37.pyc,, |
|||
jinja2/__pycache__/idtracking.cpython-37.pyc,, |
|||
jinja2/__pycache__/lexer.cpython-37.pyc,, |
|||
jinja2/__pycache__/loaders.cpython-37.pyc,, |
|||
jinja2/__pycache__/meta.cpython-37.pyc,, |
|||
jinja2/__pycache__/nativetypes.cpython-37.pyc,, |
|||
jinja2/__pycache__/nodes.cpython-37.pyc,, |
|||
jinja2/__pycache__/optimizer.cpython-37.pyc,, |
|||
jinja2/__pycache__/parser.cpython-37.pyc,, |
|||
jinja2/__pycache__/runtime.cpython-37.pyc,, |
|||
jinja2/__pycache__/sandbox.cpython-37.pyc,, |
|||
jinja2/__pycache__/tests.cpython-37.pyc,, |
|||
jinja2/__pycache__/utils.cpython-37.pyc,, |
|||
jinja2/__pycache__/visitor.cpython-37.pyc,, |
|||
jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191 |
|||
jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775 |
|||
jinja2/asyncfilters.py,sha256=XJtYXTxFvcJ5xwk6SaDL4S0oNnT0wPYvXBCSzc482fI,4250 |
|||
jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209 |
|||
jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139 |
|||
jinja2/compiler.py,sha256=Ta9W1Lit542wItAHXlDcg0sEOsFDMirCdlFPHAurg4o,66284 |
|||
jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458 |
|||
jinja2/debug.py,sha256=neR7GIGGjZH3_ILJGVUYy3eLQCCaWJMXOb7o0kGInWc,8529 |
|||
jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126 |
|||
jinja2/environment.py,sha256=XDSLKc4SqNLMOwTSq3TbWEyA5WyXfuLuVD0wAVjEFwM,50629 |
|||
jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425 |
|||
jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441 |
|||
jinja2/filters.py,sha256=_RpPgAlgIj7ExvyDzcHAC3B36cocfWK-1TEketbNeM0,41415 |
|||
jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211 |
|||
jinja2/lexer.py,sha256=nUFLRKhhKmmEWkLI65nQePgcQs7qsRdjVYZETMt_v0g,30331 |
|||
jinja2/loaders.py,sha256=C-fST_dmFjgWkp0ZuCkrgICAoOsoSIF28wfAFink0oU,17666 |
|||
jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131 |
|||
jinja2/nativetypes.py,sha256=Ul__gtVw4xH-0qvUvnCNHedQeNDwmEuyLJztzzSPeRg,2753 |
|||
jinja2/nodes.py,sha256=Mk1oJPVgIjnQw9WOqILvcu3rLepcFZ0ahxQm2mbwDwc,31095 |
|||
jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457 |
|||
jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660 |
|||
jinja2/runtime.py,sha256=0y-BRyIEZ9ltByL2Id6GpHe1oDRQAwNeQvI0SKobNMw,30618 |
|||
jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127 |
|||
jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799 |
|||
jinja2/utils.py,sha256=OoVMlQe9S2-lWT6jJbTu9tDuDvGNyWUhHDcE51i5_Do,22522 |
|||
jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240 |
@ -0,0 +1,6 @@ |
|||
Wheel-Version: 1.0 |
|||
Generator: bdist_wheel (0.34.2) |
|||
Root-Is-Purelib: true |
|||
Tag: py2-none-any |
|||
Tag: py3-none-any |
|||
|
@ -0,0 +1,3 @@ |
|||
[babel.extractors] |
|||
jinja2 = jinja2.ext:babel_extract [i18n] |
|||
|
@ -0,0 +1 @@ |
|||
jinja2 |
@ -0,0 +1 @@ |
|||
pip |
@ -0,0 +1,29 @@ |
|||
Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) |
|||
Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) |
|||
Copyright 2004 Manfred Stienstra (the original version) |
|||
|
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are met: |
|||
|
|||
* Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
* Redistributions in binary form must reproduce the above copyright |
|||
notice, this list of conditions and the following disclaimer in the |
|||
documentation and/or other materials provided with the distribution. |
|||
* Neither the name of the Python Markdown Project nor the |
|||
names of its contributors may be used to endorse or promote products |
|||
derived from this software without specific prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY |
|||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT |
|||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|||
POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,57 @@ |
|||
Metadata-Version: 2.1 |
|||
Name: Markdown |
|||
Version: 3.2.2 |
|||
Summary: Python implementation of Markdown. |
|||
Home-page: https://Python-Markdown.github.io/ |
|||
Author: Manfred Stienstra, Yuri takhteyev and Waylan limberg |
|||
Author-email: waylan.limberg@icloud.com |
|||
Maintainer: Waylan Limberg |
|||
Maintainer-email: waylan.limberg@icloud.com |
|||
License: BSD License |
|||
Download-URL: http://pypi.python.org/packages/source/M/Markdown/Markdown-3.2.2-py2.py3-none-any.whl |
|||
Platform: UNKNOWN |
|||
Classifier: Development Status :: 5 - Production/Stable |
|||
Classifier: License :: OSI Approved :: BSD License |
|||
Classifier: Operating System :: OS Independent |
|||
Classifier: Programming Language :: Python |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.5 |
|||
Classifier: Programming Language :: Python :: 3.6 |
|||
Classifier: Programming Language :: Python :: 3.7 |
|||
Classifier: Programming Language :: Python :: 3.8 |
|||
Classifier: Programming Language :: Python :: 3 :: Only |
|||
Classifier: Programming Language :: Python :: Implementation :: CPython |
|||
Classifier: Programming Language :: Python :: Implementation :: PyPy |
|||
Classifier: Topic :: Communications :: Email :: Filters |
|||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries |
|||
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management |
|||
Classifier: Topic :: Software Development :: Documentation |
|||
Classifier: Topic :: Software Development :: Libraries :: Python Modules |
|||
Classifier: Topic :: Text Processing :: Filters |
|||
Classifier: Topic :: Text Processing :: Markup :: HTML |
|||
Requires-Python: >=3.5 |
|||
Requires-Dist: importlib-metadata ; python_version < "3.8" |
|||
Provides-Extra: testing |
|||
Requires-Dist: coverage ; extra == 'testing' |
|||
Requires-Dist: pyyaml ; extra == 'testing' |
|||
|
|||
|
|||
This is a Python implementation of John Gruber's Markdown_. |
|||
It is almost completely compliant with the reference implementation, |
|||
though there are a few known issues. See Features_ for information |
|||
on what exactly is supported and what is not. Additional features are |
|||
supported by the `Available Extensions`_. |
|||
|
|||
.. _Markdown: https://daringfireball.net/projects/markdown/ |
|||
.. _Features: https://Python-Markdown.github.io#features |
|||
.. _`Available Extensions`: https://Python-Markdown.github.io/extensions/ |
|||
|
|||
Support |
|||
======= |
|||
|
|||
You may report bugs, ask for help, and discuss various other issues on |
|||
the `bug tracker`_. |
|||
|
|||
.. _`bug tracker`: https://github.com/Python-Markdown/markdown/issues |
|||
|
|||
|
@ -0,0 +1,74 @@ |
|||
../../../bin/markdown_py,sha256=qKeKc-r7oY5-Fbky1RHMUdhnzJzQ5zSPsiabAys1mnc,273 |
|||
Markdown-3.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
|||
Markdown-3.2.2.dist-info/LICENSE.md,sha256=bxGTy2NHGOZcOlN9biXr1hSCDsDvaTz8EiSBEmONZNo,1645 |
|||
Markdown-3.2.2.dist-info/METADATA,sha256=zgAbjRRuBBmQaECWiKBHfwpPd1JjR8qQ3-39oaAHHaI,2409 |
|||
Markdown-3.2.2.dist-info/RECORD,, |
|||
Markdown-3.2.2.dist-info/WHEEL,sha256=S8S5VL-stOTSZDYxHyf0KP7eds0J72qrK0Evu3TfyAY,92 |
|||
Markdown-3.2.2.dist-info/entry_points.txt,sha256=j4jiKg-iwZGImvi8OzotZePWoFbJJ4GrfzDqH03u3SQ,1103 |
|||
Markdown-3.2.2.dist-info/top_level.txt,sha256=IAxs8x618RXoH1uCqeLLxXsDefJvE_mIibr_M4sOlyk,9 |
|||
markdown/__init__.py,sha256=002-LuHviYzROW2rg_gBGai81nMouUNO9UFj5nSsTSk,2065 |
|||
markdown/__main__.py,sha256=MpVK3zlwQ-4AzDzZmIScPB90PpunMGVgS5KBmJuHYTw,5802 |
|||
markdown/__meta__.py,sha256=1KPSWlbs623C1QTn8qYSTfbDKrYQFyydYwlRep-5ATk,1630 |
|||
markdown/__pycache__/__init__.cpython-37.pyc,, |
|||
markdown/__pycache__/__main__.cpython-37.pyc,, |
|||
markdown/__pycache__/__meta__.cpython-37.pyc,, |
|||
markdown/__pycache__/blockparser.cpython-37.pyc,, |
|||
markdown/__pycache__/blockprocessors.cpython-37.pyc,, |
|||
markdown/__pycache__/core.cpython-37.pyc,, |
|||
markdown/__pycache__/inlinepatterns.cpython-37.pyc,, |
|||
markdown/__pycache__/pep562.cpython-37.pyc,, |
|||
markdown/__pycache__/postprocessors.cpython-37.pyc,, |
|||
markdown/__pycache__/preprocessors.cpython-37.pyc,, |
|||
markdown/__pycache__/serializers.cpython-37.pyc,, |
|||
markdown/__pycache__/test_tools.cpython-37.pyc,, |
|||
markdown/__pycache__/treeprocessors.cpython-37.pyc,, |
|||
markdown/__pycache__/util.cpython-37.pyc,, |
|||
markdown/blockparser.py,sha256=JpBhOokOoBUGCXolftOc5m1hPcR2y9s9hVd9WSuhHzo,4285 |
|||
markdown/blockprocessors.py,sha256=l4gmkAN9b2L340EX0gm24EyWS7UzBviPqX6wYrcgEco,23736 |
|||
markdown/core.py,sha256=Hm1VMHvmHJiVMta9y1vFyUx04OWjTP3yRJ-al4Rqz1U,15278 |
|||
markdown/extensions/__init__.py,sha256=nw2VtafIf5zHjAcUuykQbaNY6taOmNn7ARn11-Pe080,3661 |
|||
markdown/extensions/__pycache__/__init__.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/abbr.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/admonition.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/attr_list.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/codehilite.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/def_list.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/extra.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/fenced_code.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/footnotes.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/legacy_attrs.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/legacy_em.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/md_in_html.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/meta.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/nl2br.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/sane_lists.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/smarty.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/tables.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/toc.cpython-37.pyc,, |
|||
markdown/extensions/__pycache__/wikilinks.cpython-37.pyc,, |
|||
markdown/extensions/abbr.py,sha256=pqp2HnOR2giT-iYKyqtsp2_eUOWBR0j_hUfjvUV5c88,2916 |
|||
markdown/extensions/admonition.py,sha256=HWHHjuYZPAPOg5X8hbpDuSbw8gB6k0odw8GuTT1v_N4,3124 |
|||
markdown/extensions/attr_list.py,sha256=m9a1H-S33rV2twtlFYuoxSiCAf22ndU5tziSzNF2dNg,6003 |
|||
markdown/extensions/codehilite.py,sha256=ChzzzrRIQZQwhQ7dLEIXDKTnemZzmEJCoNFcw6Sp5gk,9838 |
|||
markdown/extensions/def_list.py,sha256=iqRXAEl2XnyF415afCxihAgOmEUOK1hIuBPIK1k7Tzo,3521 |
|||
markdown/extensions/extra.py,sha256=udRN8OvSWcq3UwkPygvsFl1RlCVtCJ-ARVg2IwVH6VY,1831 |
|||
markdown/extensions/fenced_code.py,sha256=dww9rDu2kQtkoTpjn9BBgeGCTNdE1bMPJ2wgR6695iM,3897 |
|||
markdown/extensions/footnotes.py,sha256=a9sb8RoKqFU8p8ZhpTObrn_Uek0hbyPFVGYpRaEDXaw,15339 |
|||
markdown/extensions/legacy_attrs.py,sha256=2EaVQkxQoNnP8_lMPvGRBdNda8L4weUQroiyEuVdS-w,2547 |
|||
markdown/extensions/legacy_em.py,sha256=9ZMGCTrFh01eiOpnFjS0jVkqgYXiTzCGn-eNvYcvObg,1579 |
|||
markdown/extensions/md_in_html.py,sha256=ohSiGcgR5yBqusuTs0opbTO_5fq442fqPK-klFd_qaM,4040 |
|||
markdown/extensions/meta.py,sha256=EUfkzM7l7UpH__Or9K3pl8ldVddwndlCZWA3d712RAE,2331 |
|||
markdown/extensions/nl2br.py,sha256=wAqTNOuf2L1NzlEvEqoID70n9y-aiYaGLkuyQk3CD0w,783 |
|||
markdown/extensions/sane_lists.py,sha256=ZQmCf-247KBexVG0fc62nDvokGkV6W1uavYbieNKSG4,1505 |
|||
markdown/extensions/smarty.py,sha256=0padzkVCNACainKw-Xj1S5UfT0125VCTfNejmrCZItA,10238 |
|||
markdown/extensions/tables.py,sha256=bicFx_wqhnEx6Y_8MJqA56rh71pt5fOe94oiWbvcobY,7685 |
|||
markdown/extensions/toc.py,sha256=C45ZZxlp9uDTE1WW9EvLTKT24H2SY0HM3nUDfGlzgng,13477 |
|||
markdown/extensions/wikilinks.py,sha256=GkgT9BY7b1-qW--dIwFAhC9V20RoeF13b7CFdw_V21Q,2812 |
|||
markdown/inlinepatterns.py,sha256=EnYq9aU_Hi1gu5e8dcbUxUu0mRz-pHFV79uGQCYbD5I,29378 |
|||
markdown/pep562.py,sha256=5UkqT7sb-cQufgbOl_jF-RYUVVHS7VThzlMzR9vrd3I,8917 |
|||
markdown/postprocessors.py,sha256=25g6qqpJ4kuiq4RBrGz8RA6GMb7ArUi1AN2VDVnR35U,3738 |
|||
markdown/preprocessors.py,sha256=dsmMVPP2afKAZ0s59_mFidM_mCiNfgdBJ9aVDWu_viE,15323 |
|||
markdown/serializers.py,sha256=_wQl-iJrPSUEQ4Q1owWYqN9qceVh6TOlAOH_i44BKAQ,6540 |
|||
markdown/test_tools.py,sha256=qwF7x7QZa9Wa509Y4KJfmc1O3udrtXgH1AXj33TpDso,6823 |
|||
markdown/treeprocessors.py,sha256=NBaYc9TEGP7TBaN6YRROIqE5Lj-AMoAqp0jN-coGW3Q,15401 |
|||
markdown/util.py,sha256=3-F0KcHEYOIOayAt8FIeoUxNfLlfMeiSF3EE3dWzxg8,15499 |
@ -0,0 +1,5 @@ |
|||
Wheel-Version: 1.0 |
|||
Generator: bdist_wheel (0.33.4) |
|||
Root-Is-Purelib: true |
|||
Tag: py3-none-any |
|||
|
@ -0,0 +1,23 @@ |
|||
[console_scripts] |
|||
markdown_py = markdown.__main__:run |
|||
|
|||
[markdown.extensions] |
|||
abbr = markdown.extensions.abbr:AbbrExtension |
|||
admonition = markdown.extensions.admonition:AdmonitionExtension |
|||
attr_list = markdown.extensions.attr_list:AttrListExtension |
|||
codehilite = markdown.extensions.codehilite:CodeHiliteExtension |
|||
def_list = markdown.extensions.def_list:DefListExtension |
|||
extra = markdown.extensions.extra:ExtraExtension |
|||
fenced_code = markdown.extensions.fenced_code:FencedCodeExtension |
|||
footnotes = markdown.extensions.footnotes:FootnoteExtension |
|||
legacy_attrs = markdown.extensions.legacy_attrs:LegacyAttrExtension |
|||
legacy_em = markdown.extensions.legacy_em:LegacyEmExtension |
|||
md_in_html = markdown.extensions.md_in_html:MarkdownInHtmlExtension |
|||
meta = markdown.extensions.meta:MetaExtension |
|||
nl2br = markdown.extensions.nl2br:Nl2BrExtension |
|||
sane_lists = markdown.extensions.sane_lists:SaneListExtension |
|||
smarty = markdown.extensions.smarty:SmartyExtension |
|||
tables = markdown.extensions.tables:TableExtension |
|||
toc = markdown.extensions.toc:TocExtension |
|||
wikilinks = markdown.extensions.wikilinks:WikiLinkExtension |
|||
|
@ -0,0 +1 @@ |
|||
markdown |
@ -0,0 +1 @@ |
|||
pip |
@ -0,0 +1,28 @@ |
|||
Copyright 2010 Pallets |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are |
|||
met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above copyright |
|||
notice, this list of conditions and the following disclaimer in the |
|||
documentation and/or other materials provided with the distribution. |
|||
|
|||
3. Neither the name of the copyright holder nor the names of its |
|||
contributors may be used to endorse or promote products derived from |
|||
this software without specific prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
|||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
|||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,103 @@ |
|||
Metadata-Version: 2.1 |
|||
Name: MarkupSafe |
|||
Version: 1.1.1 |
|||
Summary: Safely add untrusted strings to HTML/XML markup. |
|||
Home-page: https://palletsprojects.com/p/markupsafe/ |
|||
Author: Armin Ronacher |
|||
Author-email: armin.ronacher@active-4.com |
|||
Maintainer: The Pallets Team |
|||
Maintainer-email: contact@palletsprojects.com |
|||
License: BSD-3-Clause |
|||
Project-URL: Documentation, https://markupsafe.palletsprojects.com/ |
|||
Project-URL: Code, https://github.com/pallets/markupsafe |
|||
Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues |
|||
Platform: UNKNOWN |
|||
Classifier: Development Status :: 5 - Production/Stable |
|||
Classifier: Environment :: Web Environment |
|||
Classifier: Intended Audience :: Developers |
|||
Classifier: License :: OSI Approved :: BSD License |
|||
Classifier: Operating System :: OS Independent |
|||
Classifier: Programming Language :: Python |
|||
Classifier: Programming Language :: Python :: 2 |
|||
Classifier: Programming Language :: Python :: 2.7 |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.4 |
|||
Classifier: Programming Language :: Python :: 3.5 |
|||
Classifier: Programming Language :: Python :: 3.6 |
|||
Classifier: Programming Language :: Python :: 3.7 |
|||
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content |
|||
Classifier: Topic :: Software Development :: Libraries :: Python Modules |
|||
Classifier: Topic :: Text Processing :: Markup :: HTML |
|||
Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* |
|||
|
|||
MarkupSafe |
|||
========== |
|||
|
|||
MarkupSafe implements a text object that escapes characters so it is |
|||
safe to use in HTML and XML. Characters that have special meanings are |
|||
replaced so that they display as the actual characters. This mitigates |
|||
injection attacks, meaning untrusted user input can safely be displayed |
|||
on a page. |
|||
|
|||
|
|||
Installing |
|||
---------- |
|||
|
|||
Install and update using `pip`_: |
|||
|
|||
.. code-block:: text |
|||
|
|||
pip install -U MarkupSafe |
|||
|
|||
.. _pip: https://pip.pypa.io/en/stable/quickstart/ |
|||
|
|||
|
|||
Examples |
|||
-------- |
|||
|
|||
.. code-block:: pycon |
|||
|
|||
>>> from markupsafe import Markup, escape |
|||
>>> # escape replaces special characters and wraps in Markup |
|||
>>> escape('<script>alert(document.cookie);</script>') |
|||
Markup(u'<script>alert(document.cookie);</script>') |
|||
>>> # wrap in Markup to mark text "safe" and prevent escaping |
|||
>>> Markup('<strong>Hello</strong>') |
|||
Markup('<strong>hello</strong>') |
|||
>>> escape(Markup('<strong>Hello</strong>')) |
|||
Markup('<strong>hello</strong>') |
|||
>>> # Markup is a text subclass (str on Python 3, unicode on Python 2) |
|||
>>> # methods and operators escape their arguments |
|||
>>> template = Markup("Hello <em>%s</em>") |
|||
>>> template % '"World"' |
|||
Markup('Hello <em>"World"</em>') |
|||
|
|||
|
|||
Donate |
|||
------ |
|||
|
|||
The Pallets organization develops and supports MarkupSafe and other |
|||
libraries that use it. In order to grow the community of contributors |
|||
and users, and allow the maintainers to devote more time to the |
|||
projects, `please donate today`_. |
|||
|
|||
.. _please donate today: https://palletsprojects.com/donate |
|||
|
|||
|
|||
Links |
|||
----- |
|||
|
|||
* Website: https://palletsprojects.com/p/markupsafe/ |
|||
* Documentation: https://markupsafe.palletsprojects.com/ |
|||
* License: `BSD-3-Clause <https://github.com/pallets/markupsafe/blob/master/LICENSE.rst>`_ |
|||
* Releases: https://pypi.org/project/MarkupSafe/ |
|||
* Code: https://github.com/pallets/markupsafe |
|||
* Issue tracker: https://github.com/pallets/markupsafe/issues |
|||
* Test status: |
|||
|
|||
* Linux, Mac: https://travis-ci.org/pallets/markupsafe |
|||
* Windows: https://ci.appveyor.com/project/pallets/markupsafe |
|||
|
|||
* Test coverage: https://codecov.io/gh/pallets/markupsafe |
|||
|
|||
|
@ -0,0 +1,16 @@ |
|||
MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
|||
MarkupSafe-1.1.1.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 |
|||
MarkupSafe-1.1.1.dist-info/METADATA,sha256=nJHwJ4_4ka-V39QH883jPrslj6inNdyyNASBXbYgHXQ,3570 |
|||
MarkupSafe-1.1.1.dist-info/RECORD,, |
|||
MarkupSafe-1.1.1.dist-info/WHEEL,sha256=AhV6RMqZ2IDfreRJKo44QWYxYeP-0Jr0bezzBLQ1eog,109 |
|||
MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 |
|||
markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126 |
|||
markupsafe/__pycache__/__init__.cpython-37.pyc,, |
|||
markupsafe/__pycache__/_compat.cpython-37.pyc,, |
|||
markupsafe/__pycache__/_constants.cpython-37.pyc,, |
|||
markupsafe/__pycache__/_native.cpython-37.pyc,, |
|||
markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558 |
|||
markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690 |
|||
markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873 |
|||
markupsafe/_speedups.c,sha256=k0fzEIK3CP6MmMqeY0ob43TP90mVN0DTyn7BAl3RqSg,9884 |
|||
markupsafe/_speedups.cpython-37m-x86_64-linux-gnu.so,sha256=pz-ucGdAq6kJtq9lEY1kY2Ed6LQjbRrIicdu_i4HFqU,38875 |
@ -0,0 +1,5 @@ |
|||
Wheel-Version: 1.0 |
|||
Generator: bdist_wheel (0.31.1) |
|||
Root-Is-Purelib: false |
|||
Tag: cp37-cp37m-manylinux1_x86_64 |
|||
|
@ -0,0 +1 @@ |
|||
markupsafe |
@ -0,0 +1,231 @@ |
|||
Pygments is written and maintained by Georg Brandl <georg@python.org>. |
|||
|
|||
Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher |
|||
<armin.ronacher@active-4.com>. |
|||
|
|||
Other contributors, listed alphabetically, are: |
|||
|
|||
* Sam Aaron -- Ioke lexer |
|||
* Ali Afshar -- image formatter |
|||
* Thomas Aglassinger -- Easytrieve, JCL, Rexx, Transact-SQL and VBScript |
|||
lexers |
|||
* Muthiah Annamalai -- Ezhil lexer |
|||
* Kumar Appaiah -- Debian control lexer |
|||
* Andreas Amann -- AppleScript lexer |
|||
* Timothy Armstrong -- Dart lexer fixes |
|||
* Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers |
|||
* Jeremy Ashkenas -- CoffeeScript lexer |
|||
* José Joaquín Atria -- Praat lexer |
|||
* Stefan Matthias Aust -- Smalltalk lexer |
|||
* Lucas Bajolet -- Nit lexer |
|||
* Ben Bangert -- Mako lexers |
|||
* Max Battcher -- Darcs patch lexer |
|||
* Thomas Baruchel -- APL lexer |
|||
* Tim Baumann -- (Literate) Agda lexer |
|||
* Paul Baumgart, 280 North, Inc. -- Objective-J lexer |
|||
* Michael Bayer -- Myghty lexers |
|||
* Thomas Beale -- Archetype lexers |
|||
* John Benediktsson -- Factor lexer |
|||
* Trevor Bergeron -- mIRC formatter |
|||
* Vincent Bernat -- LessCSS lexer |
|||
* Christopher Bertels -- Fancy lexer |
|||
* Sébastien Bigaret -- QVT Operational lexer |
|||
* Jarrett Billingsley -- MiniD lexer |
|||
* Adam Blinkinsop -- Haskell, Redcode lexers |
|||
* Stéphane Blondon -- SGF and Sieve lexers |
|||
* Frits van Bommel -- assembler lexers |
|||
* Pierre Bourdon -- bugfixes |
|||
* Martijn Braam -- Kernel log lexer |
|||
* Matthias Bussonnier -- ANSI style handling for terminal-256 formatter |
|||
* chebee7i -- Python traceback lexer improvements |
|||
* Hiram Chirino -- Scaml and Jade lexers |
|||
* Mauricio Caceres -- SAS and Stata lexers. |
|||
* Ian Cooper -- VGL lexer |
|||
* David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers |
|||
* Leaf Corcoran -- MoonScript lexer |
|||
* Christopher Creutzig -- MuPAD lexer |
|||
* Daniël W. Crompton -- Pike lexer |
|||
* Pete Curry -- bugfixes |
|||
* Bryan Davis -- EBNF lexer |
|||
* Bruno Deferrari -- Shen lexer |
|||
* Giedrius Dubinskas -- HTML formatter improvements |
|||
* Owen Durni -- Haxe lexer |
|||
* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer |
|||
* James Edwards -- Terraform lexer |
|||
* Nick Efford -- Python 3 lexer |
|||
* Sven Efftinge -- Xtend lexer |
|||
* Artem Egorkine -- terminal256 formatter |
|||
* Matthew Fernandez -- CAmkES lexer |
|||
* Michael Ficarra -- CPSA lexer |
|||
* James H. Fisher -- PostScript lexer |
|||
* William S. Fulton -- SWIG lexer |
|||
* Carlos Galdino -- Elixir and Elixir Console lexers |
|||
* Michael Galloy -- IDL lexer |
|||
* Naveen Garg -- Autohotkey lexer |
|||
* Simon Garnotel -- FreeFem++ lexer |
|||
* Laurent Gautier -- R/S lexer |
|||
* Alex Gaynor -- PyPy log lexer |
|||
* Richard Gerkin -- Igor Pro lexer |
|||
* Alain Gilbert -- TypeScript lexer |
|||
* Alex Gilding -- BlitzBasic lexer |
|||
* GitHub, Inc -- DASM16, Augeas, TOML, and Slash lexers |
|||
* Bertrand Goetzmann -- Groovy lexer |
|||
* Krzysiek Goj -- Scala lexer |
|||
* Rostyslav Golda -- FloScript lexer |
|||
* Andrey Golovizin -- BibTeX lexers |
|||
* Matt Good -- Genshi, Cheetah lexers |
|||
* Michał Górny -- vim modeline support |
|||
* Alex Gosse -- TrafficScript lexer |
|||
* Patrick Gotthardt -- PHP namespaces support |
|||
* Olivier Guibe -- Asymptote lexer |
|||
* Phil Hagelberg -- Fennel lexer |
|||
* Florian Hahn -- Boogie lexer |
|||
* Martin Harriman -- SNOBOL lexer |
|||
* Matthew Harrison -- SVG formatter |
|||
* Steven Hazel -- Tcl lexer |
|||
* Dan Michael Heggø -- Turtle lexer |
|||
* Aslak Hellesøy -- Gherkin lexer |
|||
* Greg Hendershott -- Racket lexer |
|||
* Justin Hendrick -- ParaSail lexer |
|||
* Jordi Gutiérrez Hermoso -- Octave lexer |
|||
* David Hess, Fish Software, Inc. -- Objective-J lexer |
|||
* Varun Hiremath -- Debian control lexer |
|||
* Rob Hoelz -- Perl 6 lexer |
|||
* Doug Hogan -- Mscgen lexer |
|||
* Ben Hollis -- Mason lexer |
|||
* Max Horn -- GAP lexer |
|||
* Alastair Houghton -- Lexer inheritance facility |
|||
* Tim Howard -- BlitzMax lexer |
|||
* Dustin Howett -- Logos lexer |
|||
* Ivan Inozemtsev -- Fantom lexer |
|||
* Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session, |
|||
MSDOS session, BC, WDiff |
|||
* Brian R. Jackson -- Tea lexer |
|||
* Christian Jann -- ShellSession lexer |
|||
* Dennis Kaarsemaker -- sources.list lexer |
|||
* Dmitri Kabak -- Inferno Limbo lexer |
|||
* Igor Kalnitsky -- vhdl lexer |
|||
* Colin Kennedy - USD lexer |
|||
* Alexander Kit -- MaskJS lexer |
|||
* Pekka Klärck -- Robot Framework lexer |
|||
* Gerwin Klein -- Isabelle lexer |
|||
* Eric Knibbe -- Lasso lexer |
|||
* Stepan Koltsov -- Clay lexer |
|||
* Adam Koprowski -- Opa lexer |
|||
* Benjamin Kowarsch -- Modula-2 lexer |
|||
* Domen Kožar -- Nix lexer |
|||
* Oleh Krekel -- Emacs Lisp lexer |
|||
* Alexander Kriegisch -- Kconfig and AspectJ lexers |
|||
* Marek Kubica -- Scheme lexer |
|||
* Jochen Kupperschmidt -- Markdown processor |
|||
* Gerd Kurzbach -- Modelica lexer |
|||
* Jon Larimer, Google Inc. -- Smali lexer |
|||
* Olov Lassus -- Dart lexer |
|||
* Matt Layman -- TAP lexer |
|||
* Kristian Lyngstøl -- Varnish lexers |
|||
* Sylvestre Ledru -- Scilab lexer |
|||
* Chee Sing Lee -- Flatline lexer |
|||
* Mark Lee -- Vala lexer |
|||
* Valentin Lorentz -- C++ lexer improvements |
|||
* Ben Mabey -- Gherkin lexer |
|||
* Angus MacArthur -- QML lexer |
|||
* Louis Mandel -- X10 lexer |
|||
* Louis Marchand -- Eiffel lexer |
|||
* Simone Margaritelli -- Hybris lexer |
|||
* Kirk McDonald -- D lexer |
|||
* Gordon McGregor -- SystemVerilog lexer |
|||
* Stephen McKamey -- Duel/JBST lexer |
|||
* Brian McKenna -- F# lexer |
|||
* Charles McLaughlin -- Puppet lexer |
|||
* Kurt McKee -- Tera Term macro lexer |
|||
* Lukas Meuser -- BBCode formatter, Lua lexer |
|||
* Cat Miller -- Pig lexer |
|||
* Paul Miller -- LiveScript lexer |
|||
* Hong Minhee -- HTTP lexer |
|||
* Michael Mior -- Awk lexer |
|||
* Bruce Mitchener -- Dylan lexer rewrite |
|||
* Reuben Morais -- SourcePawn lexer |
|||
* Jon Morton -- Rust lexer |
|||
* Paulo Moura -- Logtalk lexer |
|||
* Mher Movsisyan -- DTD lexer |
|||
* Dejan Muhamedagic -- Crmsh lexer |
|||
* Ana Nelson -- Ragel, ANTLR, R console lexers |
|||
* Kurt Neufeld -- Markdown lexer |
|||
* Nam T. Nguyen -- Monokai style |
|||
* Jesper Noehr -- HTML formatter "anchorlinenos" |
|||
* Mike Nolta -- Julia lexer |
|||
* Jonas Obrist -- BBCode lexer |
|||
* Edward O'Callaghan -- Cryptol lexer |
|||
* David Oliva -- Rebol lexer |
|||
* Pat Pannuto -- nesC lexer |
|||
* Jon Parise -- Protocol buffers and Thrift lexers |
|||
* Benjamin Peterson -- Test suite refactoring |
|||
* Ronny Pfannschmidt -- BBCode lexer |
|||
* Dominik Picheta -- Nimrod lexer |
|||
* Andrew Pinkham -- RTF Formatter Refactoring |
|||
* Clément Prévost -- UrbiScript lexer |
|||
* Tanner Prynn -- cmdline -x option and loading lexers from files |
|||
* Oleh Prypin -- Crystal lexer (based on Ruby lexer) |
|||
* Xidorn Quan -- Web IDL lexer |
|||
* Elias Rabel -- Fortran fixed form lexer |
|||
* raichoo -- Idris lexer |
|||
* Kashif Rasul -- CUDA lexer |
|||
* Nathan Reed -- HLSL lexer |
|||
* Justin Reidy -- MXML lexer |
|||
* Norman Richards -- JSON lexer |
|||
* Corey Richardson -- Rust lexer updates |
|||
* Lubomir Rintel -- GoodData MAQL and CL lexers |
|||
* Andre Roberge -- Tango style |
|||
* Georg Rollinger -- HSAIL lexer |
|||
* Michiel Roos -- TypoScript lexer |
|||
* Konrad Rudolph -- LaTeX formatter enhancements |
|||
* Mario Ruggier -- Evoque lexers |
|||
* Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements |
|||
* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers |
|||
* Matteo Sasso -- Common Lisp lexer |
|||
* Joe Schafer -- Ada lexer |
|||
* Ken Schutte -- Matlab lexers |
|||
* René Schwaiger -- Rainbow Dash style |
|||
* Sebastian Schweizer -- Whiley lexer |
|||
* Tassilo Schweyer -- Io, MOOCode lexers |
|||
* Ted Shaw -- AutoIt lexer |
|||
* Joerg Sieker -- ABAP lexer |
|||
* Robert Simmons -- Standard ML lexer |
|||
* Kirill Simonov -- YAML lexer |
|||
* Corbin Simpson -- Monte lexer |
|||
* Alexander Smishlajev -- Visual FoxPro lexer |
|||
* Steve Spigarelli -- XQuery lexer |
|||
* Jerome St-Louis -- eC lexer |
|||
* Camil Staps -- Clean and NuSMV lexers; Solarized style |
|||
* James Strachan -- Kotlin lexer |
|||
* Tom Stuart -- Treetop lexer |
|||
* Colin Sullivan -- SuperCollider lexer |
|||
* Ben Swift -- Extempore lexer |
|||
* Edoardo Tenani -- Arduino lexer |
|||
* Tiberius Teng -- default style overhaul |
|||
* Jeremy Thurgood -- Erlang, Squid config lexers |
|||
* Brian Tiffin -- OpenCOBOL lexer |
|||
* Bob Tolbert -- Hy lexer |
|||
* Matthias Trute -- Forth lexer |
|||
* Erick Tryzelaar -- Felix lexer |
|||
* Alexander Udalov -- Kotlin lexer improvements |
|||
* Thomas Van Doren -- Chapel lexer |
|||
* Daniele Varrazzo -- PostgreSQL lexers |
|||
* Abe Voelker -- OpenEdge ABL lexer |
|||
* Pepijn de Vos -- HTML formatter CTags support |
|||
* Matthias Vallentin -- Bro lexer |
|||
* Benoît Vinot -- AMPL lexer |
|||
* Linh Vu Hong -- RSL lexer |
|||
* Nathan Weizenbaum -- Haml and Sass lexers |
|||
* Nathan Whetsell -- Csound lexers |
|||
* Dietmar Winkler -- Modelica lexer |
|||
* Nils Winter -- Smalltalk lexer |
|||
* Davy Wybiral -- Clojure lexer |
|||
* Whitney Young -- ObjectiveC lexer |
|||
* Diego Zamboni -- CFengine3 lexer |
|||
* Enrique Zamudio -- Ceylon lexer |
|||
* Alex Zimin -- Nemerle lexer |
|||
* Rob Zimmerman -- Kal lexer |
|||
* Vincent Zurczak -- Roboconf lexer |
|||
|
|||
Many thanks for all contributions! |
@ -0,0 +1 @@ |
|||
pip |
@ -0,0 +1,25 @@ |
|||
Copyright (c) 2006-2019 by the respective authors (see AUTHORS file). |
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are |
|||
met: |
|||
|
|||
* Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
|
|||
* Redistributions in binary form must reproduce the above copyright |
|||
notice, this list of conditions and the following disclaimer in the |
|||
documentation and/or other materials provided with the distribution. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@ -0,0 +1,48 @@ |
|||
Metadata-Version: 2.1 |
|||
Name: Pygments |
|||
Version: 2.6.1 |
|||
Summary: Pygments is a syntax highlighting package written in Python. |
|||
Home-page: https://pygments.org/ |
|||
Author: Georg Brandl |
|||
Author-email: georg@python.org |
|||
License: BSD License |
|||
Keywords: syntax highlighting |
|||
Platform: any |
|||
Classifier: License :: OSI Approved :: BSD License |
|||
Classifier: Intended Audience :: Developers |
|||
Classifier: Intended Audience :: End Users/Desktop |
|||
Classifier: Intended Audience :: System Administrators |
|||
Classifier: Development Status :: 6 - Mature |
|||
Classifier: Programming Language :: Python |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.5 |
|||
Classifier: Programming Language :: Python :: 3.6 |
|||
Classifier: Programming Language :: Python :: 3.7 |
|||
Classifier: Programming Language :: Python :: 3.8 |
|||
Classifier: Programming Language :: Python :: Implementation :: CPython |
|||
Classifier: Programming Language :: Python :: Implementation :: PyPy |
|||
Classifier: Operating System :: OS Independent |
|||
Classifier: Topic :: Text Processing :: Filters |
|||
Classifier: Topic :: Utilities |
|||
Requires-Python: >=3.5 |
|||
|
|||
|
|||
Pygments |
|||
~~~~~~~~ |
|||
|
|||
Pygments is a syntax highlighting package written in Python. |
|||
|
|||
It is a generic syntax highlighter suitable for use in code hosting, forums, |
|||
wikis or other applications that need to prettify source code. Highlights |
|||
are: |
|||
|
|||
* a wide range of over 500 languages and other text formats is supported |
|||
* special attention is paid to details, increasing quality by a fair amount |
|||
* support for new languages and formats are added easily |
|||
* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image formats that PIL supports and ANSI sequences |
|||
* it is usable as a command-line tool and as a library |
|||
|
|||
:copyright: Copyright 2006-2019 by the Pygments team, see AUTHORS. |
|||
:license: BSD, see LICENSE for details. |
|||
|
|||
|
@ -0,0 +1,463 @@ |
|||
../../../bin/pygmentize,sha256=6RvQXO-s7wr966AOCrbnxrTCy8omBpXvLVMxqyuZaOk,274 |
|||
Pygments-2.6.1.dist-info/AUTHORS,sha256=PVpa2_Oku6BGuiUvutvuPnWGpzxqFy2I8-NIrqCvqUY,8449 |
|||
Pygments-2.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
|||
Pygments-2.6.1.dist-info/LICENSE,sha256=RbiNNEnDeAZZR1i_PEhNnZixKx7MFj9lQx_gf-pgJfA,1331 |
|||
Pygments-2.6.1.dist-info/METADATA,sha256=nrRK1IyAspMOw3-uN_SPDbJo1XIALm7ZbRV9aui-FtM,1833 |
|||
Pygments-2.6.1.dist-info/RECORD,, |
|||
Pygments-2.6.1.dist-info/WHEEL,sha256=p46_5Uhzqz6AzeSosiOnxK-zmFja1i22CrQCjmYe8ec,92 |
|||
Pygments-2.6.1.dist-info/entry_points.txt,sha256=NXt9BRDRv6tAfDwqKM0bDHrrxaIt2f1nxH9CwjyjSKc,54 |
|||
Pygments-2.6.1.dist-info/top_level.txt,sha256=RjKKqrVIStoebLHdbs0yZ2Lk4rS7cxGguXsLCYvZ2Ak,9 |
|||
pygments/__init__.py,sha256=Hmd0jgKuzYTHVCXGJrUr5E7R0tAINEf8WuhKUmC7ITY,3036 |
|||
pygments/__main__.py,sha256=JV6RSKzbYgMQHLf0nZGzfq1IXxns2iGunsfkY3jxFKo,372 |
|||
pygments/__pycache__/__init__.cpython-37.pyc,, |
|||
pygments/__pycache__/__main__.cpython-37.pyc,, |
|||
pygments/__pycache__/cmdline.cpython-37.pyc,, |
|||
pygments/__pycache__/console.cpython-37.pyc,, |
|||
pygments/__pycache__/filter.cpython-37.pyc,, |
|||
pygments/__pycache__/formatter.cpython-37.pyc,, |
|||
pygments/__pycache__/lexer.cpython-37.pyc,, |
|||
pygments/__pycache__/modeline.cpython-37.pyc,, |
|||
pygments/__pycache__/plugin.cpython-37.pyc,, |
|||
pygments/__pycache__/regexopt.cpython-37.pyc,, |
|||
pygments/__pycache__/scanner.cpython-37.pyc,, |
|||
pygments/__pycache__/sphinxext.cpython-37.pyc,, |
|||
pygments/__pycache__/style.cpython-37.pyc,, |
|||
pygments/__pycache__/token.cpython-37.pyc,, |
|||
pygments/__pycache__/unistring.cpython-37.pyc,, |
|||
pygments/__pycache__/util.cpython-37.pyc,, |
|||
pygments/cmdline.py,sha256=-mJqcK1Cic8Z-z-ITdj0yjN9exJdPew8m9BwHvtesJY,19479 |
|||
pygments/console.py,sha256=QF0bQHbGeFRSetc3g5JsmGziVHQqIZCprEwNlZFtiRg,1721 |
|||
pygments/filter.py,sha256=hu4Qo6zdyMcIprEL3xmZGb-inVe1_vUKvgY9vdAV5JU,2030 |
|||
pygments/filters/__init__.py,sha256=L_K0aapWqkqDPBkMVGoXvp17zsv7ddl0bNQdMsK43tg,11534 |
|||
pygments/filters/__pycache__/__init__.cpython-37.pyc,, |
|||
pygments/formatter.py,sha256=Zyz1t_dRczxwuuQkgkwOIOd2TRZpHMbjVHOL_ch37JQ,2917 |
|||
pygments/formatters/__init__.py,sha256=d8AnTX9J39ZKoh2YJIiFcOk79h28T0cJ7Yn6rs4G3UI,5107 |
|||
pygments/formatters/__pycache__/__init__.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/_mapping.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/bbcode.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/html.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/img.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/irc.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/latex.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/other.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/rtf.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/svg.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/terminal.cpython-37.pyc,, |
|||
pygments/formatters/__pycache__/terminal256.cpython-37.pyc,, |
|||
pygments/formatters/_mapping.py,sha256=QvLAVzGeldQ6iE8xeGOYtclUBMV0KclGiINcsCaK538,6175 |
|||
pygments/formatters/bbcode.py,sha256=_K7UzwyT70snOYAiT3UkItbXRwQYVuTHpr1AZtRHL6Y,3314 |
|||
pygments/formatters/html.py,sha256=Eoa4EJxTmE3g0kgMiNN7Ihh5A9lNWUnBlZ1eXFC-yl4,32625 |
|||
pygments/formatters/img.py,sha256=iajPfAvg5cB79wS0Mu3pv5Vy2TgghWQcl1OWIz1NcKg,20701 |
|||
pygments/formatters/irc.py,sha256=nU9jSjARuRaZpCuCey7bnRwGTGKeCTEhm_yDDYxzKQ8,5869 |
|||
pygments/formatters/latex.py,sha256=IOqv1C-LyWs6v2cgecfZ-CkfNNF6VQqcNkPUs3aHUjU,17711 |
|||
pygments/formatters/other.py,sha256=Qfc5OixOxM7YEy0d0NJBT750ukj-uPyhxKtHGTm0Vlc,5140 |
|||
pygments/formatters/rtf.py,sha256=z8LTTuEXwx3hpLaG0qeJumZCkUfseLIBsxhZE-0tEKg,5050 |
|||
pygments/formatters/svg.py,sha256=QUPMQIhXN4JA6auaUTj6z6JaeffyF7OpVoQ8IENptCo,7279 |
|||
pygments/formatters/terminal.py,sha256=q0QuanTWnUr4fuNuxnSnjLwjlyUJSMXqBK58MZCAk8Q,4662 |
|||
pygments/formatters/terminal256.py,sha256=x9n-YSOwDZhOaLGmYKLO259ZNBCqSydm_KxZJh2Q-Eg,11126 |
|||
pygments/lexer.py,sha256=FBy1KBXYiwf1TYtXN25OSrnLGbm9oAWXCsq6ReqtvNA,31559 |
|||
pygments/lexers/__init__.py,sha256=3dDjsioYkLz3fRbX3gV9xoi-SkpRRCtYurrWrylAZCo,11310 |
|||
pygments/lexers/__pycache__/__init__.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_asy_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_cl_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_cocoa_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_csound_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_lasso_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_lua_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_mapping.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_mql_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_openedge_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_php_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_postgres_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_scilab_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_sourcemod_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_stan_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_stata_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_tsql_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_usd_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_vbscript_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/_vim_builtins.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/actionscript.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/agile.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/algebra.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ambient.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ampl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/apl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/archetype.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/asm.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/automation.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/basic.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/bibtex.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/boa.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/business.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/c_cpp.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/c_like.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/capnproto.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/chapel.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/clean.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/compiled.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/configs.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/console.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/crystal.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/csound.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/css.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/d.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/dalvik.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/data.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/diff.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/dotnet.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/dsls.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/dylan.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ecl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/eiffel.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/elm.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/email.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/erlang.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/esoteric.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ezhil.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/factor.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/fantom.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/felix.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/floscript.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/forth.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/fortran.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/foxpro.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/freefem.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/functional.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/go.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/grammar_notation.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/graph.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/graphics.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/haskell.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/haxe.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/hdl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/hexdump.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/html.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/idl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/igor.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/inferno.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/installers.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/int_fiction.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/iolang.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/j.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/javascript.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/julia.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/jvm.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/lisp.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/make.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/markup.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/math.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/matlab.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/mime.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ml.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/modeling.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/modula2.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/monte.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/mosel.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ncl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/nimrod.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/nit.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/nix.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/oberon.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/objective.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ooc.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/other.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/parasail.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/parsers.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/pascal.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/pawn.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/perl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/php.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/pony.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/praat.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/prolog.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/python.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/qvt.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/r.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/rdf.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/rebol.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/resource.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ride.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/rnc.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/roboconf.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/robotframework.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/ruby.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/rust.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/sas.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/scdoc.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/scripting.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/sgf.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/shell.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/sieve.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/slash.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/smalltalk.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/smv.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/snobol.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/solidity.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/special.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/sql.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/stata.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/supercollider.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/tcl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/templates.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/teraterm.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/testing.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/text.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/textedit.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/textfmts.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/theorem.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/trafficscript.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/typoscript.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/unicon.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/urbi.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/usd.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/varnish.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/verification.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/web.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/webidl.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/webmisc.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/whiley.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/x10.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/xorg.cpython-37.pyc,, |
|||
pygments/lexers/__pycache__/zig.cpython-37.pyc,, |
|||
pygments/lexers/_asy_builtins.py,sha256=zO_y8v-bp6kjlIwvbmse79qY8P7qAUhoVObaX9Qy3S8,27311 |
|||
pygments/lexers/_cl_builtins.py,sha256=x-mRhM6ukZv0pxYtqCq7SlsezhL8L9fpcCQ-gou0Z9w,14018 |
|||
pygments/lexers/_cocoa_builtins.py,sha256=h8CT9tpHtyg7PF1tQsLj0NCoN6o9TzzIOBA5UTadEQs,39962 |
|||
pygments/lexers/_csound_builtins.py,sha256=6OzL4rwy_qgAenQ8uN0n2u39NlfoVMSZEOy4tdLNHOE,17619 |
|||
pygments/lexers/_lasso_builtins.py,sha256=1jR-3eDhf1CUcPSSEXgbJMymAkQaJqpWIPjYM4rL6Sk,134534 |
|||
pygments/lexers/_lua_builtins.py,sha256=VkZNUZW9_lTBBcTFOl8NDepWTBfwha6tkV8BXR1EzaM,8297 |
|||
pygments/lexers/_mapping.py,sha256=KQJCLXu0jKEF8g9N8Ysg3giPGOFByjdgiOIEMA1yoqw,58920 |
|||
pygments/lexers/_mql_builtins.py,sha256=MS7566jpdiud7gEa_y4iJpHLkqjpo-7Y8WwB9MyMUhY,24737 |
|||
pygments/lexers/_openedge_builtins.py,sha256=hCqbIZd_qcBTlLyQGME8mqijUDCIm5P9HtIsv8JCEG8,48362 |
|||
pygments/lexers/_php_builtins.py,sha256=6-lirHeDcuo-5U5Yh9D4Fgx0sGmN2gq_dmCzjY3wEQg,154390 |
|||
pygments/lexers/_postgres_builtins.py,sha256=OI0j7i72gKoNGJomATjK_P00D7cVT6bpPqeeSB4k0aM,11210 |
|||
pygments/lexers/_scilab_builtins.py,sha256=ffgN-8Jj5KLRIwdD9j51zvScUbim2DaYv9WmF8_JCNA,52401 |
|||
pygments/lexers/_sourcemod_builtins.py,sha256=BSnleYNoGBZ0IrTJz17r-Z9yz7OHwgJVy1oRvvqXg38,27074 |
|||
pygments/lexers/_stan_builtins.py,sha256=BfSr_PiG5QE0-7hUfX4g_jdwugKf1zWtGE2w33FotvA,10481 |
|||
pygments/lexers/_stata_builtins.py,sha256=rZ8lopR_vKuDCBeCF9oPf71sHkD6n-tN6T5QpyOVEg4,25228 |
|||
pygments/lexers/_tsql_builtins.py,sha256=5qrkZJHk_m1SgTnhCrKp5jXJxexjCaf4GtRkY5_PTEA,15484 |
|||
pygments/lexers/_usd_builtins.py,sha256=eiB5M8wMXpllmheEzX3BuId6zXGQWaMcJs92E114P7U,1514 |
|||
pygments/lexers/_vbscript_builtins.py,sha256=chotaveFeFC-A6qcRAghQC7fAwrDmV-BKE_TW-hrZwk,4249 |
|||
pygments/lexers/_vim_builtins.py,sha256=Il_pjrP0PWUjMLCRPOZPoLgd_3jauvv9SGtBOkzmU2A,57090 |
|||
pygments/lexers/actionscript.py,sha256=jQTpfKe0OwRQTknMs132_WhqEDIW7lQbLW0HU5D0cOs,11181 |
|||
pygments/lexers/agile.py,sha256=0yI_Bq_-ekqFCiMzkcnJfNQ12iyA4QmPk70RCfl1Xa0,900 |
|||
pygments/lexers/algebra.py,sha256=vMjSoC9CgSWUMoaNu7gysQDdAc46t_Y6U4dX2mEzNCc,7201 |
|||
pygments/lexers/ambient.py,sha256=1_B2JkmFVgGq-JuEhmrXIu-q5WP2e7Ir5DSpO7qXN9E,2557 |
|||
pygments/lexers/ampl.py,sha256=HWeNZxYsNhPuGmW1lgNUxMe5zMtbMQ-xNFoj9oVOvq8,4123 |
|||
pygments/lexers/apl.py,sha256=gzIuS7p2Qz-pN5M0i45uvDow_gsNNus5k6zrwe19M9c,3174 |
|||
pygments/lexers/archetype.py,sha256=luJBCChBsH6fdJOboz5pVTSNCHh7miLd1xtLnI7TH88,11136 |
|||
pygments/lexers/asm.py,sha256=0gX4w_cbEbWWUp0kBla41r0ZMAY8NUxaaeW-faRRiqE,39356 |
|||
pygments/lexers/automation.py,sha256=9oR495kiyEbl-ev7PWF4Mw-jvtuSbOkmKJRmOvUzQb8,19640 |
|||
pygments/lexers/basic.py,sha256=siXk3fQfTEfJNeSW2sI-rfssoUpyj7drMdMrs5csYrs,27576 |
|||
pygments/lexers/bibtex.py,sha256=fxbIyhfV1yrFfd7oyAp-fyss27T0Bfv8VqRdVnLg63Y,4725 |
|||
pygments/lexers/boa.py,sha256=OB_W242mpr2vwbhg0MO4BpZcdhjaXuM6ffQ54zn3-ZI,3942 |
|||
pygments/lexers/business.py,sha256=onAZDADHM7atSEFKsmODBvPc8GlOTDwPgfsh_hVGXNI,27666 |
|||
pygments/lexers/c_cpp.py,sha256=dfPzKNoZeqoprqM4a7pTqWin7scz6VYg5_q9MzbnjH0,10638 |
|||
pygments/lexers/c_like.py,sha256=UusXq2S5d0v0CpGsxkmVludmu58WsLZQHWnsb0YwhK4,25080 |
|||
pygments/lexers/capnproto.py,sha256=pC3zXFSfYFHEIBq3OqLPGKl71K5HtdWnAEqMz6n8KFY,2194 |
|||
pygments/lexers/chapel.py,sha256=qzglX8OKh7aaUgXqAVXFkerNjTMIJKdMbihP_o2VFWk,3908 |
|||
pygments/lexers/clean.py,sha256=XG0_2KVyxbRFp-_U5HgT1wN9srL522kOe_9T51HeQmA,6362 |
|||
pygments/lexers/compiled.py,sha256=iGwVkCJ-SXoovHegOBSnOG518hHkDudegb9_qS-8vW0,1385 |
|||
pygments/lexers/configs.py,sha256=YO1NWPpNENDBN4fr-yBYdBWwIqotSquTeaKfY24a7mk,32127 |
|||
pygments/lexers/console.py,sha256=tj_ARAplXlqt2sGb2ycxsOy8xIL4NCAMOd3bZ0Zjojg,4120 |
|||
pygments/lexers/crystal.py,sha256=hTz20yWrjuam9JVG9Xxr6I7x50M_sIlfdBs0_gg5hKQ,16845 |
|||
pygments/lexers/csound.py,sha256=_OqMoEegHcp0NV7zuiLt6h_aY17adQRlJe1DG-pQP4M,16739 |
|||
pygments/lexers/css.py,sha256=EvJYfYeaT-TkDHpqXc4ssz0BoXSnBfWT3Vb9MKCeNQg,31467 |
|||
pygments/lexers/d.py,sha256=ZWc365C_vRjee-ATfen2OmHCFW3QMoMNE9JEeTplk94,9686 |
|||
pygments/lexers/dalvik.py,sha256=tAoPPa_iRXhWG_MzslSvBE99NlGnkx0WKnwdDQ3XU9o,4420 |
|||
pygments/lexers/data.py,sha256=_-dqdUSm7Edmh-zaljABFodHjwMCECW1Y-IlyjnWibM,19072 |
|||
pygments/lexers/diff.py,sha256=8jKEVtSA2YKprutpONqFvMKBhK1U_IFdxaScTuRNeU4,4873 |
|||
pygments/lexers/dotnet.py,sha256=oGL8kWok74zOLn92iwjOYX6Do9tnk96-YTFlJSdkBaQ,27582 |
|||
pygments/lexers/dsls.py,sha256=qv0kHmfQOHkHMnXyFbgYrDjUpsCkuXPLig1hma2zcJ0,35837 |
|||
pygments/lexers/dylan.py,sha256=LkWTiLsU561_VQL-PUirryEt7ewbseLRJfN-H1twmiA,10402 |
|||
pygments/lexers/ecl.py,sha256=5ivxyk5lzMottCuIxyE7DBvWYJV5KTuaHNRkvOtgM7c,5875 |
|||
pygments/lexers/eiffel.py,sha256=He2DwoUqWqMt8_PDzoP3NuBl9AZ9K3_SmpGkIgSzWuI,2482 |
|||
pygments/lexers/elm.py,sha256=91CM_h3PPoBLLm2stJqNZi3lgjhZH7NvzNKWdXAe8CA,2997 |
|||
pygments/lexers/email.py,sha256=ap9imSi6jbbP7gPBAyc3rcNurVDSNmRKIWv0ByR6VOQ,5207 |
|||
pygments/lexers/erlang.py,sha256=bZBqAKFa-EsRpvai0EpwZkKMPCd2q6pDfZapq9gh9Qg,18985 |
|||
pygments/lexers/esoteric.py,sha256=I7YEPnQdftxEOasCec8_dxVr7zgypMtoYtds0v2srNQ,9489 |
|||
pygments/lexers/ezhil.py,sha256=R26b4iXSpdMkgXewJN2INhJXL0ICXhW2o9fu3bn078U,3020 |
|||
pygments/lexers/factor.py,sha256=nBYhJoNLkSxtshGrF08tSQKUq_TtgVp1ukKX4Zromm8,17864 |
|||
pygments/lexers/fantom.py,sha256=3OTJDka8qeNRykM1Ki1Lyek6gd-jqOa-l5IgRbX8kSg,9982 |
|||
pygments/lexers/felix.py,sha256=DoSGdEntZgG3JUbeBA9fqUtg3lODbqwY3_XS6EIfXt4,9408 |
|||
pygments/lexers/floscript.py,sha256=eza4Rw3RI3mFjIIAA2czmi2SlgbcSI1T8pNr7vUd0eY,2667 |
|||
pygments/lexers/forth.py,sha256=Yqm9z-PjymjQjaleCW-SNJdCCc_NWeFXMz_XvjtAStI,7179 |
|||
pygments/lexers/fortran.py,sha256=XqwbZg25atjNDN8yUnqkxm1nfqbzSgZDqmKUIFNQSHk,9841 |
|||
pygments/lexers/foxpro.py,sha256=i1B6wX4U5oY8FJO5BGtTR0RaVWbO6P45PXxndi5HcpE,26236 |
|||
pygments/lexers/freefem.py,sha256=bYEPIZ1mysE2Ub9WO8NPHefz-CaGqPiE0WbHZeMHPsQ,27086 |
|||
pygments/lexers/functional.py,sha256=gJqzgp1ujTa8Zk5hjzXdutz8vvSJpRxhqTVCkK03Ij0,698 |
|||
pygments/lexers/go.py,sha256=aRdc0lsKbF7xxTcUnu35m-_e3SD7s2eBAllq1y7_qY8,3701 |
|||
pygments/lexers/grammar_notation.py,sha256=0INMOPjLnMohU0QCUIvBaJdty7A7i1hS4ZItB4ehPnA,7941 |
|||
pygments/lexers/graph.py,sha256=v013Gzn_RIuLrEz_DJuUah_vCpv6aVSMZpHGov19BMY,2756 |
|||
pygments/lexers/graphics.py,sha256=xfr7jZ_JF81kh-RFxIFSKOa06W4z0YxWzOxXAmrLwMA,38259 |
|||
pygments/lexers/haskell.py,sha256=VXzPclm0SiawKT2E4L4ZO8uPKcNYMVDWKY4NPcLKFsg,32245 |
|||
pygments/lexers/haxe.py,sha256=uWeORmR1BBCtA_HKRJIhzl26GfkzxzVd7c8or-REw7s,30959 |
|||
pygments/lexers/hdl.py,sha256=Xpf_1SJ-Uwf94J6MK_C5wR7JyXQkDKtlNdJ7MLL6uzs,18179 |
|||
pygments/lexers/hexdump.py,sha256=7y6XhpOGaVfbtWPSzFxgen8u4sr9sWCbnRUTmvnW1KI,3507 |
|||
pygments/lexers/html.py,sha256=B-XSH62dR1GZSJ6E3rDOoF6WO-FcKAnrCqTYvvm8jow,19280 |
|||
pygments/lexers/idl.py,sha256=hg7CnizaVt7br6ydWkt4VU9UMNax7gg4ToA3_rnqM1M,14986 |
|||
pygments/lexers/igor.py,sha256=FP_3Uz06p1emRB1BqpJ_11KY5k38D5nBLP9nFLnXsHA,30917 |
|||
pygments/lexers/inferno.py,sha256=iB07whrTd_qnsABOUalv999QhFYB2nhIHfTp_ECsTxM,3117 |
|||
pygments/lexers/installers.py,sha256=QVPOqFLmDydPhBJYmQcyjq6XQvcPb1Hxhpbv5JvgL-M,12866 |
|||
pygments/lexers/int_fiction.py,sha256=-jBktm0onIUz_hzsP0lUd3g9aLXJ4KLls0gjIwSB46o,55779 |
|||
pygments/lexers/iolang.py,sha256=Sv9qzhNgvVz1xmStZOLm3KTvlcI2A1zywAWQTo6ahs0,1905 |
|||
pygments/lexers/j.py,sha256=2wqBgvkxF99yBTdyslEsaeweZuqNO_yNZPjTKRwNTdo,4527 |
|||
pygments/lexers/javascript.py,sha256=cOcijZB6rFr1aclYt94LHInEKs1KgZZ4Xg4i2zDvW28,60194 |
|||
pygments/lexers/julia.py,sha256=ObRU-RjNe_N6zcQZgq5nws526X_j_4c4KPUFwwROFns,14179 |
|||
pygments/lexers/jvm.py,sha256=Qsg2PugXHCD55g_w4GVI4FDFCfOBICYW70xKhWMfNiQ,70347 |
|||
pygments/lexers/lisp.py,sha256=oUWEXl8czd_ovmKgkROzATeDjy01jPXAne18zXtEYRY,143609 |
|||
pygments/lexers/make.py,sha256=dbnhkZWxESvkvV69TrQEZYdo4yiUGoBBIE-VpXX1uBM,7326 |
|||
pygments/lexers/markup.py,sha256=6ACdRUnjI6CGRwes8szHfUjZU-nR7C42y2dbP5EdJeI,20704 |
|||
pygments/lexers/math.py,sha256=74YS-Z0zpBP6JYk1fsauYbW7XeZ-XPDTqKakbkX0v1Y,700 |
|||
pygments/lexers/matlab.py,sha256=23FUS7UgeE9c0gPr9xnyIBz_0Qr7f8ks8DCumF0fGdU,30403 |
|||
pygments/lexers/mime.py,sha256=hf-dShZ8AUSIzTELUEnlel7gnZLZpiOd-OFehEDSba0,7975 |
|||
pygments/lexers/ml.py,sha256=SV44RnHSqsCQX7wZHZe_bJtzl0hTFrlY5UF8nhO9ozU,31376 |
|||
pygments/lexers/modeling.py,sha256=n4gorBPf3gttlsITHGYeOnrUjUWz3nCh5oLYkDMOnrM,13409 |
|||
pygments/lexers/modula2.py,sha256=zenAwJk17hVa1FnOTZHJAwLrDrmcurxu4yw7pUoa_Qk,52561 |
|||
pygments/lexers/monte.py,sha256=tIn0lsLdG0iHRX_01KI9OkR4iazyiV5F8H3OlkKdFZQ,6307 |
|||
pygments/lexers/mosel.py,sha256=N8J6mCnzTUd4KADnhMAAQ2X5OZGxXI-i2Xvq8HfzjNA,9211 |
|||
pygments/lexers/ncl.py,sha256=0U8xDdO0guIlnQKCHKmKQPXv91Jqy1YvrkNoMonaYp4,63986 |
|||
pygments/lexers/nimrod.py,sha256=ERUF4NVMUlbirF_FvN8EIXXFRv6RJqchq4rr9vugHPI,5174 |
|||
pygments/lexers/nit.py,sha256=FSQCdLNjKUrw_pisiCH-m15EQcz30lv6wvvbTgkrB-Y,2743 |
|||
pygments/lexers/nix.py,sha256=RTgXFxL2niA9iG1zLHRWdNZy70he_vE1D0-FcoU1cfw,4031 |
|||
pygments/lexers/oberon.py,sha256=HMOnehgSbLaTV6l1e5b44aZttyE2YIfA2hzyj6MW5xU,3733 |
|||
pygments/lexers/objective.py,sha256=FA7gniip1eEDC9x1UIvdI8flRtFxehTHId0MlqB0llo,22789 |
|||
pygments/lexers/ooc.py,sha256=lP6KSoWFrq9Q7w5F_aRSaLYUryh4nuBcPfnUkwyBQsU,2999 |
|||
pygments/lexers/other.py,sha256=0xuOYQ0uI9eLONFTNBv2e-hltZhQcN531NVi7e2AcQQ,1768 |
|||
pygments/lexers/parasail.py,sha256=YEgpP3B62qHYOBFcoChOfgzATczrSPj1WyovIgqW3gg,2737 |
|||
pygments/lexers/parsers.py,sha256=fhTyqwzifEpFFfW8emQ9WYYBwlUs48Sv_qykCUQoWHE,27590 |
|||
pygments/lexers/pascal.py,sha256=YpIQHj54lSJrBFdWSo_nkV8M_dYHfJyJMjLk6W6UNZY,32624 |
|||
pygments/lexers/pawn.py,sha256=LN0m73AC00wHyvBlbTPU1k2ihBdmDkfIFq24uAWvsF0,8021 |
|||
pygments/lexers/perl.py,sha256=Plh4ovtDulyq5oxJTIijQlJ8Td5ga7s3uQ0sbV7uES8,39155 |
|||
pygments/lexers/php.py,sha256=yU7DdvXBQlnEvX6WBb7c9kgSw9COwYp6psvzGmCebs4,10834 |
|||
pygments/lexers/pony.py,sha256=h6S-MGKN7q7sk869oWjC1OcgV7zwXloYnGFshhTFxHk,3269 |
|||
pygments/lexers/praat.py,sha256=aFOD7K8wEVjcr4Jb3DAGn5AmjhMDSHY8pVC4WQfjGlc,12292 |
|||
pygments/lexers/prolog.py,sha256=TNj3F1ossufZ_XKVVrWJlRtPDRU1ExGO6NS0-TBq7gw,12405 |
|||
pygments/lexers/python.py,sha256=7VkiN5v5IAIL9bDQGdwtmt2__plhedbEi3rzh397Nec,51187 |
|||
pygments/lexers/qvt.py,sha256=_lXPT5SdDEqhCmuq4TcO9JRrP703kIT3a1Y_ZW9NTCY,6097 |
|||
pygments/lexers/r.py,sha256=VGb5x89r844B-a_V49wAwu8i0245tbdyLKZWq_wRG74,6276 |
|||
pygments/lexers/rdf.py,sha256=RAerwJHNjrtXXtua4UXRfUQkMQ36uqfQZlSj63yoQA8,14608 |
|||
pygments/lexers/rebol.py,sha256=3bhOFMMneP38O9aJFjPZlNTS6cwbcnDlJaDbfvF4x1g,18624 |
|||
pygments/lexers/resource.py,sha256=xbAErtO3-d4LQJJPnLfhD7Kxz_NVQp4WiYrFu52UX-o,2926 |
|||
pygments/lexers/ride.py,sha256=lMlEAtdFILb1vd2WC17UaNwFJqOKb1du7EPG5jwX3Xk,5074 |
|||
pygments/lexers/rnc.py,sha256=OxpGllFDAM6Vn_alGiaEKMzQDoqRCrl82ocOO4s6L_k,1990 |
|||
pygments/lexers/roboconf.py,sha256=9eZkX5xkajimTV1F5wr0Y8QHPfuEB659Lde8H5AzFfM,2070 |
|||
pygments/lexers/robotframework.py,sha256=R0x05_jTPu9bErGS4v_mh-9kyCOG4g4GC-KUvxYkSKo,18646 |
|||
pygments/lexers/ruby.py,sha256=rqBelW7OJZIP-J3MVPgQzhXTh3Ey41MjMmpbGQDv390,22168 |
|||
pygments/lexers/rust.py,sha256=auhHzIX7VaYzgkj26USy9ZH5DZbPQ1LJYW7YDQB8Wgs,7844 |
|||
pygments/lexers/sas.py,sha256=guELd_4GLI1fhZr3Sxtn80Gt6s6ViYFf4jWnK23zzDc,9449 |
|||
pygments/lexers/scdoc.py,sha256=raoQeCR0E6sjvT56Lar0Wxc_1u6fB-gFjptjT0jE56g,1983 |
|||
pygments/lexers/scripting.py,sha256=kH-Kezddx8HzQMgA2z1ZRB-lcvc9qVyEvZnVjJ_YUBU,69759 |
|||
pygments/lexers/sgf.py,sha256=R5Zqd5oVOyUd-NewEXMmACaEO5RX_F7eYUZaJXGTY4g,2024 |
|||
pygments/lexers/shell.py,sha256=00dGjndFJ6ZWZzsfKW3nKjIKG-CBwTHH-VYQQs57700,33870 |
|||
pygments/lexers/sieve.py,sha256=79MOyJl8iAuvzhphpK-Qu_oybyFTdgzrP6d1Hj9-Lqc,2313 |
|||
pygments/lexers/slash.py,sha256=WN2f0VirklPe6djATJtbNMkFGRiuIykKZjqG19Rlgk8,8522 |
|||
pygments/lexers/smalltalk.py,sha256=xwRETRB2O_cKHZU9w18QXZpiz87WOw0lULDhMxc9xnA,7215 |
|||
pygments/lexers/smv.py,sha256=rbXxBG2rGtm7oPP_Il6v3BbUH3i5q4RtiDaweeN7fLA,2793 |
|||
pygments/lexers/snobol.py,sha256=YFOOuPk4yBxg6stlIm6R3UiUgzkMjz06ac7dW3LRxNk,2756 |
|||
pygments/lexers/solidity.py,sha256=fW_aQc_HyRawyStUxllYhUn-NYJPCqzDH-ABWTeKcOI,3255 |
|||
pygments/lexers/special.py,sha256=N0msqSMphQf0_7Vx9T7kABoHx_KkYLHUxP2FcyYmshg,3149 |
|||
pygments/lexers/sql.py,sha256=7evoMDWdBz0kXPIt1jy0YXrQ9KJFYnjN2cslkDrfB88,31823 |
|||
pygments/lexers/stata.py,sha256=E46GbEy8ET3yBw1l3KQLSknKW3_qS6Sq3V_hkpVotn0,6459 |
|||
pygments/lexers/supercollider.py,sha256=llVW-HUi7m4MNGy4wEp8bF2BJGTXdwF0oNfJfJ_sI8M,3516 |
|||
pygments/lexers/tcl.py,sha256=ORf0CBXHwC2MFBpZpcK2sPBCCTyJ3rcwcYOIhN9s0AI,5398 |
|||
pygments/lexers/templates.py,sha256=AE6yF5ohbqy52-rn8xUJ5A6OZCkoIs72j7wUnwp25vE,73612 |
|||
pygments/lexers/teraterm.py,sha256=2DdFVGyKIF85efcB5QdqqQQNGjqRHoWzVc5psdhSD7c,6310 |
|||
pygments/lexers/testing.py,sha256=JfFVWAh_8zaqaiPrewb3CGTmGNuHu6hFR4dtvcFCYRE,10753 |
|||
pygments/lexers/text.py,sha256=7cwhjV2GwLRH0CPjlOb7PLVa6XEiRQhDNFU1VO3KNjE,1030 |
|||
pygments/lexers/textedit.py,sha256=7F9f0-pAsorZpaFalHOZz5124fsdHCLTAWX_YuwA9XE,6092 |
|||
pygments/lexers/textfmts.py,sha256=Ctq-u_o2HVb-xvvsKfpuwkgNzVCNxXJHkirqhpsC8lE,15184 |
|||
pygments/lexers/theorem.py,sha256=c51ir2FdsyczFRu059z9wKFZplBETdhwWuWX0Y9wMtM,18908 |
|||
pygments/lexers/trafficscript.py,sha256=BYTyTAlD4oDVZ9D1aRrmy4zIC4VJ_n2Lgkgq92DxeJM,1546 |
|||
pygments/lexers/typoscript.py,sha256=Leb81-51KKuK9FHoo1xKWJGPqTIsyVoeZkGcsK5tQzU,8224 |
|||
pygments/lexers/unicon.py,sha256=xo0E3hnBW0gbdszL6n96Cdzume3l1DI7scgkIQ8koaw,18001 |
|||
pygments/lexers/urbi.py,sha256=Zq3PCTC-KI7QYuLZ7NSdikm9-MrAhrYH9DGXVSTT89I,5750 |
|||
pygments/lexers/usd.py,sha256=uEPjTqbXu0Ag_qJOB9IEwAGj4-R8_5yBbNRlUPtSlbY,3487 |
|||
pygments/lexers/varnish.py,sha256=Y2t_JY7uVz6pH3UvlpIvuaxurH4gRiQrP4Esqw5jPnk,7265 |
|||
pygments/lexers/verification.py,sha256=rN6OD2ary21XXvnzUTjknibiM9oF9YjxmLyC7iG6kuo,3932 |
|||
pygments/lexers/web.py,sha256=4thoq-m_kGixnDR2baWwN5eEqpFAeH3aRaOMK4J_GOE,918 |
|||
pygments/lexers/webidl.py,sha256=TTHSlvRlmdpMPNCMvrrUULY6Y6Q7l53HMR9CGyisq9I,10473 |
|||
pygments/lexers/webmisc.py,sha256=pJUyS7bcr77iHQshVzllZmIaZQoVkdGZi1D3FqlJEg0,40054 |
|||
pygments/lexers/whiley.py,sha256=J9ZuO8Yv9DYl9Mb6IHyZz2zguGxZXBKxTSwDcxaii8o,4012 |
|||
pygments/lexers/x10.py,sha256=Lu35QT0l-objbi6mCm-rxZU_7gO1rZQhjA6JnZ-EBRI,1965 |
|||
pygments/lexers/xorg.py,sha256=FDN0czbxMD6YDOqwL6ltspElwMoxxNVKW11OL--keQY,887 |
|||
pygments/lexers/zig.py,sha256=C3kbdZ_rJUb0hMK61UiFsjzJVvC_QIPJZ6glZDNPi78,4147 |
|||
pygments/modeline.py,sha256=ctgJHLjLF23gklYyo7Nz6P3I3Z8ArewlT5R2n2KNatQ,1010 |
|||
pygments/plugin.py,sha256=QFSBZcOqSJqAVQnydwDg8_LG7GzkxUgWjb0FzqoQHEM,1734 |
|||
pygments/regexopt.py,sha256=yMZBB3DRudP4AjPGAUpIF__o_NWOK4HrNfFV6h04V1w,3094 |
|||
pygments/scanner.py,sha256=tATA_g4QYMfFS2Tb-WIJtr_abdUetPb4tC1k7b0e97w,3115 |
|||
pygments/sphinxext.py,sha256=OVWeIgj0mvRslxw5boeo0tBykJHuSi5jSjIWXgAmqgk,4618 |
|||
pygments/style.py,sha256=DhwzS-OOt088Zkk-SWY6lBVy-Eh_2AcP2R_FdTYO9oI,5705 |
|||
pygments/styles/__init__.py,sha256=TBRYkROPEACN-kE1nQ1ygrhU4efWVShENqI6aqjk5cE,2894 |
|||
pygments/styles/__pycache__/__init__.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/abap.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/algol.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/algol_nu.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/arduino.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/autumn.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/borland.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/bw.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/colorful.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/default.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/emacs.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/friendly.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/fruity.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/igor.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/inkpot.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/lovelace.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/manni.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/monokai.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/murphy.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/native.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/paraiso_dark.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/paraiso_light.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/pastie.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/perldoc.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/rainbow_dash.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/rrt.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/sas.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/solarized.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/stata_dark.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/stata_light.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/tango.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/trac.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/vim.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/vs.cpython-37.pyc,, |
|||
pygments/styles/__pycache__/xcode.cpython-37.pyc,, |
|||
pygments/styles/abap.py,sha256=weNa2ATjBDbWN-EJp36KuapOv_161OYudM6ilzp_5tU,751 |
|||
pygments/styles/algol.py,sha256=aVMDywxJ1VRTQ-eYd7CZVQ1BFIWehw2G9OcGg5KmfFI,2263 |
|||
pygments/styles/algol_nu.py,sha256=xgZhMlsdR8RppCyaGliUKBWVvianjxt5KrIcWCJDVMM,2278 |
|||
pygments/styles/arduino.py,sha256=MtP75GT5SqaAX2PfaC116iPETAPOaD6re6cZ1d9xehQ,4492 |
|||
pygments/styles/autumn.py,sha256=setTunOOFJAmdVHab3wmv5OkZmjP6-NVoZjMAyQ2rYY,2144 |
|||
pygments/styles/borland.py,sha256=UOFktPmmU_TK6prVMETvVm6FhT01oqsd9_HcG1NZq_Y,1562 |
|||
pygments/styles/bw.py,sha256=t0kQytwvh_0SMBcOcmM5foPcc3JWiSd8VWBIXkoP17s,1355 |
|||
pygments/styles/colorful.py,sha256=NV-MuEX61J0HH1M0dmurc0RNinp5eA9qIHTjhZ3M6ek,2778 |
|||
pygments/styles/default.py,sha256=j124bQ-0TFJaQ2U3ZICWq8_KUOQdjUSxFVknFcpSF40,2532 |
|||
pygments/styles/emacs.py,sha256=zNGOC_fHnCZxVphHkieHr7f-zxKkSg_PrFEwWGfQw2U,2486 |
|||
pygments/styles/friendly.py,sha256=55qszHEliWiT8h1dW5GjnEA47CpXpJ0BX0C-x6EmZsQ,2515 |
|||
pygments/styles/fruity.py,sha256=zkSwyKzmWDs9Jtzgq3rG4DathCH6Pq2JVLuUW8auKXI,1298 |
|||
pygments/styles/igor.py,sha256=6GFYt43btx70XZoVDSAqljc1G7UJb6_r9euz0b5nWpY,739 |
|||
pygments/styles/inkpot.py,sha256=ecGBxZQw0UhueDHZA06wvgWizu2JzXg9YkYCoLYJuh4,2347 |
|||
pygments/styles/lovelace.py,sha256=PBObIz9_gAjMJ8YgNrm-_z2P_wG7moQ1BosKLThJl20,3173 |
|||
pygments/styles/manni.py,sha256=EmN6YSp-U-ccxqLqjfnIPg-qkIhUAlSb78tIBvwFCsA,2374 |
|||
pygments/styles/monokai.py,sha256=hT5jhhqRQoOmjdK1lZ56hspKke4UDCCiUc3B8m5osLY,5086 |
|||
pygments/styles/murphy.py,sha256=ppT--IJLWtcbxKCNRBuusP4zdSmbR8YShosCdd3hpXs,2751 |
|||
pygments/styles/native.py,sha256=xkphXXv8PvfbgawNSTR28LcEe1TQxFtdrk_sQcGeo2E,1938 |
|||
pygments/styles/paraiso_dark.py,sha256=3a4BSgZQMfB8E2bUMi1WAWkDr98oFUfaPygcsl9B9ZM,5641 |
|||
pygments/styles/paraiso_light.py,sha256=QsZyh5oPQb6wYgnoQAkH2MRBkJjRPqAu5De77diOeN8,5645 |
|||
pygments/styles/pastie.py,sha256=duELGPs_LEzLbesA39vu0MzxtwkPJ2wnV2rS_clTu2E,2473 |
|||
pygments/styles/perldoc.py,sha256=Wf54Io76npBZEsVt8HuM-x7mpzJ7iwPgj5PP_hOf91w,2175 |
|||
pygments/styles/rainbow_dash.py,sha256=IlLrIcl76wy4aIiZIRWxMzUILOI9ms7YEX0o6UL9ROc,2480 |
|||
pygments/styles/rrt.py,sha256=xQp_B5sDo4BJ4Mzx4PWVK6AW_pZs_XmIoM8zLwpfVTs,852 |
|||
pygments/styles/sas.py,sha256=jC6iVFl7-xp0MKwFkPM9QbEInzxVlnhsluPR69iqMZE,1441 |
|||
pygments/styles/solarized.py,sha256=f_E9bd-THUcJUJR36hQgbu9BVIjLi6yiI_n07oRu2u4,3747 |
|||
pygments/styles/stata_dark.py,sha256=K1AKYh93Jd9E_eWXhDw7-tM6fJbIuFeJcAR5jVE1Nkc,1245 |
|||
pygments/styles/stata_light.py,sha256=cN0ulhqteDqKkGnOqAL1aNHy3AvYbmu-fS35XaMptKM,1274 |
|||
pygments/styles/tango.py,sha256=1VtAeshYeFh4jWITdb5_wf-7avl1DwtGWrQkvSKqJJo,7096 |
|||
pygments/styles/trac.py,sha256=wWJokrY8EWWxJTChPxxYsH_cB-CNN7coa1ZBihzbiG4,1933 |
|||
pygments/styles/vim.py,sha256=9PtHne1K4TmKIFcPoM4NY_HRV3naKXRIeEvMC437t7U,1976 |
|||
pygments/styles/vs.py,sha256=-mK8_RJJk12gbR-TXP1zedQpflKS2zc9xQQzHbZTB1E,1073 |
|||
pygments/styles/xcode.py,sha256=s3NuWSoZ8dRCuU0PU0-aDop4xqgAXP4rVefg5yFgQVg,1501 |
|||
pygments/token.py,sha256=J1LOX6vjhiN3pTShN9Mj0MfbWPzhypuPQYZuw29E8As,6167 |
|||
pygments/unistring.py,sha256=V4LPrb9dhNBGR-AdEnopDNmwpxFSodqPBuHOlqG9b0g,64569 |
|||
pygments/util.py,sha256=586xXHiJGGZxqk5PMBu3vBhE68DLuAe5MBARWrSPGxA,10778 |
@ -0,0 +1,5 @@ |
|||
Wheel-Version: 1.0 |
|||
Generator: bdist_wheel (0.33.6) |
|||
Root-Is-Purelib: true |
|||
Tag: py3-none-any |
|||
|
@ -0,0 +1,3 @@ |
|||
[console_scripts] |
|||
pygmentize = pygments.cmdline:main |
|||
|
@ -0,0 +1 @@ |
|||
pygments |
@ -0,0 +1,237 @@ |
|||
Unidecode, lossy ASCII transliterations of Unicode text |
|||
======================================================= |
|||
|
|||
It often happens that you have text data in Unicode, but you need to |
|||
represent it in ASCII. For example when integrating with legacy code that |
|||
doesn't support Unicode, or for ease of entry of non-Roman names on a US |
|||
keyboard, or when constructing ASCII machine identifiers from |
|||
human-readable Unicode strings that should still be somewhat intelligible |
|||
(a popular example of this is when making an URL slug from an article |
|||
title). |
|||
|
|||
In most of these examples you could represent Unicode characters as ``???`` or |
|||
``\\15BA\\15A0\\1610``, to mention two extreme cases. But that's nearly useless |
|||
to someone who actually wants to read what the text says. |
|||
|
|||
What Unidecode provides is a middle road: the function ``unidecode()`` takes |
|||
Unicode data and tries to represent it in ASCII characters (i.e., the |
|||
universally displayable characters between 0x00 and 0x7F), where the |
|||
compromises taken when mapping between two character sets are chosen to be |
|||
near what a human with a US keyboard would choose. |
|||
|
|||
The quality of resulting ASCII representation varies. For languages of |
|||
western origin it should be between perfect and good. On the other hand |
|||
transliteration (i.e., conveying, in Roman letters, the pronunciation |
|||
expressed by the text in some other writing system) of languages like |
|||
Chinese, Japanese or Korean is a very complex issue and this library does |
|||
not even attempt to address it. It draws the line at context-free |
|||
character-by-character mapping. So a good rule of thumb is that the further |
|||
the script you are transliterating is from Latin alphabet, the worse the |
|||
transliteration will be. |
|||
|
|||
Note that this module generally produces better results than simply |
|||
stripping accents from characters (which can be done in Python with |
|||
built-in functions). It is based on hand-tuned character mappings that for |
|||
example also contain ASCII approximations for symbols and non-Latin |
|||
alphabets. |
|||
|
|||
This is a Python port of ``Text::Unidecode`` Perl module by Sean M. Burke |
|||
<sburke@cpan.org>. |
|||
|
|||
|
|||
Module content |
|||
-------------- |
|||
|
|||
The module exports a function that takes an Unicode object (Python 2.x) or |
|||
string (Python 3.x) and returns a string (that can be encoded to ASCII bytes in |
|||
Python 3.x):: |
|||
|
|||
>>> from unidecode import unidecode |
|||
>>> unidecode(u'ko\u017eu\u0161\u010dek') |
|||
'kozuscek' |
|||
>>> unidecode(u'30 \U0001d5c4\U0001d5c6/\U0001d5c1') |
|||
'30 km/h' |
|||
>>> unidecode(u"\u5317\u4EB0") |
|||
'Bei Jing ' |
|||
|
|||
A utility is also included that allows you to transliterate text from the |
|||
command line in several ways. Reading from standard input:: |
|||
|
|||
$ echo hello | unidecode |
|||
hello |
|||
|
|||
from a command line argument:: |
|||
|
|||
$ unidecode -c hello |
|||
hello |
|||
|
|||
or from a file:: |
|||
|
|||
$ unidecode hello.txt |
|||
hello |
|||
|
|||
The default encoding used by the utility depends on your system locale. You can |
|||
specify another encoding with the ``-e`` argument. See ``unidecode --help`` for |
|||
a full list of available options. |
|||
|
|||
Requirements |
|||
------------ |
|||
|
|||
Nothing except Python itself. Unidecode supports Python 2.7 and 3.4 or later. |
|||
|
|||
You need a Python build with "wide" Unicode characters (also called "UCS-4 |
|||
build") in order for Unidecode to work correctly with characters outside of |
|||
Basic Multilingual Plane (BMP). Common characters outside BMP are bold, italic, |
|||
script, etc. variants of the Latin alphabet intended for mathematical notation. |
|||
Surrogate pair encoding of "narrow" builds is not supported in Unidecode. |
|||
|
|||
If your Python build supports "wide" Unicode the following expression will |
|||
return True:: |
|||
|
|||
>>> import sys |
|||
>>> sys.maxunicode > 0xffff |
|||
True |
|||
|
|||
See `PEP 261 <https://www.python.org/dev/peps/pep-0261/>`_ for details |
|||
regarding support for "wide" Unicode characters in Python. |
|||
|
|||
|
|||
Installation |
|||
------------ |
|||
|
|||
To install the latest version of Unidecode from the Python package index, use |
|||
these commands:: |
|||
|
|||
$ pip install unidecode |
|||
|
|||
To install Unidecode from the source distribution and run unit tests, use:: |
|||
|
|||
$ python setup.py install |
|||
$ python setup.py test |
|||
|
|||
Frequently asked questions |
|||
-------------------------- |
|||
|
|||
German umlauts are transliterated incorrectly |
|||
Latin letters "a", "o" and "u" with diaeresis are transliterated by |
|||
Unidecode as "a", "o", "u", *not* according to German rules "ae", "oe", |
|||
"ue". This is intentional and will not be changed. Rationale is that these |
|||
letters are used in languages other than German (for example, Finnish and |
|||
Turkish). German text transliterated without the extra "e" is much more |
|||
readable than other languages transliterated using German rules. A |
|||
workaround is to do your own replacements of these characters before |
|||
passing the string to ``unidecode()``. |
|||
|
|||
Unidecode should support localization (e.g. a language or country parameter, inspecting system locale, etc.) |
|||
Language-specific transliteration is a complicated problem and beyond the |
|||
scope of this library. Changes related to this will not be accepted. Please |
|||
consider using other libraries which do provide this capability, such as |
|||
`Unihandecode <https://github.com/miurahr/unihandecode>`_. |
|||
|
|||
Unidecode should use a permissive license such as MIT or the BSD license. |
|||
The maintainer of Unidecode believes that providing access to source code |
|||
on redistribution is a fair and reasonable request when basing products on |
|||
voluntary work of many contributors. If the license is not suitable for |
|||
you, please consider using other libraries, such as `text-unidecode |
|||
<https://github.com/kmike/text-unidecode>`_. |
|||
|
|||
Unidecode produces completely wrong results (e.g. "u" with diaeresis transliterating as "A 1/4 ") |
|||
The strings you are passing to Unidecode have been wrongly decoded |
|||
somewhere in your program. For example, you might be decoding utf-8 encoded |
|||
strings as latin1. With a misconfigured terminal, locale and/or a text |
|||
editor this might not be immediately apparent. Inspect your strings with |
|||
``repr()`` and consult the |
|||
`Unicode HOWTO <https://docs.python.org/3/howto/unicode.html>`_. |
|||
|
|||
I've upgraded Unidecode and now some URLs on my website return 404 Not Found. |
|||
This is an issue with the software that is running your website, not |
|||
Unidecode. Occasionally, new versions of Unidecode library are released |
|||
which contain improvements to the transliteration tables. This means that |
|||
you cannot rely that ``unidecode()`` output will not change across |
|||
different versions of Unidecode library. If you use ``unidecode()`` to |
|||
generate URLs for your website, either generate the URL slug once and store |
|||
it in the database or lock your dependency of Unidecode to one specific |
|||
version. |
|||
|
|||
Some of the issues in this section are discussed in more detail in `this blog |
|||
post <https://www.tablix.org/~avian/blog/archives/2013/09/python_unidecode_release_0_04_14/>`_. |
|||
|
|||
|
|||
Performance notes |
|||
----------------- |
|||
|
|||
By default, ``unidecode()`` optimizes for the use case where most of the strings |
|||
passed to it are already ASCII-only and no transliteration is necessary (this |
|||
default might change in future versions). |
|||
|
|||
For performance critical applications, two additional functions are exposed: |
|||
|
|||
``unidecode_expect_ascii()`` is optimized for ASCII-only inputs (approximately |
|||
5 times faster than ``unidecode_expect_nonascii()`` on 10 character strings, |
|||
more on longer strings), but slightly slower for non-ASCII inputs. |
|||
|
|||
``unidecode_expect_nonascii()`` takes approximately the same amount of time on |
|||
ASCII and non-ASCII inputs, but is slightly faster for non-ASCII inputs than |
|||
``unidecode_expect_ascii()``. |
|||
|
|||
Apart from differences in run time, both functions produce identical results. |
|||
For most users of Unidecode, the difference in performance should be |
|||
negligible. |
|||
|
|||
|
|||
Source |
|||
------ |
|||
|
|||
You can get the latest development version of Unidecode with:: |
|||
|
|||
$ git clone https://www.tablix.org/~avian/git/unidecode.git |
|||
|
|||
There is also an official mirror of this repository on GitHub at |
|||
https://github.com/avian2/unidecode |
|||
|
|||
|
|||
Contact |
|||
------- |
|||
|
|||
Please make sure to read the `Frequently asked questions`_ section above before |
|||
contacting the maintainer. |
|||
|
|||
Bug reports, patches and suggestions for Unidecode can be sent to |
|||
tomaz.solc@tablix.org. |
|||
|
|||
Alternatively, you can also open a ticket or pull request at |
|||
https://github.com/avian2/unidecode |
|||
|
|||
|
|||
Copyright |
|||
--------- |
|||
|
|||
Original character transliteration tables: |
|||
|
|||
Copyright 2001, Sean M. Burke <sburke@cpan.org>, all rights reserved. |
|||
|
|||
Python code and later additions: |
|||
|
|||
Copyright 2019, Tomaz Solc <tomaz.solc@tablix.org> |
|||
|
|||
This program is free software; you can redistribute it and/or modify it |
|||
under the terms of the GNU General Public License as published by the Free |
|||
Software Foundation; either version 2 of the License, or (at your option) |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, but WITHOUT |
|||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|||
more details. |
|||
|
|||
You should have received a copy of the GNU General Public License along |
|||
with this program; if not, write to the Free Software Foundation, Inc., 51 |
|||
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. The programs and |
|||
documentation in this dist are distributed in the hope that they will be |
|||
useful, but without any warranty; without even the implied warranty of |
|||
merchantability or fitness for a particular purpose. |
|||
|
|||
.. |
|||
vim: set filetype=rst: |
|||
|
|||
|
@ -0,0 +1 @@ |
|||
pip |
@ -0,0 +1,339 @@ |
|||
GNU GENERAL PUBLIC LICENSE |
|||
Version 2, June 1991 |
|||
|
|||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|||
Everyone is permitted to copy and distribute verbatim copies |
|||
of this license document, but changing it is not allowed. |
|||
|
|||
Preamble |
|||
|
|||
The licenses for most software are designed to take away your |
|||
freedom to share and change it. By contrast, the GNU General Public |
|||
License is intended to guarantee your freedom to share and change free |
|||
software--to make sure the software is free for all its users. This |
|||
General Public License applies to most of the Free Software |
|||
Foundation's software and to any other program whose authors commit to |
|||
using it. (Some other Free Software Foundation software is covered by |
|||
the GNU Lesser General Public License instead.) You can apply it to |
|||
your programs, too. |
|||
|
|||
When we speak of free software, we are referring to freedom, not |
|||
price. Our General Public Licenses are designed to make sure that you |
|||
have the freedom to distribute copies of free software (and charge for |
|||
this service if you wish), that you receive source code or can get it |
|||
if you want it, that you can change the software or use pieces of it |
|||
in new free programs; and that you know you can do these things. |
|||
|
|||
To protect your rights, we need to make restrictions that forbid |
|||
anyone to deny you these rights or to ask you to surrender the rights. |
|||
These restrictions translate to certain responsibilities for you if you |
|||
distribute copies of the software, or if you modify it. |
|||
|
|||
For example, if you distribute copies of such a program, whether |
|||
gratis or for a fee, you must give the recipients all the rights that |
|||
you have. You must make sure that they, too, receive or can get the |
|||
source code. And you must show them these terms so they know their |
|||
rights. |
|||
|
|||
We protect your rights with two steps: (1) copyright the software, and |
|||
(2) offer you this license which gives you legal permission to copy, |
|||
distribute and/or modify the software. |
|||
|
|||
Also, for each author's protection and ours, we want to make certain |
|||
that everyone understands that there is no warranty for this free |
|||
software. If the software is modified by someone else and passed on, we |
|||
want its recipients to know that what they have is not the original, so |
|||
that any problems introduced by others will not reflect on the original |
|||
authors' reputations. |
|||
|
|||
Finally, any free program is threatened constantly by software |
|||
patents. We wish to avoid the danger that redistributors of a free |
|||
program will individually obtain patent licenses, in effect making the |
|||
program proprietary. To prevent this, we have made it clear that any |
|||
patent must be licensed for everyone's free use or not licensed at all. |
|||
|
|||
The precise terms and conditions for copying, distribution and |
|||
modification follow. |
|||
|
|||
GNU GENERAL PUBLIC LICENSE |
|||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|||
|
|||
0. This License applies to any program or other work which contains |
|||
a notice placed by the copyright holder saying it may be distributed |
|||
under the terms of this General Public License. The "Program", below, |
|||
refers to any such program or work, and a "work based on the Program" |
|||
means either the Program or any derivative work under copyright law: |
|||
that is to say, a work containing the Program or a portion of it, |
|||
either verbatim or with modifications and/or translated into another |
|||
language. (Hereinafter, translation is included without limitation in |
|||
the term "modification".) Each licensee is addressed as "you". |
|||
|
|||
Activities other than copying, distribution and modification are not |
|||
covered by this License; they are outside its scope. The act of |
|||
running the Program is not restricted, and the output from the Program |
|||
is covered only if its contents constitute a work based on the |
|||
Program (independent of having been made by running the Program). |
|||
Whether that is true depends on what the Program does. |
|||
|
|||
1. You may copy and distribute verbatim copies of the Program's |
|||
source code as you receive it, in any medium, provided that you |
|||
conspicuously and appropriately publish on each copy an appropriate |
|||
copyright notice and disclaimer of warranty; keep intact all the |
|||
notices that refer to this License and to the absence of any warranty; |
|||
and give any other recipients of the Program a copy of this License |
|||
along with the Program. |
|||
|
|||
You may charge a fee for the physical act of transferring a copy, and |
|||
you may at your option offer warranty protection in exchange for a fee. |
|||
|
|||
2. You may modify your copy or copies of the Program or any portion |
|||
of it, thus forming a work based on the Program, and copy and |
|||
distribute such modifications or work under the terms of Section 1 |
|||
above, provided that you also meet all of these conditions: |
|||
|
|||
a) You must cause the modified files to carry prominent notices |
|||
stating that you changed the files and the date of any change. |
|||
|
|||
b) You must cause any work that you distribute or publish, that in |
|||
whole or in part contains or is derived from the Program or any |
|||
part thereof, to be licensed as a whole at no charge to all third |
|||
parties under the terms of this License. |
|||
|
|||
c) If the modified program normally reads commands interactively |
|||
when run, you must cause it, when started running for such |
|||
interactive use in the most ordinary way, to print or display an |
|||
announcement including an appropriate copyright notice and a |
|||
notice that there is no warranty (or else, saying that you provide |
|||
a warranty) and that users may redistribute the program under |
|||
these conditions, and telling the user how to view a copy of this |
|||
License. (Exception: if the Program itself is interactive but |
|||
does not normally print such an announcement, your work based on |
|||
the Program is not required to print an announcement.) |
|||
|
|||
These requirements apply to the modified work as a whole. If |
|||
identifiable sections of that work are not derived from the Program, |
|||
and can be reasonably considered independent and separate works in |
|||
themselves, then this License, and its terms, do not apply to those |
|||
sections when you distribute them as separate works. But when you |
|||
distribute the same sections as part of a whole which is a work based |
|||
on the Program, the distribution of the whole must be on the terms of |
|||
this License, whose permissions for other licensees extend to the |
|||
entire whole, and thus to each and every part regardless of who wrote it. |
|||
|
|||
Thus, it is not the intent of this section to claim rights or contest |
|||
your rights to work written entirely by you; rather, the intent is to |
|||
exercise the right to control the distribution of derivative or |
|||
collective works based on the Program. |
|||
|
|||
In addition, mere aggregation of another work not based on the Program |
|||
with the Program (or with a work based on the Program) on a volume of |
|||
a storage or distribution medium does not bring the other work under |
|||
the scope of this License. |
|||
|
|||
3. You may copy and distribute the Program (or a work based on it, |
|||
under Section 2) in object code or executable form under the terms of |
|||
Sections 1 and 2 above provided that you also do one of the following: |
|||
|
|||
a) Accompany it with the complete corresponding machine-readable |
|||
source code, which must be distributed under the terms of Sections |
|||
1 and 2 above on a medium customarily used for software interchange; or, |
|||
|
|||
b) Accompany it with a written offer, valid for at least three |
|||
years, to give any third party, for a charge no more than your |
|||
cost of physically performing source distribution, a complete |
|||
machine-readable copy of the corresponding source code, to be |
|||
distributed under the terms of Sections 1 and 2 above on a medium |
|||
customarily used for software interchange; or, |
|||
|
|||
c) Accompany it with the information you received as to the offer |
|||
to distribute corresponding source code. (This alternative is |
|||
allowed only for noncommercial distribution and only if you |
|||
received the program in object code or executable form with such |
|||
an offer, in accord with Subsection b above.) |
|||
|
|||
The source code for a work means the preferred form of the work for |
|||
making modifications to it. For an executable work, complete source |
|||
code means all the source code for all modules it contains, plus any |
|||
associated interface definition files, plus the scripts used to |
|||
control compilation and installation of the executable. However, as a |
|||
special exception, the source code distributed need not include |
|||
anything that is normally distributed (in either source or binary |
|||
form) with the major components (compiler, kernel, and so on) of the |
|||
operating system on which the executable runs, unless that component |
|||
itself accompanies the executable. |
|||
|
|||
If distribution of executable or object code is made by offering |
|||
access to copy from a designated place, then offering equivalent |
|||
access to copy the source code from the same place counts as |
|||
distribution of the source code, even though third parties are not |
|||
compelled to copy the source along with the object code. |
|||
|
|||
4. You may not copy, modify, sublicense, or distribute the Program |
|||
except as expressly provided under this License. Any attempt |
|||
otherwise to copy, modify, sublicense or distribute the Program is |
|||
void, and will automatically terminate your rights under this License. |
|||
However, parties who have received copies, or rights, from you under |
|||
this License will not have their licenses terminated so long as such |
|||
parties remain in full compliance. |
|||
|
|||
5. You are not required to accept this License, since you have not |
|||
signed it. However, nothing else grants you permission to modify or |
|||
distribute the Program or its derivative works. These actions are |
|||
prohibited by law if you do not accept this License. Therefore, by |
|||
modifying or distributing the Program (or any work based on the |
|||
Program), you indicate your acceptance of this License to do so, and |
|||
all its terms and conditions for copying, distributing or modifying |
|||
the Program or works based on it. |
|||
|
|||
6. Each time you redistribute the Program (or any work based on the |
|||
Program), the recipient automatically receives a license from the |
|||
original licensor to copy, distribute or modify the Program subject to |
|||
these terms and conditions. You may not impose any further |
|||
restrictions on the recipients' exercise of the rights granted herein. |
|||
You are not responsible for enforcing compliance by third parties to |
|||
this License. |
|||
|
|||
7. If, as a consequence of a court judgment or allegation of patent |
|||
infringement or for any other reason (not limited to patent issues), |
|||
conditions are imposed on you (whether by court order, agreement or |
|||
otherwise) that contradict the conditions of this License, they do not |
|||
excuse you from the conditions of this License. If you cannot |
|||
distribute so as to satisfy simultaneously your obligations under this |
|||
License and any other pertinent obligations, then as a consequence you |
|||
may not distribute the Program at all. For example, if a patent |
|||
license would not permit royalty-free redistribution of the Program by |
|||
all those who receive copies directly or indirectly through you, then |
|||
the only way you could satisfy both it and this License would be to |
|||
refrain entirely from distribution of the Program. |
|||
|
|||
If any portion of this section is held invalid or unenforceable under |
|||
any particular circumstance, the balance of the section is intended to |
|||
apply and the section as a whole is intended to apply in other |
|||
circumstances. |
|||
|
|||
It is not the purpose of this section to induce you to infringe any |
|||
patents or other property right claims or to contest validity of any |
|||
such claims; this section has the sole purpose of protecting the |
|||
integrity of the free software distribution system, which is |
|||
implemented by public license practices. Many people have made |
|||
generous contributions to the wide range of software distributed |
|||
through that system in reliance on consistent application of that |
|||
system; it is up to the author/donor to decide if he or she is willing |
|||
to distribute software through any other system and a licensee cannot |
|||
impose that choice. |
|||
|
|||
This section is intended to make thoroughly clear what is believed to |
|||
be a consequence of the rest of this License. |
|||
|
|||
8. If the distribution and/or use of the Program is restricted in |
|||
certain countries either by patents or by copyrighted interfaces, the |
|||
original copyright holder who places the Program under this License |
|||
may add an explicit geographical distribution limitation excluding |
|||
those countries, so that distribution is permitted only in or among |
|||
countries not thus excluded. In such case, this License incorporates |
|||
the limitation as if written in the body of this License. |
|||
|
|||
9. The Free Software Foundation may publish revised and/or new versions |
|||
of the General Public License from time to time. Such new versions will |
|||
be similar in spirit to the present version, but may differ in detail to |
|||
address new problems or concerns. |
|||
|
|||
Each version is given a distinguishing version number. If the Program |
|||
specifies a version number of this License which applies to it and "any |
|||
later version", you have the option of following the terms and conditions |
|||
either of that version or of any later version published by the Free |
|||
Software Foundation. If the Program does not specify a version number of |
|||
this License, you may choose any version ever published by the Free Software |
|||
Foundation. |
|||
|
|||
10. If you wish to incorporate parts of the Program into other free |
|||
programs whose distribution conditions are different, write to the author |
|||
to ask for permission. For software which is copyrighted by the Free |
|||
Software Foundation, write to the Free Software Foundation; we sometimes |
|||
make exceptions for this. Our decision will be guided by the two goals |
|||
of preserving the free status of all derivatives of our free software and |
|||
of promoting the sharing and reuse of software generally. |
|||
|
|||
NO WARRANTY |
|||
|
|||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
|||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
|||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
|||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
|||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
|||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
|||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
|||
REPAIR OR CORRECTION. |
|||
|
|||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
|||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
|||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
|||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
|||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
|||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
|||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
|||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
|||
POSSIBILITY OF SUCH DAMAGES. |
|||
|
|||
END OF TERMS AND CONDITIONS |
|||
|
|||
How to Apply These Terms to Your New Programs |
|||
|
|||
If you develop a new program, and you want it to be of the greatest |
|||
possible use to the public, the best way to achieve this is to make it |
|||
free software which everyone can redistribute and change under these terms. |
|||
|
|||
To do so, attach the following notices to the program. It is safest |
|||
to attach them to the start of each source file to most effectively |
|||
convey the exclusion of warranty; and each file should have at least |
|||
the "copyright" line and a pointer to where the full notice is found. |
|||
|
|||
<one line to give the program's name and a brief idea of what it does.> |
|||
Copyright (C) <year> <name of author> |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License along |
|||
with this program; if not, write to the Free Software Foundation, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
|||
|
|||
Also add information on how to contact you by electronic and paper mail. |
|||
|
|||
If the program is interactive, make it output a short notice like this |
|||
when it starts in an interactive mode: |
|||
|
|||
Gnomovision version 69, Copyright (C) year name of author |
|||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
|||
This is free software, and you are welcome to redistribute it |
|||
under certain conditions; type `show c' for details. |
|||
|
|||
The hypothetical commands `show w' and `show c' should show the appropriate |
|||
parts of the General Public License. Of course, the commands you use may |
|||
be called something other than `show w' and `show c'; they could even be |
|||
mouse-clicks or menu items--whatever suits your program. |
|||
|
|||
You should also get your employer (if you work as a programmer) or your |
|||
school, if any, to sign a "copyright disclaimer" for the program, if |
|||
necessary. Here is a sample; alter the names: |
|||
|
|||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
|||
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
|||
|
|||
<signature of Ty Coon>, 1 April 1989 |
|||
Ty Coon, President of Vice |
|||
|
|||
This General Public License does not permit incorporating your program into |
|||
proprietary programs. If your program is a subroutine library, you may |
|||
consider it more useful to permit linking proprietary applications with the |
|||
library. If this is what you want to do, use the GNU Lesser General |
|||
Public License instead of this License. |
@ -0,0 +1,261 @@ |
|||
Metadata-Version: 2.0 |
|||
Name: Unidecode |
|||
Version: 1.1.1 |
|||
Summary: ASCII transliterations of Unicode text |
|||
Home-page: UNKNOWN |
|||
Author: Tomaz Solc |
|||
Author-email: tomaz.solc@tablix.org |
|||
License: GPL |
|||
Platform: UNKNOWN |
|||
Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) |
|||
Classifier: Programming Language :: Python |
|||
Classifier: Programming Language :: Python :: 2 |
|||
Classifier: Programming Language :: Python :: 2.7 |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.4 |
|||
Classifier: Programming Language :: Python :: 3.5 |
|||
Classifier: Programming Language :: Python :: 3.6 |
|||
Classifier: Programming Language :: Python :: 3.7 |
|||
Classifier: Programming Language :: Python :: Implementation :: CPython |
|||
Classifier: Programming Language :: Python :: Implementation :: PyPy |
|||
Classifier: Topic :: Text Processing |
|||
Classifier: Topic :: Text Processing :: Filters |
|||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* |
|||
|
|||
Unidecode, lossy ASCII transliterations of Unicode text |
|||
======================================================= |
|||
|
|||
It often happens that you have text data in Unicode, but you need to |
|||
represent it in ASCII. For example when integrating with legacy code that |
|||
doesn't support Unicode, or for ease of entry of non-Roman names on a US |
|||
keyboard, or when constructing ASCII machine identifiers from |
|||
human-readable Unicode strings that should still be somewhat intelligible |
|||
(a popular example of this is when making an URL slug from an article |
|||
title). |
|||
|
|||
In most of these examples you could represent Unicode characters as ``???`` or |
|||
``\\15BA\\15A0\\1610``, to mention two extreme cases. But that's nearly useless |
|||
to someone who actually wants to read what the text says. |
|||
|
|||
What Unidecode provides is a middle road: the function ``unidecode()`` takes |
|||
Unicode data and tries to represent it in ASCII characters (i.e., the |
|||
universally displayable characters between 0x00 and 0x7F), where the |
|||
compromises taken when mapping between two character sets are chosen to be |
|||
near what a human with a US keyboard would choose. |
|||
|
|||
The quality of resulting ASCII representation varies. For languages of |
|||
western origin it should be between perfect and good. On the other hand |
|||
transliteration (i.e., conveying, in Roman letters, the pronunciation |
|||
expressed by the text in some other writing system) of languages like |
|||
Chinese, Japanese or Korean is a very complex issue and this library does |
|||
not even attempt to address it. It draws the line at context-free |
|||
character-by-character mapping. So a good rule of thumb is that the further |
|||
the script you are transliterating is from Latin alphabet, the worse the |
|||
transliteration will be. |
|||
|
|||
Note that this module generally produces better results than simply |
|||
stripping accents from characters (which can be done in Python with |
|||
built-in functions). It is based on hand-tuned character mappings that for |
|||
example also contain ASCII approximations for symbols and non-Latin |
|||
alphabets. |
|||
|
|||
This is a Python port of ``Text::Unidecode`` Perl module by Sean M. Burke |
|||
<sburke@cpan.org>. |
|||
|
|||
|
|||
Module content |
|||
-------------- |
|||
|
|||
The module exports a function that takes an Unicode object (Python 2.x) or |
|||
string (Python 3.x) and returns a string (that can be encoded to ASCII bytes in |
|||
Python 3.x):: |
|||
|
|||
>>> from unidecode import unidecode |
|||
>>> unidecode(u'ko\u017eu\u0161\u010dek') |
|||
'kozuscek' |
|||
>>> unidecode(u'30 \U0001d5c4\U0001d5c6/\U0001d5c1') |
|||
'30 km/h' |
|||
>>> unidecode(u"\u5317\u4EB0") |
|||
'Bei Jing ' |
|||
|
|||
A utility is also included that allows you to transliterate text from the |
|||
command line in several ways. Reading from standard input:: |
|||
|
|||
$ echo hello | unidecode |
|||
hello |
|||
|
|||
from a command line argument:: |
|||
|
|||
$ unidecode -c hello |
|||
hello |
|||
|
|||
or from a file:: |
|||
|
|||
$ unidecode hello.txt |
|||
hello |
|||
|
|||
The default encoding used by the utility depends on your system locale. You can |
|||
specify another encoding with the ``-e`` argument. See ``unidecode --help`` for |
|||
a full list of available options. |
|||
|
|||
Requirements |
|||
------------ |
|||
|
|||
Nothing except Python itself. Unidecode supports Python 2.7 and 3.4 or later. |
|||
|
|||
You need a Python build with "wide" Unicode characters (also called "UCS-4 |
|||
build") in order for Unidecode to work correctly with characters outside of |
|||
Basic Multilingual Plane (BMP). Common characters outside BMP are bold, italic, |
|||
script, etc. variants of the Latin alphabet intended for mathematical notation. |
|||
Surrogate pair encoding of "narrow" builds is not supported in Unidecode. |
|||
|
|||
If your Python build supports "wide" Unicode the following expression will |
|||
return True:: |
|||
|
|||
>>> import sys |
|||
>>> sys.maxunicode > 0xffff |
|||
True |
|||
|
|||
See `PEP 261 <https://www.python.org/dev/peps/pep-0261/>`_ for details |
|||
regarding support for "wide" Unicode characters in Python. |
|||
|
|||
|
|||
Installation |
|||
------------ |
|||
|
|||
To install the latest version of Unidecode from the Python package index, use |
|||
these commands:: |
|||
|
|||
$ pip install unidecode |
|||
|
|||
To install Unidecode from the source distribution and run unit tests, use:: |
|||
|
|||
$ python setup.py install |
|||
$ python setup.py test |
|||
|
|||
Frequently asked questions |
|||
-------------------------- |
|||
|
|||
German umlauts are transliterated incorrectly |
|||
Latin letters "a", "o" and "u" with diaeresis are transliterated by |
|||
Unidecode as "a", "o", "u", *not* according to German rules "ae", "oe", |
|||
"ue". This is intentional and will not be changed. Rationale is that these |
|||
letters are used in languages other than German (for example, Finnish and |
|||
Turkish). German text transliterated without the extra "e" is much more |
|||
readable than other languages transliterated using German rules. A |
|||
workaround is to do your own replacements of these characters before |
|||
passing the string to ``unidecode()``. |
|||
|
|||
Unidecode should support localization (e.g. a language or country parameter, inspecting system locale, etc.) |
|||
Language-specific transliteration is a complicated problem and beyond the |
|||
scope of this library. Changes related to this will not be accepted. Please |
|||
consider using other libraries which do provide this capability, such as |
|||
`Unihandecode <https://github.com/miurahr/unihandecode>`_. |
|||
|
|||
Unidecode should use a permissive license such as MIT or the BSD license. |
|||
The maintainer of Unidecode believes that providing access to source code |
|||
on redistribution is a fair and reasonable request when basing products on |
|||
voluntary work of many contributors. If the license is not suitable for |
|||
you, please consider using other libraries, such as `text-unidecode |
|||
<https://github.com/kmike/text-unidecode>`_. |
|||
|
|||
Unidecode produces completely wrong results (e.g. "u" with diaeresis transliterating as "A 1/4 ") |
|||
The strings you are passing to Unidecode have been wrongly decoded |
|||
somewhere in your program. For example, you might be decoding utf-8 encoded |
|||
strings as latin1. With a misconfigured terminal, locale and/or a text |
|||
editor this might not be immediately apparent. Inspect your strings with |
|||
``repr()`` and consult the |
|||
`Unicode HOWTO <https://docs.python.org/3/howto/unicode.html>`_. |
|||
|
|||
I've upgraded Unidecode and now some URLs on my website return 404 Not Found. |
|||
This is an issue with the software that is running your website, not |
|||
Unidecode. Occasionally, new versions of Unidecode library are released |
|||
which contain improvements to the transliteration tables. This means that |
|||
you cannot rely that ``unidecode()`` output will not change across |
|||
different versions of Unidecode library. If you use ``unidecode()`` to |
|||
generate URLs for your website, either generate the URL slug once and store |
|||
it in the database or lock your dependency of Unidecode to one specific |
|||
version. |
|||
|
|||
Some of the issues in this section are discussed in more detail in `this blog |
|||
post <https://www.tablix.org/~avian/blog/archives/2013/09/python_unidecode_release_0_04_14/>`_. |
|||
|
|||
|
|||
Performance notes |
|||
----------------- |
|||
|
|||
By default, ``unidecode()`` optimizes for the use case where most of the strings |
|||
passed to it are already ASCII-only and no transliteration is necessary (this |
|||
default might change in future versions). |
|||
|
|||
For performance critical applications, two additional functions are exposed: |
|||
|
|||
``unidecode_expect_ascii()`` is optimized for ASCII-only inputs (approximately |
|||
5 times faster than ``unidecode_expect_nonascii()`` on 10 character strings, |
|||
more on longer strings), but slightly slower for non-ASCII inputs. |
|||
|
|||
``unidecode_expect_nonascii()`` takes approximately the same amount of time on |
|||
ASCII and non-ASCII inputs, but is slightly faster for non-ASCII inputs than |
|||
``unidecode_expect_ascii()``. |
|||
|
|||
Apart from differences in run time, both functions produce identical results. |
|||
For most users of Unidecode, the difference in performance should be |
|||
negligible. |
|||
|
|||
|
|||
Source |
|||
------ |
|||
|
|||
You can get the latest development version of Unidecode with:: |
|||
|
|||
$ git clone https://www.tablix.org/~avian/git/unidecode.git |
|||
|
|||
There is also an official mirror of this repository on GitHub at |
|||
https://github.com/avian2/unidecode |
|||
|
|||
|
|||
Contact |
|||
------- |
|||
|
|||
Please make sure to read the `Frequently asked questions`_ section above before |
|||
contacting the maintainer. |
|||
|
|||
Bug reports, patches and suggestions for Unidecode can be sent to |
|||
tomaz.solc@tablix.org. |
|||
|
|||
Alternatively, you can also open a ticket or pull request at |
|||
https://github.com/avian2/unidecode |
|||
|
|||
|
|||
Copyright |
|||
--------- |
|||
|
|||
Original character transliteration tables: |
|||
|
|||
Copyright 2001, Sean M. Burke <sburke@cpan.org>, all rights reserved. |
|||
|
|||
Python code and later additions: |
|||
|
|||
Copyright 2019, Tomaz Solc <tomaz.solc@tablix.org> |
|||
|
|||
This program is free software; you can redistribute it and/or modify it |
|||
under the terms of the GNU General Public License as published by the Free |
|||
Software Foundation; either version 2 of the License, or (at your option) |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, but WITHOUT |
|||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|||
more details. |
|||
|
|||
You should have received a copy of the GNU General Public License along |
|||
with this program; if not, write to the Free Software Foundation, Inc., 51 |
|||
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. The programs and |
|||
documentation in this dist are distributed in the hope that they will be |
|||
useful, but without any warranty; without even the implied warranty of |
|||
merchantability or fitness for a particular purpose. |
|||
|
|||
.. |
|||
vim: set filetype=rst: |
|||
|
|||
|
@ -0,0 +1,394 @@ |
|||
../../../bin/unidecode,sha256=lTbG9QCtfk2-jWUig_WnlGb4t7-1Bljb0pu2DtfOpRw,272 |
|||
Unidecode-1.1.1.dist-info/DESCRIPTION.rst,sha256=1qgo-PnPYFf7RjSFGEnFbEL6FdtVq5GJMUDpysakI6A,9474 |
|||
Unidecode-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
|||
Unidecode-1.1.1.dist-info/LICENSE.txt,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092 |
|||
Unidecode-1.1.1.dist-info/METADATA,sha256=tYiBHi608dh-oJ4Eev65ipZFvIjgAVbj-peGVHYr73I,10442 |
|||
Unidecode-1.1.1.dist-info/RECORD,, |
|||
Unidecode-1.1.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 |
|||
Unidecode-1.1.1.dist-info/entry_points.txt,sha256=ItDp7W6CoSJQAKqdiUkzmecugvKvWzjfN7MMK52GM10,51 |
|||
Unidecode-1.1.1.dist-info/metadata.json,sha256=uK7I5vPstQ58Y3hzy2i7dCLyq5GjVCJPIxQk1MZt8x0,1200 |
|||
Unidecode-1.1.1.dist-info/top_level.txt,sha256=4uYNG2l04s0dm0mEQmPLo2zrjLbhLPKUesLr2dOTdpo,10 |
|||
unidecode/__init__.py,sha256=OdPRbXia-xzzGelCHnVh_zmcHJA2s2wP6RGocPnCihU,3094 |
|||
unidecode/__main__.py,sha256=VWYWCclyJsdhtNMQtryMFbgsCZtNUsWcEuS7ZOlH1Jc,40 |
|||
unidecode/__pycache__/__init__.cpython-37.pyc,, |
|||
unidecode/__pycache__/__main__.cpython-37.pyc,, |
|||
unidecode/__pycache__/util.cpython-37.pyc,, |
|||
unidecode/__pycache__/x000.cpython-37.pyc,, |
|||
unidecode/__pycache__/x001.cpython-37.pyc,, |
|||
unidecode/__pycache__/x002.cpython-37.pyc,, |
|||
unidecode/__pycache__/x003.cpython-37.pyc,, |
|||
unidecode/__pycache__/x004.cpython-37.pyc,, |
|||
unidecode/__pycache__/x005.cpython-37.pyc,, |
|||
unidecode/__pycache__/x006.cpython-37.pyc,, |
|||
unidecode/__pycache__/x007.cpython-37.pyc,, |
|||
unidecode/__pycache__/x009.cpython-37.pyc,, |
|||
unidecode/__pycache__/x00a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x00b.cpython-37.pyc,, |
|||
unidecode/__pycache__/x00c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x00d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x00e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x00f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x010.cpython-37.pyc,, |
|||
unidecode/__pycache__/x011.cpython-37.pyc,, |
|||
unidecode/__pycache__/x012.cpython-37.pyc,, |
|||
unidecode/__pycache__/x013.cpython-37.pyc,, |
|||
unidecode/__pycache__/x014.cpython-37.pyc,, |
|||
unidecode/__pycache__/x015.cpython-37.pyc,, |
|||
unidecode/__pycache__/x016.cpython-37.pyc,, |
|||
unidecode/__pycache__/x017.cpython-37.pyc,, |
|||
unidecode/__pycache__/x018.cpython-37.pyc,, |
|||
unidecode/__pycache__/x01d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x01e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x01f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x020.cpython-37.pyc,, |
|||
unidecode/__pycache__/x021.cpython-37.pyc,, |
|||
unidecode/__pycache__/x022.cpython-37.pyc,, |
|||
unidecode/__pycache__/x023.cpython-37.pyc,, |
|||
unidecode/__pycache__/x024.cpython-37.pyc,, |
|||
unidecode/__pycache__/x025.cpython-37.pyc,, |
|||
unidecode/__pycache__/x026.cpython-37.pyc,, |
|||
unidecode/__pycache__/x027.cpython-37.pyc,, |
|||
unidecode/__pycache__/x028.cpython-37.pyc,, |
|||
unidecode/__pycache__/x029.cpython-37.pyc,, |
|||
unidecode/__pycache__/x02a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x02c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x02e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x02f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x030.cpython-37.pyc,, |
|||
unidecode/__pycache__/x031.cpython-37.pyc,, |
|||
unidecode/__pycache__/x032.cpython-37.pyc,, |
|||
unidecode/__pycache__/x033.cpython-37.pyc,, |
|||
unidecode/__pycache__/x04d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x04e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x04f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x050.cpython-37.pyc,, |
|||
unidecode/__pycache__/x051.cpython-37.pyc,, |
|||
unidecode/__pycache__/x052.cpython-37.pyc,, |
|||
unidecode/__pycache__/x053.cpython-37.pyc,, |
|||
unidecode/__pycache__/x054.cpython-37.pyc,, |
|||
unidecode/__pycache__/x055.cpython-37.pyc,, |
|||
unidecode/__pycache__/x056.cpython-37.pyc,, |
|||
unidecode/__pycache__/x057.cpython-37.pyc,, |
|||
unidecode/__pycache__/x058.cpython-37.pyc,, |
|||
unidecode/__pycache__/x059.cpython-37.pyc,, |
|||
unidecode/__pycache__/x05a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x05b.cpython-37.pyc,, |
|||
unidecode/__pycache__/x05c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x05d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x05e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x05f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x060.cpython-37.pyc,, |
|||
unidecode/__pycache__/x061.cpython-37.pyc,, |
|||
unidecode/__pycache__/x062.cpython-37.pyc,, |
|||
unidecode/__pycache__/x063.cpython-37.pyc,, |
|||
unidecode/__pycache__/x064.cpython-37.pyc,, |
|||
unidecode/__pycache__/x065.cpython-37.pyc,, |
|||
unidecode/__pycache__/x066.cpython-37.pyc,, |
|||
unidecode/__pycache__/x067.cpython-37.pyc,, |
|||
unidecode/__pycache__/x068.cpython-37.pyc,, |
|||
unidecode/__pycache__/x069.cpython-37.pyc,, |
|||
unidecode/__pycache__/x06a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x06b.cpython-37.pyc,, |
|||
unidecode/__pycache__/x06c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x06d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x06e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x06f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x070.cpython-37.pyc,, |
|||
unidecode/__pycache__/x071.cpython-37.pyc,, |
|||
unidecode/__pycache__/x072.cpython-37.pyc,, |
|||
unidecode/__pycache__/x073.cpython-37.pyc,, |
|||
unidecode/__pycache__/x074.cpython-37.pyc,, |
|||
unidecode/__pycache__/x075.cpython-37.pyc,, |
|||
unidecode/__pycache__/x076.cpython-37.pyc,, |
|||
unidecode/__pycache__/x077.cpython-37.pyc,, |
|||
unidecode/__pycache__/x078.cpython-37.pyc,, |
|||
unidecode/__pycache__/x079.cpython-37.pyc,, |
|||
unidecode/__pycache__/x07a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x07b.cpython-37.pyc,, |
|||
unidecode/__pycache__/x07c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x07d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x07e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x07f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x080.cpython-37.pyc,, |
|||
unidecode/__pycache__/x081.cpython-37.pyc,, |
|||
unidecode/__pycache__/x082.cpython-37.pyc,, |
|||
unidecode/__pycache__/x083.cpython-37.pyc,, |
|||
unidecode/__pycache__/x084.cpython-37.pyc,, |
|||
unidecode/__pycache__/x085.cpython-37.pyc,, |
|||
unidecode/__pycache__/x086.cpython-37.pyc,, |
|||
unidecode/__pycache__/x087.cpython-37.pyc,, |
|||
unidecode/__pycache__/x088.cpython-37.pyc,, |
|||
unidecode/__pycache__/x089.cpython-37.pyc,, |
|||
unidecode/__pycache__/x08a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x08b.cpython-37.pyc,, |
|||
unidecode/__pycache__/x08c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x08d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x08e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x08f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x090.cpython-37.pyc,, |
|||
unidecode/__pycache__/x091.cpython-37.pyc,, |
|||
unidecode/__pycache__/x092.cpython-37.pyc,, |
|||
unidecode/__pycache__/x093.cpython-37.pyc,, |
|||
unidecode/__pycache__/x094.cpython-37.pyc,, |
|||
unidecode/__pycache__/x095.cpython-37.pyc,, |
|||
unidecode/__pycache__/x096.cpython-37.pyc,, |
|||
unidecode/__pycache__/x097.cpython-37.pyc,, |
|||
unidecode/__pycache__/x098.cpython-37.pyc,, |
|||
unidecode/__pycache__/x099.cpython-37.pyc,, |
|||
unidecode/__pycache__/x09a.cpython-37.pyc,, |
|||
unidecode/__pycache__/x09b.cpython-37.pyc,, |
|||
unidecode/__pycache__/x09c.cpython-37.pyc,, |
|||
unidecode/__pycache__/x09d.cpython-37.pyc,, |
|||
unidecode/__pycache__/x09e.cpython-37.pyc,, |
|||
unidecode/__pycache__/x09f.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0a0.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0a1.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0a2.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0a3.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0a4.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ac.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ad.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ae.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0af.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b0.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b1.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b2.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b3.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b4.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b5.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b6.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b7.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b8.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0b9.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ba.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0bb.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0bc.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0bd.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0be.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0bf.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c0.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c1.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c2.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c3.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c4.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c5.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c6.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c7.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c8.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0c9.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ca.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0cb.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0cc.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0cd.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ce.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0cf.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d0.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d1.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d2.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d3.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d4.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d5.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d6.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0d7.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0f9.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0fa.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0fb.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0fc.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0fd.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0fe.cpython-37.pyc,, |
|||
unidecode/__pycache__/x0ff.cpython-37.pyc,, |
|||
unidecode/__pycache__/x1d4.cpython-37.pyc,, |
|||
unidecode/__pycache__/x1d5.cpython-37.pyc,, |
|||
unidecode/__pycache__/x1d6.cpython-37.pyc,, |
|||
unidecode/__pycache__/x1d7.cpython-37.pyc,, |
|||
unidecode/__pycache__/x1f1.cpython-37.pyc,, |
|||
unidecode/util.py,sha256=qR0aGIMExGrFUGmojfAMdbRklcXrAPvXpU1evPXCa4g,1782 |
|||
unidecode/x000.py,sha256=dxTi7LcLTlbF3ZGGk9xPjx8sx2M6qPBIs2b5RS2DVNY,3041 |
|||
unidecode/x001.py,sha256=ylHh3UVaPtibVuUEEWvdSeDFK0OXrWt4-LnxAgYD6qo,3891 |
|||
unidecode/x002.py,sha256=Hoks5fu8uyhwDuJt93BiC6iYv_HVY4bIvKklyAtBoFI,3889 |
|||
unidecode/x003.py,sha256=UdskMuqktghKcjLeegwYkyfhDH3lgi_G5rr7ID5W0-s,3875 |
|||
unidecode/x004.py,sha256=85Sh4Rem7dRS7kIx6yGQqA7U7MxqCD40DGoqaob9MzI,4071 |
|||
unidecode/x005.py,sha256=qPEepEySMuoXFtVhrFw-y69wnVQGcFmk_0vtcUzDYTo,3997 |
|||
unidecode/x006.py,sha256=4fZWzc5DGZVFD1zvHtkywMHykQTiFgA7M6LMowpaGI0,3961 |
|||
unidecode/x007.py,sha256=k2kkTXdbKqMFOQy2TlGmRnoRYMCOvqTfjusGV76u9SE,4122 |
|||
unidecode/x009.py,sha256=aZrWpXwsS2yIyO8oZIIN3Uo4j0XdpaJq5VGdCu3e8cc,4075 |
|||
unidecode/x00a.py,sha256=UrXdvZ-qVMfWRSRW8HwrxfNXB-Jp0lgW2iPs6roZXz4,4121 |
|||
unidecode/x00b.py,sha256=MjqdSyCxXLZ6wUrgeS8A-wop9S78EEK9e-BJ4HpAqLA,4132 |
|||
unidecode/x00c.py,sha256=y-y0RqVolrIBfsj1DtT_rQUbmxxjoKnWlZDMPPC6Om4,4102 |
|||
unidecode/x00d.py,sha256=OVfHvb44WS_aMXSWrZt-693xJ70L4sepcyJFIkl23TY,4121 |
|||
unidecode/x00e.py,sha256=9N9w09V225dx1-e8w0HRaIoD66mpDhHgoQ-RlPZznmA,4092 |
|||
unidecode/x00f.py,sha256=Vak8Z6Dy6ucFysFSNBt24ZE4h2ZSXQcBLiWCSC27bSA,4061 |
|||
unidecode/x010.py,sha256=9vck5PTRcz5Q64F_2dIMQoPGEFTHWjvwq7ZE90nvOK4,4110 |
|||
unidecode/x011.py,sha256=8EN-PZS-ythtQlU3HZYNkGePm3oWFzSOgOorkeQUBV4,4135 |
|||
unidecode/x012.py,sha256=2onQfsL5e7X4RB9DKehMUcG81gaSav4UwGalXulnxOE,4318 |
|||
unidecode/x013.py,sha256=Nl9CnUVkJkXBux5TEia5Vq1nPjTICUUyT77GhkChbrQ,4247 |
|||
unidecode/x014.py,sha256=CkrW473dLq_AllpcK8teAUQSeglML_MZ6t9TsK5g9wE,4300 |
|||
unidecode/x015.py,sha256=TB6O4l2qPxbmF2dejlxXLqX5tTfjl95cMYx1770GHs0,4329 |
|||
unidecode/x016.py,sha256=M9kiUT0ScE5acj-tkomNZ0eND1lvau0i6tJOWepU1FA,4140 |
|||
unidecode/x017.py,sha256=nsZP_7vWKOTYY8LOE535g67qwwaMdGblZ-79MbfTNX8,4190 |
|||
unidecode/x018.py,sha256=_qBETpive71IdV6nD0md6KaSHaxaSpPUsTTHtVlE4KM,4099 |
|||
unidecode/x01d.py,sha256=EwAYkMVHAFvbKRzsQ-e4cRcvS_eia3kYCM2GcaqkBWY,3701 |
|||
unidecode/x01e.py,sha256=oVdWd4v85k-Slc3V0i2NZ4i5G866X6Qw7bKXJDmbXig,3853 |
|||
unidecode/x01f.py,sha256=pG-fs1iD7O3vSwIx6Ibz5MhpZI_NsQWEDlHiRpxgZC0,3899 |
|||
unidecode/x020.py,sha256=k9PWwEJiWl7yUFTVR89cl2XuYqWDEiVfrXvSqOaeJH4,4010 |
|||
unidecode/x021.py,sha256=Ns9H51Q51tDB-mRSERyMN1y2EiE7UPQx9K3BxwaFrQs,4012 |
|||
unidecode/x022.py,sha256=OzIXC-VMfUskTtEe5_m3zpmgtKtJSDY0XBZ5C0codi8,4329 |
|||
unidecode/x023.py,sha256=FFgn4hJ7Q4SbsxFtHUa8SuQ0VBJ9hkod5QTWaMmkk9U,4341 |
|||
unidecode/x024.py,sha256=pMZqUxkwfgz9n9NXpUaAaNr-p9ACNCyfTQKo2PFJ11w,4049 |
|||
unidecode/x025.py,sha256=-dvBV3byxxngHQcQx7Jjt9dwtehBaQwRoCnX3ZAzWe0,3871 |
|||
unidecode/x026.py,sha256=N7i11hEwuiW9mSEp0Dk4Aa9iIsHsxAYhLAplqZnUMs0,4020 |
|||
unidecode/x027.py,sha256=wZ1l328qv5BWbk-FPr34ayyJ4rWQG3EQIsPxd7GilFg,3783 |
|||
unidecode/x028.py,sha256=FZPCZ9w3N3WOI42h2gHEQgVOAlLBNTZjMu_KQQkIMdk,5069 |
|||
unidecode/x029.py,sha256=TlYRf7ym0R-L7DncmX4RNZX5kKctvGFLbtu8GPkxqpE,3584 |
|||
unidecode/x02a.py,sha256=WD3uhv1sNhQB45ugiKUk4Btj3aj8qcH_kpwrV3jRWJw,3589 |
|||
unidecode/x02c.py,sha256=zRG2Elxv5SlYrBpJb1NUz7WsJOFAkzwSi991cMyhnJs,3596 |
|||
unidecode/x02e.py,sha256=_ntc-U9pwAkGQkFC3zdQgJNUZSv9W4115ouIbINGyw4,4461 |
|||
unidecode/x02f.py,sha256=9cxem6MFm7acjUDcmYLk9lbxEyfP2xMjfE3c-6PUEbg,4572 |
|||
unidecode/x030.py,sha256=aHVHcoSl5FcxX9QQALaW5n1zYJ0Ymap-wgWuzojXLyY,4037 |
|||
unidecode/x031.py,sha256=vRlzxBKPo5s3ZDpUojrXelZKjTEwR8fsnm3vUeB5bp8,4125 |
|||
unidecode/x032.py,sha256=BSZV_t8jVsWX_RsoqajWAqigQaHh3wXmoMG5wUZtgos,4485 |
|||
unidecode/x033.py,sha256=ImTd4BRRPgCqWmrvJPoikoL0dJMKH8eQgd48vksi60A,4513 |
|||
unidecode/x04d.py,sha256=d5K-HbR3Gg1VBdMk1GO6PJdoseRRIV5ef4aQbslnsBo,4528 |
|||
unidecode/x04e.py,sha256=z04XMxt3y016alep4Xg8Zjh4cvBj6CddjD9Qv6sr6v4,4646 |
|||
unidecode/x04f.py,sha256=zEf_S6bDF755svnPRWyreVf2Q4SekYMxIpGf1Jb2alc,4607 |
|||
unidecode/x050.py,sha256=MNhEf7TRcQ2CdgkMcFloEGSbTtrsXK-6r6Ru7HDG6hU,4682 |
|||
unidecode/x051.py,sha256=VY0jC10xdU7bm21Cig5omd7L-4hiSk_rk2UTR_yTF3g,4685 |
|||
unidecode/x052.py,sha256=a09eo_5pL6jpU9TW-zG2w2iXTYp6awtQ4OxGnLdcwKg,4654 |
|||
unidecode/x053.py,sha256=so5U-CQ5jRbp7AYZZPCdmkdnNtfNn_-Nl_761eBMtIU,4616 |
|||
unidecode/x054.py,sha256=Htu6ZFPTTyBHUU1Ia-mc7Y3Dy4j1cp-fRwag0HGwmwk,4583 |
|||
unidecode/x055.py,sha256=WzgwsrHInE1H-O519FOIybJpofzdyfu7w5NZ5I2OtQI,4599 |
|||
unidecode/x056.py,sha256=t4ZVJlxic1vcqhrypLWRd3LyIfEuWoPIz343pCrfW7k,4615 |
|||
unidecode/x057.py,sha256=ndJuRj4TnvSe6aLX-yzDYHnWEl1JfqA6HnQvzsf2Fyo,4631 |
|||
unidecode/x058.py,sha256=nkaS7T1PVlhKlxVd-WrDw4Gx14mciLEZQrUt-9NpkD0,4678 |
|||
unidecode/x059.py,sha256=9wAKGpczWuyqMb89px7Ldy1McHecDXd8RMJ7lXwcBCU,4644 |
|||
unidecode/x05a.py,sha256=F150z3X248dkDgTq-0lyL-bLRqZZd7U0mkUI6PJRwwM,4636 |
|||
unidecode/x05b.py,sha256=LeJj8prX04qvLHFaeG-b2YE9LqIbnUec6pFD-7E918c,4668 |
|||
unidecode/x05c.py,sha256=Citt0KhdqvWkErFdpeSyg6x5CviH1opVRPSD6eBWjsA,4612 |
|||
unidecode/x05d.py,sha256=w1vKjN5RWPiwP535FCiqakz1IbeB4MGe2ANVM_bcdq4,4670 |
|||
unidecode/x05e.py,sha256=6Z7gnAXq9tVwvFIwh632oLQuEiHz1atcqIDREeoqldM,4668 |
|||
unidecode/x05f.py,sha256=Ho5tdX7JErho7LjeVCxf29XlWeEpDt5RUJC3nbw2j8M,4660 |
|||
unidecode/x060.py,sha256=2x6hmUwn_V3icd1kdfzkkDp5iEdmij7zpUWizfVIE7Q,4642 |
|||
unidecode/x061.py,sha256=hwSoPcP4PLy5zPITLdSVaYGwt_fIH9kJPpshKJZi-LA,4662 |
|||
unidecode/x062.py,sha256=rH9eYXX_t-Z4-pOy9-lyVm68zXt114X3lAIBI5JG_Qs,4620 |
|||
unidecode/x063.py,sha256=n8aXYOPurrEbBzz4DAl-tFOFiqMJ-r1Yt3WpM3ZGTq0,4656 |
|||
unidecode/x064.py,sha256=uBebjkUmgQVzK0tKWjxLZwQ1oC9KMEppv0W6caB8v1g,4655 |
|||
unidecode/x065.py,sha256=cFnHSLoNwMG6PJvxWWeWShSkHoB9IYTS2LJCc8W0l4I,4638 |
|||
unidecode/x066.py,sha256=gV2vx0TqIA44PBOzF02wetf3dxXcXmg8Jr2CtzxMDFU,4677 |
|||
unidecode/x067.py,sha256=9ck2UFSv8UL3c0RHPTdV4Rzq7ogZVedwsMAYhGE1lmM,4635 |
|||
unidecode/x068.py,sha256=aTAAeHLr5-VnMqNF0h9KC4tFOusV9PpWdywp7xllAA0,4674 |
|||
unidecode/x069.py,sha256=8_VMN2vGqNAPrP8iPxICRI9PN81Hts21FM1A4n1_7to,4673 |
|||
unidecode/x06a.py,sha256=e7ahJ-j5YvomZvQcIxfAMbHgijbKncYoTN9TakDQqig,4674 |
|||
unidecode/x06b.py,sha256=lBRWVhTMJPBKWAyAT23PueHtw9wXTuUG9S2UVWjosr4,4608 |
|||
unidecode/x06c.py,sha256=i8xXjlNwhXxvrHdnTbdy-jTfml_fD0uFURctA1BQKk0,4643 |
|||
unidecode/x06d.py,sha256=BvgJd7TNj6cL6I5bjPXngi3tJPo0YfhISCHSXvfmsTk,4651 |
|||
unidecode/x06e.py,sha256=jZ6VeQbASYGtx0QXySzZzRQf_LqtPAU6jhTo3U_nFTU,4640 |
|||
unidecode/x06f.py,sha256=W0A95toB7w7pLrohCaet_d0-S3V84fjzTKgZ6vhUtok,4650 |
|||
unidecode/x070.py,sha256=lVM1qXUltqIrKIi0WPH1F5Feuq4M007nm3lOkR_EB2s,4693 |
|||
unidecode/x071.py,sha256=v2V3WNKPVEhuJ_RX6rZA45rFIukgMCJ8rqPoUwj05zc,4670 |
|||
unidecode/x072.py,sha256=NhOkJEqApO9shkYgwdWVarVUDmWailI4N1vNiLGkOSM,4659 |
|||
unidecode/x073.py,sha256=loYg-ZrK1rdy2CkbQfd4qydW8lCeiNywEzT6gLTN-GI,4646 |
|||
unidecode/x074.py,sha256=FLIumUZcrCy9Y6eXL5BLpa_hE5HMGbPo-PWtFBh-rBs,4696 |
|||
unidecode/x075.py,sha256=P3SrhI5BQ5sJ66hyu_LWDONpuzLZJBKsl7f-A37sJXc,4675 |
|||
unidecode/x076.py,sha256=3enaJAMy951MK_yBnhJiOmoTdzU0eJ2uEgoRgZRTUn0,4639 |
|||
unidecode/x077.py,sha256=XH_TjHspGSnu4v3qgNOqFNMvZKZcA-HH6q_GWB48Cos,4675 |
|||
unidecode/x078.py,sha256=L9XOo8UH_x-prQC_edArnTs-j2asZR940sLaPST2iy0,4648 |
|||
unidecode/x079.py,sha256=6e29mgaXPmtMrU8_QRfmZpWZW8o-yEeeIOgAHOoepo8,4602 |
|||
unidecode/x07a.py,sha256=fMACYuAsIumgE8XkYnM2795HtFA6weH4YLn7jgJLbbw,4669 |
|||
unidecode/x07b.py,sha256=UH8ZXsR11pINz0AaxJ8etTTyaXiCawjuLcctzp4FwZc,4669 |
|||
unidecode/x07c.py,sha256=fpqGGsF0-rEVxBeVFf0RM8fjweUlg-9UduAtxAjL5vc,4663 |
|||
unidecode/x07d.py,sha256=EKFrTQTNFLGnsm3qI76ALxrxGCcDuyEbapi9j9jy1B4,4678 |
|||
unidecode/x07e.py,sha256=n2OG5xe8I-V0pn98Q2E-7PbXSQQI72ozNNUXFnMZHvM,4682 |
|||
unidecode/x07f.py,sha256=g455qjG3LBu9ujuuTt5xrRn2djK_iVXAJ4dUVl-bYfs,4664 |
|||
unidecode/x080.py,sha256=Fuqy0RgnvfvFFdmGiaHwK2B60UCU5Aw4fyF79kBfhr8,4651 |
|||
unidecode/x081.py,sha256=rQg3Hjqo61bEKCpb7TybHDLv2Hgu-_ghKdW6xk9xOhU,4673 |
|||
unidecode/x082.py,sha256=sRjOiGrYy2RtqqH_xQdL6_i17I-wJZI6ag7404mL4M8,4649 |
|||
unidecode/x083.py,sha256=8hCxGV2o1kFA6hMFvk4Ici_QKynDCYjDWjzCuMyfmHI,4643 |
|||
unidecode/x084.py,sha256=jIDgDPhwssUcLgA7N0ZINrB_qZn1P4C7lHyvP7yKA6o,4646 |
|||
unidecode/x085.py,sha256=5063XP5F72OEYuqjETqFlN_7IaU1A0feVuvIup9R0rI,4636 |
|||
unidecode/x086.py,sha256=ovNLdMRRHm4jngDGXmwG66zZH6l-V-uMtoYnXB_W_QY,4614 |
|||
unidecode/x087.py,sha256=-VmLJWGVMGF9BxYD8VcTc8TS83W27qcERuycKCfpLBc,4649 |
|||
unidecode/x088.py,sha256=E63aAVUF0B1f-5XL7fOUWqXL2juUJLU9TwO_LHKvd2Q,4645 |
|||
unidecode/x089.py,sha256=mrKWneiJ2hIFkM4cu4bU0IQMvTRWgXZ8rsDW575jp9A,4628 |
|||
unidecode/x08a.py,sha256=NjMp9ck824PXG2gcJXfi_9oQCFgXhhiallO3bYCtXCE,4647 |
|||
unidecode/x08b.py,sha256=W1kAtliqhm5x28Kxc6kUrjzqo-xc_HmYY0BjHhEV2x4,4643 |
|||
unidecode/x08c.py,sha256=aDhwugSrvtUhDdwbACfjS0EkBqGojwny-qbrQRJfPhA,4630 |
|||
unidecode/x08d.py,sha256=oyydBTJng0ip79lUTBHoTIqGjxmHTb0twkPZqE7LxeU,4636 |
|||
unidecode/x08e.py,sha256=w-FysLX-LgmggEuhmPZjyT67-i4_EB8Hx44i_X_Q3Nc,4659 |
|||
unidecode/x08f.py,sha256=adygkkCQn4W6YhJUknf2O-2eM_LzH1LfjjpgenbPh80,4651 |
|||
unidecode/x090.py,sha256=j-5qrCDDHYKJnbHL5A_fm5ISrdFVgDR5bXQbP18G-14,4631 |
|||
unidecode/x091.py,sha256=S8jlVjjPNLPCsSXK8qKXqGGoTLj-LWje5J-f-2AAEXY,4655 |
|||
unidecode/x092.py,sha256=uSF8NVYh_UGJE2pcl4JrVU2Prb-T2crGLCE4XQe7DfQ,4648 |
|||
unidecode/x093.py,sha256=oMiZM1VfvfKnwVKSJh28iynWJG8iQtKu_1zsrbPdPNs,4666 |
|||
unidecode/x094.py,sha256=MShhNv4E9bj9jmQEtWHi_8ZjeS4p2Iz6j3j9kJb5rK0,4661 |
|||
unidecode/x095.py,sha256=BQ1R6QwhWjC_Eb7zIbWP0A2ro7bI-t6fTAQWLFMmzAM,4671 |
|||
unidecode/x096.py,sha256=N9hLQrZhbTXC9boxDcWu3WESTIB6En82kJkBY-6qBRI,4610 |
|||
unidecode/x097.py,sha256=K4waHuw6tNchmcY7Glc-Su6cTG3-iF_X_egYuG-E4fA,4643 |
|||
unidecode/x098.py,sha256=CFFcb5gpK7FBqPsFwRoLP0YcYFJBGgh3l-Rf4PzXbjc,4645 |
|||
unidecode/x099.py,sha256=e9w1-tsa3tCYYQXn71Ey1bg_n2UYudMQ0y-zSSCdajE,4629 |
|||
unidecode/x09a.py,sha256=Z8pQsTc62CWgm0JPnj3kokKKf9_qfzRpo0u5iH61CaE,4623 |
|||
unidecode/x09b.py,sha256=piSZ2AAK5GavHJEa8qwI_lrldSSgNhxYvLua0Au_1aA,4655 |
|||
unidecode/x09c.py,sha256=NveMhN85_Cm4H1cnfHDTcnSj675MOVBq9Lkjpw3YxA0,4659 |
|||
unidecode/x09d.py,sha256=2Sj376QIs8rJ7VDrPW5RELhkJ8LI5JI4NRbFcl4DXlE,4632 |
|||
unidecode/x09e.py,sha256=z1bF6AML_d20dQm9HD7YBrnKqTQVjeTTI999hcLEe0M,4615 |
|||
unidecode/x09f.py,sha256=T-pS5hli39rA1GDDqZYfyHRupPALqklPXA-1i8pgc1I,4509 |
|||
unidecode/x0a0.py,sha256=EpopPuuocybgCcpX19Ii-udqsPXJjSces3360lqJ8vs,4428 |
|||
unidecode/x0a1.py,sha256=0hvF77d5E640SujjdHVqy5gMUH85gEdOv80eRvCEAGM,4469 |
|||
unidecode/x0a2.py,sha256=9Icpfk_ElebYd_xN09OMziFrpAGPXEUNVmawpnhbBaQ,4503 |
|||
unidecode/x0a3.py,sha256=G1lPrnCqYz0s4wsSa1qM0WgrZBWO_beRk3AgK0iVZLA,4521 |
|||
unidecode/x0a4.py,sha256=vS-wPpkfMmwRJjXTBYM4BGpzBfDoKWMadNNWaTPYcpI,4437 |
|||
unidecode/x0ac.py,sha256=wj7hl88VlCdc_eGpOL4m4CBJILyQqd9atObC5Xvd0aA,4709 |
|||
unidecode/x0ad.py,sha256=Rz5rn0fM-CqRjaN4TvSq_1StAQdyAF2WX3cUvcQHaWU,4766 |
|||
unidecode/x0ae.py,sha256=jNIBVB-Pw2ZNihAeyWbDIEq9Yt9zlhdfGylfvAaxUks,4875 |
|||
unidecode/x0af.py,sha256=Am5YC8Zfrun5NUKxU6LrU2-d5GgkGSBs7fZt2rqSi74,5012 |
|||
unidecode/x0b0.py,sha256=1bgHerCDAqIcJHYeGddJjJfRWiHCKtU2B0J-XGvcbbc,4853 |
|||
unidecode/x0b1.py,sha256=Six-lzGdvgJx4YsIa0lTusnBEV1zbCKQCquq17TDJoQ,4746 |
|||
unidecode/x0b2.py,sha256=HQDbmglNi4QfiRSGucUclgq_4FGpRjbJkWU1JTLAFGc,4680 |
|||
unidecode/x0b3.py,sha256=1lqxghVZiiStOAx1IG_vc1zZTXrAa7Z__QY6ZWvo2aA,4741 |
|||
unidecode/x0b4.py,sha256=V6BNSTxpyP8VuqF7x5z7bpF3MQAkwZfKtEu6NFr_vSg,4762 |
|||
unidecode/x0b5.py,sha256=9NVd2hNLyRlLceVlznba1dreqBGeKU_0gzmkgAw0gyg,4919 |
|||
unidecode/x0b6.py,sha256=V_vRsB0GICu9hqhO4pnbPWreDSevJ3bbmLRJkuQUxnE,4996 |
|||
unidecode/x0b7.py,sha256=CwBaCBICyVagnFjUpkwabuDvBJw7gAeqkSRpfBAVv8s,4833 |
|||
unidecode/x0b8.py,sha256=xYp-xy2LIwq95OWyS9vYMc_Z5od9dud0W1dxeg4P_Jk,4714 |
|||
unidecode/x0b9.py,sha256=z3hKNzBq_MeK9V3AyQzaY58cgi0-VGOsLk3-UFmszLQ,4704 |
|||
unidecode/x0ba.py,sha256=4gubifoBeJUUrwXEI4litJygekufEycmWDLrJ-Qvs14,4765 |
|||
unidecode/x0bb.py,sha256=bsCTABUdC6yTn8_0vhYe5jRP1z_BoAdificB8Y1c1hA,4730 |
|||
unidecode/x0bc.py,sha256=AhQvAz7yHlbQ_4c2KOIisq07eZJ5JQn6cV8I31oT9kg,4707 |
|||
unidecode/x0bd.py,sha256=IGtyVxIUr1mU3hokn6iUDJhXZezQozVvfWOyf4Pa5dI,4752 |
|||
unidecode/x0be.py,sha256=1D-hXu3p3wvOnGVMjEqVsrltYe7UuSwit2yqN5eFizc,4849 |
|||
unidecode/x0bf.py,sha256=NkEXqr2ER3BNFkTasDV9CHnkRBuX_Ao5OHGv_NgKAew,5010 |
|||
unidecode/x0c0.py,sha256=zDlHpyM0omza5TqGLb8Rhl7Wd-LlV1AjvH_xdnEnNFw,4856 |
|||
unidecode/x0c1.py,sha256=AC6xJyx9UblKAGNqGN7AH2Idb3_3vbc-I5U0Myig5fA,4765 |
|||
unidecode/x0c2.py,sha256=siRYLA8Cv9Z8XsRp3WQOBdRrPkjJOuEh8z1-3SMXOzQ,4710 |
|||
unidecode/x0c3.py,sha256=hlAFe6lsz0aLMixlpeFjV4I-WTIiA3B2BU58yGlTwRg,4975 |
|||
unidecode/x0c4.py,sha256=z3xZwSkf5ru1FCdBMHOr5fyglzVdyPhQVtWjq9xInsQ,5024 |
|||
unidecode/x0c5.py,sha256=F-DR0eVMRkemOnNXOtDjI5i6gW9136XLmWM_yMVvc84,4581 |
|||
unidecode/x0c6.py,sha256=7p_jMrHf3WUa_zANms-RGVN1bAeshgWLkC16_VcSawA,4490 |
|||
unidecode/x0c7.py,sha256=5eOAq4jFsPZ-zKO7lHzAGj_EvXdaMC4Kud7gvE-B7Tg,4564 |
|||
unidecode/x0c8.py,sha256=wltKvhBgn51jULzwUnEbmyDuK9JvQpQee0uTKK42-20,4733 |
|||
unidecode/x0c9.py,sha256=GoARON07wCoHN2wRHb5fvzqE9L3Yme2hKeciynUIAIk,4722 |
|||
unidecode/x0ca.py,sha256=BsBZTNj3npIkdo3L9pSEX7XvDT68KV7wFtOOwyEb2So,5007 |
|||
unidecode/x0cb.py,sha256=8T7vnJMRmYGyySYthMWz0bgN-MremktGImjejodFeMo,5012 |
|||
unidecode/x0cc.py,sha256=GKoHN-4vL4Y3EL42G0xbN74Tgspew1oMvxQtsIa3ess,4749 |
|||
unidecode/x0cd.py,sha256=7sZ05OjugbaombMRDYOVxgstZbXMcuX5kHFheKv4W2E,4738 |
|||
unidecode/x0ce.py,sha256=mOEHFrsAwIvcTnh7OKVK5qbuXUXHfJOR7D4FtXsQmao,4708 |
|||
unidecode/x0cf.py,sha256=H9PeYcbOG68F_yc7zsELUuN05ANfFNOUX-e3-gzx7Ow,4713 |
|||
unidecode/x0d0.py,sha256=eULqcGHPmaoEdl0EwRB5wWSu8M43bp4HoFo5gGljacg,4706 |
|||
unidecode/x0d1.py,sha256=BClLDAjPgsAX6MJCsuHfmfuhH9qfzUy_vb-d9zBs3Oc,4767 |
|||
unidecode/x0d2.py,sha256=e74nqGo4E4sF1sy8qBFu2ecWoRfJdoXI1xRFRPqYEz8,4724 |
|||
unidecode/x0d3.py,sha256=8-UmvJ3-ILXo9d3GA-ReOE4OfUenL3tVUJYldZ9gHu0,4705 |
|||
unidecode/x0d4.py,sha256=fwUmzksoddTKB8fH2rZMxRK3pJtLrxhcrYpHfBauAwE,4758 |
|||
unidecode/x0d5.py,sha256=rANSL5ndzLgSgYJQNEw57AfXpicRe7pvHRlKTPb4-QQ,4680 |
|||
unidecode/x0d6.py,sha256=fT8_cRzp7y60IIhn87kM9lLehKGAg5wYmfFOwgGp6e0,4765 |
|||
unidecode/x0d7.py,sha256=0zY-KFUnKk-CuYpb1zSYj3QdS6UsfZ_lsemOuRSeDwM,4559 |
|||
unidecode/x0f9.py,sha256=2PD0_fpDnaFO9ftICjYSOhnjAfBppjsj1TcLIuYjnCI,4567 |
|||
unidecode/x0fa.py,sha256=6X94S2GbR6XOwkzx2SYynZzBMHAbRHC9GvW_vXaTDRU,4406 |
|||
unidecode/x0fb.py,sha256=qaAP_vF3_-M--wKkyb0DfBjIdnGKuk4GQLxV7fp2-_4,3838 |
|||
unidecode/x0fc.py,sha256=KcyQnyv7gxNeVcAnRwQrm4NlabZE3CrnmtLqXj_7te8,3595 |
|||
unidecode/x0fd.py,sha256=fq1BGexi73J3QPUwnL4_LZT4uh8mxYqAgMNtofbfVKE,3764 |
|||
unidecode/x0fe.py,sha256=mpt-K-jqk36iouLz5HOcthOQJczqsca9aYkEGhJ6Wk4,3825 |
|||
unidecode/x0ff.py,sha256=KGE3aIdJCR-3kAVaXOyuY44M-KfCA9UQt4B9AlEJiq0,3983 |
|||
unidecode/x1d4.py,sha256=ZS_7TAX87oGtT7b8tIlWcmeHChVINZ4W9jl9wA6JfmU,3839 |
|||
unidecode/x1d5.py,sha256=Cuh3bUzoyp8c8lJ7Y_gLmAKQ03XHMCsgTZf3uE2-G2o,3839 |
|||
unidecode/x1d6.py,sha256=6fIRGTFODh3kysq10Xr_8EmG6HZuWztLjr4vitkk8OQ,3974 |
|||
unidecode/x1d7.py,sha256=jIs9oZBMbSh5OQvPiyUI4aAdji9EbzeOXigTq4Oq_kY,3645 |
|||
unidecode/x1f1.py,sha256=CcmetFXD5Xxt9ZY0xKAjQbe16Wlq-YccWvJ_eqdzeTc,3937 |
@ -0,0 +1,6 @@ |
|||
Wheel-Version: 1.0 |
|||
Generator: bdist_wheel (0.29.0) |
|||
Root-Is-Purelib: true |
|||
Tag: py2-none-any |
|||
Tag: py3-none-any |
|||
|
@ -0,0 +1,3 @@ |
|||
[console_scripts] |
|||
unidecode = unidecode.util:main |
|||
|
@ -0,0 +1 @@ |
|||
{"classifiers": ["License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Text Processing", "Topic :: Text Processing :: Filters"], "extensions": {"python.commands": {"wrap_console": {"unidecode": "unidecode.util:main"}}, "python.details": {"contacts": [{"email": "tomaz.solc@tablix.org", "name": "Tomaz Solc", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}}, "python.exports": {"console_scripts": {"unidecode": "unidecode.util:main"}}}, "generator": "bdist_wheel (0.29.0)", "license": "GPL", "metadata_version": "2.0", "name": "Unidecode", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "ASCII transliterations of Unicode text", "version": "1.1.1"} |
@ -0,0 +1 @@ |
|||
unidecode |
@ -0,0 +1,101 @@ |
|||
Metadata-Version: 1.1 |
|||
Name: blinker |
|||
Version: 1.4 |
|||
Summary: Fast, simple object-to-object and broadcast signaling |
|||
Home-page: http://pythonhosted.org/blinker/ |
|||
Author: Jason Kirtland |
|||
Author-email: jek@discorporate.us |
|||
License: MIT License |
|||
Description: [![Build Status](https://travis-ci.org/jek/blinker.svg?branch=master)](https://travis-ci.org/jek/blinker) |
|||
|
|||
|
|||
# Blinker |
|||
|
|||
Blinker provides a fast dispatching system that allows any number of |
|||
interested parties to subscribe to events, or "signals". |
|||
|
|||
Signal receivers can subscribe to specific senders or receive signals |
|||
sent by any sender. |
|||
|
|||
>>> from blinker import signal |
|||
>>> started = signal('round-started') |
|||
>>> def each(round): |
|||
... print "Round %s!" % round |
|||
... |
|||
>>> started.connect(each) |
|||
|
|||
>>> def round_two(round): |
|||
... print "This is round two." |
|||
... |
|||
>>> started.connect(round_two, sender=2) |
|||
|
|||
>>> for round in range(1, 4): |
|||
... started.send(round) |
|||
... |
|||
Round 1! |
|||
Round 2! |
|||
This is round two. |
|||
Round 3! |
|||
|
|||
See the [Blinker documentation](https://pythonhosted.org/blinker/) for more information. |
|||
|
|||
## Requirements |
|||
|
|||
Blinker requires Python 2.4 or higher, Python 3.0 or higher, or Jython 2.5 or higher. |
|||
|
|||
## Changelog Summary |
|||
|
|||
1.3 (July 3, 2013) |
|||
|
|||
- The global signal stash behind blinker.signal() is now backed by a |
|||
regular name-to-Signal dictionary. Previously, weak references were |
|||
held in the mapping and ephemeral usage in code like |
|||
``signal('foo').connect(...)`` could have surprising program behavior |
|||
depending on import order of modules. |
|||
- blinker.Namespace is now built on a regular dict. Use |
|||
blinker.WeakNamespace for the older, weak-referencing behavior. |
|||
- Signal.connect('text-sender') uses an alternate hashing strategy to |
|||
avoid sharp edges in text identity. |
|||
|
|||
1.2 (October 26, 2011) |
|||
|
|||
- Added Signal.receiver_connected and Signal.receiver_disconnected |
|||
per-Signal signals. |
|||
- Deprecated the global 'receiver_connected' signal. |
|||
- Verified Python 3.2 support (no changes needed!) |
|||
|
|||
1.1 (July 21, 2010) |
|||
|
|||
- Added ``@signal.connect_via(sender)`` decorator |
|||
- Added ``signal.connected_to`` shorthand name for the |
|||
``temporarily_connected_to`` context manager. |
|||
|
|||
1.0 (March 28, 2010) |
|||
|
|||
- Python 3.x compatibility |
|||
|
|||
0.9 (February 26, 2010) |
|||
|
|||
- Sphinx docs, project website |
|||
- Added ``with a_signal.temporarily_connected_to(receiver): ...`` support |
|||
|
|||
Keywords: signal emit events broadcast |
|||
Platform: UNKNOWN |
|||
Classifier: Development Status :: 5 - Production/Stable |
|||
Classifier: Intended Audience :: Developers |
|||
Classifier: License :: OSI Approved :: MIT License |
|||
Classifier: Operating System :: OS Independent |
|||
Classifier: Programming Language :: Python |
|||
Classifier: Programming Language :: Python :: 2 |
|||
Classifier: Programming Language :: Python :: 2.4 |
|||
Classifier: Programming Language :: Python :: 2.5 |
|||
Classifier: Programming Language :: Python :: 2.6 |
|||
Classifier: Programming Language :: Python :: 2.7 |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.0 |
|||
Classifier: Programming Language :: Python :: 3.1 |
|||
Classifier: Programming Language :: Python :: 3.2 |
|||
Classifier: Programming Language :: Python :: 3.3 |
|||
Classifier: Programming Language :: Python :: 3.4 |
|||
Classifier: Topic :: Software Development :: Libraries |
|||
Classifier: Topic :: Utilities |
@ -0,0 +1,49 @@ |
|||
AUTHORS |
|||
CHANGES |
|||
LICENSE |
|||
MANIFEST.in |
|||
README.md |
|||
setup.cfg |
|||
setup.py |
|||
blinker/__init__.py |
|||
blinker/_saferef.py |
|||
blinker/_utilities.py |
|||
blinker/base.py |
|||
blinker.egg-info/PKG-INFO |
|||
blinker.egg-info/SOURCES.txt |
|||
blinker.egg-info/dependency_links.txt |
|||
blinker.egg-info/top_level.txt |
|||
docs/html/genindex.html |
|||
docs/html/index.html |
|||
docs/html/objects.inv |
|||
docs/html/search.html |
|||
docs/html/searchindex.js |
|||
docs/html/_sources/index.txt |
|||
docs/html/_static/basic.css |
|||
docs/html/_static/blinker-named.png |
|||
docs/html/_static/blinker64.png |
|||
docs/html/_static/comment-bright.png |
|||
docs/html/_static/comment-close.png |
|||
docs/html/_static/comment.png |
|||
docs/html/_static/doctools.js |
|||
docs/html/_static/down-pressed.png |
|||
docs/html/_static/down.png |
|||
docs/html/_static/file.png |
|||
docs/html/_static/flasky.css |
|||
docs/html/_static/jquery.js |
|||
docs/html/_static/minus.png |
|||
docs/html/_static/plus.png |
|||
docs/html/_static/pygments.css |
|||
docs/html/_static/searchtools.js |
|||
docs/html/_static/underscore.js |
|||
docs/html/_static/up-pressed.png |
|||
docs/html/_static/up.png |
|||
docs/html/_static/websupport.js |
|||
docs/source/conf.py |
|||
docs/source/index.rst |
|||
docs/source/_themes/flask_theme_support.py |
|||
docs/text/index.txt |
|||
tests/test_context.py |
|||
tests/test_saferef.py |
|||
tests/test_signals.py |
|||
tests/test_utilities.py |
@ -0,0 +1 @@ |
|||
|
@ -0,0 +1,12 @@ |
|||
../blinker/__init__.py |
|||
../blinker/__pycache__/__init__.cpython-37.pyc |
|||
../blinker/__pycache__/_saferef.cpython-37.pyc |
|||
../blinker/__pycache__/_utilities.cpython-37.pyc |
|||
../blinker/__pycache__/base.cpython-37.pyc |
|||
../blinker/_saferef.py |
|||
../blinker/_utilities.py |
|||
../blinker/base.py |
|||
PKG-INFO |
|||
SOURCES.txt |
|||
dependency_links.txt |
|||
top_level.txt |
@ -0,0 +1 @@ |
|||
blinker |
@ -0,0 +1,22 @@ |
|||
from blinker.base import ( |
|||
ANY, |
|||
NamedSignal, |
|||
Namespace, |
|||
Signal, |
|||
WeakNamespace, |
|||
receiver_connected, |
|||
signal, |
|||
) |
|||
|
|||
__all__ = [ |
|||
'ANY', |
|||
'NamedSignal', |
|||
'Namespace', |
|||
'Signal', |
|||
'WeakNamespace', |
|||
'receiver_connected', |
|||
'signal', |
|||
] |
|||
|
|||
|
|||
__version__ = '1.4' |
@ -0,0 +1,234 @@ |
|||
# extracted from Louie, http://pylouie.org/ |
|||
# updated for Python 3 |
|||
# |
|||
# Copyright (c) 2006 Patrick K. O'Brien, Mike C. Fletcher, |
|||
# Matthew R. Scott |
|||
# |
|||
# Redistribution and use in source and binary forms, with or without |
|||
# modification, are permitted provided that the following conditions are |
|||
# met: |
|||
# |
|||
# * Redistributions of source code must retain the above copyright |
|||
# notice, this list of conditions and the following disclaimer. |
|||
# |
|||
# * Redistributions in binary form must reproduce the above |
|||
# copyright notice, this list of conditions and the following |
|||
# disclaimer in the documentation and/or other materials provided |
|||
# with the distribution. |
|||
# |
|||
# * Neither the name of the <ORGANIZATION> nor the names of its |
|||
# contributors may be used to endorse or promote products derived |
|||
# from this software without specific prior written permission. |
|||
# |
|||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
# |
|||
"""Refactored 'safe reference from dispatcher.py""" |
|||
|
|||
import operator |
|||
import sys |
|||
import traceback |
|||
import weakref |
|||
|
|||
|
|||
try: |
|||
callable |
|||
except NameError: |
|||
def callable(object): |
|||
return hasattr(object, '__call__') |
|||
|
|||
|
|||
if sys.version_info < (3,): |
|||
get_self = operator.attrgetter('im_self') |
|||
get_func = operator.attrgetter('im_func') |
|||
else: |
|||
get_self = operator.attrgetter('__self__') |
|||
get_func = operator.attrgetter('__func__') |
|||
|
|||
|
|||
def safe_ref(target, on_delete=None): |
|||
"""Return a *safe* weak reference to a callable target. |
|||
|
|||
- ``target``: The object to be weakly referenced, if it's a bound |
|||
method reference, will create a BoundMethodWeakref, otherwise |
|||
creates a simple weakref. |
|||
|
|||
- ``on_delete``: If provided, will have a hard reference stored to |
|||
the callable to be called after the safe reference goes out of |
|||
scope with the reference object, (either a weakref or a |
|||
BoundMethodWeakref) as argument. |
|||
""" |
|||
try: |
|||
im_self = get_self(target) |
|||
except AttributeError: |
|||
if callable(on_delete): |
|||
return weakref.ref(target, on_delete) |
|||
else: |
|||
return weakref.ref(target) |
|||
else: |
|||
if im_self is not None: |
|||
# Turn a bound method into a BoundMethodWeakref instance. |
|||
# Keep track of these instances for lookup by disconnect(). |
|||
assert hasattr(target, 'im_func') or hasattr(target, '__func__'), ( |
|||
"safe_ref target %r has im_self, but no im_func, " |
|||
"don't know how to create reference" % target) |
|||
reference = BoundMethodWeakref(target=target, on_delete=on_delete) |
|||
return reference |
|||
|
|||
|
|||
class BoundMethodWeakref(object): |
|||
"""'Safe' and reusable weak references to instance methods. |
|||
|
|||
BoundMethodWeakref objects provide a mechanism for referencing a |
|||
bound method without requiring that the method object itself |
|||
(which is normally a transient object) is kept alive. Instead, |
|||
the BoundMethodWeakref object keeps weak references to both the |
|||
object and the function which together define the instance method. |
|||
|
|||
Attributes: |
|||
|
|||
- ``key``: The identity key for the reference, calculated by the |
|||
class's calculate_key method applied to the target instance method. |
|||
|
|||
- ``deletion_methods``: Sequence of callable objects taking single |
|||
argument, a reference to this object which will be called when |
|||
*either* the target object or target function is garbage |
|||
collected (i.e. when this object becomes invalid). These are |
|||
specified as the on_delete parameters of safe_ref calls. |
|||
|
|||
- ``weak_self``: Weak reference to the target object. |
|||
|
|||
- ``weak_func``: Weak reference to the target function. |
|||
|
|||
Class Attributes: |
|||
|
|||
- ``_all_instances``: Class attribute pointing to all live |
|||
BoundMethodWeakref objects indexed by the class's |
|||
calculate_key(target) method applied to the target objects. |
|||
This weak value dictionary is used to short-circuit creation so |
|||
that multiple references to the same (object, function) pair |
|||
produce the same BoundMethodWeakref instance. |
|||
""" |
|||
|
|||
_all_instances = weakref.WeakValueDictionary() |
|||
|
|||
def __new__(cls, target, on_delete=None, *arguments, **named): |
|||
"""Create new instance or return current instance. |
|||
|
|||
Basically this method of construction allows us to |
|||
short-circuit creation of references to already- referenced |
|||
instance methods. The key corresponding to the target is |
|||
calculated, and if there is already an existing reference, |
|||
that is returned, with its deletion_methods attribute updated. |
|||
Otherwise the new instance is created and registered in the |
|||
table of already-referenced methods. |
|||
""" |
|||
key = cls.calculate_key(target) |
|||
current = cls._all_instances.get(key) |
|||
if current is not None: |
|||
current.deletion_methods.append(on_delete) |
|||
return current |
|||
else: |
|||
base = super(BoundMethodWeakref, cls).__new__(cls) |
|||
cls._all_instances[key] = base |
|||
base.__init__(target, on_delete, *arguments, **named) |
|||
return base |
|||
|
|||
def __init__(self, target, on_delete=None): |
|||
"""Return a weak-reference-like instance for a bound method. |
|||
|
|||
- ``target``: The instance-method target for the weak reference, |
|||
must have im_self and im_func attributes and be |
|||
reconstructable via the following, which is true of built-in |
|||
instance methods:: |
|||
|
|||
target.im_func.__get__( target.im_self ) |
|||
|
|||
- ``on_delete``: Optional callback which will be called when |
|||
this weak reference ceases to be valid (i.e. either the |
|||
object or the function is garbage collected). Should take a |
|||
single argument, which will be passed a pointer to this |
|||
object. |
|||
""" |
|||
def remove(weak, self=self): |
|||
"""Set self.isDead to True when method or instance is destroyed.""" |
|||
methods = self.deletion_methods[:] |
|||
del self.deletion_methods[:] |
|||
try: |
|||
del self.__class__._all_instances[self.key] |
|||
except KeyError: |
|||
pass |
|||
for function in methods: |
|||
try: |
|||
if callable(function): |
|||
function(self) |
|||
except Exception: |
|||
try: |
|||
traceback.print_exc() |
|||
except AttributeError: |
|||
e = sys.exc_info()[1] |
|||
print ('Exception during saferef %s ' |
|||
'cleanup function %s: %s' % (self, function, e)) |
|||
self.deletion_methods = [on_delete] |
|||
self.key = self.calculate_key(target) |
|||
im_self = get_self(target) |
|||
im_func = get_func(target) |
|||
self.weak_self = weakref.ref(im_self, remove) |
|||
self.weak_func = weakref.ref(im_func, remove) |
|||
self.self_name = str(im_self) |
|||
self.func_name = str(im_func.__name__) |
|||
|
|||
def calculate_key(cls, target): |
|||
"""Calculate the reference key for this reference. |
|||
|
|||
Currently this is a two-tuple of the id()'s of the target |
|||
object and the target function respectively. |
|||
""" |
|||
return (id(get_self(target)), id(get_func(target))) |
|||
calculate_key = classmethod(calculate_key) |
|||
|
|||
def __str__(self): |
|||
"""Give a friendly representation of the object.""" |
|||
return "%s(%s.%s)" % ( |
|||
self.__class__.__name__, |
|||
self.self_name, |
|||
self.func_name, |
|||
) |
|||
|
|||
__repr__ = __str__ |
|||
|
|||
def __nonzero__(self): |
|||
"""Whether we are still a valid reference.""" |
|||
return self() is not None |
|||
|
|||
def __cmp__(self, other): |
|||
"""Compare with another reference.""" |
|||
if not isinstance(other, self.__class__): |
|||
return cmp(self.__class__, type(other)) |
|||
return cmp(self.key, other.key) |
|||
|
|||
def __call__(self): |
|||
"""Return a strong reference to the bound method. |
|||
|
|||
If the target cannot be retrieved, then will return None, |
|||
otherwise returns a bound instance method for our object and |
|||
function. |
|||
|
|||
Note: You may call this method any number of times, as it does |
|||
not invalidate the reference. |
|||
""" |
|||
target = self.weak_self() |
|||
if target is not None: |
|||
function = self.weak_func() |
|||
if function is not None: |
|||
return function.__get__(target) |
|||
return None |
@ -0,0 +1,163 @@ |
|||
from weakref import ref |
|||
|
|||
from blinker._saferef import BoundMethodWeakref |
|||
|
|||
|
|||
try: |
|||
callable |
|||
except NameError: |
|||
def callable(object): |
|||
return hasattr(object, '__call__') |
|||
|
|||
|
|||
try: |
|||
from collections import defaultdict |
|||
except: |
|||
class defaultdict(dict): |
|||
|
|||
def __init__(self, default_factory=None, *a, **kw): |
|||
if (default_factory is not None and |
|||
not hasattr(default_factory, '__call__')): |
|||
raise TypeError('first argument must be callable') |
|||
dict.__init__(self, *a, **kw) |
|||
self.default_factory = default_factory |
|||
|
|||
def __getitem__(self, key): |
|||
try: |
|||
return dict.__getitem__(self, key) |
|||
except KeyError: |
|||
return self.__missing__(key) |
|||
|
|||
def __missing__(self, key): |
|||
if self.default_factory is None: |
|||
raise KeyError(key) |
|||
self[key] = value = self.default_factory() |
|||
return value |
|||
|
|||
def __reduce__(self): |
|||
if self.default_factory is None: |
|||
args = tuple() |
|||
else: |
|||
args = self.default_factory, |
|||
return type(self), args, None, None, self.items() |
|||
|
|||
def copy(self): |
|||
return self.__copy__() |
|||
|
|||
def __copy__(self): |
|||
return type(self)(self.default_factory, self) |
|||
|
|||
def __deepcopy__(self, memo): |
|||
import copy |
|||
return type(self)(self.default_factory, |
|||
copy.deepcopy(self.items())) |
|||
|
|||
def __repr__(self): |
|||
return 'defaultdict(%s, %s)' % (self.default_factory, |
|||
dict.__repr__(self)) |
|||
|
|||
|
|||
try: |
|||
from contextlib import contextmanager |
|||
except ImportError: |
|||
def contextmanager(fn): |
|||
def oops(*args, **kw): |
|||
raise RuntimeError("Python 2.5 or above is required to use " |
|||
"context managers.") |
|||
oops.__name__ = fn.__name__ |
|||
return oops |
|||
|
|||
class _symbol(object): |
|||
|
|||
def __init__(self, name): |
|||
"""Construct a new named symbol.""" |
|||
self.__name__ = self.name = name |
|||
|
|||
def __reduce__(self): |
|||
return symbol, (self.name,) |
|||
|
|||
def __repr__(self): |
|||
return self.name |
|||
_symbol.__name__ = 'symbol' |
|||
|
|||
|
|||
class symbol(object): |
|||
"""A constant symbol. |
|||
|
|||
>>> symbol('foo') is symbol('foo') |
|||
True |
|||
>>> symbol('foo') |
|||
foo |
|||
|
|||
A slight refinement of the MAGICCOOKIE=object() pattern. The primary |
|||
advantage of symbol() is its repr(). They are also singletons. |
|||
|
|||
Repeated calls of symbol('name') will all return the same instance. |
|||
|
|||
""" |
|||
symbols = {} |
|||
|
|||
def __new__(cls, name): |
|||
try: |
|||
return cls.symbols[name] |
|||
except KeyError: |
|||
return cls.symbols.setdefault(name, _symbol(name)) |
|||
|
|||
|
|||
try: |
|||
text = (str, unicode) |
|||
except NameError: |
|||
text = str |
|||
|
|||
|
|||
def hashable_identity(obj): |
|||
if hasattr(obj, '__func__'): |
|||
return (id(obj.__func__), id(obj.__self__)) |
|||
elif hasattr(obj, 'im_func'): |
|||
return (id(obj.im_func), id(obj.im_self)) |
|||
elif isinstance(obj, text): |
|||
return obj |
|||
else: |
|||
return id(obj) |
|||
|
|||
|
|||
WeakTypes = (ref, BoundMethodWeakref) |
|||
|
|||
|
|||
class annotatable_weakref(ref): |
|||
"""A weakref.ref that supports custom instance attributes.""" |
|||
|
|||
|
|||
def reference(object, callback=None, **annotations): |
|||
"""Return an annotated weak ref.""" |
|||
if callable(object): |
|||
weak = callable_reference(object, callback) |
|||
else: |
|||
weak = annotatable_weakref(object, callback) |
|||
for key, value in annotations.items(): |
|||
setattr(weak, key, value) |
|||
return weak |
|||
|
|||
|
|||
def callable_reference(object, callback=None): |
|||
"""Return an annotated weak ref, supporting bound instance methods.""" |
|||
if hasattr(object, 'im_self') and object.im_self is not None: |
|||
return BoundMethodWeakref(target=object, on_delete=callback) |
|||
elif hasattr(object, '__self__') and object.__self__ is not None: |
|||
return BoundMethodWeakref(target=object, on_delete=callback) |
|||
return annotatable_weakref(object, callback) |
|||
|
|||
|
|||
class lazy_property(object): |
|||
"""A @property that is only evaluated once.""" |
|||
|
|||
def __init__(self, deferred): |
|||
self._deferred = deferred |
|||
self.__doc__ = deferred.__doc__ |
|||
|
|||
def __get__(self, obj, cls): |
|||
if obj is None: |
|||
return self |
|||
value = self._deferred(obj) |
|||
setattr(obj, self._deferred.__name__, value) |
|||
return value |
@ -0,0 +1,455 @@ |
|||
# -*- coding: utf-8; fill-column: 76 -*- |
|||
"""Signals and events. |
|||
|
|||
A small implementation of signals, inspired by a snippet of Django signal |
|||
API client code seen in a blog post. Signals are first-class objects and |
|||
each manages its own receivers and message emission. |
|||
|
|||
The :func:`signal` function provides singleton behavior for named signals. |
|||
|
|||
""" |
|||
from warnings import warn |
|||
from weakref import WeakValueDictionary |
|||
|
|||
from blinker._utilities import ( |
|||
WeakTypes, |
|||
contextmanager, |
|||
defaultdict, |
|||
hashable_identity, |
|||
lazy_property, |
|||
reference, |
|||
symbol, |
|||
) |
|||
|
|||
|
|||
ANY = symbol('ANY') |
|||
ANY.__doc__ = 'Token for "any sender".' |
|||
ANY_ID = 0 |
|||
|
|||
|
|||
class Signal(object): |
|||
"""A notification emitter.""" |
|||
|
|||
#: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` |
|||
#: without an additional import. |
|||
ANY = ANY |
|||
|
|||
@lazy_property |
|||
def receiver_connected(self): |
|||
"""Emitted after each :meth:`connect`. |
|||
|
|||
The signal sender is the signal instance, and the :meth:`connect` |
|||
arguments are passed through: *receiver*, *sender*, and *weak*. |
|||
|
|||
.. versionadded:: 1.2 |
|||
|
|||
""" |
|||
return Signal(doc="Emitted after a receiver connects.") |
|||
|
|||
@lazy_property |
|||
def receiver_disconnected(self): |
|||
"""Emitted after :meth:`disconnect`. |
|||
|
|||
The sender is the signal instance, and the :meth:`disconnect` arguments |
|||
are passed through: *receiver* and *sender*. |
|||
|
|||
Note, this signal is emitted **only** when :meth:`disconnect` is |
|||
called explicitly. |
|||
|
|||
The disconnect signal can not be emitted by an automatic disconnect |
|||
(due to a weakly referenced receiver or sender going out of scope), |
|||
as the receiver and/or sender instances are no longer available for |
|||
use at the time this signal would be emitted. |
|||
|
|||
An alternative approach is available by subscribing to |
|||
:attr:`receiver_connected` and setting up a custom weakref cleanup |
|||
callback on weak receivers and senders. |
|||
|
|||
.. versionadded:: 1.2 |
|||
|
|||
""" |
|||
return Signal(doc="Emitted after a receiver disconnects.") |
|||
|
|||
def __init__(self, doc=None): |
|||
""" |
|||
:param doc: optional. If provided, will be assigned to the signal's |
|||
__doc__ attribute. |
|||
|
|||
""" |
|||
if doc: |
|||
self.__doc__ = doc |
|||
#: A mapping of connected receivers. |
|||
#: |
|||
#: The values of this mapping are not meaningful outside of the |
|||
#: internal :class:`Signal` implementation, however the boolean value |
|||
#: of the mapping is useful as an extremely efficient check to see if |
|||
#: any receivers are connected to the signal. |
|||
self.receivers = {} |
|||
self._by_receiver = defaultdict(set) |
|||
self._by_sender = defaultdict(set) |
|||
self._weak_senders = {} |
|||
|
|||
def connect(self, receiver, sender=ANY, weak=True): |
|||
"""Connect *receiver* to signal events sent by *sender*. |
|||
|
|||
:param receiver: A callable. Will be invoked by :meth:`send` with |
|||
`sender=` as a single positional argument and any \*\*kwargs that |
|||
were provided to a call to :meth:`send`. |
|||
|
|||
:param sender: Any object or :obj:`ANY`, defaults to ``ANY``. |
|||
Restricts notifications delivered to *receiver* to only those |
|||
:meth:`send` emissions sent by *sender*. If ``ANY``, the receiver |
|||
will always be notified. A *receiver* may be connected to |
|||
multiple *sender* values on the same Signal through multiple calls |
|||
to :meth:`connect`. |
|||
|
|||
:param weak: If true, the Signal will hold a weakref to *receiver* |
|||
and automatically disconnect when *receiver* goes out of scope or |
|||
is garbage collected. Defaults to True. |
|||
|
|||
""" |
|||
receiver_id = hashable_identity(receiver) |
|||
if weak: |
|||
receiver_ref = reference(receiver, self._cleanup_receiver) |
|||
receiver_ref.receiver_id = receiver_id |
|||
else: |
|||
receiver_ref = receiver |
|||
if sender is ANY: |
|||
sender_id = ANY_ID |
|||
else: |
|||
sender_id = hashable_identity(sender) |
|||
|
|||
self.receivers.setdefault(receiver_id, receiver_ref) |
|||
self._by_sender[sender_id].add(receiver_id) |
|||
self._by_receiver[receiver_id].add(sender_id) |
|||
del receiver_ref |
|||
|
|||
if sender is not ANY and sender_id not in self._weak_senders: |
|||
# wire together a cleanup for weakref-able senders |
|||
try: |
|||
sender_ref = reference(sender, self._cleanup_sender) |
|||
sender_ref.sender_id = sender_id |
|||
except TypeError: |
|||
pass |
|||
else: |
|||
self._weak_senders.setdefault(sender_id, sender_ref) |
|||
del sender_ref |
|||
|
|||
# broadcast this connection. if receivers raise, disconnect. |
|||
if ('receiver_connected' in self.__dict__ and |
|||
self.receiver_connected.receivers): |
|||
try: |
|||
self.receiver_connected.send(self, |
|||
receiver=receiver, |
|||
sender=sender, |
|||
weak=weak) |
|||
except: |
|||
self.disconnect(receiver, sender) |
|||
raise |
|||
if receiver_connected.receivers and self is not receiver_connected: |
|||
try: |
|||
receiver_connected.send(self, |
|||
receiver_arg=receiver, |
|||
sender_arg=sender, |
|||
weak_arg=weak) |
|||
except: |
|||
self.disconnect(receiver, sender) |
|||
raise |
|||
return receiver |
|||
|
|||
def connect_via(self, sender, weak=False): |
|||
"""Connect the decorated function as a receiver for *sender*. |
|||
|
|||
:param sender: Any object or :obj:`ANY`. The decorated function |
|||
will only receive :meth:`send` emissions sent by *sender*. If |
|||
``ANY``, the receiver will always be notified. A function may be |
|||
decorated multiple times with differing *sender* values. |
|||
|
|||
:param weak: If true, the Signal will hold a weakref to the |
|||
decorated function and automatically disconnect when *receiver* |
|||
goes out of scope or is garbage collected. Unlike |
|||
:meth:`connect`, this defaults to False. |
|||
|
|||
The decorated function will be invoked by :meth:`send` with |
|||
`sender=` as a single positional argument and any \*\*kwargs that |
|||
were provided to the call to :meth:`send`. |
|||
|
|||
|
|||
.. versionadded:: 1.1 |
|||
|
|||
""" |
|||
def decorator(fn): |
|||
self.connect(fn, sender, weak) |
|||
return fn |
|||
return decorator |
|||
|
|||
@contextmanager |
|||
def connected_to(self, receiver, sender=ANY): |
|||
"""Execute a block with the signal temporarily connected to *receiver*. |
|||
|
|||
:param receiver: a receiver callable |
|||
:param sender: optional, a sender to filter on |
|||
|
|||
This is a context manager for use in the ``with`` statement. It can |
|||
be useful in unit tests. *receiver* is connected to the signal for |
|||
the duration of the ``with`` block, and will be disconnected |
|||
automatically when exiting the block: |
|||
|
|||
.. testsetup:: |
|||
|
|||
from __future__ import with_statement |
|||
from blinker import Signal |
|||
on_ready = Signal() |
|||
receiver = lambda sender: None |
|||
|
|||
.. testcode:: |
|||
|
|||
with on_ready.connected_to(receiver): |
|||
# do stuff |
|||
on_ready.send(123) |
|||
|
|||
.. versionadded:: 1.1 |
|||
|
|||
""" |
|||
self.connect(receiver, sender=sender, weak=False) |
|||
try: |
|||
yield None |
|||
except: |
|||
self.disconnect(receiver) |
|||
raise |
|||
else: |
|||
self.disconnect(receiver) |
|||
|
|||
def temporarily_connected_to(self, receiver, sender=ANY): |
|||
"""An alias for :meth:`connected_to`. |
|||
|
|||
:param receiver: a receiver callable |
|||
:param sender: optional, a sender to filter on |
|||
|
|||
.. versionadded:: 0.9 |
|||
|
|||
.. versionchanged:: 1.1 |
|||
Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was |
|||
deprecated in 1.2 and will be removed in a subsequent version. |
|||
|
|||
""" |
|||
warn("temporarily_connected_to is deprecated; " |
|||
"use connected_to instead.", |
|||
DeprecationWarning) |
|||
return self.connected_to(receiver, sender) |
|||
|
|||
def send(self, *sender, **kwargs): |
|||
"""Emit this signal on behalf of *sender*, passing on \*\*kwargs. |
|||
|
|||
Returns a list of 2-tuples, pairing receivers with their return |
|||
value. The ordering of receiver notification is undefined. |
|||
|
|||
:param \*sender: Any object or ``None``. If omitted, synonymous |
|||
with ``None``. Only accepts one positional argument. |
|||
|
|||
:param \*\*kwargs: Data to be sent to receivers. |
|||
|
|||
""" |
|||
# Using '*sender' rather than 'sender=None' allows 'sender' to be |
|||
# used as a keyword argument- i.e. it's an invisible name in the |
|||
# function signature. |
|||
if len(sender) == 0: |
|||
sender = None |
|||
elif len(sender) > 1: |
|||
raise TypeError('send() accepts only one positional argument, ' |
|||
'%s given' % len(sender)) |
|||
else: |
|||
sender = sender[0] |
|||
if not self.receivers: |
|||
return [] |
|||
else: |
|||
return [(receiver, receiver(sender, **kwargs)) |
|||
for receiver in self.receivers_for(sender)] |
|||
|
|||
def has_receivers_for(self, sender): |
|||
"""True if there is probably a receiver for *sender*. |
|||
|
|||
Performs an optimistic check only. Does not guarantee that all |
|||
weakly referenced receivers are still alive. See |
|||
:meth:`receivers_for` for a stronger search. |
|||
|
|||
""" |
|||
if not self.receivers: |
|||
return False |
|||
if self._by_sender[ANY_ID]: |
|||
return True |
|||
if sender is ANY: |
|||
return False |
|||
return hashable_identity(sender) in self._by_sender |
|||
|
|||
def receivers_for(self, sender): |
|||
"""Iterate all live receivers listening for *sender*.""" |
|||
# TODO: test receivers_for(ANY) |
|||
if self.receivers: |
|||
sender_id = hashable_identity(sender) |
|||
if sender_id in self._by_sender: |
|||
ids = (self._by_sender[ANY_ID] | |
|||
self._by_sender[sender_id]) |
|||
else: |
|||
ids = self._by_sender[ANY_ID].copy() |
|||
for receiver_id in ids: |
|||
receiver = self.receivers.get(receiver_id) |
|||
if receiver is None: |
|||
continue |
|||
if isinstance(receiver, WeakTypes): |
|||
strong = receiver() |
|||
if strong is None: |
|||
self._disconnect(receiver_id, ANY_ID) |
|||
continue |
|||
receiver = strong |
|||
yield receiver |
|||
|
|||
def disconnect(self, receiver, sender=ANY): |
|||
"""Disconnect *receiver* from this signal's events. |
|||
|
|||
:param receiver: a previously :meth:`connected<connect>` callable |
|||
|
|||
:param sender: a specific sender to disconnect from, or :obj:`ANY` |
|||
to disconnect from all senders. Defaults to ``ANY``. |
|||
|
|||
""" |
|||
if sender is ANY: |
|||
sender_id = ANY_ID |
|||
else: |
|||
sender_id = hashable_identity(sender) |
|||
receiver_id = hashable_identity(receiver) |
|||
self._disconnect(receiver_id, sender_id) |
|||
|
|||
if ('receiver_disconnected' in self.__dict__ and |
|||
self.receiver_disconnected.receivers): |
|||
self.receiver_disconnected.send(self, |
|||
receiver=receiver, |
|||
sender=sender) |
|||
|
|||
def _disconnect(self, receiver_id, sender_id): |
|||
if sender_id == ANY_ID: |
|||
if self._by_receiver.pop(receiver_id, False): |
|||
for bucket in self._by_sender.values(): |
|||
bucket.discard(receiver_id) |
|||
self.receivers.pop(receiver_id, None) |
|||
else: |
|||
self._by_sender[sender_id].discard(receiver_id) |
|||
self._by_receiver[receiver_id].discard(sender_id) |
|||
|
|||
def _cleanup_receiver(self, receiver_ref): |
|||
"""Disconnect a receiver from all senders.""" |
|||
self._disconnect(receiver_ref.receiver_id, ANY_ID) |
|||
|
|||
def _cleanup_sender(self, sender_ref): |
|||
"""Disconnect all receivers from a sender.""" |
|||
sender_id = sender_ref.sender_id |
|||
assert sender_id != ANY_ID |
|||
self._weak_senders.pop(sender_id, None) |
|||
for receiver_id in self._by_sender.pop(sender_id, ()): |
|||
self._by_receiver[receiver_id].discard(sender_id) |
|||
|
|||
def _cleanup_bookkeeping(self): |
|||
"""Prune unused sender/receiver bookeeping. Not threadsafe. |
|||
|
|||
Connecting & disconnecting leave behind a small amount of bookeeping |
|||
for the receiver and sender values. Typical workloads using Blinker, |
|||
for example in most web apps, Flask, CLI scripts, etc., are not |
|||
adversely affected by this bookkeeping. |
|||
|
|||
With a long-running Python process performing dynamic signal routing |
|||
with high volume- e.g. connecting to function closures, "senders" are |
|||
all unique object instances, and doing all of this over and over- you |
|||
may see memory usage will grow due to extraneous bookeeping. (An empty |
|||
set() for each stale sender/receiver pair.) |
|||
|
|||
This method will prune that bookeeping away, with the caveat that such |
|||
pruning is not threadsafe. The risk is that cleanup of a fully |
|||
disconnected receiver/sender pair occurs while another thread is |
|||
connecting that same pair. If you are in the highly dynamic, unique |
|||
receiver/sender situation that has lead you to this method, that |
|||
failure mode is perhaps not a big deal for you. |
|||
""" |
|||
for mapping in (self._by_sender, self._by_receiver): |
|||
for _id, bucket in list(mapping.items()): |
|||
if not bucket: |
|||
mapping.pop(_id, None) |
|||
|
|||
def _clear_state(self): |
|||
"""Throw away all signal state. Useful for unit tests.""" |
|||
self._weak_senders.clear() |
|||
self.receivers.clear() |
|||
self._by_sender.clear() |
|||
self._by_receiver.clear() |
|||
|
|||
|
|||
receiver_connected = Signal("""\ |
|||
Sent by a :class:`Signal` after a receiver connects. |
|||
|
|||
:argument: the Signal that was connected to |
|||
:keyword receiver_arg: the connected receiver |
|||
:keyword sender_arg: the sender to connect to |
|||
:keyword weak_arg: true if the connection to receiver_arg is a weak reference |
|||
|
|||
.. deprecated:: 1.2 |
|||
|
|||
As of 1.2, individual signals have their own private |
|||
:attr:`~Signal.receiver_connected` and |
|||
:attr:`~Signal.receiver_disconnected` signals with a slightly simplified |
|||
call signature. This global signal is planned to be removed in 1.6. |
|||
|
|||
""") |
|||
|
|||
|
|||
class NamedSignal(Signal): |
|||
"""A named generic notification emitter.""" |
|||
|
|||
def __init__(self, name, doc=None): |
|||
Signal.__init__(self, doc) |
|||
|
|||
#: The name of this signal. |
|||
self.name = name |
|||
|
|||
def __repr__(self): |
|||
base = Signal.__repr__(self) |
|||
return "%s; %r>" % (base[:-1], self.name) |
|||
|
|||
|
|||
class Namespace(dict): |
|||
"""A mapping of signal names to signals.""" |
|||
|
|||
def signal(self, name, doc=None): |
|||
"""Return the :class:`NamedSignal` *name*, creating it if required. |
|||
|
|||
Repeated calls to this function will return the same signal object. |
|||
|
|||
""" |
|||
try: |
|||
return self[name] |
|||
except KeyError: |
|||
return self.setdefault(name, NamedSignal(name, doc)) |
|||
|
|||
|
|||
class WeakNamespace(WeakValueDictionary): |
|||
"""A weak mapping of signal names to signals. |
|||
|
|||
Automatically cleans up unused Signals when the last reference goes out |
|||
of scope. This namespace implementation exists for a measure of legacy |
|||
compatibility with Blinker <= 1.2, and may be dropped in the future. |
|||
|
|||
.. versionadded:: 1.3 |
|||
|
|||
""" |
|||
|
|||
def signal(self, name, doc=None): |
|||
"""Return the :class:`NamedSignal` *name*, creating it if required. |
|||
|
|||
Repeated calls to this function will return the same signal object. |
|||
|
|||
""" |
|||
try: |
|||
return self[name] |
|||
except KeyError: |
|||
return self.setdefault(name, NamedSignal(name, doc)) |
|||
|
|||
|
|||
signal = Namespace().signal |
@ -0,0 +1,8 @@ |
|||
# -*- coding: utf-8 -*- |
|||
try: |
|||
from ._version import version as __version__ |
|||
except ImportError: |
|||
__version__ = 'unknown' |
|||
|
|||
__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', |
|||
'utils', 'zoneinfo'] |
@ -0,0 +1,43 @@ |
|||
""" |
|||
Common code used in multiple modules. |
|||
""" |
|||
|
|||
|
|||
class weekday(object): |
|||
__slots__ = ["weekday", "n"] |
|||
|
|||
def __init__(self, weekday, n=None): |
|||
self.weekday = weekday |
|||
self.n = n |
|||
|
|||
def __call__(self, n): |
|||
if n == self.n: |
|||
return self |
|||
else: |
|||
return self.__class__(self.weekday, n) |
|||
|
|||
def __eq__(self, other): |
|||
try: |
|||
if self.weekday != other.weekday or self.n != other.n: |
|||
return False |
|||
except AttributeError: |
|||
return False |
|||
return True |
|||
|
|||
def __hash__(self): |
|||
return hash(( |
|||
self.weekday, |
|||
self.n, |
|||
)) |
|||
|
|||
def __ne__(self, other): |
|||
return not (self == other) |
|||
|
|||
def __repr__(self): |
|||
s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] |
|||
if not self.n: |
|||
return s |
|||
else: |
|||
return "%s(%+d)" % (s, self.n) |
|||
|
|||
# vim:ts=4:sw=4:et |
@ -0,0 +1,4 @@ |
|||
# coding: utf-8 |
|||
# file generated by setuptools_scm |
|||
# don't change, don't track in version control |
|||
version = '2.8.1' |
@ -0,0 +1,89 @@ |
|||
# -*- coding: utf-8 -*- |
|||
""" |
|||
This module offers a generic easter computing method for any given year, using |
|||
Western, Orthodox or Julian algorithms. |
|||
""" |
|||
|
|||
import datetime |
|||
|
|||
__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] |
|||
|
|||
EASTER_JULIAN = 1 |
|||
EASTER_ORTHODOX = 2 |
|||
EASTER_WESTERN = 3 |
|||
|
|||
|
|||
def easter(year, method=EASTER_WESTERN): |
|||
""" |
|||
This method was ported from the work done by GM Arts, |
|||
on top of the algorithm by Claus Tondering, which was |
|||
based in part on the algorithm of Ouding (1940), as |
|||
quoted in "Explanatory Supplement to the Astronomical |
|||
Almanac", P. Kenneth Seidelmann, editor. |
|||
|
|||
This algorithm implements three different easter |
|||
calculation methods: |
|||
|
|||
1 - Original calculation in Julian calendar, valid in |
|||
dates after 326 AD |
|||
2 - Original method, with date converted to Gregorian |
|||
calendar, valid in years 1583 to 4099 |
|||
3 - Revised method, in Gregorian calendar, valid in |
|||
years 1583 to 4099 as well |
|||
|
|||
These methods are represented by the constants: |
|||
|
|||
* ``EASTER_JULIAN = 1`` |
|||
* ``EASTER_ORTHODOX = 2`` |
|||
* ``EASTER_WESTERN = 3`` |
|||
|
|||
The default method is method 3. |
|||
|
|||
More about the algorithm may be found at: |
|||
|
|||
`GM Arts: Easter Algorithms <http://www.gmarts.org/index.php?go=415>`_ |
|||
|
|||
and |
|||
|
|||
`The Calendar FAQ: Easter <https://www.tondering.dk/claus/cal/easter.php>`_ |
|||
|
|||
""" |
|||
|
|||
if not (1 <= method <= 3): |
|||
raise ValueError("invalid method") |
|||
|
|||
# g - Golden year - 1 |
|||
# c - Century |
|||
# h - (23 - Epact) mod 30 |
|||
# i - Number of days from March 21 to Paschal Full Moon |
|||
# j - Weekday for PFM (0=Sunday, etc) |
|||
# p - Number of days from March 21 to Sunday on or before PFM |
|||
# (-6 to 28 methods 1 & 3, to 56 for method 2) |
|||
# e - Extra days to add for method 2 (converting Julian |
|||
# date to Gregorian date) |
|||
|
|||
y = year |
|||
g = y % 19 |
|||
e = 0 |
|||
if method < 3: |
|||
# Old method |
|||
i = (19*g + 15) % 30 |
|||
j = (y + y//4 + i) % 7 |
|||
if method == 2: |
|||
# Extra dates to convert Julian to Gregorian date |
|||
e = 10 |
|||
if y > 1600: |
|||
e = e + y//100 - 16 - (y//100 - 16)//4 |
|||
else: |
|||
# New method |
|||
c = y//100 |
|||
h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 |
|||
i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) |
|||
j = (y + y//4 + i + 2 - c + c//4) % 7 |
|||
|
|||
# p can be from -6 to 56 corresponding to dates 22 March to 23 May |
|||
# (later dates apply to method 2, although 23 May never actually occurs) |
|||
p = i - j + e |
|||
d = 1 + (p + 27 + (p + 6)//40) % 31 |
|||
m = 3 + (p + 26)//30 |
|||
return datetime.date(int(y), int(m), int(d)) |
@ -0,0 +1,61 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from ._parser import parse, parser, parserinfo, ParserError |
|||
from ._parser import DEFAULTPARSER, DEFAULTTZPARSER |
|||
from ._parser import UnknownTimezoneWarning |
|||
|
|||
from ._parser import __doc__ |
|||
|
|||
from .isoparser import isoparser, isoparse |
|||
|
|||
__all__ = ['parse', 'parser', 'parserinfo', |
|||
'isoparse', 'isoparser', |
|||
'ParserError', |
|||
'UnknownTimezoneWarning'] |
|||
|
|||
|
|||
### |
|||
# Deprecate portions of the private interface so that downstream code that |
|||
# is improperly relying on it is given *some* notice. |
|||
|
|||
|
|||
def __deprecated_private_func(f): |
|||
from functools import wraps |
|||
import warnings |
|||
|
|||
msg = ('{name} is a private function and may break without warning, ' |
|||
'it will be moved and or renamed in future versions.') |
|||
msg = msg.format(name=f.__name__) |
|||
|
|||
@wraps(f) |
|||
def deprecated_func(*args, **kwargs): |
|||
warnings.warn(msg, DeprecationWarning) |
|||
return f(*args, **kwargs) |
|||
|
|||
return deprecated_func |
|||
|
|||
def __deprecate_private_class(c): |
|||
import warnings |
|||
|
|||
msg = ('{name} is a private class and may break without warning, ' |
|||
'it will be moved and or renamed in future versions.') |
|||
msg = msg.format(name=c.__name__) |
|||
|
|||
class private_class(c): |
|||
__doc__ = c.__doc__ |
|||
|
|||
def __init__(self, *args, **kwargs): |
|||
warnings.warn(msg, DeprecationWarning) |
|||
super(private_class, self).__init__(*args, **kwargs) |
|||
|
|||
private_class.__name__ = c.__name__ |
|||
|
|||
return private_class |
|||
|
|||
|
|||
from ._parser import _timelex, _resultbase |
|||
from ._parser import _tzparser, _parsetz |
|||
|
|||
_timelex = __deprecate_private_class(_timelex) |
|||
_tzparser = __deprecate_private_class(_tzparser) |
|||
_resultbase = __deprecate_private_class(_resultbase) |
|||
_parsetz = __deprecated_private_func(_parsetz) |
File diff suppressed because it is too large
@ -0,0 +1,411 @@ |
|||
# -*- coding: utf-8 -*- |
|||
""" |
|||
This module offers a parser for ISO-8601 strings |
|||
|
|||
It is intended to support all valid date, time and datetime formats per the |
|||
ISO-8601 specification. |
|||
|
|||
..versionadded:: 2.7.0 |
|||
""" |
|||
from datetime import datetime, timedelta, time, date |
|||
import calendar |
|||
from dateutil import tz |
|||
|
|||
from functools import wraps |
|||
|
|||
import re |
|||
import six |
|||
|
|||
__all__ = ["isoparse", "isoparser"] |
|||
|
|||
|
|||
def _takes_ascii(f): |
|||
@wraps(f) |
|||
def func(self, str_in, *args, **kwargs): |
|||
# If it's a stream, read the whole thing |
|||
str_in = getattr(str_in, 'read', lambda: str_in)() |
|||
|
|||
# If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII |
|||
if isinstance(str_in, six.text_type): |
|||
# ASCII is the same in UTF-8 |
|||
try: |
|||
str_in = str_in.encode('ascii') |
|||
except UnicodeEncodeError as e: |
|||
msg = 'ISO-8601 strings should contain only ASCII characters' |
|||
six.raise_from(ValueError(msg), e) |
|||
|
|||
return f(self, str_in, *args, **kwargs) |
|||
|
|||
return func |
|||
|
|||
|
|||
class isoparser(object): |
|||
def __init__(self, sep=None): |
|||
""" |
|||
:param sep: |
|||
A single character that separates date and time portions. If |
|||
``None``, the parser will accept any single character. |
|||
For strict ISO-8601 adherence, pass ``'T'``. |
|||
""" |
|||
if sep is not None: |
|||
if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): |
|||
raise ValueError('Separator must be a single, non-numeric ' + |
|||
'ASCII character') |
|||
|
|||
sep = sep.encode('ascii') |
|||
|
|||
self._sep = sep |
|||
|
|||
@_takes_ascii |
|||
def isoparse(self, dt_str): |
|||
""" |
|||
Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. |
|||
|
|||
An ISO-8601 datetime string consists of a date portion, followed |
|||
optionally by a time portion - the date and time portions are separated |
|||
by a single character separator, which is ``T`` in the official |
|||
standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be |
|||
combined with a time portion. |
|||
|
|||
Supported date formats are: |
|||
|
|||
Common: |
|||
|
|||
- ``YYYY`` |
|||
- ``YYYY-MM`` or ``YYYYMM`` |
|||
- ``YYYY-MM-DD`` or ``YYYYMMDD`` |
|||
|
|||
Uncommon: |
|||
|
|||
- ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) |
|||
- ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day |
|||
|
|||
The ISO week and day numbering follows the same logic as |
|||
:func:`datetime.date.isocalendar`. |
|||
|
|||
Supported time formats are: |
|||
|
|||
- ``hh`` |
|||
- ``hh:mm`` or ``hhmm`` |
|||
- ``hh:mm:ss`` or ``hhmmss`` |
|||
- ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) |
|||
|
|||
Midnight is a special case for `hh`, as the standard supports both |
|||
00:00 and 24:00 as a representation. The decimal separator can be |
|||
either a dot or a comma. |
|||
|
|||
|
|||
.. caution:: |
|||
|
|||
Support for fractional components other than seconds is part of the |
|||
ISO-8601 standard, but is not currently implemented in this parser. |
|||
|
|||
Supported time zone offset formats are: |
|||
|
|||
- `Z` (UTC) |
|||
- `±HH:MM` |
|||
- `±HHMM` |
|||
- `±HH` |
|||
|
|||
Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, |
|||
with the exception of UTC, which will be represented as |
|||
:class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such |
|||
as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. |
|||
|
|||
:param dt_str: |
|||
A string or stream containing only an ISO-8601 datetime string |
|||
|
|||
:return: |
|||
Returns a :class:`datetime.datetime` representing the string. |
|||
Unspecified components default to their lowest value. |
|||
|
|||
.. warning:: |
|||
|
|||
As of version 2.7.0, the strictness of the parser should not be |
|||
considered a stable part of the contract. Any valid ISO-8601 string |
|||
that parses correctly with the default settings will continue to |
|||
parse correctly in future versions, but invalid strings that |
|||
currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not |
|||
guaranteed to continue failing in future versions if they encode |
|||
a valid date. |
|||
|
|||
.. versionadded:: 2.7.0 |
|||
""" |
|||
components, pos = self._parse_isodate(dt_str) |
|||
|
|||
if len(dt_str) > pos: |
|||
if self._sep is None or dt_str[pos:pos + 1] == self._sep: |
|||
components += self._parse_isotime(dt_str[pos + 1:]) |
|||
else: |
|||
raise ValueError('String contains unknown ISO components') |
|||
|
|||
if len(components) > 3 and components[3] == 24: |
|||
components[3] = 0 |
|||
return datetime(*components) + timedelta(days=1) |
|||
|
|||
return datetime(*components) |
|||
|
|||
@_takes_ascii |
|||
def parse_isodate(self, datestr): |
|||
""" |
|||
Parse the date portion of an ISO string. |
|||
|
|||
:param datestr: |
|||
The string portion of an ISO string, without a separator |
|||
|
|||
:return: |
|||
Returns a :class:`datetime.date` object |
|||
""" |
|||
components, pos = self._parse_isodate(datestr) |
|||
if pos < len(datestr): |
|||
raise ValueError('String contains unknown ISO ' + |
|||
'components: {}'.format(datestr)) |
|||
return date(*components) |
|||
|
|||
@_takes_ascii |
|||
def parse_isotime(self, timestr): |
|||
""" |
|||
Parse the time portion of an ISO string. |
|||
|
|||
:param timestr: |
|||
The time portion of an ISO string, without a separator |
|||
|
|||
:return: |
|||
Returns a :class:`datetime.time` object |
|||
""" |
|||
components = self._parse_isotime(timestr) |
|||
if components[0] == 24: |
|||
components[0] = 0 |
|||
return time(*components) |
|||
|
|||
@_takes_ascii |
|||
def parse_tzstr(self, tzstr, zero_as_utc=True): |
|||
""" |
|||
Parse a valid ISO time zone string. |
|||
|
|||
See :func:`isoparser.isoparse` for details on supported formats. |
|||
|
|||
:param tzstr: |
|||
A string representing an ISO time zone offset |
|||
|
|||
:param zero_as_utc: |
|||
Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones |
|||
|
|||
:return: |
|||
Returns :class:`dateutil.tz.tzoffset` for offsets and |
|||
:class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is |
|||
specified) offsets equivalent to UTC. |
|||
""" |
|||
return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) |
|||
|
|||
# Constants |
|||
_DATE_SEP = b'-' |
|||
_TIME_SEP = b':' |
|||
_FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') |
|||
|
|||
def _parse_isodate(self, dt_str): |
|||
try: |
|||
return self._parse_isodate_common(dt_str) |
|||
except ValueError: |
|||
return self._parse_isodate_uncommon(dt_str) |
|||
|
|||
def _parse_isodate_common(self, dt_str): |
|||
len_str = len(dt_str) |
|||
components = [1, 1, 1] |
|||
|
|||
if len_str < 4: |
|||
raise ValueError('ISO string too short') |
|||
|
|||
# Year |
|||
components[0] = int(dt_str[0:4]) |
|||
pos = 4 |
|||
if pos >= len_str: |
|||
return components, pos |
|||
|
|||
has_sep = dt_str[pos:pos + 1] == self._DATE_SEP |
|||
if has_sep: |
|||
pos += 1 |
|||
|
|||
# Month |
|||
if len_str - pos < 2: |
|||
raise ValueError('Invalid common month') |
|||
|
|||
components[1] = int(dt_str[pos:pos + 2]) |
|||
pos += 2 |
|||
|
|||
if pos >= len_str: |
|||
if has_sep: |
|||
return components, pos |
|||
else: |
|||
raise ValueError('Invalid ISO format') |
|||
|
|||
if has_sep: |
|||
if dt_str[pos:pos + 1] != self._DATE_SEP: |
|||
raise ValueError('Invalid separator in ISO string') |
|||
pos += 1 |
|||
|
|||
# Day |
|||
if len_str - pos < 2: |
|||
raise ValueError('Invalid common day') |
|||
components[2] = int(dt_str[pos:pos + 2]) |
|||
return components, pos + 2 |
|||
|
|||
def _parse_isodate_uncommon(self, dt_str): |
|||
if len(dt_str) < 4: |
|||
raise ValueError('ISO string too short') |
|||
|
|||
# All ISO formats start with the year |
|||
year = int(dt_str[0:4]) |
|||
|
|||
has_sep = dt_str[4:5] == self._DATE_SEP |
|||
|
|||
pos = 4 + has_sep # Skip '-' if it's there |
|||
if dt_str[pos:pos + 1] == b'W': |
|||
# YYYY-?Www-?D? |
|||
pos += 1 |
|||
weekno = int(dt_str[pos:pos + 2]) |
|||
pos += 2 |
|||
|
|||
dayno = 1 |
|||
if len(dt_str) > pos: |
|||
if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: |
|||
raise ValueError('Inconsistent use of dash separator') |
|||
|
|||
pos += has_sep |
|||
|
|||
dayno = int(dt_str[pos:pos + 1]) |
|||
pos += 1 |
|||
|
|||
base_date = self._calculate_weekdate(year, weekno, dayno) |
|||
else: |
|||
# YYYYDDD or YYYY-DDD |
|||
if len(dt_str) - pos < 3: |
|||
raise ValueError('Invalid ordinal day') |
|||
|
|||
ordinal_day = int(dt_str[pos:pos + 3]) |
|||
pos += 3 |
|||
|
|||
if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): |
|||
raise ValueError('Invalid ordinal day' + |
|||
' {} for year {}'.format(ordinal_day, year)) |
|||
|
|||
base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) |
|||
|
|||
components = [base_date.year, base_date.month, base_date.day] |
|||
return components, pos |
|||
|
|||
def _calculate_weekdate(self, year, week, day): |
|||
""" |
|||
Calculate the day of corresponding to the ISO year-week-day calendar. |
|||
|
|||
This function is effectively the inverse of |
|||
:func:`datetime.date.isocalendar`. |
|||
|
|||
:param year: |
|||
The year in the ISO calendar |
|||
|
|||
:param week: |
|||
The week in the ISO calendar - range is [1, 53] |
|||
|
|||
:param day: |
|||
The day in the ISO calendar - range is [1 (MON), 7 (SUN)] |
|||
|
|||
:return: |
|||
Returns a :class:`datetime.date` |
|||
""" |
|||
if not 0 < week < 54: |
|||
raise ValueError('Invalid week: {}'.format(week)) |
|||
|
|||
if not 0 < day < 8: # Range is 1-7 |
|||
raise ValueError('Invalid weekday: {}'.format(day)) |
|||
|
|||
# Get week 1 for the specific year: |
|||
jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it |
|||
week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) |
|||
|
|||
# Now add the specific number of weeks and days to get what we want |
|||
week_offset = (week - 1) * 7 + (day - 1) |
|||
return week_1 + timedelta(days=week_offset) |
|||
|
|||
def _parse_isotime(self, timestr): |
|||
len_str = len(timestr) |
|||
components = [0, 0, 0, 0, None] |
|||
pos = 0 |
|||
comp = -1 |
|||
|
|||
if len(timestr) < 2: |
|||
raise ValueError('ISO time too short') |
|||
|
|||
has_sep = len_str >= 3 and timestr[2:3] == self._TIME_SEP |
|||
|
|||
while pos < len_str and comp < 5: |
|||
comp += 1 |
|||
|
|||
if timestr[pos:pos + 1] in b'-+Zz': |
|||
# Detect time zone boundary |
|||
components[-1] = self._parse_tzstr(timestr[pos:]) |
|||
pos = len_str |
|||
break |
|||
|
|||
if comp < 3: |
|||
# Hour, minute, second |
|||
components[comp] = int(timestr[pos:pos + 2]) |
|||
pos += 2 |
|||
if (has_sep and pos < len_str and |
|||
timestr[pos:pos + 1] == self._TIME_SEP): |
|||
pos += 1 |
|||
|
|||
if comp == 3: |
|||
# Fraction of a second |
|||
frac = self._FRACTION_REGEX.match(timestr[pos:]) |
|||
if not frac: |
|||
continue |
|||
|
|||
us_str = frac.group(1)[:6] # Truncate to microseconds |
|||
components[comp] = int(us_str) * 10**(6 - len(us_str)) |
|||
pos += len(frac.group()) |
|||
|
|||
if pos < len_str: |
|||
raise ValueError('Unused components in ISO string') |
|||
|
|||
if components[0] == 24: |
|||
# Standard supports 00:00 and 24:00 as representations of midnight |
|||
if any(component != 0 for component in components[1:4]): |
|||
raise ValueError('Hour may only be 24 at 24:00:00.000') |
|||
|
|||
return components |
|||
|
|||
def _parse_tzstr(self, tzstr, zero_as_utc=True): |
|||
if tzstr == b'Z' or tzstr == b'z': |
|||
return tz.UTC |
|||
|
|||
if len(tzstr) not in {3, 5, 6}: |
|||
raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') |
|||
|
|||
if tzstr[0:1] == b'-': |
|||
mult = -1 |
|||
elif tzstr[0:1] == b'+': |
|||
mult = 1 |
|||
else: |
|||
raise ValueError('Time zone offset requires sign') |
|||
|
|||
hours = int(tzstr[1:3]) |
|||
if len(tzstr) == 3: |
|||
minutes = 0 |
|||
else: |
|||
minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) |
|||
|
|||
if zero_as_utc and hours == 0 and minutes == 0: |
|||
return tz.UTC |
|||
else: |
|||
if minutes > 59: |
|||
raise ValueError('Invalid minutes in time zone offset') |
|||
|
|||
if hours > 23: |
|||
raise ValueError('Invalid hours in time zone offset') |
|||
|
|||
return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) |
|||
|
|||
|
|||
DEFAULT_ISOPARSER = isoparser() |
|||
isoparse = DEFAULT_ISOPARSER.isoparse |
@ -0,0 +1,599 @@ |
|||
# -*- coding: utf-8 -*- |
|||
import datetime |
|||
import calendar |
|||
|
|||
import operator |
|||
from math import copysign |
|||
|
|||
from six import integer_types |
|||
from warnings import warn |
|||
|
|||
from ._common import weekday |
|||
|
|||
MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) |
|||
|
|||
__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] |
|||
|
|||
|
|||
class relativedelta(object): |
|||
""" |
|||
The relativedelta type is designed to be applied to an existing datetime and |
|||
can replace specific components of that datetime, or represents an interval |
|||
of time. |
|||
|
|||
It is based on the specification of the excellent work done by M.-A. Lemburg |
|||
in his |
|||
`mx.DateTime <https://www.egenix.com/products/python/mxBase/mxDateTime/>`_ extension. |
|||
However, notice that this type does *NOT* implement the same algorithm as |
|||
his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. |
|||
|
|||
There are two different ways to build a relativedelta instance. The |
|||
first one is passing it two date/datetime classes:: |
|||
|
|||
relativedelta(datetime1, datetime2) |
|||
|
|||
The second one is passing it any number of the following keyword arguments:: |
|||
|
|||
relativedelta(arg1=x,arg2=y,arg3=z...) |
|||
|
|||
year, month, day, hour, minute, second, microsecond: |
|||
Absolute information (argument is singular); adding or subtracting a |
|||
relativedelta with absolute information does not perform an arithmetic |
|||
operation, but rather REPLACES the corresponding value in the |
|||
original datetime with the value(s) in relativedelta. |
|||
|
|||
years, months, weeks, days, hours, minutes, seconds, microseconds: |
|||
Relative information, may be negative (argument is plural); adding |
|||
or subtracting a relativedelta with relative information performs |
|||
the corresponding arithmetic operation on the original datetime value |
|||
with the information in the relativedelta. |
|||
|
|||
weekday: |
|||
One of the weekday instances (MO, TU, etc) available in the |
|||
relativedelta module. These instances may receive a parameter N, |
|||
specifying the Nth weekday, which could be positive or negative |
|||
(like MO(+1) or MO(-2)). Not specifying it is the same as specifying |
|||
+1. You can also use an integer, where 0=MO. This argument is always |
|||
relative e.g. if the calculated date is already Monday, using MO(1) |
|||
or MO(-1) won't change the day. To effectively make it absolute, use |
|||
it in combination with the day argument (e.g. day=1, MO(1) for first |
|||
Monday of the month). |
|||
|
|||
leapdays: |
|||
Will add given days to the date found, if year is a leap |
|||
year, and the date found is post 28 of february. |
|||
|
|||
yearday, nlyearday: |
|||
Set the yearday or the non-leap year day (jump leap days). |
|||
These are converted to day/month/leapdays information. |
|||
|
|||
There are relative and absolute forms of the keyword |
|||
arguments. The plural is relative, and the singular is |
|||
absolute. For each argument in the order below, the absolute form |
|||
is applied first (by setting each attribute to that value) and |
|||
then the relative form (by adding the value to the attribute). |
|||
|
|||
The order of attributes considered when this relativedelta is |
|||
added to a datetime is: |
|||
|
|||
1. Year |
|||
2. Month |
|||
3. Day |
|||
4. Hours |
|||
5. Minutes |
|||
6. Seconds |
|||
7. Microseconds |
|||
|
|||
Finally, weekday is applied, using the rule described above. |
|||
|
|||
For example |
|||
|
|||
>>> from datetime import datetime |
|||
>>> from dateutil.relativedelta import relativedelta, MO |
|||
>>> dt = datetime(2018, 4, 9, 13, 37, 0) |
|||
>>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) |
|||
>>> dt + delta |
|||
datetime.datetime(2018, 4, 2, 14, 37) |
|||
|
|||
First, the day is set to 1 (the first of the month), then 25 hours |
|||
are added, to get to the 2nd day and 14th hour, finally the |
|||
weekday is applied, but since the 2nd is already a Monday there is |
|||
no effect. |
|||
|
|||
""" |
|||
|
|||
def __init__(self, dt1=None, dt2=None, |
|||
years=0, months=0, days=0, leapdays=0, weeks=0, |
|||
hours=0, minutes=0, seconds=0, microseconds=0, |
|||
year=None, month=None, day=None, weekday=None, |
|||
yearday=None, nlyearday=None, |
|||
hour=None, minute=None, second=None, microsecond=None): |
|||
|
|||
if dt1 and dt2: |
|||
# datetime is a subclass of date. So both must be date |
|||
if not (isinstance(dt1, datetime.date) and |
|||
isinstance(dt2, datetime.date)): |
|||
raise TypeError("relativedelta only diffs datetime/date") |
|||
|
|||
# We allow two dates, or two datetimes, so we coerce them to be |
|||
# of the same type |
|||
if (isinstance(dt1, datetime.datetime) != |
|||
isinstance(dt2, datetime.datetime)): |
|||
if not isinstance(dt1, datetime.datetime): |
|||
dt1 = datetime.datetime.fromordinal(dt1.toordinal()) |
|||
elif not isinstance(dt2, datetime.datetime): |
|||
dt2 = datetime.datetime.fromordinal(dt2.toordinal()) |
|||
|
|||
self.years = 0 |
|||
self.months = 0 |
|||
self.days = 0 |
|||
self.leapdays = 0 |
|||
self.hours = 0 |
|||
self.minutes = 0 |
|||
self.seconds = 0 |
|||
self.microseconds = 0 |
|||
self.year = None |
|||
self.month = None |
|||
self.day = None |
|||
self.weekday = None |
|||
self.hour = None |
|||
self.minute = None |
|||
self.second = None |
|||
self.microsecond = None |
|||
self._has_time = 0 |
|||
|
|||
# Get year / month delta between the two |
|||
months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) |
|||
self._set_months(months) |
|||
|
|||
# Remove the year/month delta so the timedelta is just well-defined |
|||
# time units (seconds, days and microseconds) |
|||
dtm = self.__radd__(dt2) |
|||
|
|||
# If we've overshot our target, make an adjustment |
|||
if dt1 < dt2: |
|||
compare = operator.gt |
|||
increment = 1 |
|||
else: |
|||
compare = operator.lt |
|||
increment = -1 |
|||
|
|||
while compare(dt1, dtm): |
|||
months += increment |
|||
self._set_months(months) |
|||
dtm = self.__radd__(dt2) |
|||
|
|||
# Get the timedelta between the "months-adjusted" date and dt1 |
|||
delta = dt1 - dtm |
|||
self.seconds = delta.seconds + delta.days * 86400 |
|||
self.microseconds = delta.microseconds |
|||
else: |
|||
# Check for non-integer values in integer-only quantities |
|||
if any(x is not None and x != int(x) for x in (years, months)): |
|||
raise ValueError("Non-integer years and months are " |
|||
"ambiguous and not currently supported.") |
|||
|
|||
# Relative information |
|||
self.years = int(years) |
|||
self.months = int(months) |
|||
self.days = days + weeks * 7 |
|||
self.leapdays = leapdays |
|||
self.hours = hours |
|||
self.minutes = minutes |
|||
self.seconds = seconds |
|||
self.microseconds = microseconds |
|||
|
|||
# Absolute information |
|||
self.year = year |
|||
self.month = month |
|||
self.day = day |
|||
self.hour = hour |
|||
self.minute = minute |
|||
self.second = second |
|||
self.microsecond = microsecond |
|||
|
|||
if any(x is not None and int(x) != x |
|||
for x in (year, month, day, hour, |
|||
minute, second, microsecond)): |
|||
# For now we'll deprecate floats - later it'll be an error. |
|||
warn("Non-integer value passed as absolute information. " + |
|||
"This is not a well-defined condition and will raise " + |
|||
"errors in future versions.", DeprecationWarning) |
|||
|
|||
if isinstance(weekday, integer_types): |
|||
self.weekday = weekdays[weekday] |
|||
else: |
|||
self.weekday = weekday |
|||
|
|||
yday = 0 |
|||
if nlyearday: |
|||
yday = nlyearday |
|||
elif yearday: |
|||
yday = yearday |
|||
if yearday > 59: |
|||
self.leapdays = -1 |
|||
if yday: |
|||
ydayidx = [31, 59, 90, 120, 151, 181, 212, |
|||
243, 273, 304, 334, 366] |
|||
for idx, ydays in enumerate(ydayidx): |
|||
if yday <= ydays: |
|||
self.month = idx+1 |
|||
if idx == 0: |
|||
self.day = yday |
|||
else: |
|||
self.day = yday-ydayidx[idx-1] |
|||
break |
|||
else: |
|||
raise ValueError("invalid year day (%d)" % yday) |
|||
|
|||
self._fix() |
|||
|
|||
def _fix(self): |
|||
if abs(self.microseconds) > 999999: |
|||
s = _sign(self.microseconds) |
|||
div, mod = divmod(self.microseconds * s, 1000000) |
|||
self.microseconds = mod * s |
|||
self.seconds += div * s |
|||
if abs(self.seconds) > 59: |
|||
s = _sign(self.seconds) |
|||
div, mod = divmod(self.seconds * s, 60) |
|||
self.seconds = mod * s |
|||
self.minutes += div * s |
|||
if abs(self.minutes) > 59: |
|||
s = _sign(self.minutes) |
|||
div, mod = divmod(self.minutes * s, 60) |
|||
self.minutes = mod * s |
|||
self.hours += div * s |
|||
if abs(self.hours) > 23: |
|||
s = _sign(self.hours) |
|||
div, mod = divmod(self.hours * s, 24) |
|||
self.hours = mod * s |
|||
self.days += div * s |
|||
if abs(self.months) > 11: |
|||
s = _sign(self.months) |
|||
div, mod = divmod(self.months * s, 12) |
|||
self.months = mod * s |
|||
self.years += div * s |
|||
if (self.hours or self.minutes or self.seconds or self.microseconds |
|||
or self.hour is not None or self.minute is not None or |
|||
self.second is not None or self.microsecond is not None): |
|||
self._has_time = 1 |
|||
else: |
|||
self._has_time = 0 |
|||
|
|||
@property |
|||
def weeks(self): |
|||
return int(self.days / 7.0) |
|||
|
|||
@weeks.setter |
|||
def weeks(self, value): |
|||
self.days = self.days - (self.weeks * 7) + value * 7 |
|||
|
|||
def _set_months(self, months): |
|||
self.months = months |
|||
if abs(self.months) > 11: |
|||
s = _sign(self.months) |
|||
div, mod = divmod(self.months * s, 12) |
|||
self.months = mod * s |
|||
self.years = div * s |
|||
else: |
|||
self.years = 0 |
|||
|
|||
def normalized(self): |
|||
""" |
|||
Return a version of this object represented entirely using integer |
|||
values for the relative attributes. |
|||
|
|||
>>> relativedelta(days=1.5, hours=2).normalized() |
|||
relativedelta(days=+1, hours=+14) |
|||
|
|||
:return: |
|||
Returns a :class:`dateutil.relativedelta.relativedelta` object. |
|||
""" |
|||
# Cascade remainders down (rounding each to roughly nearest microsecond) |
|||
days = int(self.days) |
|||
|
|||
hours_f = round(self.hours + 24 * (self.days - days), 11) |
|||
hours = int(hours_f) |
|||
|
|||
minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) |
|||
minutes = int(minutes_f) |
|||
|
|||
seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) |
|||
seconds = int(seconds_f) |
|||
|
|||
microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) |
|||
|
|||
# Constructor carries overflow back up with call to _fix() |
|||
return self.__class__(years=self.years, months=self.months, |
|||
days=days, hours=hours, minutes=minutes, |
|||
seconds=seconds, microseconds=microseconds, |
|||
leapdays=self.leapdays, year=self.year, |
|||
month=self.month, day=self.day, |
|||
weekday=self.weekday, hour=self.hour, |
|||
minute=self.minute, second=self.second, |
|||
microsecond=self.microsecond) |
|||
|
|||
def __add__(self, other): |
|||
if isinstance(other, relativedelta): |
|||
return self.__class__(years=other.years + self.years, |
|||
months=other.months + self.months, |
|||
days=other.days + self.days, |
|||
hours=other.hours + self.hours, |
|||
minutes=other.minutes + self.minutes, |
|||
seconds=other.seconds + self.seconds, |
|||
microseconds=(other.microseconds + |
|||
self.microseconds), |
|||
leapdays=other.leapdays or self.leapdays, |
|||
year=(other.year if other.year is not None |
|||
else self.year), |
|||
month=(other.month if other.month is not None |
|||
else self.month), |
|||
day=(other.day if other.day is not None |
|||
else self.day), |
|||
weekday=(other.weekday if other.weekday is not None |
|||
else self.weekday), |
|||
hour=(other.hour if other.hour is not None |
|||
else self.hour), |
|||
minute=(other.minute if other.minute is not None |
|||
else self.minute), |
|||
second=(other.second if other.second is not None |
|||
else self.second), |
|||
microsecond=(other.microsecond if other.microsecond |
|||
is not None else |
|||
self.microsecond)) |
|||
if isinstance(other, datetime.timedelta): |
|||
return self.__class__(years=self.years, |
|||
months=self.months, |
|||
days=self.days + other.days, |
|||
hours=self.hours, |
|||
minutes=self.minutes, |
|||
seconds=self.seconds + other.seconds, |
|||
microseconds=self.microseconds + other.microseconds, |
|||
leapdays=self.leapdays, |
|||
year=self.year, |
|||
month=self.month, |
|||
day=self.day, |
|||
weekday=self.weekday, |
|||
hour=self.hour, |
|||
minute=self.minute, |
|||
second=self.second, |
|||
microsecond=self.microsecond) |
|||
if not isinstance(other, datetime.date): |
|||
return NotImplemented |
|||
elif self._has_time and not isinstance(other, datetime.datetime): |
|||
other = datetime.datetime.fromordinal(other.toordinal()) |
|||
year = (self.year or other.year)+self.years |
|||
month = self.month or other.month |
|||
if self.months: |
|||
assert 1 <= abs(self.months) <= 12 |
|||
month += self.months |
|||
if month > 12: |
|||
year += 1 |
|||
month -= 12 |
|||
elif month < 1: |
|||
year -= 1 |
|||
month += 12 |
|||
day = min(calendar.monthrange(year, month)[1], |
|||
self.day or other.day) |
|||
repl = {"year": year, "month": month, "day": day} |
|||
for attr in ["hour", "minute", "second", "microsecond"]: |
|||
value = getattr(self, attr) |
|||
if value is not None: |
|||
repl[attr] = value |
|||
days = self.days |
|||
if self.leapdays and month > 2 and calendar.isleap(year): |
|||
days += self.leapdays |
|||
ret = (other.replace(**repl) |
|||
+ datetime.timedelta(days=days, |
|||
hours=self.hours, |
|||
minutes=self.minutes, |
|||
seconds=self.seconds, |
|||
microseconds=self.microseconds)) |
|||
if self.weekday: |
|||
weekday, nth = self.weekday.weekday, self.weekday.n or 1 |
|||
jumpdays = (abs(nth) - 1) * 7 |
|||
if nth > 0: |
|||
jumpdays += (7 - ret.weekday() + weekday) % 7 |
|||
else: |
|||
jumpdays += (ret.weekday() - weekday) % 7 |
|||
jumpdays *= -1 |
|||
ret += datetime.timedelta(days=jumpdays) |
|||
return ret |
|||
|
|||
def __radd__(self, other): |
|||
return self.__add__(other) |
|||
|
|||
def __rsub__(self, other): |
|||
return self.__neg__().__radd__(other) |
|||
|
|||
def __sub__(self, other): |
|||
if not isinstance(other, relativedelta): |
|||
return NotImplemented # In case the other object defines __rsub__ |
|||
return self.__class__(years=self.years - other.years, |
|||
months=self.months - other.months, |
|||
days=self.days - other.days, |
|||
hours=self.hours - other.hours, |
|||
minutes=self.minutes - other.minutes, |
|||
seconds=self.seconds - other.seconds, |
|||
microseconds=self.microseconds - other.microseconds, |
|||
leapdays=self.leapdays or other.leapdays, |
|||
year=(self.year if self.year is not None |
|||
else other.year), |
|||
month=(self.month if self.month is not None else |
|||
other.month), |
|||
day=(self.day if self.day is not None else |
|||
other.day), |
|||
weekday=(self.weekday if self.weekday is not None else |
|||
other.weekday), |
|||
hour=(self.hour if self.hour is not None else |
|||
other.hour), |
|||
minute=(self.minute if self.minute is not None else |
|||
other.minute), |
|||
second=(self.second if self.second is not None else |
|||
other.second), |
|||
microsecond=(self.microsecond if self.microsecond |
|||
is not None else |
|||
other.microsecond)) |
|||
|
|||
def __abs__(self): |
|||
return self.__class__(years=abs(self.years), |
|||
months=abs(self.months), |
|||
days=abs(self.days), |
|||
hours=abs(self.hours), |
|||
minutes=abs(self.minutes), |
|||
seconds=abs(self.seconds), |
|||
microseconds=abs(self.microseconds), |
|||
leapdays=self.leapdays, |
|||
year=self.year, |
|||
month=self.month, |
|||
day=self.day, |
|||
weekday=self.weekday, |
|||
hour=self.hour, |
|||
minute=self.minute, |
|||
second=self.second, |
|||
microsecond=self.microsecond) |
|||
|
|||
def __neg__(self): |
|||
return self.__class__(years=-self.years, |
|||
months=-self.months, |
|||
days=-self.days, |
|||
hours=-self.hours, |
|||
minutes=-self.minutes, |
|||
seconds=-self.seconds, |
|||
microseconds=-self.microseconds, |
|||
leapdays=self.leapdays, |
|||
year=self.year, |
|||
month=self.month, |
|||
day=self.day, |
|||
weekday=self.weekday, |
|||
hour=self.hour, |
|||
minute=self.minute, |
|||
second=self.second, |
|||
microsecond=self.microsecond) |
|||
|
|||
def __bool__(self): |
|||
return not (not self.years and |
|||
not self.months and |
|||
not self.days and |
|||
not self.hours and |
|||
not self.minutes and |
|||
not self.seconds and |
|||
not self.microseconds and |
|||
not self.leapdays and |
|||
self.year is None and |
|||
self.month is None and |
|||
self.day is None and |
|||
self.weekday is None and |
|||
self.hour is None and |
|||
self.minute is None and |
|||
self.second is None and |
|||
self.microsecond is None) |
|||
# Compatibility with Python 2.x |
|||
__nonzero__ = __bool__ |
|||
|
|||
def __mul__(self, other): |
|||
try: |
|||
f = float(other) |
|||
except TypeError: |
|||
return NotImplemented |
|||
|
|||
return self.__class__(years=int(self.years * f), |
|||
months=int(self.months * f), |
|||
days=int(self.days * f), |
|||
hours=int(self.hours * f), |
|||
minutes=int(self.minutes * f), |
|||
seconds=int(self.seconds * f), |
|||
microseconds=int(self.microseconds * f), |
|||
leapdays=self.leapdays, |
|||
year=self.year, |
|||
month=self.month, |
|||
day=self.day, |
|||
weekday=self.weekday, |
|||
hour=self.hour, |
|||
minute=self.minute, |
|||
second=self.second, |
|||
microsecond=self.microsecond) |
|||
|
|||
__rmul__ = __mul__ |
|||
|
|||
def __eq__(self, other): |
|||
if not isinstance(other, relativedelta): |
|||
return NotImplemented |
|||
if self.weekday or other.weekday: |
|||
if not self.weekday or not other.weekday: |
|||
return False |
|||
if self.weekday.weekday != other.weekday.weekday: |
|||
return False |
|||
n1, n2 = self.weekday.n, other.weekday.n |
|||
if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): |
|||
return False |
|||
return (self.years == other.years and |
|||
self.months == other.months and |
|||
self.days == other.days and |
|||
self.hours == other.hours and |
|||
self.minutes == other.minutes and |
|||
self.seconds == other.seconds and |
|||
self.microseconds == other.microseconds and |
|||
self.leapdays == other.leapdays and |
|||
self.year == other.year and |
|||
self.month == other.month and |
|||
self.day == other.day and |
|||
self.hour == other.hour and |
|||
self.minute == other.minute and |
|||
self.second == other.second and |
|||
self.microsecond == other.microsecond) |
|||
|
|||
def __hash__(self): |
|||
return hash(( |
|||
self.weekday, |
|||
self.years, |
|||
self.months, |
|||
self.days, |
|||
self.hours, |
|||
self.minutes, |
|||
self.seconds, |
|||
self.microseconds, |
|||
self.leapdays, |
|||
self.year, |
|||
self.month, |
|||
self.day, |
|||
self.hour, |
|||
self.minute, |
|||
self.second, |
|||
self.microsecond, |
|||
)) |
|||
|
|||
def __ne__(self, other): |
|||
return not self.__eq__(other) |
|||
|
|||
def __div__(self, other): |
|||
try: |
|||
reciprocal = 1 / float(other) |
|||
except TypeError: |
|||
return NotImplemented |
|||
|
|||
return self.__mul__(reciprocal) |
|||
|
|||
__truediv__ = __div__ |
|||
|
|||
def __repr__(self): |
|||
l = [] |
|||
for attr in ["years", "months", "days", "leapdays", |
|||
"hours", "minutes", "seconds", "microseconds"]: |
|||
value = getattr(self, attr) |
|||
if value: |
|||
l.append("{attr}={value:+g}".format(attr=attr, value=value)) |
|||
for attr in ["year", "month", "day", "weekday", |
|||
"hour", "minute", "second", "microsecond"]: |
|||
value = getattr(self, attr) |
|||
if value is not None: |
|||
l.append("{attr}={value}".format(attr=attr, value=repr(value))) |
|||
return "{classname}({attrs})".format(classname=self.__class__.__name__, |
|||
attrs=", ".join(l)) |
|||
|
|||
|
|||
def _sign(x): |
|||
return int(copysign(1, x)) |
|||
|
|||
# vim:ts=4:sw=4:et |
File diff suppressed because it is too large
@ -0,0 +1,12 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from .tz import * |
|||
from .tz import __doc__ |
|||
|
|||
__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", |
|||
"tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", |
|||
"enfold", "datetime_ambiguous", "datetime_exists", |
|||
"resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] |
|||
|
|||
|
|||
class DeprecatedTzFormatWarning(Warning): |
|||
"""Warning raised when time zones are parsed from deprecated formats.""" |
@ -0,0 +1,419 @@ |
|||
from six import PY2 |
|||
|
|||
from functools import wraps |
|||
|
|||
from datetime import datetime, timedelta, tzinfo |
|||
|
|||
|
|||
ZERO = timedelta(0) |
|||
|
|||
__all__ = ['tzname_in_python2', 'enfold'] |
|||
|
|||
|
|||
def tzname_in_python2(namefunc): |
|||
"""Change unicode output into bytestrings in Python 2 |
|||
|
|||
tzname() API changed in Python 3. It used to return bytes, but was changed |
|||
to unicode strings |
|||
""" |
|||
if PY2: |
|||
@wraps(namefunc) |
|||
def adjust_encoding(*args, **kwargs): |
|||
name = namefunc(*args, **kwargs) |
|||
if name is not None: |
|||
name = name.encode() |
|||
|
|||
return name |
|||
|
|||
return adjust_encoding |
|||
else: |
|||
return namefunc |
|||
|
|||
|
|||
# The following is adapted from Alexander Belopolsky's tz library |
|||
# https://github.com/abalkin/tz |
|||
if hasattr(datetime, 'fold'): |
|||
# This is the pre-python 3.6 fold situation |
|||
def enfold(dt, fold=1): |
|||
""" |
|||
Provides a unified interface for assigning the ``fold`` attribute to |
|||
datetimes both before and after the implementation of PEP-495. |
|||
|
|||
:param fold: |
|||
The value for the ``fold`` attribute in the returned datetime. This |
|||
should be either 0 or 1. |
|||
|
|||
:return: |
|||
Returns an object for which ``getattr(dt, 'fold', 0)`` returns |
|||
``fold`` for all versions of Python. In versions prior to |
|||
Python 3.6, this is a ``_DatetimeWithFold`` object, which is a |
|||
subclass of :py:class:`datetime.datetime` with the ``fold`` |
|||
attribute added, if ``fold`` is 1. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
""" |
|||
return dt.replace(fold=fold) |
|||
|
|||
else: |
|||
class _DatetimeWithFold(datetime): |
|||
""" |
|||
This is a class designed to provide a PEP 495-compliant interface for |
|||
Python versions before 3.6. It is used only for dates in a fold, so |
|||
the ``fold`` attribute is fixed at ``1``. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
""" |
|||
__slots__ = () |
|||
|
|||
def replace(self, *args, **kwargs): |
|||
""" |
|||
Return a datetime with the same attributes, except for those |
|||
attributes given new values by whichever keyword arguments are |
|||
specified. Note that tzinfo=None can be specified to create a naive |
|||
datetime from an aware datetime with no conversion of date and time |
|||
data. |
|||
|
|||
This is reimplemented in ``_DatetimeWithFold`` because pypy3 will |
|||
return a ``datetime.datetime`` even if ``fold`` is unchanged. |
|||
""" |
|||
argnames = ( |
|||
'year', 'month', 'day', 'hour', 'minute', 'second', |
|||
'microsecond', 'tzinfo' |
|||
) |
|||
|
|||
for arg, argname in zip(args, argnames): |
|||
if argname in kwargs: |
|||
raise TypeError('Duplicate argument: {}'.format(argname)) |
|||
|
|||
kwargs[argname] = arg |
|||
|
|||
for argname in argnames: |
|||
if argname not in kwargs: |
|||
kwargs[argname] = getattr(self, argname) |
|||
|
|||
dt_class = self.__class__ if kwargs.get('fold', 1) else datetime |
|||
|
|||
return dt_class(**kwargs) |
|||
|
|||
@property |
|||
def fold(self): |
|||
return 1 |
|||
|
|||
def enfold(dt, fold=1): |
|||
""" |
|||
Provides a unified interface for assigning the ``fold`` attribute to |
|||
datetimes both before and after the implementation of PEP-495. |
|||
|
|||
:param fold: |
|||
The value for the ``fold`` attribute in the returned datetime. This |
|||
should be either 0 or 1. |
|||
|
|||
:return: |
|||
Returns an object for which ``getattr(dt, 'fold', 0)`` returns |
|||
``fold`` for all versions of Python. In versions prior to |
|||
Python 3.6, this is a ``_DatetimeWithFold`` object, which is a |
|||
subclass of :py:class:`datetime.datetime` with the ``fold`` |
|||
attribute added, if ``fold`` is 1. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
""" |
|||
if getattr(dt, 'fold', 0) == fold: |
|||
return dt |
|||
|
|||
args = dt.timetuple()[:6] |
|||
args += (dt.microsecond, dt.tzinfo) |
|||
|
|||
if fold: |
|||
return _DatetimeWithFold(*args) |
|||
else: |
|||
return datetime(*args) |
|||
|
|||
|
|||
def _validate_fromutc_inputs(f): |
|||
""" |
|||
The CPython version of ``fromutc`` checks that the input is a ``datetime`` |
|||
object and that ``self`` is attached as its ``tzinfo``. |
|||
""" |
|||
@wraps(f) |
|||
def fromutc(self, dt): |
|||
if not isinstance(dt, datetime): |
|||
raise TypeError("fromutc() requires a datetime argument") |
|||
if dt.tzinfo is not self: |
|||
raise ValueError("dt.tzinfo is not self") |
|||
|
|||
return f(self, dt) |
|||
|
|||
return fromutc |
|||
|
|||
|
|||
class _tzinfo(tzinfo): |
|||
""" |
|||
Base class for all ``dateutil`` ``tzinfo`` objects. |
|||
""" |
|||
|
|||
def is_ambiguous(self, dt): |
|||
""" |
|||
Whether or not the "wall time" of a given datetime is ambiguous in this |
|||
zone. |
|||
|
|||
:param dt: |
|||
A :py:class:`datetime.datetime`, naive or time zone aware. |
|||
|
|||
|
|||
:return: |
|||
Returns ``True`` if ambiguous, ``False`` otherwise. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
""" |
|||
|
|||
dt = dt.replace(tzinfo=self) |
|||
|
|||
wall_0 = enfold(dt, fold=0) |
|||
wall_1 = enfold(dt, fold=1) |
|||
|
|||
same_offset = wall_0.utcoffset() == wall_1.utcoffset() |
|||
same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) |
|||
|
|||
return same_dt and not same_offset |
|||
|
|||
def _fold_status(self, dt_utc, dt_wall): |
|||
""" |
|||
Determine the fold status of a "wall" datetime, given a representation |
|||
of the same datetime as a (naive) UTC datetime. This is calculated based |
|||
on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all |
|||
datetimes, and that this offset is the actual number of hours separating |
|||
``dt_utc`` and ``dt_wall``. |
|||
|
|||
:param dt_utc: |
|||
Representation of the datetime as UTC |
|||
|
|||
:param dt_wall: |
|||
Representation of the datetime as "wall time". This parameter must |
|||
either have a `fold` attribute or have a fold-naive |
|||
:class:`datetime.tzinfo` attached, otherwise the calculation may |
|||
fail. |
|||
""" |
|||
if self.is_ambiguous(dt_wall): |
|||
delta_wall = dt_wall - dt_utc |
|||
_fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) |
|||
else: |
|||
_fold = 0 |
|||
|
|||
return _fold |
|||
|
|||
def _fold(self, dt): |
|||
return getattr(dt, 'fold', 0) |
|||
|
|||
def _fromutc(self, dt): |
|||
""" |
|||
Given a timezone-aware datetime in a given timezone, calculates a |
|||
timezone-aware datetime in a new timezone. |
|||
|
|||
Since this is the one time that we *know* we have an unambiguous |
|||
datetime object, we take this opportunity to determine whether the |
|||
datetime is ambiguous and in a "fold" state (e.g. if it's the first |
|||
occurrence, chronologically, of the ambiguous datetime). |
|||
|
|||
:param dt: |
|||
A timezone-aware :class:`datetime.datetime` object. |
|||
""" |
|||
|
|||
# Re-implement the algorithm from Python's datetime.py |
|||
dtoff = dt.utcoffset() |
|||
if dtoff is None: |
|||
raise ValueError("fromutc() requires a non-None utcoffset() " |
|||
"result") |
|||
|
|||
# The original datetime.py code assumes that `dst()` defaults to |
|||
# zero during ambiguous times. PEP 495 inverts this presumption, so |
|||
# for pre-PEP 495 versions of python, we need to tweak the algorithm. |
|||
dtdst = dt.dst() |
|||
if dtdst is None: |
|||
raise ValueError("fromutc() requires a non-None dst() result") |
|||
delta = dtoff - dtdst |
|||
|
|||
dt += delta |
|||
# Set fold=1 so we can default to being in the fold for |
|||
# ambiguous dates. |
|||
dtdst = enfold(dt, fold=1).dst() |
|||
if dtdst is None: |
|||
raise ValueError("fromutc(): dt.dst gave inconsistent " |
|||
"results; cannot convert") |
|||
return dt + dtdst |
|||
|
|||
@_validate_fromutc_inputs |
|||
def fromutc(self, dt): |
|||
""" |
|||
Given a timezone-aware datetime in a given timezone, calculates a |
|||
timezone-aware datetime in a new timezone. |
|||
|
|||
Since this is the one time that we *know* we have an unambiguous |
|||
datetime object, we take this opportunity to determine whether the |
|||
datetime is ambiguous and in a "fold" state (e.g. if it's the first |
|||
occurrence, chronologically, of the ambiguous datetime). |
|||
|
|||
:param dt: |
|||
A timezone-aware :class:`datetime.datetime` object. |
|||
""" |
|||
dt_wall = self._fromutc(dt) |
|||
|
|||
# Calculate the fold status given the two datetimes. |
|||
_fold = self._fold_status(dt, dt_wall) |
|||
|
|||
# Set the default fold value for ambiguous dates |
|||
return enfold(dt_wall, fold=_fold) |
|||
|
|||
|
|||
class tzrangebase(_tzinfo): |
|||
""" |
|||
This is an abstract base class for time zones represented by an annual |
|||
transition into and out of DST. Child classes should implement the following |
|||
methods: |
|||
|
|||
* ``__init__(self, *args, **kwargs)`` |
|||
* ``transitions(self, year)`` - this is expected to return a tuple of |
|||
datetimes representing the DST on and off transitions in standard |
|||
time. |
|||
|
|||
A fully initialized ``tzrangebase`` subclass should also provide the |
|||
following attributes: |
|||
* ``hasdst``: Boolean whether or not the zone uses DST. |
|||
* ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects |
|||
representing the respective UTC offsets. |
|||
* ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short |
|||
abbreviations in DST and STD, respectively. |
|||
* ``_hasdst``: Whether or not the zone has DST. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
""" |
|||
def __init__(self): |
|||
raise NotImplementedError('tzrangebase is an abstract base class') |
|||
|
|||
def utcoffset(self, dt): |
|||
isdst = self._isdst(dt) |
|||
|
|||
if isdst is None: |
|||
return None |
|||
elif isdst: |
|||
return self._dst_offset |
|||
else: |
|||
return self._std_offset |
|||
|
|||
def dst(self, dt): |
|||
isdst = self._isdst(dt) |
|||
|
|||
if isdst is None: |
|||
return None |
|||
elif isdst: |
|||
return self._dst_base_offset |
|||
else: |
|||
return ZERO |
|||
|
|||
@tzname_in_python2 |
|||
def tzname(self, dt): |
|||
if self._isdst(dt): |
|||
return self._dst_abbr |
|||
else: |
|||
return self._std_abbr |
|||
|
|||
def fromutc(self, dt): |
|||
""" Given a datetime in UTC, return local time """ |
|||
if not isinstance(dt, datetime): |
|||
raise TypeError("fromutc() requires a datetime argument") |
|||
|
|||
if dt.tzinfo is not self: |
|||
raise ValueError("dt.tzinfo is not self") |
|||
|
|||
# Get transitions - if there are none, fixed offset |
|||
transitions = self.transitions(dt.year) |
|||
if transitions is None: |
|||
return dt + self.utcoffset(dt) |
|||
|
|||
# Get the transition times in UTC |
|||
dston, dstoff = transitions |
|||
|
|||
dston -= self._std_offset |
|||
dstoff -= self._std_offset |
|||
|
|||
utc_transitions = (dston, dstoff) |
|||
dt_utc = dt.replace(tzinfo=None) |
|||
|
|||
isdst = self._naive_isdst(dt_utc, utc_transitions) |
|||
|
|||
if isdst: |
|||
dt_wall = dt + self._dst_offset |
|||
else: |
|||
dt_wall = dt + self._std_offset |
|||
|
|||
_fold = int(not isdst and self.is_ambiguous(dt_wall)) |
|||
|
|||
return enfold(dt_wall, fold=_fold) |
|||
|
|||
def is_ambiguous(self, dt): |
|||
""" |
|||
Whether or not the "wall time" of a given datetime is ambiguous in this |
|||
zone. |
|||
|
|||
:param dt: |
|||
A :py:class:`datetime.datetime`, naive or time zone aware. |
|||
|
|||
|
|||
:return: |
|||
Returns ``True`` if ambiguous, ``False`` otherwise. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
""" |
|||
if not self.hasdst: |
|||
return False |
|||
|
|||
start, end = self.transitions(dt.year) |
|||
|
|||
dt = dt.replace(tzinfo=None) |
|||
return (end <= dt < end + self._dst_base_offset) |
|||
|
|||
def _isdst(self, dt): |
|||
if not self.hasdst: |
|||
return False |
|||
elif dt is None: |
|||
return None |
|||
|
|||
transitions = self.transitions(dt.year) |
|||
|
|||
if transitions is None: |
|||
return False |
|||
|
|||
dt = dt.replace(tzinfo=None) |
|||
|
|||
isdst = self._naive_isdst(dt, transitions) |
|||
|
|||
# Handle ambiguous dates |
|||
if not isdst and self.is_ambiguous(dt): |
|||
return not self._fold(dt) |
|||
else: |
|||
return isdst |
|||
|
|||
def _naive_isdst(self, dt, transitions): |
|||
dston, dstoff = transitions |
|||
|
|||
dt = dt.replace(tzinfo=None) |
|||
|
|||
if dston < dstoff: |
|||
isdst = dston <= dt < dstoff |
|||
else: |
|||
isdst = not dstoff <= dt < dston |
|||
|
|||
return isdst |
|||
|
|||
@property |
|||
def _dst_base_offset(self): |
|||
return self._dst_offset - self._std_offset |
|||
|
|||
__hash__ = None |
|||
|
|||
def __ne__(self, other): |
|||
return not (self == other) |
|||
|
|||
def __repr__(self): |
|||
return "%s(...)" % self.__class__.__name__ |
|||
|
|||
__reduce__ = object.__reduce__ |
@ -0,0 +1,80 @@ |
|||
from datetime import timedelta |
|||
import weakref |
|||
from collections import OrderedDict |
|||
|
|||
from six.moves import _thread |
|||
|
|||
|
|||
class _TzSingleton(type): |
|||
def __init__(cls, *args, **kwargs): |
|||
cls.__instance = None |
|||
super(_TzSingleton, cls).__init__(*args, **kwargs) |
|||
|
|||
def __call__(cls): |
|||
if cls.__instance is None: |
|||
cls.__instance = super(_TzSingleton, cls).__call__() |
|||
return cls.__instance |
|||
|
|||
|
|||
class _TzFactory(type): |
|||
def instance(cls, *args, **kwargs): |
|||
"""Alternate constructor that returns a fresh instance""" |
|||
return type.__call__(cls, *args, **kwargs) |
|||
|
|||
|
|||
class _TzOffsetFactory(_TzFactory): |
|||
def __init__(cls, *args, **kwargs): |
|||
cls.__instances = weakref.WeakValueDictionary() |
|||
cls.__strong_cache = OrderedDict() |
|||
cls.__strong_cache_size = 8 |
|||
|
|||
cls._cache_lock = _thread.allocate_lock() |
|||
|
|||
def __call__(cls, name, offset): |
|||
if isinstance(offset, timedelta): |
|||
key = (name, offset.total_seconds()) |
|||
else: |
|||
key = (name, offset) |
|||
|
|||
instance = cls.__instances.get(key, None) |
|||
if instance is None: |
|||
instance = cls.__instances.setdefault(key, |
|||
cls.instance(name, offset)) |
|||
|
|||
# This lock may not be necessary in Python 3. See GH issue #901 |
|||
with cls._cache_lock: |
|||
cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) |
|||
|
|||
# Remove an item if the strong cache is overpopulated |
|||
if len(cls.__strong_cache) > cls.__strong_cache_size: |
|||
cls.__strong_cache.popitem(last=False) |
|||
|
|||
return instance |
|||
|
|||
|
|||
class _TzStrFactory(_TzFactory): |
|||
def __init__(cls, *args, **kwargs): |
|||
cls.__instances = weakref.WeakValueDictionary() |
|||
cls.__strong_cache = OrderedDict() |
|||
cls.__strong_cache_size = 8 |
|||
|
|||
cls.__cache_lock = _thread.allocate_lock() |
|||
|
|||
def __call__(cls, s, posix_offset=False): |
|||
key = (s, posix_offset) |
|||
instance = cls.__instances.get(key, None) |
|||
|
|||
if instance is None: |
|||
instance = cls.__instances.setdefault(key, |
|||
cls.instance(s, posix_offset)) |
|||
|
|||
# This lock may not be necessary in Python 3. See GH issue #901 |
|||
with cls.__cache_lock: |
|||
cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) |
|||
|
|||
# Remove an item if the strong cache is overpopulated |
|||
if len(cls.__strong_cache) > cls.__strong_cache_size: |
|||
cls.__strong_cache.popitem(last=False) |
|||
|
|||
return instance |
|||
|
File diff suppressed because it is too large
@ -0,0 +1,370 @@ |
|||
# -*- coding: utf-8 -*- |
|||
""" |
|||
This module provides an interface to the native time zone data on Windows, |
|||
including :py:class:`datetime.tzinfo` implementations. |
|||
|
|||
Attempting to import this module on a non-Windows platform will raise an |
|||
:py:obj:`ImportError`. |
|||
""" |
|||
# This code was originally contributed by Jeffrey Harris. |
|||
import datetime |
|||
import struct |
|||
|
|||
from six.moves import winreg |
|||
from six import text_type |
|||
|
|||
try: |
|||
import ctypes |
|||
from ctypes import wintypes |
|||
except ValueError: |
|||
# ValueError is raised on non-Windows systems for some horrible reason. |
|||
raise ImportError("Running tzwin on non-Windows system") |
|||
|
|||
from ._common import tzrangebase |
|||
|
|||
__all__ = ["tzwin", "tzwinlocal", "tzres"] |
|||
|
|||
ONEWEEK = datetime.timedelta(7) |
|||
|
|||
TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" |
|||
TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" |
|||
TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" |
|||
|
|||
|
|||
def _settzkeyname(): |
|||
handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) |
|||
try: |
|||
winreg.OpenKey(handle, TZKEYNAMENT).Close() |
|||
TZKEYNAME = TZKEYNAMENT |
|||
except WindowsError: |
|||
TZKEYNAME = TZKEYNAME9X |
|||
handle.Close() |
|||
return TZKEYNAME |
|||
|
|||
|
|||
TZKEYNAME = _settzkeyname() |
|||
|
|||
|
|||
class tzres(object): |
|||
""" |
|||
Class for accessing ``tzres.dll``, which contains timezone name related |
|||
resources. |
|||
|
|||
.. versionadded:: 2.5.0 |
|||
""" |
|||
p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char |
|||
|
|||
def __init__(self, tzres_loc='tzres.dll'): |
|||
# Load the user32 DLL so we can load strings from tzres |
|||
user32 = ctypes.WinDLL('user32') |
|||
|
|||
# Specify the LoadStringW function |
|||
user32.LoadStringW.argtypes = (wintypes.HINSTANCE, |
|||
wintypes.UINT, |
|||
wintypes.LPWSTR, |
|||
ctypes.c_int) |
|||
|
|||
self.LoadStringW = user32.LoadStringW |
|||
self._tzres = ctypes.WinDLL(tzres_loc) |
|||
self.tzres_loc = tzres_loc |
|||
|
|||
def load_name(self, offset): |
|||
""" |
|||
Load a timezone name from a DLL offset (integer). |
|||
|
|||
>>> from dateutil.tzwin import tzres |
|||
>>> tzr = tzres() |
|||
>>> print(tzr.load_name(112)) |
|||
'Eastern Standard Time' |
|||
|
|||
:param offset: |
|||
A positive integer value referring to a string from the tzres dll. |
|||
|
|||
.. note:: |
|||
|
|||
Offsets found in the registry are generally of the form |
|||
``@tzres.dll,-114``. The offset in this case is 114, not -114. |
|||
|
|||
""" |
|||
resource = self.p_wchar() |
|||
lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) |
|||
nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) |
|||
return resource[:nchar] |
|||
|
|||
def name_from_string(self, tzname_str): |
|||
""" |
|||
Parse strings as returned from the Windows registry into the time zone |
|||
name as defined in the registry. |
|||
|
|||
>>> from dateutil.tzwin import tzres |
|||
>>> tzr = tzres() |
|||
>>> print(tzr.name_from_string('@tzres.dll,-251')) |
|||
'Dateline Daylight Time' |
|||
>>> print(tzr.name_from_string('Eastern Standard Time')) |
|||
'Eastern Standard Time' |
|||
|
|||
:param tzname_str: |
|||
A timezone name string as returned from a Windows registry key. |
|||
|
|||
:return: |
|||
Returns the localized timezone string from tzres.dll if the string |
|||
is of the form `@tzres.dll,-offset`, else returns the input string. |
|||
""" |
|||
if not tzname_str.startswith('@'): |
|||
return tzname_str |
|||
|
|||
name_splt = tzname_str.split(',-') |
|||
try: |
|||
offset = int(name_splt[1]) |
|||
except: |
|||
raise ValueError("Malformed timezone string.") |
|||
|
|||
return self.load_name(offset) |
|||
|
|||
|
|||
class tzwinbase(tzrangebase): |
|||
"""tzinfo class based on win32's timezones available in the registry.""" |
|||
def __init__(self): |
|||
raise NotImplementedError('tzwinbase is an abstract base class') |
|||
|
|||
def __eq__(self, other): |
|||
# Compare on all relevant dimensions, including name. |
|||
if not isinstance(other, tzwinbase): |
|||
return NotImplemented |
|||
|
|||
return (self._std_offset == other._std_offset and |
|||
self._dst_offset == other._dst_offset and |
|||
self._stddayofweek == other._stddayofweek and |
|||
self._dstdayofweek == other._dstdayofweek and |
|||
self._stdweeknumber == other._stdweeknumber and |
|||
self._dstweeknumber == other._dstweeknumber and |
|||
self._stdhour == other._stdhour and |
|||
self._dsthour == other._dsthour and |
|||
self._stdminute == other._stdminute and |
|||
self._dstminute == other._dstminute and |
|||
self._std_abbr == other._std_abbr and |
|||
self._dst_abbr == other._dst_abbr) |
|||
|
|||
@staticmethod |
|||
def list(): |
|||
"""Return a list of all time zones known to the system.""" |
|||
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: |
|||
with winreg.OpenKey(handle, TZKEYNAME) as tzkey: |
|||
result = [winreg.EnumKey(tzkey, i) |
|||
for i in range(winreg.QueryInfoKey(tzkey)[0])] |
|||
return result |
|||
|
|||
def display(self): |
|||
""" |
|||
Return the display name of the time zone. |
|||
""" |
|||
return self._display |
|||
|
|||
def transitions(self, year): |
|||
""" |
|||
For a given year, get the DST on and off transition times, expressed |
|||
always on the standard time side. For zones with no transitions, this |
|||
function returns ``None``. |
|||
|
|||
:param year: |
|||
The year whose transitions you would like to query. |
|||
|
|||
:return: |
|||
Returns a :class:`tuple` of :class:`datetime.datetime` objects, |
|||
``(dston, dstoff)`` for zones with an annual DST transition, or |
|||
``None`` for fixed offset zones. |
|||
""" |
|||
|
|||
if not self.hasdst: |
|||
return None |
|||
|
|||
dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, |
|||
self._dsthour, self._dstminute, |
|||
self._dstweeknumber) |
|||
|
|||
dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, |
|||
self._stdhour, self._stdminute, |
|||
self._stdweeknumber) |
|||
|
|||
# Ambiguous dates default to the STD side |
|||
dstoff -= self._dst_base_offset |
|||
|
|||
return dston, dstoff |
|||
|
|||
def _get_hasdst(self): |
|||
return self._dstmonth != 0 |
|||
|
|||
@property |
|||
def _dst_base_offset(self): |
|||
return self._dst_base_offset_ |
|||
|
|||
|
|||
class tzwin(tzwinbase): |
|||
""" |
|||
Time zone object created from the zone info in the Windows registry |
|||
|
|||
These are similar to :py:class:`dateutil.tz.tzrange` objects in that |
|||
the time zone data is provided in the format of a single offset rule |
|||
for either 0 or 2 time zone transitions per year. |
|||
|
|||
:param: name |
|||
The name of a Windows time zone key, e.g. "Eastern Standard Time". |
|||
The full list of keys can be retrieved with :func:`tzwin.list`. |
|||
""" |
|||
|
|||
def __init__(self, name): |
|||
self._name = name |
|||
|
|||
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: |
|||
tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) |
|||
with winreg.OpenKey(handle, tzkeyname) as tzkey: |
|||
keydict = valuestodict(tzkey) |
|||
|
|||
self._std_abbr = keydict["Std"] |
|||
self._dst_abbr = keydict["Dlt"] |
|||
|
|||
self._display = keydict["Display"] |
|||
|
|||
# See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm |
|||
tup = struct.unpack("=3l16h", keydict["TZI"]) |
|||
stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 |
|||
dstoffset = stdoffset-tup[2] # + DaylightBias * -1 |
|||
self._std_offset = datetime.timedelta(minutes=stdoffset) |
|||
self._dst_offset = datetime.timedelta(minutes=dstoffset) |
|||
|
|||
# for the meaning see the win32 TIME_ZONE_INFORMATION structure docs |
|||
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx |
|||
(self._stdmonth, |
|||
self._stddayofweek, # Sunday = 0 |
|||
self._stdweeknumber, # Last = 5 |
|||
self._stdhour, |
|||
self._stdminute) = tup[4:9] |
|||
|
|||
(self._dstmonth, |
|||
self._dstdayofweek, # Sunday = 0 |
|||
self._dstweeknumber, # Last = 5 |
|||
self._dsthour, |
|||
self._dstminute) = tup[12:17] |
|||
|
|||
self._dst_base_offset_ = self._dst_offset - self._std_offset |
|||
self.hasdst = self._get_hasdst() |
|||
|
|||
def __repr__(self): |
|||
return "tzwin(%s)" % repr(self._name) |
|||
|
|||
def __reduce__(self): |
|||
return (self.__class__, (self._name,)) |
|||
|
|||
|
|||
class tzwinlocal(tzwinbase): |
|||
""" |
|||
Class representing the local time zone information in the Windows registry |
|||
|
|||
While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` |
|||
module) to retrieve time zone information, ``tzwinlocal`` retrieves the |
|||
rules directly from the Windows registry and creates an object like |
|||
:class:`dateutil.tz.tzwin`. |
|||
|
|||
Because Windows does not have an equivalent of :func:`time.tzset`, on |
|||
Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the |
|||
time zone settings *at the time that the process was started*, meaning |
|||
changes to the machine's time zone settings during the run of a program |
|||
on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. |
|||
Because ``tzwinlocal`` reads the registry directly, it is unaffected by |
|||
this issue. |
|||
""" |
|||
def __init__(self): |
|||
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: |
|||
with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: |
|||
keydict = valuestodict(tzlocalkey) |
|||
|
|||
self._std_abbr = keydict["StandardName"] |
|||
self._dst_abbr = keydict["DaylightName"] |
|||
|
|||
try: |
|||
tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, |
|||
sn=self._std_abbr) |
|||
with winreg.OpenKey(handle, tzkeyname) as tzkey: |
|||
_keydict = valuestodict(tzkey) |
|||
self._display = _keydict["Display"] |
|||
except OSError: |
|||
self._display = None |
|||
|
|||
stdoffset = -keydict["Bias"]-keydict["StandardBias"] |
|||
dstoffset = stdoffset-keydict["DaylightBias"] |
|||
|
|||
self._std_offset = datetime.timedelta(minutes=stdoffset) |
|||
self._dst_offset = datetime.timedelta(minutes=dstoffset) |
|||
|
|||
# For reasons unclear, in this particular key, the day of week has been |
|||
# moved to the END of the SYSTEMTIME structure. |
|||
tup = struct.unpack("=8h", keydict["StandardStart"]) |
|||
|
|||
(self._stdmonth, |
|||
self._stdweeknumber, # Last = 5 |
|||
self._stdhour, |
|||
self._stdminute) = tup[1:5] |
|||
|
|||
self._stddayofweek = tup[7] |
|||
|
|||
tup = struct.unpack("=8h", keydict["DaylightStart"]) |
|||
|
|||
(self._dstmonth, |
|||
self._dstweeknumber, # Last = 5 |
|||
self._dsthour, |
|||
self._dstminute) = tup[1:5] |
|||
|
|||
self._dstdayofweek = tup[7] |
|||
|
|||
self._dst_base_offset_ = self._dst_offset - self._std_offset |
|||
self.hasdst = self._get_hasdst() |
|||
|
|||
def __repr__(self): |
|||
return "tzwinlocal()" |
|||
|
|||
def __str__(self): |
|||
# str will return the standard name, not the daylight name. |
|||
return "tzwinlocal(%s)" % repr(self._std_abbr) |
|||
|
|||
def __reduce__(self): |
|||
return (self.__class__, ()) |
|||
|
|||
|
|||
def picknthweekday(year, month, dayofweek, hour, minute, whichweek): |
|||
""" dayofweek == 0 means Sunday, whichweek 5 means last instance """ |
|||
first = datetime.datetime(year, month, 1, hour, minute) |
|||
|
|||
# This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), |
|||
# Because 7 % 7 = 0 |
|||
weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) |
|||
wd = weekdayone + ((whichweek - 1) * ONEWEEK) |
|||
if (wd.month != month): |
|||
wd -= ONEWEEK |
|||
|
|||
return wd |
|||
|
|||
|
|||
def valuestodict(key): |
|||
"""Convert a registry key's values to a dictionary.""" |
|||
dout = {} |
|||
size = winreg.QueryInfoKey(key)[1] |
|||
tz_res = None |
|||
|
|||
for i in range(size): |
|||
key_name, value, dtype = winreg.EnumValue(key, i) |
|||
if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: |
|||
# If it's a DWORD (32-bit integer), it's stored as unsigned - convert |
|||
# that to a proper signed integer |
|||
if value & (1 << 31): |
|||
value = value - (1 << 32) |
|||
elif dtype == winreg.REG_SZ: |
|||
# If it's a reference to the tzres DLL, load the actual string |
|||
if value.startswith('@tzres'): |
|||
tz_res = tz_res or tzres() |
|||
value = tz_res.name_from_string(value) |
|||
|
|||
value = value.rstrip('\x00') # Remove trailing nulls |
|||
|
|||
dout[key_name] = value |
|||
|
|||
return dout |
@ -0,0 +1,2 @@ |
|||
# tzwin has moved to dateutil.tz.win |
|||
from .tz.win import * |
@ -0,0 +1,71 @@ |
|||
# -*- coding: utf-8 -*- |
|||
""" |
|||
This module offers general convenience and utility functions for dealing with |
|||
datetimes. |
|||
|
|||
.. versionadded:: 2.7.0 |
|||
""" |
|||
from __future__ import unicode_literals |
|||
|
|||
from datetime import datetime, time |
|||
|
|||
|
|||
def today(tzinfo=None): |
|||
""" |
|||
Returns a :py:class:`datetime` representing the current day at midnight |
|||
|
|||
:param tzinfo: |
|||
The time zone to attach (also used to determine the current day). |
|||
|
|||
:return: |
|||
A :py:class:`datetime.datetime` object representing the current day |
|||
at midnight. |
|||
""" |
|||
|
|||
dt = datetime.now(tzinfo) |
|||
return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) |
|||
|
|||
|
|||
def default_tzinfo(dt, tzinfo): |
|||
""" |
|||
Sets the ``tzinfo`` parameter on naive datetimes only |
|||
|
|||
This is useful for example when you are provided a datetime that may have |
|||
either an implicit or explicit time zone, such as when parsing a time zone |
|||
string. |
|||
|
|||
.. doctest:: |
|||
|
|||
>>> from dateutil.tz import tzoffset |
|||
>>> from dateutil.parser import parse |
|||
>>> from dateutil.utils import default_tzinfo |
|||
>>> dflt_tz = tzoffset("EST", -18000) |
|||
>>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) |
|||
2014-01-01 12:30:00+00:00 |
|||
>>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) |
|||
2014-01-01 12:30:00-05:00 |
|||
|
|||
:param dt: |
|||
The datetime on which to replace the time zone |
|||
|
|||
:param tzinfo: |
|||
The :py:class:`datetime.tzinfo` subclass instance to assign to |
|||
``dt`` if (and only if) it is naive. |
|||
|
|||
:return: |
|||
Returns an aware :py:class:`datetime.datetime`. |
|||
""" |
|||
if dt.tzinfo is not None: |
|||
return dt |
|||
else: |
|||
return dt.replace(tzinfo=tzinfo) |
|||
|
|||
|
|||
def within_delta(dt1, dt2, delta): |
|||
""" |
|||
Useful for comparing two datetimes that may a negilible difference |
|||
to be considered equal. |
|||
""" |
|||
delta = abs(delta) |
|||
difference = dt1 - dt2 |
|||
return -delta <= difference <= delta |
@ -0,0 +1,167 @@ |
|||
# -*- coding: utf-8 -*- |
|||
import warnings |
|||
import json |
|||
|
|||
from tarfile import TarFile |
|||
from pkgutil import get_data |
|||
from io import BytesIO |
|||
|
|||
from dateutil.tz import tzfile as _tzfile |
|||
|
|||
__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] |
|||
|
|||
ZONEFILENAME = "dateutil-zoneinfo.tar.gz" |
|||
METADATA_FN = 'METADATA' |
|||
|
|||
|
|||
class tzfile(_tzfile): |
|||
def __reduce__(self): |
|||
return (gettz, (self._filename,)) |
|||
|
|||
|
|||
def getzoneinfofile_stream(): |
|||
try: |
|||
return BytesIO(get_data(__name__, ZONEFILENAME)) |
|||
except IOError as e: # TODO switch to FileNotFoundError? |
|||
warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) |
|||
return None |
|||
|
|||
|
|||
class ZoneInfoFile(object): |
|||
def __init__(self, zonefile_stream=None): |
|||
if zonefile_stream is not None: |
|||
with TarFile.open(fileobj=zonefile_stream) as tf: |
|||
self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) |
|||
for zf in tf.getmembers() |
|||
if zf.isfile() and zf.name != METADATA_FN} |
|||
# deal with links: They'll point to their parent object. Less |
|||
# waste of memory |
|||
links = {zl.name: self.zones[zl.linkname] |
|||
for zl in tf.getmembers() if |
|||
zl.islnk() or zl.issym()} |
|||
self.zones.update(links) |
|||
try: |
|||
metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) |
|||
metadata_str = metadata_json.read().decode('UTF-8') |
|||
self.metadata = json.loads(metadata_str) |
|||
except KeyError: |
|||
# no metadata in tar file |
|||
self.metadata = None |
|||
else: |
|||
self.zones = {} |
|||
self.metadata = None |
|||
|
|||
def get(self, name, default=None): |
|||
""" |
|||
Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method |
|||
for retrieving zones from the zone dictionary. |
|||
|
|||
:param name: |
|||
The name of the zone to retrieve. (Generally IANA zone names) |
|||
|
|||
:param default: |
|||
The value to return in the event of a missing key. |
|||
|
|||
.. versionadded:: 2.6.0 |
|||
|
|||
""" |
|||
return self.zones.get(name, default) |
|||
|
|||
|
|||
# The current API has gettz as a module function, although in fact it taps into |
|||
# a stateful class. So as a workaround for now, without changing the API, we |
|||
# will create a new "global" class instance the first time a user requests a |
|||
# timezone. Ugly, but adheres to the api. |
|||
# |
|||
# TODO: Remove after deprecation period. |
|||
_CLASS_ZONE_INSTANCE = [] |
|||
|
|||
|
|||
def get_zonefile_instance(new_instance=False): |
|||
""" |
|||
This is a convenience function which provides a :class:`ZoneInfoFile` |
|||
instance using the data provided by the ``dateutil`` package. By default, it |
|||
caches a single instance of the ZoneInfoFile object and returns that. |
|||
|
|||
:param new_instance: |
|||
If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and |
|||
used as the cached instance for the next call. Otherwise, new instances |
|||
are created only as necessary. |
|||
|
|||
:return: |
|||
Returns a :class:`ZoneInfoFile` object. |
|||
|
|||
.. versionadded:: 2.6 |
|||
""" |
|||
if new_instance: |
|||
zif = None |
|||
else: |
|||
zif = getattr(get_zonefile_instance, '_cached_instance', None) |
|||
|
|||
if zif is None: |
|||
zif = ZoneInfoFile(getzoneinfofile_stream()) |
|||
|
|||
get_zonefile_instance._cached_instance = zif |
|||
|
|||
return zif |
|||
|
|||
|
|||
def gettz(name): |
|||
""" |
|||
This retrieves a time zone from the local zoneinfo tarball that is packaged |
|||
with dateutil. |
|||
|
|||
:param name: |
|||
An IANA-style time zone name, as found in the zoneinfo file. |
|||
|
|||
:return: |
|||
Returns a :class:`dateutil.tz.tzfile` time zone object. |
|||
|
|||
.. warning:: |
|||
It is generally inadvisable to use this function, and it is only |
|||
provided for API compatibility with earlier versions. This is *not* |
|||
equivalent to ``dateutil.tz.gettz()``, which selects an appropriate |
|||
time zone based on the inputs, favoring system zoneinfo. This is ONLY |
|||
for accessing the dateutil-specific zoneinfo (which may be out of |
|||
date compared to the system zoneinfo). |
|||
|
|||
.. deprecated:: 2.6 |
|||
If you need to use a specific zoneinfofile over the system zoneinfo, |
|||
instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call |
|||
:func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. |
|||
|
|||
Use :func:`get_zonefile_instance` to retrieve an instance of the |
|||
dateutil-provided zoneinfo. |
|||
""" |
|||
warnings.warn("zoneinfo.gettz() will be removed in future versions, " |
|||
"to use the dateutil-provided zoneinfo files, instantiate a " |
|||
"ZoneInfoFile object and use ZoneInfoFile.zones.get() " |
|||
"instead. See the documentation for details.", |
|||
DeprecationWarning) |
|||
|
|||
if len(_CLASS_ZONE_INSTANCE) == 0: |
|||
_CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) |
|||
return _CLASS_ZONE_INSTANCE[0].zones.get(name) |
|||
|
|||
|
|||
def gettz_db_metadata(): |
|||
""" Get the zonefile metadata |
|||
|
|||
See `zonefile_metadata`_ |
|||
|
|||
:returns: |
|||
A dictionary with the database metadata |
|||
|
|||
.. deprecated:: 2.6 |
|||
See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, |
|||
query the attribute ``zoneinfo.ZoneInfoFile.metadata``. |
|||
""" |
|||
warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " |
|||
"versions, to use the dateutil-provided zoneinfo files, " |
|||
"ZoneInfoFile object and query the 'metadata' attribute " |
|||
"instead. See the documentation for details.", |
|||
DeprecationWarning) |
|||
|
|||
if len(_CLASS_ZONE_INSTANCE) == 0: |
|||
_CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) |
|||
return _CLASS_ZONE_INSTANCE[0].metadata |
Binary file not shown.
@ -0,0 +1,53 @@ |
|||
import logging |
|||
import os |
|||
import tempfile |
|||
import shutil |
|||
import json |
|||
from subprocess import check_call |
|||
from tarfile import TarFile |
|||
|
|||
from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME |
|||
|
|||
|
|||
def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): |
|||
"""Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* |
|||
|
|||
filename is the timezone tarball from ``ftp.iana.org/tz``. |
|||
|
|||
""" |
|||
tmpdir = tempfile.mkdtemp() |
|||
zonedir = os.path.join(tmpdir, "zoneinfo") |
|||
moduledir = os.path.dirname(__file__) |
|||
try: |
|||
with TarFile.open(filename) as tf: |
|||
for name in zonegroups: |
|||
tf.extract(name, tmpdir) |
|||
filepaths = [os.path.join(tmpdir, n) for n in zonegroups] |
|||
try: |
|||
check_call(["zic", "-d", zonedir] + filepaths) |
|||
except OSError as e: |
|||
_print_on_nosuchfile(e) |
|||
raise |
|||
# write metadata file |
|||
with open(os.path.join(zonedir, METADATA_FN), 'w') as f: |
|||
json.dump(metadata, f, indent=4, sort_keys=True) |
|||
target = os.path.join(moduledir, ZONEFILENAME) |
|||
with TarFile.open(target, "w:%s" % format) as tf: |
|||
for entry in os.listdir(zonedir): |
|||
entrypath = os.path.join(zonedir, entry) |
|||
tf.add(entrypath, entry) |
|||
finally: |
|||
shutil.rmtree(tmpdir) |
|||
|
|||
|
|||
def _print_on_nosuchfile(e): |
|||
"""Print helpful troubleshooting message |
|||
|
|||
e is an exception raised by subprocess.check_call() |
|||
|
|||
""" |
|||
if e.errno == 2: |
|||
logging.error( |
|||
"Could not find zic. Perhaps you need to install " |
|||
"libc-bin or some other package that provides it, " |
|||
"or it's not in your PATH?") |
@ -0,0 +1,137 @@ |
|||
================== |
|||
Copying Docutils |
|||
================== |
|||
|
|||
:Author: David Goodger |
|||
:Contact: goodger@python.org |
|||
:Date: $Date: 2015-05-08 17:56:32 +0200 (Fr, 08. Mai 2015) $ |
|||
:Web site: http://docutils.sourceforge.net/ |
|||
:Copyright: This document has been placed in the public domain. |
|||
|
|||
Most of the files included in this project have been placed in the |
|||
public domain, and therefore have no license requirements and no |
|||
restrictions on copying or usage; see the `Public Domain Dedication`_ |
|||
below. There are a few exceptions_, listed below. |
|||
Files in the Sandbox_ are not distributed with Docutils releases and |
|||
may have different license terms. |
|||
|
|||
|
|||
Public Domain Dedication |
|||
======================== |
|||
|
|||
The persons who have associated their work with this project (the |
|||
"Dedicator": David Goodger and the many contributors to the Docutils |
|||
project) hereby dedicate the entire copyright, less the exceptions_ |
|||
listed below, in the work of authorship known as "Docutils" identified |
|||
below (the "Work") to the public domain. |
|||
|
|||
The primary repository for the Work is the Internet World Wide Web |
|||
site <http://docutils.sourceforge.net/>. The Work consists of the |
|||
files within the "docutils" module of the Docutils project Subversion |
|||
repository (Internet host docutils.svn.sourceforge.net, filesystem path |
|||
/svnroot/docutils), whose Internet web interface is located at |
|||
<http://docutils.svn.sourceforge.net/viewvc/docutils/>. Files dedicated to the |
|||
public domain may be identified by the inclusion, near the beginning |
|||
of each file, of a declaration of the form:: |
|||
|
|||
Copyright: This document/module/DTD/stylesheet/file/etc. has been |
|||
placed in the public domain. |
|||
|
|||
Dedicator makes this dedication for the benefit of the public at large |
|||
and to the detriment of Dedicator's heirs and successors. Dedicator |
|||
intends this dedication to be an overt act of relinquishment in |
|||
perpetuity of all present and future rights under copyright law, |
|||
whether vested or contingent, in the Work. Dedicator understands that |
|||
such relinquishment of all rights includes the relinquishment of all |
|||
rights to enforce (by lawsuit or otherwise) those copyrights in the |
|||
Work. |
|||
|
|||
Dedicator recognizes that, once placed in the public domain, the Work |
|||
may be freely reproduced, distributed, transmitted, used, modified, |
|||
built upon, or otherwise exploited by anyone for any purpose, |
|||
commercial or non-commercial, and in any way, including by methods |
|||
that have not yet been invented or conceived. |
|||
|
|||
(This dedication is derived from the text of the `Creative Commons |
|||
Public Domain Dedication`. [#]_) |
|||
|
|||
.. [#] Creative Commons has `retired this legal tool`__ and does not |
|||
recommend that it be applied to works: This tool is based on United |
|||
States law and may not be applicable outside the US. For dedicating new |
|||
works to the public domain, Creative Commons recommend the replacement |
|||
Public Domain Dedication CC0_ (CC zero, "No Rights Reserved"). So does |
|||
the Free Software Foundation in its license-list_. |
|||
|
|||
__ http://creativecommons.org/retiredlicenses |
|||
.. _CC0: http://creativecommons.org/about/cc0 |
|||
|
|||
Exceptions |
|||
========== |
|||
|
|||
The exceptions to the `Public Domain Dedication`_ above are: |
|||
|
|||
* docutils/writers/s5_html/themes/default/iepngfix.htc: |
|||
|
|||
IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull |
|||
<http://www.twinhelix.com>. Free usage permitted as long as |
|||
this notice remains intact. |
|||
|
|||
* docutils/utils/math/__init__.py, |
|||
docutils/utils/math/latex2mathml.py, |
|||
docutils/writers/xetex/__init__.py, |
|||
docutils/writers/latex2e/docutils-05-compat.sty, |
|||
docs/user/docutils-05-compat.sty.txt, |
|||
docutils/utils/error_reporting.py, |
|||
docutils/test/transforms/test_smartquotes.py: |
|||
|
|||
Copyright © Günter Milde. |
|||
Released under the terms of the `2-Clause BSD license`_ |
|||
(`local copy <licenses/BSD-2-Clause.txt>`__). |
|||
|
|||
* docutils/utils/smartquotes.py |
|||
|
|||
Copyright © 2011 Günter Milde, |
|||
based on `SmartyPants`_ © 2003 John Gruber |
|||
(released under a 3-Clause BSD license included in the file) |
|||
and smartypants.py © 2004, 2007 Chad Miller. |
|||
Released under the terms of the `2-Clause BSD license`_ |
|||
(`local copy <licenses/BSD-2-Clause.txt>`__). |
|||
|
|||
.. _SmartyPants: http://daringfireball.net/projects/smartypants/ |
|||
|
|||
* docutils/utils/math/math2html.py, |
|||
docutils/writers/html4css1/math.css |
|||
|
|||
Copyright © Alex Fernández |
|||
These files are part of eLyXer_, released under the `GNU |
|||
General Public License`_ version 3 or later. The author relicensed |
|||
them for Docutils under the terms of the `2-Clause BSD license`_ |
|||
(`local copy <licenses/BSD-2-Clause.txt>`__). |
|||
|
|||
.. _eLyXer: http://www.nongnu.org/elyxer/ |
|||
|
|||
* docutils/utils/roman.py, copyright by Mark Pilgrim, released under the |
|||
`Python 2.1.1 license`_ (`local copy`__). |
|||
|
|||
__ licenses/python-2-1-1.txt |
|||
|
|||
* tools/editors/emacs/rst.el, copyright by Free Software Foundation, |
|||
Inc., released under the `GNU General Public License`_ version 3 or |
|||
later (`local copy`__). |
|||
|
|||
__ licenses/gpl-3-0.txt |
|||
|
|||
The `2-Clause BSD license`_ and the Python licenses are OSI-approved_ |
|||
and GPL-compatible_. |
|||
|
|||
Plaintext versions of all the linked-to licenses are provided in the |
|||
licenses_ directory. |
|||
|
|||
.. _sandbox: http://docutils.sourceforge.net/sandbox/README.html |
|||
.. _licenses: licenses/ |
|||
.. _Python 2.1.1 license: http://www.python.org/2.1.1/license.html |
|||
.. _GNU General Public License: http://www.gnu.org/copyleft/gpl.html |
|||
.. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause |
|||
.. _OSI-approved: http://opensource.org/licenses/ |
|||
.. _license-list: |
|||
.. _GPL-compatible: http://www.gnu.org/licenses/license-list.html |
@ -0,0 +1 @@ |
|||
pip |
@ -0,0 +1,64 @@ |
|||
Metadata-Version: 2.1 |
|||
Name: docutils |
|||
Version: 0.16 |
|||
Summary: Docutils -- Python Documentation Utilities |
|||
Home-page: http://docutils.sourceforge.net/ |
|||
Author: David Goodger |
|||
Author-email: goodger@python.org |
|||
Maintainer: docutils-develop list |
|||
Maintainer-email: docutils-develop@lists.sourceforge.net |
|||
License: public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt) |
|||
Platform: OS-independent |
|||
Classifier: Development Status :: 4 - Beta |
|||
Classifier: Environment :: Console |
|||
Classifier: Intended Audience :: End Users/Desktop |
|||
Classifier: Intended Audience :: Other Audience |
|||
Classifier: Intended Audience :: Developers |
|||
Classifier: Intended Audience :: System Administrators |
|||
Classifier: License :: Public Domain |
|||
Classifier: License :: OSI Approved :: Python Software Foundation License |
|||
Classifier: License :: OSI Approved :: BSD License |
|||
Classifier: License :: OSI Approved :: GNU General Public License (GPL) |
|||
Classifier: Operating System :: OS Independent |
|||
Classifier: Programming Language :: Python :: 2 |
|||
Classifier: Programming Language :: Python :: 2.7 |
|||
Classifier: Programming Language :: Python :: 3 |
|||
Classifier: Programming Language :: Python :: 3.5 |
|||
Classifier: Programming Language :: Python :: 3.6 |
|||
Classifier: Programming Language :: Python :: 3.7 |
|||
Classifier: Topic :: Documentation |
|||
Classifier: Topic :: Software Development :: Documentation |
|||
Classifier: Topic :: Text Processing |
|||
Classifier: Natural Language :: English |
|||
Classifier: Natural Language :: Afrikaans |
|||
Classifier: Natural Language :: Catalan |
|||
Classifier: Natural Language :: Chinese (Simplified) |
|||
Classifier: Natural Language :: Chinese (Traditional) |
|||
Classifier: Natural Language :: Czech |
|||
Classifier: Natural Language :: Danish |
|||
Classifier: Natural Language :: Dutch |
|||
Classifier: Natural Language :: Esperanto |
|||
Classifier: Natural Language :: Finnish |
|||
Classifier: Natural Language :: French |
|||
Classifier: Natural Language :: Galician |
|||
Classifier: Natural Language :: German |
|||
Classifier: Natural Language :: Hebrew |
|||
Classifier: Natural Language :: Italian |
|||
Classifier: Natural Language :: Japanese |
|||
Classifier: Natural Language :: Korean |
|||
Classifier: Natural Language :: Latvian |
|||
Classifier: Natural Language :: Lithuanian |
|||
Classifier: Natural Language :: Persian |
|||
Classifier: Natural Language :: Polish |
|||
Classifier: Natural Language :: Portuguese (Brazilian) |
|||
Classifier: Natural Language :: Russian |
|||
Classifier: Natural Language :: Slovak |
|||
Classifier: Natural Language :: Spanish |
|||
Classifier: Natural Language :: Swedish |
|||
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* |
|||
|
|||
Docutils is a modular system for processing documentation |
|||
into useful formats, such as HTML, XML, and LaTeX. For |
|||
input Docutils supports reStructuredText, an easy-to-read, |
|||
what-you-see-is-what-you-get plaintext markup syntax. |
|||
|
@ -0,0 +1,332 @@ |
|||
../../../bin/__pycache__/rst2html.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2html4.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2html5.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2latex.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2man.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2odt.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2odt_prepstyles.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2pseudoxml.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2s5.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2xetex.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rst2xml.cpython-37.pyc,, |
|||
../../../bin/__pycache__/rstpep2html.cpython-37.pyc,, |
|||
../../../bin/rst2html.py,sha256=_ZSHNn9dmPKAx6L7qZ8XgfPAy3KZv5MNky6n_8V3xiI,584 |
|||
../../../bin/rst2html4.py,sha256=u5YWYGbe9xyegHW30S6gzVpAg8nTI9Xu_ZOeve5CbOo,704 |
|||
../../../bin/rst2html5.py,sha256=_r_cnR_zNKLHiLjSTXDkMBLZskLkxmrPt93InJbhkbA,1127 |
|||
../../../bin/rst2latex.py,sha256=nLGST5HE554VD4EbuhUn2_6kijGgDFcQgOMa4RrFngI,781 |
|||
../../../bin/rst2man.py,sha256=nPtkEv9P7LIoK8GJOeiA66yi1ApVM1gNOFdbOB0CIXM,589 |
|||
../../../bin/rst2odt.py,sha256=iH9HaLPbzEfJU599E2DvAW2n2py69TXfJDOIZEHRsyk,754 |
|||
../../../bin/rst2odt_prepstyles.py,sha256=B90_1J9aRI6eJlKTYYDiHGyFio8Dfmgli9vJmg9qXHs,1716 |
|||
../../../bin/rst2pseudoxml.py,sha256=9SwwDEOFNz3AqOSI4CEvhieDm_3TgTPN_3FDPz6b5ys,591 |
|||
../../../bin/rst2s5.py,sha256=zdT-5LNxruUZqMVe-Wjj1F-eXan9pLDBvxA1k38XRGw,627 |
|||
../../../bin/rst2xetex.py,sha256=SzPM2iz6wCAc8Ki3sEnhCq6318jTQziosToib4FIzEw,861 |
|||
../../../bin/rst2xml.py,sha256=MKbl4dkpIBjzh4GdITggzJpi-SMGoRaXdkbZs-yd05E,592 |
|||
../../../bin/rstpep2html.py,sha256=TlXeA4lyMxtICwwaEERXcrXTleXfwyQE5qbooZLtcSw,660 |
|||
docutils-0.16.dist-info/COPYING.txt,sha256=76DIWqmepbR4EkADGw0Cr1TXtVVMh60rK-qbpJD2Zj8,5538 |
|||
docutils-0.16.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 |
|||
docutils-0.16.dist-info/METADATA,sha256=4IVnPgSLMJRQ5ZfIjKFlv0poher_Si1vM7QowzUC1dI,2749 |
|||
docutils-0.16.dist-info/RECORD,, |
|||
docutils-0.16.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 |
|||
docutils-0.16.dist-info/top_level.txt,sha256=dPq3jQoxpMOEhrZ1tQh3_-9hqhdvOjUplSdSVDAc95A,9 |
|||
docutils/__init__.py,sha256=YIX4_xeGvPh3ZINoAqP1zx76lI2RCCEw39wbeigwYWU,7759 |
|||
docutils/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/__pycache__/core.cpython-37.pyc,, |
|||
docutils/__pycache__/examples.cpython-37.pyc,, |
|||
docutils/__pycache__/frontend.cpython-37.pyc,, |
|||
docutils/__pycache__/io.cpython-37.pyc,, |
|||
docutils/__pycache__/nodes.cpython-37.pyc,, |
|||
docutils/__pycache__/statemachine.cpython-37.pyc,, |
|||
docutils/core.py,sha256=PTD5CeE4Z42n5f9UJJUxXGBK27fRGQ5kanx5aMlZ5qA,29575 |
|||
docutils/examples.py,sha256=nlPe2PYXNvz5ZAVRu7xHHiV7qML7s-eyUu4Gun7j3SY,3959 |
|||
docutils/frontend.py,sha256=dxG9PqW_-snfcbR5S2vunCsUUwH1OTauqx0RJxnMPdQ,37086 |
|||
docutils/io.py,sha256=th8Zq_UUIWY27bDIB1sLMtYhdzBWE4qo4Gf9VEwL_gk,16765 |
|||
docutils/languages/__init__.py,sha256=oPqoleNr7_rp64XNjbg4gdL8owO_gLEZc1HWHKOA26k,1555 |
|||
docutils/languages/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/af.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/ca.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/cs.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/da.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/de.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/en.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/eo.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/es.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/fa.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/fi.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/fr.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/gl.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/he.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/it.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/ja.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/ko.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/lt.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/lv.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/nl.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/pl.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/pt_br.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/ru.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/sk.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/sv.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/zh_cn.cpython-37.pyc,, |
|||
docutils/languages/__pycache__/zh_tw.cpython-37.pyc,, |
|||
docutils/languages/af.py,sha256=6wl-XbsF8wbSiBs5IORna4Lz-WPqnnye_6qr8Cbh_1c,1824 |
|||
docutils/languages/ca.py,sha256=7_XR5q5GEXaeI4O5ianMmdnjWY_sRQD1ynuRB_HxUok,1940 |
|||
docutils/languages/cs.py,sha256=GARzldc3tDZByhqf_R-cOh1QJDOrFvSJzqewRdWRNXw,1928 |
|||
docutils/languages/da.py,sha256=88ZPB6ppJPWqNsaFQKKAC1aEZVLYw13BFR44vecp4MU,1907 |
|||
docutils/languages/de.py,sha256=AQTUIl4j3x43kQi5800-lobZHsh06VOsrxfAjS5FHGM,1722 |
|||
docutils/languages/en.py,sha256=tWVrPr6593mIzFokX_4Hw1fC6ZWC8GPdgpc72jmQq1g,1848 |
|||
docutils/languages/eo.py,sha256=uGSGcjfeHFliqm-f9amMfsPIl3trHONYPXdGR_ybm8U,1948 |
|||
docutils/languages/es.py,sha256=nk0PUeVyjFEu_8cNJA9Llsdv-W3kKx-wgOeaYGllqgw,1962 |
|||
docutils/languages/fa.py,sha256=vsf5xJxJuzcPXyz8ad3Cuf9ntBoOND0zdhsE4dwJEjI,2044 |
|||
docutils/languages/fi.py,sha256=yrE6Zhs-LdknXCpf-WX15QACQ75DroMpET95r3JD_OM,2026 |
|||
docutils/languages/fr.py,sha256=FTaOYQQHvqFzkzuhbdFQPS7dPkcpGLUPMeStu0cjFGs,1893 |
|||
docutils/languages/gl.py,sha256=6Uoq9rYigieFN0-LeSgoRmB9_ROX60Oqul7faPROMYs,2040 |
|||
docutils/languages/he.py,sha256=BfiRLxQ5Y8pivYi7GbGQ5NJ-rEgUId9mstJR6YYkeAQ,2683 |
|||
docutils/languages/it.py,sha256=Z3eh86YrmB8aT_Dl56X7W2gqpJgYK0v0QnJ07hekXlM,1808 |
|||
docutils/languages/ja.py,sha256=VJc9fRk4H_OhD8wyx3-uGUay3qdqeAIHCZEF67EsMTQ,1942 |
|||
docutils/languages/ko.py,sha256=PsZlCPQ5uQsUC2Puk2POTDmTc83cJWOxHmLrnq3-s2U,1880 |
|||
docutils/languages/lt.py,sha256=Y1204UnrqJlvM1vyteckkrqkbU02dSvrnpHCB5b23oM,1940 |
|||
docutils/languages/lv.py,sha256=tEqF4ya9h4FznB-uiUKQnNLY2XDFRatxKt2evJPhsDM,1867 |
|||
docutils/languages/nl.py,sha256=3CjsGFeJgLZEw2xhHxAc4sYDKRW6ODUZsVyibjl7DmM,1865 |
|||
docutils/languages/pl.py,sha256=ImdSmS6l4SgZ7uEaWQR5_aLNmv4K5onOInEtinPqWJk,1900 |
|||
docutils/languages/pt_br.py,sha256=cW8OceiFMPzPICT6buhnjm3tvEEw4W1PG-GFC4MxhyI,1982 |
|||
docutils/languages/ru.py,sha256=AkDQVhcW4cbvP0je-z8UJafQ-s2Lwc-eAIqXGCFZzco,2155 |
|||
docutils/languages/sk.py,sha256=v4XMBxIx5d6zQY7ehjZdtgfUy9Hz999XdH9G9d7SxEc,1860 |
|||
docutils/languages/sv.py,sha256=yIVWV9He5dbCuMpegSDiuI75tD4GXm9VkN7ra0-xgMI,2103 |
|||
docutils/languages/zh_cn.py,sha256=kF2sokHa0Qr-3X45ZeWEb0mImZRlZpiX2TM6d9_GjpY,2026 |
|||
docutils/languages/zh_tw.py,sha256=Xwrbf8wSylyMwwaNH6xYeAjMrldiBbDB_LElv67hGPQ,2771 |
|||
docutils/nodes.py,sha256=RRwVFRtRtRUzbuoYIWkMoSBXBAfQ4Dc2Xtzvht7XwAY,81241 |
|||
docutils/parsers/__init__.py,sha256=aDrATsCPGo92zucFl_n2ludoFSfxOrmdF7U8oQV0uEQ,1584 |
|||
docutils/parsers/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/parsers/__pycache__/null.cpython-37.pyc,, |
|||
docutils/parsers/null.py,sha256=LtO7n-E6lNOs4mLXZ2SiShB3C630SoJ80ugd9fh1vXI,445 |
|||
docutils/parsers/rst/__init__.py,sha256=F6PQ5IyGtYcpxOi0YHekivCrob2iLQIn5JpaqTIME50,16208 |
|||
docutils/parsers/rst/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/parsers/rst/__pycache__/roles.cpython-37.pyc,, |
|||
docutils/parsers/rst/__pycache__/states.cpython-37.pyc,, |
|||
docutils/parsers/rst/__pycache__/tableparser.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__init__.py,sha256=dk9-IEfhp-xsEcuEkW1PthgJYdkva87rMlAVMh8eRYs,14053 |
|||
docutils/parsers/rst/directives/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/admonitions.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/body.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/html.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/images.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/misc.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/parts.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/references.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/__pycache__/tables.cpython-37.pyc,, |
|||
docutils/parsers/rst/directives/admonitions.py,sha256=w38T7YfRc0isuF5qmaw-6wOQgHx9xGHJBqu_gDqQCdI,2413 |
|||
docutils/parsers/rst/directives/body.py,sha256=qkeqiZrbSbfd8bMxfSl1M0HJ_vCfZYg63HhUmdldpE0,9191 |
|||
docutils/parsers/rst/directives/html.py,sha256=CKHg2_lAFayH2DGoVD_t9--nNKVMh7aNuWmNTef7ffI,3235 |
|||
docutils/parsers/rst/directives/images.py,sha256=PthLb5pJJvltqvTLkQSOemWEzO_ZEQbjlbKBilZ03x0,6982 |
|||
docutils/parsers/rst/directives/misc.py,sha256=MVqSu3TutboCbNFLIXgJ8EXF2R8Z8K_k2nDJ73JY1_w,23872 |
|||
docutils/parsers/rst/directives/parts.py,sha256=Mx7y6BwTP1WAD_qnL-g0bjg1_O06NCXgqeYCPfP4JbI,4251 |
|||
docutils/parsers/rst/directives/references.py,sha256=1Y1yhe_O2PqLtQUSly-ny291nrQKJgQiO4Hu7Xew9Zo,831 |
|||
docutils/parsers/rst/directives/tables.py,sha256=QjxFrNMHdH6rgyIiqBcbVqWvy8ousjy5k6ZeDKeZh8s,22815 |
|||
docutils/parsers/rst/include/README.txt,sha256=_C6pSfeGShQ0evvKKKZUtx4bP4RFG9UoUlgHoMn06DU,666 |
|||
docutils/parsers/rst/include/isoamsa.txt,sha256=CioOAjUSuL_MG2JHqVHst0ceHzF0v3kupB6stgPMD2g,10925 |
|||
docutils/parsers/rst/include/isoamsb.txt,sha256=pSD9D42IRcGBcjYXrJUBFicIA7KRtfBhCKnFlJiytC0,7242 |
|||
docutils/parsers/rst/include/isoamsc.txt,sha256=wC2J-pHkHJMokFfOg6S5_6TX1LcibltUpLMWkm-OT3U,1723 |
|||
docutils/parsers/rst/include/isoamsn.txt,sha256=LPorblUlj9fua5tpigH-lAfqPYj_yXWQiOa91CpBD7w,6721 |
|||
docutils/parsers/rst/include/isoamso.txt,sha256=3CB6lhSNhRIAY-ST8hGPRrO-6wxI2jhYnWTU1_uBXyY,3825 |
|||
docutils/parsers/rst/include/isoamsr.txt,sha256=3qVvk1ueHuE6jnHp8ypn6UWtZH5Ly2njNDj09Xeh2qU,11763 |
|||
docutils/parsers/rst/include/isobox.txt,sha256=tYnVIj92mJ5jiY8H9-S3CzBprjU8scuJZ8BO_eWEdwc,3101 |
|||
docutils/parsers/rst/include/isocyr1.txt,sha256=-V1dpOyKxXBzNBxcW7IJp1W-SIkaXd0KVm8TP58a5B8,4241 |
|||
docutils/parsers/rst/include/isocyr2.txt,sha256=3pDslLms3yuJgQTcWtu8U1FMrMQ4KgxtDT18Ci6Mvz4,1882 |
|||
docutils/parsers/rst/include/isodia.txt,sha256=-qThXeZ-WFGztOuu_koRrlvDJpSkMVB4ivU9yyE2y7Y,869 |
|||
docutils/parsers/rst/include/isogrk1.txt,sha256=xnCDDphWarsNmum9SQRvntznPx7m547rRRuQs7PdYpQ,3010 |
|||
docutils/parsers/rst/include/isogrk2.txt,sha256=zbi3-LuRB6T0jGj_yffmgm_8_mwz-6ygAYvgie32ls0,1705 |
|||
docutils/parsers/rst/include/isogrk3.txt,sha256=X8fGxnVIG1ygvvc9hpYgUHt1d8ANdD-gxn6aKWEaRf0,2880 |
|||
docutils/parsers/rst/include/isogrk4-wide.txt,sha256=rpweSoCmHEC1vL44LEeIE8Re2tm5FEAWnae6CO2oe1I,3035 |
|||
docutils/parsers/rst/include/isogrk4.txt,sha256=zptf_ntrFuMsuk0OhEjUkRwYrz0YGDuD-_6ReIHOunY,372 |
|||
docutils/parsers/rst/include/isolat1.txt,sha256=F5R0rnBefjAbqWFCkWMFpxVKWoSec8VM0KU8DRtMCYI,4397 |
|||
docutils/parsers/rst/include/isolat2.txt,sha256=YBBbW3o9HD1JHV3QVfpaFeKnRsh2vPs0dNvpTJSEoSU,8466 |
|||
docutils/parsers/rst/include/isomfrk-wide.txt,sha256=EtzR0nFzhkCmf8CKR4hLWSAgbUjHs4sYfpJEyDp8CjY,3334 |
|||
docutils/parsers/rst/include/isomfrk.txt,sha256=zZy3M5BmklzpL02dImsAuWA1jVw7nxqx3xyZLKtILfA,519 |
|||
docutils/parsers/rst/include/isomopf-wide.txt,sha256=QUhEHzhyuCM3qzrqG5luXuL28Uoqt7I7v-CfzToG8sI,1931 |
|||
docutils/parsers/rst/include/isomopf.txt,sha256=MGuLb8WfrDm7GWvdmvYHsWtrWyh6MqRRo7wnpiaia0U,639 |
|||
docutils/parsers/rst/include/isomscr-wide.txt,sha256=VHq8miDC5nKS6Rlvv9aWpS1D_naXcfZd1CsEpJ2W8-g,3231 |
|||
docutils/parsers/rst/include/isomscr.txt,sha256=WvB9Zek3TqSyIDfw5QmE_uTvXNwjBpYU0EQttckdLJo,776 |
|||
docutils/parsers/rst/include/isonum.txt,sha256=DHWd87O6CCaSz10PEGZOxLqpDLHiMZ6--0VR9o0Yt-Q,4066 |
|||
docutils/parsers/rst/include/isopub.txt,sha256=oULMcx0Ugjk6EZAMcxHZpZM_MC7kNuzecu-sMAHVZro,4613 |
|||
docutils/parsers/rst/include/isotech.txt,sha256=h6z4dEMoVtarA9E489Zru1H29c01hWWGqbfD3wgUmiM,9726 |
|||
docutils/parsers/rst/include/mmlalias.txt,sha256=YxSvNJVNsrzgIGNjtAjtx2tVXUuby5twMZxr5Mq3PJo,45428 |
|||
docutils/parsers/rst/include/mmlextra-wide.txt,sha256=KKNjVkG-xHbeCagQfQDotJxY5oF6S6Bmk60bEv49NUQ,9010 |
|||
docutils/parsers/rst/include/mmlextra.txt,sha256=Y50tQh0fLYClCc0DUVrxr2loU5u5YaUaYbFc9PEya_c,6800 |
|||
docutils/parsers/rst/include/s5defs.txt,sha256=_5JOMpDtaufiZbdxh6QKpICqLvGpB9cypHM-SEt3sKA,1036 |
|||
docutils/parsers/rst/include/xhtml1-lat1.txt,sha256=-cEYtq3oOOoLQS6n2KmsAcIs3Y5s78mToBkUXuSrSKA,6112 |
|||
docutils/parsers/rst/include/xhtml1-special.txt,sha256=dVNILahp_Jkf0bQVX-gGFcQXst3oR-FvQmAt6lDSTpE,1945 |
|||
docutils/parsers/rst/include/xhtml1-symbol.txt,sha256=K-f7hr-LRv1NKOxjZtckBmtMQOiddlnJJ-6DG-YoAzI,7028 |
|||
docutils/parsers/rst/languages/__init__.py,sha256=sOTYRqWClRSCBOO1I46Z8-WYDJPgWtqwwqt9iIKXpls,1014 |
|||
docutils/parsers/rst/languages/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/af.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/ca.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/cs.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/da.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/de.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/en.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/eo.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/es.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/fa.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/fi.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/fr.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/gl.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/he.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/it.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/ja.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/ko.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/lt.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/lv.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/nl.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/pl.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/pt_br.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/ru.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/sk.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/sv.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-37.pyc,, |
|||
docutils/parsers/rst/languages/af.py,sha256=CKdMjiS3nx4yNRrzeuwCoT0XeeQmHm2_O8U34BZns7s,3677 |
|||
docutils/parsers/rst/languages/ca.py,sha256=7eAACvO9Dpnqujsc3BJZQktHk1RDjmwf4LeEvkV_66o,4467 |
|||
docutils/parsers/rst/languages/cs.py,sha256=7g4NgLXvV5RP7oOqQT_TM033xW48mDQVoGGHhKSwZ8I,4857 |
|||
docutils/parsers/rst/languages/da.py,sha256=u9zvTSVuqJBQ-KKlcZmi4SMAp_kQXNS6ZsHBEiVmXjY,3765 |
|||
docutils/parsers/rst/languages/de.py,sha256=wiBjwHBDmiDIRs9gTtpI63VTyp7zqds5DWy9Kdw9Ntg,3464 |
|||
docutils/parsers/rst/languages/en.py,sha256=z_J8xJ1gBTk5MX6u_bonFGoop_e8VF6jWgq9Tzl5gNY,3317 |
|||
docutils/parsers/rst/languages/eo.py,sha256=q0025TiEuSZ_8VGZz2n86ZK4o6GVTdus1HBgdxAgz0A,3898 |
|||
docutils/parsers/rst/languages/es.py,sha256=vranS55noGU_pSC0f7uyJ12szSoxMKgRJuEK-DQfhpk,4261 |
|||
docutils/parsers/rst/languages/fa.py,sha256=XWeO9UdNGKbHWpcsAhEOgBvuLMGxjQ76I5ed7i2szPw,3430 |
|||
docutils/parsers/rst/languages/fi.py,sha256=CiWQxGOSnLA05yONUB0tqsnv4IPCbvfPYU7obKRo-kU,3661 |
|||
docutils/parsers/rst/languages/fr.py,sha256=42D2mXBLYl1Vc7KnVGi-CFQbhe_DTEIpT26_f3gWknI,3709 |
|||
docutils/parsers/rst/languages/gl.py,sha256=48NwM1CfNZOfmSYkqfhUsAww2292kZLPlt_Ty5sGzxE,3711 |
|||
docutils/parsers/rst/languages/he.py,sha256=go2_5QONLkGd4KS7ZIBur2vP04GUlN95XnOTizfwZOc,3640 |
|||
docutils/parsers/rst/languages/it.py,sha256=ihEL_NivtrckGnU6dT_kTmOrafmPUIC7-e6KMUJ_y2Q,3270 |
|||
docutils/parsers/rst/languages/ja.py,sha256=jaRnNN5sTXciz9O9_-kl7rlrScCJC12S3msQWPg5yH0,3863 |
|||
docutils/parsers/rst/languages/ko.py,sha256=4cZFij5pbqx_RgKvwg_10TMMARQ9LR_edvLqlLmZbwE,3449 |
|||
docutils/parsers/rst/languages/lt.py,sha256=RWSEyHddq14wvtuIbDxRT-JnPuRh8Gk33hOHh5BEXFI,3584 |
|||
docutils/parsers/rst/languages/lv.py,sha256=OfnTo1Si1V1E_7yNAwkyQMe6y07FsOA_F-1H2Fb6vIU,3381 |
|||
docutils/parsers/rst/languages/nl.py,sha256=2yKY36FtTEkRl-YjBOm9KtLTQR8nTIGT5ORt1qhcWQk,3708 |
|||
docutils/parsers/rst/languages/pl.py,sha256=RsEunaFFi6fiko9CZrVTyWTS7MbEuJLd0eAC5EOWWWo,3427 |
|||
docutils/parsers/rst/languages/pt_br.py,sha256=wDfQWhP_ZikrL3o9T4SjyfhRmCg8Y9uIS6FnUrTASkw,3992 |
|||
docutils/parsers/rst/languages/ru.py,sha256=abw64X77S-WFpIhbbn2v_YzzjphGyjqbMhaQjnLL1N0,3306 |
|||
docutils/parsers/rst/languages/sk.py,sha256=dhy_kVHdIVSFW9aBnNBU3YTXstouhmeOMHzZsBQ7vfU,3979 |
|||
docutils/parsers/rst/languages/sv.py,sha256=S8vtO81rSQTvAV4rzrzP7XQ1Hg894gtjjlqJ8FcPRf8,3331 |
|||
docutils/parsers/rst/languages/zh_cn.py,sha256=6FyYegjPnIFguqQhR9cBu5xxlrkRszNQHWGXEByF05M,4007 |
|||
docutils/parsers/rst/languages/zh_tw.py,sha256=PswlAgKcAMvgQB2jbp1hDCpzG63ZfxgBwlJviK8KRHM,5172 |
|||
docutils/parsers/rst/roles.py,sha256=o7thTCx0_1-pMkdYseZt5UaYf6RK646ZzhkuRFAePhQ,14944 |
|||
docutils/parsers/rst/states.py,sha256=S80k_XG5kA9PNwQh9dlI-JLVDpuRMwObIvPhNxMaQ04,132111 |
|||
docutils/parsers/rst/tableparser.py,sha256=Zbvt0mR6LJYeiMR495xe0dgqlK43HK9JjIw20PvcqdM,21001 |
|||
docutils/readers/__init__.py,sha256=5alRbkyRVbNkq8njp1egI_OnGyXkxQBwMGa9MbxAoD4,3456 |
|||
docutils/readers/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/readers/__pycache__/doctree.cpython-37.pyc,, |
|||
docutils/readers/__pycache__/pep.cpython-37.pyc,, |
|||
docutils/readers/__pycache__/standalone.cpython-37.pyc,, |
|||
docutils/readers/doctree.py,sha256=9QNTk_8x46sDkcSjzQiyFZxN-m9CBO3XA5bLar7OA0Q,1607 |
|||
docutils/readers/pep.py,sha256=V9b6SUQ_h74KK11wq5k2icEPGWQuVDG5gCzhWlJdF3Y,1555 |
|||
docutils/readers/standalone.py,sha256=6kRgqKD_REEZ_zZE5AW0rLj_rqOhisubS2ADyLjOAJQ,2340 |
|||
docutils/statemachine.py,sha256=zneRqVNxZaSKK7RGag5QrlbCSAkuphG4qlZXu7CeEXw,57663 |
|||
docutils/transforms/__init__.py,sha256=KZ2cNaA87oQNs6Yi_UK2A3V3mUZz4AbZlzaCD-2fFnY,6504 |
|||
docutils/transforms/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/components.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/frontmatter.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/misc.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/parts.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/peps.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/references.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/universal.cpython-37.pyc,, |
|||
docutils/transforms/__pycache__/writer_aux.cpython-37.pyc,, |
|||
docutils/transforms/components.py,sha256=F0fXyOZsf_OA0QsX-jIAsk3RLCrkEW9GRR1-l0Nx13o,1993 |
|||
docutils/transforms/frontmatter.py,sha256=ooKzVho4qdgnkDqbjLql6AauIbJ8vHglQPnv3W4BEFU,20167 |
|||
docutils/transforms/misc.py,sha256=0jDAIndz8a7C5TVWLkC44N1pVfhwZu4nu-lnk1GmzGg,4882 |
|||
docutils/transforms/parts.py,sha256=jxs_CsaBH7uyvtCrxZqHQynLj4ktKax-_4d2xVDNNFs,6997 |
|||
docutils/transforms/peps.py,sha256=NdXwjk5gvzuzWDXred5OEbpPIDn2bWxECrBkYC_gF10,11056 |
|||
docutils/transforms/references.py,sha256=3094yQhcQa84BzcX1zjKTK7UGMjhOYejvwcv_8k7WZw,36478 |
|||
docutils/transforms/universal.py,sha256=tRcngG0usTWzQESOKqJeO4VCi3KlHzoUxHBw5ZJ_ljM,11380 |
|||
docutils/transforms/writer_aux.py,sha256=4Zd8z8s4jTG2J0xSnm5hj1kiZrKN6FqvGvpJ1cb09oU,2609 |
|||
docutils/utils/__init__.py,sha256=5VaDEvT45RFBaJvB_g5zbMilxQopc3hOMUa0SI0CRoY,28767 |
|||
docutils/utils/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/utils/__pycache__/code_analyzer.cpython-37.pyc,, |
|||
docutils/utils/__pycache__/error_reporting.cpython-37.pyc,, |
|||
docutils/utils/__pycache__/punctuation_chars.cpython-37.pyc,, |
|||
docutils/utils/__pycache__/roman.cpython-37.pyc,, |
|||
docutils/utils/__pycache__/smartquotes.cpython-37.pyc,, |
|||
docutils/utils/__pycache__/urischemes.cpython-37.pyc,, |
|||
docutils/utils/code_analyzer.py,sha256=wdT6BK7wcyYs13lu24KamEmXqRYi0fZgQBJCwE39ff0,5166 |
|||
docutils/utils/error_reporting.py,sha256=R0ViAzmz8GWr3Eayu51l6m9kCivbaJLCIf4NOiSPvqk,8460 |
|||
docutils/utils/math/__init__.py,sha256=TUGMP6ytwBzbQCHrFSxSl8OcDdbLGfCCkGteBdWm6l0,1755 |
|||
docutils/utils/math/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/utils/math/__pycache__/latex2mathml.cpython-37.pyc,, |
|||
docutils/utils/math/__pycache__/math2html.cpython-37.pyc,, |
|||
docutils/utils/math/__pycache__/tex2mathml_extern.cpython-37.pyc,, |
|||
docutils/utils/math/__pycache__/tex2unichar.cpython-37.pyc,, |
|||
docutils/utils/math/__pycache__/unichar2tex.cpython-37.pyc,, |
|||
docutils/utils/math/latex2mathml.py,sha256=JO-79izteHloIWN33QIhg3v-8cbI_kWGwvfQ32tbarc,17456 |
|||
docutils/utils/math/math2html.py,sha256=ibVwl7RbG2F--iwVVDhGoEqxnKj552Y-HYm7TybzREQ,184696 |
|||
docutils/utils/math/tex2mathml_extern.py,sha256=Zx-47MMnzGnbP9YLu_Yc6KM7dcuSgzJPfKZy_i0gj5I,5656 |
|||
docutils/utils/math/tex2unichar.py,sha256=0tXV29tatGECc6zDV78yvx-6vc5npfO1GukZrzbI5ps,35109 |
|||
docutils/utils/math/unichar2tex.py,sha256=pQsCi50-vC7hbl0DsfHEK5Xn9jhHOAOtG6D0tTWGAAY,17590 |
|||
docutils/utils/punctuation_chars.py,sha256=UPAtrr1Om1cJ0l3JpNLvnuNryfR8ybXNvOJNriO7PW0,6426 |
|||
docutils/utils/roman.py,sha256=nJRHm0rTPqrKFrwJNwOM8ywKIy81DKvAlXPdnOsefIU,2688 |
|||
docutils/utils/smartquotes.py,sha256=DuVPLCPUnn1Q_TPn0PzNLRTonSPPNOTgWbo1cc1kQY4,40050 |
|||
docutils/utils/urischemes.py,sha256=_wNIoSw8D_Ch4dLGMZmCTceF4mT6jnodFK_H2HDSRLA,6272 |
|||
docutils/writers/__init__.py,sha256=ybRAHTZrV29u5zCFTbAcQvh6ZZDRgQqliRn4cPMiVzw,4593 |
|||
docutils/writers/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/__pycache__/_html_base.cpython-37.pyc,, |
|||
docutils/writers/__pycache__/docutils_xml.cpython-37.pyc,, |
|||
docutils/writers/__pycache__/manpage.cpython-37.pyc,, |
|||
docutils/writers/__pycache__/null.cpython-37.pyc,, |
|||
docutils/writers/__pycache__/pseudoxml.cpython-37.pyc,, |
|||
docutils/writers/_html_base.py,sha256=h30bM3-CdDeK-lF1DM3-M1b_-4n7rAjl1N0VP_CRXpE,63552 |
|||
docutils/writers/docutils_xml.py,sha256=P8A8o8YnEZQXmHQrXF-D3vXCm29RZE185Fvd_sJWIXg,7134 |
|||
docutils/writers/html4css1/__init__.py,sha256=fFw4DkEEIZmPM8B90Gw15raeupFCQZ2dw61gMS4LV9k,33839 |
|||
docutils/writers/html4css1/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/html4css1/html4css1.css,sha256=BvqQaXs-bQ6Vx7TVsdXxxLwoiQeXQ-Wn1z7ZXRXk_q8,7210 |
|||
docutils/writers/html4css1/template.txt,sha256=HDzUUyAv7gT4ewGQTqfOE2_9HOVyGu9-wCRgsmoCmjQ,114 |
|||
docutils/writers/html5_polyglot/__init__.py,sha256=c_rbVRHUFlPFl6tBKv95WoC1DPeDbqL-2vazhCCVJ3k,9612 |
|||
docutils/writers/html5_polyglot/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/html5_polyglot/math.css,sha256=hGjowMetSh3oAlkm7_EA2pTtkv_Lg_TgwrBkyNs85Co,4783 |
|||
docutils/writers/html5_polyglot/minimal.css,sha256=pdv3dDbMH9X4VQS0aQO3Ufqg1h-waHnNJ0lFeBsy2Bs,7468 |
|||
docutils/writers/html5_polyglot/plain.css,sha256=pHd4urXyhNsneZq1MHvnScLIsRhEdyoU9X52L7fF3gM,6939 |
|||
docutils/writers/html5_polyglot/template.txt,sha256=HDzUUyAv7gT4ewGQTqfOE2_9HOVyGu9-wCRgsmoCmjQ,114 |
|||
docutils/writers/latex2e/__init__.py,sha256=aBoY6-pndI5_6o1Afw-RF2jHIxhKe36ECDEbO4WY3RA,130375 |
|||
docutils/writers/latex2e/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/latex2e/default.tex,sha256=KQFojDUG6AFGSZFGWVsQCslQrWT5-JVB29idVWiRtUA,422 |
|||
docutils/writers/latex2e/titlepage.tex,sha256=wxPKr4rylqUamK2U0EJXQTaVQ1392ua5DtSVGDqrNsI,534 |
|||
docutils/writers/latex2e/xelatex.tex,sha256=oUEz2Ze3wpoMp0X0iVELcUGNtKVre5Ug5Ujge7OiMgU,672 |
|||
docutils/writers/manpage.py,sha256=FEM_KtyyY8PgAScTa5R7dXLKlGCJPLbsaapNoI1SORg,36148 |
|||
docutils/writers/null.py,sha256=zyIuah_o8SlqvgbOWLRG9chpeNKky0D13lOTtR1E73U,450 |
|||
docutils/writers/odf_odt/__init__.py,sha256=8mr-TC7zljTp_mUUL-tZNhCCS5lezfojN1yadSDRqjQ,133436 |
|||
docutils/writers/odf_odt/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/odf_odt/__pycache__/pygmentsformatter.cpython-37.pyc,, |
|||
docutils/writers/odf_odt/pygmentsformatter.py,sha256=iBsRNxRe-v378-whp_F8CwgvuK7Ck4o_Tx4Kae8NlYw,4671 |
|||
docutils/writers/odf_odt/styles.odt,sha256=xKv9z2sd1qNxAH28X-5st5JuDZeTw6jyDOxXohsFrKY,16500 |
|||
docutils/writers/pep_html/__init__.py,sha256=gOJnTxuKLtM-81wdjIFbH5GyTFLV9m1_ZOu7Lys_MZc,3558 |
|||
docutils/writers/pep_html/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/pep_html/pep.css,sha256=UbFfiHHFSWusk2rEv7AUaTCS0r6TxfMzgLtW0VURwGw,6367 |
|||
docutils/writers/pep_html/template.txt,sha256=CfyVCCoqqB3Y8hOyt7Uxf0XeyTwtFf926L_hJeaS1wU,1294 |
|||
docutils/writers/pseudoxml.py,sha256=2bRL9zMleW8jDuGaINvM52siZiJWH1-zQfEELJE2oPE,772 |
|||
docutils/writers/s5_html/__init__.py,sha256=MUczVy19slU_C6s1akdizatEvt5KPi72Bmj2f46r-IU,14688 |
|||
docutils/writers/s5_html/__pycache__/__init__.cpython-37.pyc,, |
|||
docutils/writers/s5_html/themes/README.txt,sha256=wsty9ouRFxVMrZV2EUTOmfMS_bJJpmA5CqU23fpMccM,301 |
|||
docutils/writers/s5_html/themes/big-black/__base__,sha256=WeKnChXCPkrXDs7Xr-Qnf1i-bgFjkeaKJ-ilXV0R5lM,38 |
|||
docutils/writers/s5_html/themes/big-black/framing.css,sha256=RctE4TbWO_ctWsmE1LSPdCVRMT1QFlTrNmQNKC4wC2Y,911 |
|||
docutils/writers/s5_html/themes/big-black/pretty.css,sha256=VFK99wlPllRBKK0eQ2Yk6RC_-VDMREm-ue2Mp3YMs7A,3606 |
|||
docutils/writers/s5_html/themes/big-white/framing.css,sha256=6M4vVFfoErc5LKtuol1RqnId0166VecGy6rYu9cPY9c,906 |
|||
docutils/writers/s5_html/themes/big-white/pretty.css,sha256=YO7dDIRq7dXpIdC8pEOf7QaBb9nUvajfWkkQpxt3nJs,3566 |
|||
docutils/writers/s5_html/themes/default/blank.gif,sha256=L1YbAqSTduNnms1ZdeN5Cr3_Cey636HhhYx7om4__O8,49 |
|||
docutils/writers/s5_html/themes/default/framing.css,sha256=fcGapNDqnTT2w-2HpWTHb5yf9Yq-_31DJuazk7lCSQw,1003 |
|||
docutils/writers/s5_html/themes/default/iepngfix.htc,sha256=ve7IwOG4pkjDmYItcuQrUbESmVaY6ACDhhA5YP9d73c,1190 |
|||
docutils/writers/s5_html/themes/default/opera.css,sha256=guPZOg_BINv-LjV9_IAM7ILFQ-fKALNjlP1i06e5dmA,261 |
|||
docutils/writers/s5_html/themes/default/outline.css,sha256=z3ACJiW3_gnG8XFvX602PMTYvKhbRybqCeoWl3O_pA0,648 |
|||
docutils/writers/s5_html/themes/default/pretty.css,sha256=dUbMlVTFGx3ofvXGUmhnKAADhBkHsdU0ysWpxwX-70M,4384 |
|||
docutils/writers/s5_html/themes/default/print.css,sha256=INhYRMsY7y2wd9p7tqjcDWBREXHUMO-2ApAWvITyetI,818 |
|||
docutils/writers/s5_html/themes/default/s5-core.css,sha256=MrHjKxQ7P7ZFC2FmEq2BnkRWs59YVzUS_ZOw8CHC2Jk,451 |
|||
docutils/writers/s5_html/themes/default/slides.css,sha256=VKYQ1Oe8lZ8LHxzPqJiU79J0z295nkmIbzsXL-N_dfQ,283 |
|||
docutils/writers/s5_html/themes/default/slides.js,sha256=n6_977F6UKSfpYSDu5RKhS1g7iehHcmxm1jDLD17ME4,15800 |
|||
docutils/writers/s5_html/themes/medium-black/__base__,sha256=822LJG-LrdBZY6CA7wsLFCFzsYfxbyz2mr1j6rpb1UA,41 |
|||
docutils/writers/s5_html/themes/medium-black/pretty.css,sha256=zoRP67Cmy7JzwnXqKe02GwGzt0p5z509ymlbaxXuPoI,4031 |
|||
docutils/writers/s5_html/themes/medium-white/framing.css,sha256=nstQg2Fwdm6TTRHflpYRE7Q3b2jFO5p6tyDXJhsmi0I,944 |
|||
docutils/writers/s5_html/themes/medium-white/pretty.css,sha256=SafUPS2T_uel8lPQlvouTXUrgT9QY52nxnBJDt_pmP4,3991 |
|||
docutils/writers/s5_html/themes/small-black/__base__,sha256=WmiB80z49RfMsy_7tFI042AfUgyztL5OXI3tap9EfQM,40 |
|||
docutils/writers/s5_html/themes/small-black/pretty.css,sha256=G_e83H9lIDHXtUBJRCnsnxSiAhP0zaAafQwSviioUQ8,4030 |
|||
docutils/writers/s5_html/themes/small-white/framing.css,sha256=klf55tsjjL7FuzlWi0yY_4bHJWZZhlD36VCevg45o70,941 |
|||
docutils/writers/s5_html/themes/small-white/pretty.css,sha256=yaLNE-loYn_nSCuzvGVJWHAbh90dxdO5I06Cv-d4wcM,4001 |
|||
docutils/writers/xetex/__init__.py,sha256=ROox1G2bCAOJoht_UttnqAVgFckavEXjlkpBpQj8LFc,5797 |
|||
docutils/writers/xetex/__pycache__/__init__.cpython-37.pyc,, |
@ -0,0 +1,6 @@ |
|||
Wheel-Version: 1.0 |
|||
Generator: bdist_wheel (0.33.4) |
|||
Root-Is-Purelib: true |
|||
Tag: py2-none-any |
|||
Tag: py3-none-any |
|||
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue