deleting the bots-venv folder
This commit is contained in:
parent
b872910c97
commit
8427c5a04b
@ -1,76 +0,0 @@
|
|||||||
# 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
|
|
@ -1,37 +0,0 @@
|
|||||||
# 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
|
|
@ -1,75 +0,0 @@
|
|||||||
# 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
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1 +0,0 @@
|
|||||||
python3
|
|
@ -1 +0,0 @@
|
|||||||
/usr/bin/python3
|
|
@ -1,23 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,26 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,35 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,26 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,26 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,30 +0,0 @@
|
|||||||
#!/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)
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
|||||||
#!/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()
|
|
@ -1,23 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,24 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,27 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,23 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,25 +0,0 @@
|
|||||||
#!/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)
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/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())
|
|
@ -1 +0,0 @@
|
|||||||
pip
|
|
@ -1,28 +0,0 @@
|
|||||||
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.
|
|
@ -1,106 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
|||||||
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
|
|
@ -1,6 +0,0 @@
|
|||||||
Wheel-Version: 1.0
|
|
||||||
Generator: bdist_wheel (0.34.2)
|
|
||||||
Root-Is-Purelib: true
|
|
||||||
Tag: py2-none-any
|
|
||||||
Tag: py3-none-any
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[babel.extractors]
|
|
||||||
jinja2 = jinja2.ext:babel_extract [i18n]
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
jinja2
|
|
@ -1 +0,0 @@
|
|||||||
pip
|
|
@ -1,29 +0,0 @@
|
|||||||
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.
|
|
@ -1,57 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
../../../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
|
|
@ -1,5 +0,0 @@
|
|||||||
Wheel-Version: 1.0
|
|
||||||
Generator: bdist_wheel (0.33.4)
|
|
||||||
Root-Is-Purelib: true
|
|
||||||
Tag: py3-none-any
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
[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
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
markdown
|
|
@ -1 +0,0 @@
|
|||||||
pip
|
|
@ -1,28 +0,0 @@
|
|||||||
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.
|
|
@ -1,103 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
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
|
|
@ -1,5 +0,0 @@
|
|||||||
Wheel-Version: 1.0
|
|
||||||
Generator: bdist_wheel (0.31.1)
|
|
||||||
Root-Is-Purelib: false
|
|
||||||
Tag: cp37-cp37m-manylinux1_x86_64
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
markupsafe
|
|
@ -1,231 +0,0 @@
|
|||||||
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!
|
|
@ -1 +0,0 @@
|
|||||||
pip
|
|
@ -1,25 +0,0 @@
|
|||||||
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.
|
|
@ -1,48 +0,0 @@
|
|||||||
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.
|
|
||||||
|
|
||||||
|
|
@ -1,463 +0,0 @@
|
|||||||
../../../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
|
|
@ -1,5 +0,0 @@
|
|||||||
Wheel-Version: 1.0
|
|
||||||
Generator: bdist_wheel (0.33.6)
|
|
||||||
Root-Is-Purelib: true
|
|
||||||
Tag: py3-none-any
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[console_scripts]
|
|
||||||
pygmentize = pygments.cmdline:main
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
pygments
|
|
@ -1,237 +0,0 @@
|
|||||||
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:
|
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
pip
|
|
@ -1,339 +0,0 @@
|
|||||||
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.
|
|
@ -1,261 +0,0 @@
|
|||||||
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:
|
|
||||||
|
|
||||||
|
|
@ -1,394 +0,0 @@
|
|||||||
../../../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
|
|
@ -1,6 +0,0 @@
|
|||||||
Wheel-Version: 1.0
|
|
||||||
Generator: bdist_wheel (0.29.0)
|
|
||||||
Root-Is-Purelib: true
|
|
||||||
Tag: py2-none-any
|
|
||||||
Tag: py3-none-any
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
[console_scripts]
|
|
||||||
unidecode = unidecode.util:main
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
{"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"}
|
|
@ -1 +0,0 @@
|
|||||||
unidecode
|
|
@ -1,101 +0,0 @@
|
|||||||
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
|
|
@ -1,49 +0,0 @@
|
|||||||
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
|
|
@ -1 +0,0 @@
|
|||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
../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
|
|
@ -1 +0,0 @@
|
|||||||
blinker
|
|
@ -1,22 +0,0 @@
|
|||||||
from blinker.base import (
|
|
||||||
ANY,
|
|
||||||
NamedSignal,
|
|
||||||
Namespace,
|
|
||||||
Signal,
|
|
||||||
WeakNamespace,
|
|
||||||
receiver_connected,
|
|
||||||
signal,
|
|
||||||
)
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
'ANY',
|
|
||||||
'NamedSignal',
|
|
||||||
'Namespace',
|
|
||||||
'Signal',
|
|
||||||
'WeakNamespace',
|
|
||||||
'receiver_connected',
|
|
||||||
'signal',
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
__version__ = '1.4'
|
|
@ -1,234 +0,0 @@
|
|||||||
# 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
|
|
@ -1,163 +0,0 @@
|
|||||||
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
|
|
@ -1,455 +0,0 @@
|
|||||||
# -*- 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
|
|
@ -1,8 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
try:
|
|
||||||
from ._version import version as __version__
|
|
||||||
except ImportError:
|
|
||||||
__version__ = 'unknown'
|
|
||||||
|
|
||||||
__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz',
|
|
||||||
'utils', 'zoneinfo']
|
|
@ -1,43 +0,0 @@
|
|||||||
"""
|
|
||||||
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
|
|
@ -1,4 +0,0 @@
|
|||||||
# coding: utf-8
|
|
||||||
# file generated by setuptools_scm
|
|
||||||
# don't change, don't track in version control
|
|
||||||
version = '2.8.1'
|
|
@ -1,89 +0,0 @@
|
|||||||
# -*- 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))
|
|
@ -1,61 +0,0 @@
|
|||||||
# -*- 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
Load Diff
@ -1,411 +0,0 @@
|
|||||||
# -*- 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
|
|
@ -1,599 +0,0 @@
|
|||||||
# -*- 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
Load Diff
@ -1,12 +0,0 @@
|
|||||||
# -*- 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."""
|
|
@ -1,419 +0,0 @@
|
|||||||
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__
|
|
@ -1,80 +0,0 @@
|
|||||||
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
Load Diff
@ -1,370 +0,0 @@
|
|||||||
# -*- 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
|
|
@ -1,2 +0,0 @@
|
|||||||
# tzwin has moved to dateutil.tz.win
|
|
||||||
from .tz.win import *
|
|
@ -1,71 +0,0 @@
|
|||||||
# -*- 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
|
|
@ -1,167 +0,0 @@
|
|||||||
# -*- 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.
@ -1,53 +0,0 @@
|
|||||||
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?")
|
|
@ -1,137 +0,0 @@
|
|||||||
==================
|
|
||||||
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
|
|
@ -1 +0,0 @@
|
|||||||
pip
|
|
@ -1,64 +0,0 @@
|
|||||||
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.
|
|
||||||
|
|
@ -1,332 +0,0 @@
|
|||||||
../../../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,,
|
|
@ -1,6 +0,0 @@
|
|||||||
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 have changed in this diff Show More
Loading…
Reference in New Issue
Block a user