@rowstile/cli-win32-x64 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +5 -0
- package/package.json +23 -0
- package/python/DLLs/_asyncio.pyd +0 -0
- package/python/DLLs/_bz2.pyd +0 -0
- package/python/DLLs/_ctypes.pyd +0 -0
- package/python/DLLs/_ctypes_test.pyd +0 -0
- package/python/DLLs/_decimal.pyd +0 -0
- package/python/DLLs/_elementtree.pyd +0 -0
- package/python/DLLs/_hashlib.pyd +0 -0
- package/python/DLLs/_lzma.pyd +0 -0
- package/python/DLLs/_multiprocessing.pyd +0 -0
- package/python/DLLs/_overlapped.pyd +0 -0
- package/python/DLLs/_queue.pyd +0 -0
- package/python/DLLs/_socket.pyd +0 -0
- package/python/DLLs/_sqlite3.pyd +0 -0
- package/python/DLLs/_ssl.pyd +0 -0
- package/python/DLLs/_testbuffer.pyd +0 -0
- package/python/DLLs/_testcapi.pyd +0 -0
- package/python/DLLs/_testclinic.pyd +0 -0
- package/python/DLLs/_testclinic_limited.pyd +0 -0
- package/python/DLLs/_testconsole.pyd +0 -0
- package/python/DLLs/_testimportmultiple.pyd +0 -0
- package/python/DLLs/_testinternalcapi.pyd +0 -0
- package/python/DLLs/_testlimitedcapi.pyd +0 -0
- package/python/DLLs/_testmultiphase.pyd +0 -0
- package/python/DLLs/_testsinglephase.pyd +0 -0
- package/python/DLLs/_uuid.pyd +0 -0
- package/python/DLLs/_wmi.pyd +0 -0
- package/python/DLLs/_zoneinfo.pyd +0 -0
- package/python/DLLs/libcrypto-3-x64.dll +0 -0
- package/python/DLLs/libffi-8.dll +0 -0
- package/python/DLLs/libssl-3-x64.dll +0 -0
- package/python/DLLs/pyexpat.pyd +0 -0
- package/python/DLLs/select.pyd +0 -0
- package/python/DLLs/sqlite3.dll +0 -0
- package/python/DLLs/unicodedata.pyd +0 -0
- package/python/DLLs/winsound.pyd +0 -0
- package/python/DLLs/zlib1.dll +0 -0
- package/python/LICENSE.txt +445 -0
- package/python/Lib/__future__.py +147 -0
- package/python/Lib/__hello__.py +16 -0
- package/python/Lib/__pycache__/__future__.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_colorize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compat_pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compression.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_markupbase.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_opcode_metadata.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_weakrefset.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ast.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/base64.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bisect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bz2.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/calendar.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/colorsys.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/compileall.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/configparser.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/contextlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copy.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copyreg.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/csv.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dataclasses.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/datetime.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/decimal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dis.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/enum.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/filecmp.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fnmatch.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fractions.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/functools.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/getpass.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gettext.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gzip.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hashlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/heapq.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hmac.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/inspect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ipaddress.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/keyword.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/linecache.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/locale.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/lzma.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/mimetypes.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/nturl2path.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/numbers.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/opcode.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/operator.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/optparse.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pkgutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/platform.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/py_compile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/queue.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/quopri.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/random.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/reprlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/selectors.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shlex.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/signal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socket.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socketserver.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ssl.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/string.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/stringprep.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/struct.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/subprocess.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tarfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tempfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/textwrap.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/threading.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/token.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tokenize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/traceback.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/types.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/typing.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/uuid.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/warnings.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/weakref.cpython-313.pyc +0 -0
- package/python/Lib/_aix_support.py +108 -0
- package/python/Lib/_android_support.py +192 -0
- package/python/Lib/_apple_support.py +66 -0
- package/python/Lib/_collections_abc.py +1187 -0
- package/python/Lib/_colorize.py +119 -0
- package/python/Lib/_compat_pickle.py +251 -0
- package/python/Lib/_compression.py +162 -0
- package/python/Lib/_ios_support.py +71 -0
- package/python/Lib/_markupbase.py +396 -0
- package/python/Lib/_opcode_metadata.py +343 -0
- package/python/Lib/_osx_support.py +579 -0
- package/python/Lib/_py_abc.py +147 -0
- package/python/Lib/_pydatetime.py +2640 -0
- package/python/Lib/_pydecimal.py +6356 -0
- package/python/Lib/_pyio.py +2714 -0
- package/python/Lib/_pylong.py +363 -0
- package/python/Lib/_pyrepl/__init__.py +19 -0
- package/python/Lib/_pyrepl/__main__.py +10 -0
- package/python/Lib/_pyrepl/_minimal_curses.py +68 -0
- package/python/Lib/_pyrepl/_threading_handler.py +74 -0
- package/python/Lib/_pyrepl/base_eventqueue.py +110 -0
- package/python/Lib/_pyrepl/commands.py +492 -0
- package/python/Lib/_pyrepl/completing_reader.py +295 -0
- package/python/Lib/_pyrepl/console.py +229 -0
- package/python/Lib/_pyrepl/curses.py +33 -0
- package/python/Lib/_pyrepl/fancy_termios.py +82 -0
- package/python/Lib/_pyrepl/historical_reader.py +419 -0
- package/python/Lib/_pyrepl/input.py +114 -0
- package/python/Lib/_pyrepl/keymap.py +213 -0
- package/python/Lib/_pyrepl/main.py +59 -0
- package/python/Lib/_pyrepl/mypy.ini +29 -0
- package/python/Lib/_pyrepl/pager.py +175 -0
- package/python/Lib/_pyrepl/reader.py +764 -0
- package/python/Lib/_pyrepl/readline.py +599 -0
- package/python/Lib/_pyrepl/simple_interact.py +180 -0
- package/python/Lib/_pyrepl/trace.py +21 -0
- package/python/Lib/_pyrepl/types.py +10 -0
- package/python/Lib/_pyrepl/unix_console.py +852 -0
- package/python/Lib/_pyrepl/unix_eventqueue.py +76 -0
- package/python/Lib/_pyrepl/utils.py +83 -0
- package/python/Lib/_pyrepl/windows_console.py +687 -0
- package/python/Lib/_pyrepl/windows_eventqueue.py +42 -0
- package/python/Lib/_sitebuiltins.py +91 -0
- package/python/Lib/_strptime.py +800 -0
- package/python/Lib/_threading_local.py +120 -0
- package/python/Lib/_weakrefset.py +205 -0
- package/python/Lib/abc.py +188 -0
- package/python/Lib/antigravity.py +17 -0
- package/python/Lib/argparse.py +2690 -0
- package/python/Lib/ast.py +1865 -0
- package/python/Lib/asyncio/__init__.py +47 -0
- package/python/Lib/asyncio/__main__.py +211 -0
- package/python/Lib/asyncio/base_events.py +2086 -0
- package/python/Lib/asyncio/base_futures.py +67 -0
- package/python/Lib/asyncio/base_subprocess.py +312 -0
- package/python/Lib/asyncio/base_tasks.py +94 -0
- package/python/Lib/asyncio/constants.py +41 -0
- package/python/Lib/asyncio/coroutines.py +109 -0
- package/python/Lib/asyncio/events.py +885 -0
- package/python/Lib/asyncio/exceptions.py +62 -0
- package/python/Lib/asyncio/format_helpers.py +84 -0
- package/python/Lib/asyncio/futures.py +425 -0
- package/python/Lib/asyncio/locks.py +617 -0
- package/python/Lib/asyncio/log.py +7 -0
- package/python/Lib/asyncio/mixins.py +21 -0
- package/python/Lib/asyncio/proactor_events.py +891 -0
- package/python/Lib/asyncio/protocols.py +216 -0
- package/python/Lib/asyncio/queues.py +309 -0
- package/python/Lib/asyncio/runners.py +217 -0
- package/python/Lib/asyncio/selector_events.py +1328 -0
- package/python/Lib/asyncio/sslproto.py +929 -0
- package/python/Lib/asyncio/staggered.py +174 -0
- package/python/Lib/asyncio/streams.py +787 -0
- package/python/Lib/asyncio/subprocess.py +229 -0
- package/python/Lib/asyncio/taskgroups.py +278 -0
- package/python/Lib/asyncio/tasks.py +1121 -0
- package/python/Lib/asyncio/threads.py +26 -0
- package/python/Lib/asyncio/timeouts.py +185 -0
- package/python/Lib/asyncio/transports.py +337 -0
- package/python/Lib/asyncio/trsock.py +98 -0
- package/python/Lib/asyncio/unix_events.py +1550 -0
- package/python/Lib/asyncio/windows_events.py +906 -0
- package/python/Lib/asyncio/windows_utils.py +181 -0
- package/python/Lib/base64.py +628 -0
- package/python/Lib/bdb.py +973 -0
- package/python/Lib/bisect.py +118 -0
- package/python/Lib/bz2.py +352 -0
- package/python/Lib/cProfile.py +197 -0
- package/python/Lib/calendar.py +813 -0
- package/python/Lib/cmd.py +409 -0
- package/python/Lib/code.py +386 -0
- package/python/Lib/codecs.py +1132 -0
- package/python/Lib/codeop.py +155 -0
- package/python/Lib/collections/__init__.py +1603 -0
- package/python/Lib/collections/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/colorsys.py +166 -0
- package/python/Lib/compileall.py +470 -0
- package/python/Lib/concurrent/__init__.py +1 -0
- package/python/Lib/concurrent/futures/__init__.py +54 -0
- package/python/Lib/concurrent/futures/_base.py +660 -0
- package/python/Lib/concurrent/futures/process.py +892 -0
- package/python/Lib/concurrent/futures/thread.py +240 -0
- package/python/Lib/configparser.py +1396 -0
- package/python/Lib/contextlib.py +814 -0
- package/python/Lib/contextvars.py +4 -0
- package/python/Lib/copy.py +306 -0
- package/python/Lib/copyreg.py +217 -0
- package/python/Lib/csv.py +527 -0
- package/python/Lib/ctypes/__init__.py +602 -0
- package/python/Lib/ctypes/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/_endian.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/wintypes.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/_aix.py +327 -0
- package/python/Lib/ctypes/_endian.py +78 -0
- package/python/Lib/ctypes/macholib/README.ctypes +7 -0
- package/python/Lib/ctypes/macholib/__init__.py +9 -0
- package/python/Lib/ctypes/macholib/dyld.py +165 -0
- package/python/Lib/ctypes/macholib/dylib.py +42 -0
- package/python/Lib/ctypes/macholib/fetch_macholib +2 -0
- package/python/Lib/ctypes/macholib/fetch_macholib.bat +1 -0
- package/python/Lib/ctypes/macholib/framework.py +42 -0
- package/python/Lib/ctypes/util.py +387 -0
- package/python/Lib/ctypes/wintypes.py +202 -0
- package/python/Lib/curses/__init__.py +101 -0
- package/python/Lib/curses/ascii.py +99 -0
- package/python/Lib/curses/has_key.py +192 -0
- package/python/Lib/curses/panel.py +6 -0
- package/python/Lib/curses/textpad.py +236 -0
- package/python/Lib/dataclasses.py +1679 -0
- package/python/Lib/datetime.py +9 -0
- package/python/Lib/dbm/__init__.py +194 -0
- package/python/Lib/dbm/dumb.py +319 -0
- package/python/Lib/dbm/gnu.py +3 -0
- package/python/Lib/dbm/ndbm.py +3 -0
- package/python/Lib/dbm/sqlite3.py +144 -0
- package/python/Lib/decimal.py +109 -0
- package/python/Lib/difflib.py +2058 -0
- package/python/Lib/dis.py +1075 -0
- package/python/Lib/doctest.py +2919 -0
- package/python/Lib/email/__init__.py +61 -0
- package/python/Lib/email/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_encoded_words.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_parseaddr.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_policybase.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/base64mime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/charset.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/encoders.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/errors.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/feedparser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/header.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/iterators.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/message.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/quoprimime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/utils.cpython-313.pyc +0 -0
- package/python/Lib/email/_encoded_words.py +233 -0
- package/python/Lib/email/_header_value_parser.py +3153 -0
- package/python/Lib/email/_parseaddr.py +563 -0
- package/python/Lib/email/_policybase.py +382 -0
- package/python/Lib/email/architecture.rst +216 -0
- package/python/Lib/email/base64mime.py +115 -0
- package/python/Lib/email/charset.py +396 -0
- package/python/Lib/email/contentmanager.py +254 -0
- package/python/Lib/email/encoders.py +65 -0
- package/python/Lib/email/errors.py +117 -0
- package/python/Lib/email/feedparser.py +536 -0
- package/python/Lib/email/generator.py +530 -0
- package/python/Lib/email/header.py +582 -0
- package/python/Lib/email/headerregistry.py +618 -0
- package/python/Lib/email/iterators.py +68 -0
- package/python/Lib/email/message.py +1217 -0
- package/python/Lib/email/mime/__init__.py +0 -0
- package/python/Lib/email/mime/application.py +37 -0
- package/python/Lib/email/mime/audio.py +97 -0
- package/python/Lib/email/mime/base.py +29 -0
- package/python/Lib/email/mime/image.py +152 -0
- package/python/Lib/email/mime/message.py +33 -0
- package/python/Lib/email/mime/multipart.py +47 -0
- package/python/Lib/email/mime/nonmultipart.py +21 -0
- package/python/Lib/email/mime/text.py +40 -0
- package/python/Lib/email/parser.py +127 -0
- package/python/Lib/email/policy.py +232 -0
- package/python/Lib/email/quoprimime.py +300 -0
- package/python/Lib/email/utils.py +497 -0
- package/python/Lib/encodings/__init__.py +179 -0
- package/python/Lib/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp1252.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp437.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/hex_codec.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/idna.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
- package/python/Lib/encodings/aliases.py +560 -0
- package/python/Lib/encodings/ascii.py +50 -0
- package/python/Lib/encodings/base64_codec.py +55 -0
- package/python/Lib/encodings/big5.py +39 -0
- package/python/Lib/encodings/big5hkscs.py +39 -0
- package/python/Lib/encodings/bz2_codec.py +78 -0
- package/python/Lib/encodings/charmap.py +69 -0
- package/python/Lib/encodings/cp037.py +307 -0
- package/python/Lib/encodings/cp1006.py +307 -0
- package/python/Lib/encodings/cp1026.py +307 -0
- package/python/Lib/encodings/cp1125.py +698 -0
- package/python/Lib/encodings/cp1140.py +307 -0
- package/python/Lib/encodings/cp1250.py +307 -0
- package/python/Lib/encodings/cp1251.py +307 -0
- package/python/Lib/encodings/cp1252.py +307 -0
- package/python/Lib/encodings/cp1253.py +307 -0
- package/python/Lib/encodings/cp1254.py +307 -0
- package/python/Lib/encodings/cp1255.py +307 -0
- package/python/Lib/encodings/cp1256.py +307 -0
- package/python/Lib/encodings/cp1257.py +307 -0
- package/python/Lib/encodings/cp1258.py +307 -0
- package/python/Lib/encodings/cp273.py +307 -0
- package/python/Lib/encodings/cp424.py +307 -0
- package/python/Lib/encodings/cp437.py +698 -0
- package/python/Lib/encodings/cp500.py +307 -0
- package/python/Lib/encodings/cp720.py +309 -0
- package/python/Lib/encodings/cp737.py +698 -0
- package/python/Lib/encodings/cp775.py +697 -0
- package/python/Lib/encodings/cp850.py +698 -0
- package/python/Lib/encodings/cp852.py +698 -0
- package/python/Lib/encodings/cp855.py +698 -0
- package/python/Lib/encodings/cp856.py +307 -0
- package/python/Lib/encodings/cp857.py +694 -0
- package/python/Lib/encodings/cp858.py +698 -0
- package/python/Lib/encodings/cp860.py +698 -0
- package/python/Lib/encodings/cp861.py +698 -0
- package/python/Lib/encodings/cp862.py +698 -0
- package/python/Lib/encodings/cp863.py +698 -0
- package/python/Lib/encodings/cp864.py +690 -0
- package/python/Lib/encodings/cp865.py +698 -0
- package/python/Lib/encodings/cp866.py +698 -0
- package/python/Lib/encodings/cp869.py +689 -0
- package/python/Lib/encodings/cp874.py +307 -0
- package/python/Lib/encodings/cp875.py +307 -0
- package/python/Lib/encodings/cp932.py +39 -0
- package/python/Lib/encodings/cp949.py +39 -0
- package/python/Lib/encodings/cp950.py +39 -0
- package/python/Lib/encodings/euc_jis_2004.py +39 -0
- package/python/Lib/encodings/euc_jisx0213.py +39 -0
- package/python/Lib/encodings/euc_jp.py +39 -0
- package/python/Lib/encodings/euc_kr.py +39 -0
- package/python/Lib/encodings/gb18030.py +39 -0
- package/python/Lib/encodings/gb2312.py +39 -0
- package/python/Lib/encodings/gbk.py +39 -0
- package/python/Lib/encodings/hex_codec.py +55 -0
- package/python/Lib/encodings/hp_roman8.py +314 -0
- package/python/Lib/encodings/hz.py +39 -0
- package/python/Lib/encodings/idna.py +387 -0
- package/python/Lib/encodings/iso2022_jp.py +39 -0
- package/python/Lib/encodings/iso2022_jp_1.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2004.py +39 -0
- package/python/Lib/encodings/iso2022_jp_3.py +39 -0
- package/python/Lib/encodings/iso2022_jp_ext.py +39 -0
- package/python/Lib/encodings/iso2022_kr.py +39 -0
- package/python/Lib/encodings/iso8859_1.py +307 -0
- package/python/Lib/encodings/iso8859_10.py +307 -0
- package/python/Lib/encodings/iso8859_11.py +307 -0
- package/python/Lib/encodings/iso8859_13.py +307 -0
- package/python/Lib/encodings/iso8859_14.py +307 -0
- package/python/Lib/encodings/iso8859_15.py +307 -0
- package/python/Lib/encodings/iso8859_16.py +307 -0
- package/python/Lib/encodings/iso8859_2.py +307 -0
- package/python/Lib/encodings/iso8859_3.py +307 -0
- package/python/Lib/encodings/iso8859_4.py +307 -0
- package/python/Lib/encodings/iso8859_5.py +307 -0
- package/python/Lib/encodings/iso8859_6.py +307 -0
- package/python/Lib/encodings/iso8859_7.py +307 -0
- package/python/Lib/encodings/iso8859_8.py +307 -0
- package/python/Lib/encodings/iso8859_9.py +307 -0
- package/python/Lib/encodings/johab.py +39 -0
- package/python/Lib/encodings/koi8_r.py +307 -0
- package/python/Lib/encodings/koi8_t.py +308 -0
- package/python/Lib/encodings/koi8_u.py +307 -0
- package/python/Lib/encodings/kz1048.py +307 -0
- package/python/Lib/encodings/latin_1.py +50 -0
- package/python/Lib/encodings/mac_arabic.py +698 -0
- package/python/Lib/encodings/mac_croatian.py +307 -0
- package/python/Lib/encodings/mac_cyrillic.py +307 -0
- package/python/Lib/encodings/mac_farsi.py +307 -0
- package/python/Lib/encodings/mac_greek.py +307 -0
- package/python/Lib/encodings/mac_iceland.py +307 -0
- package/python/Lib/encodings/mac_latin2.py +312 -0
- package/python/Lib/encodings/mac_roman.py +307 -0
- package/python/Lib/encodings/mac_romanian.py +307 -0
- package/python/Lib/encodings/mac_turkish.py +307 -0
- package/python/Lib/encodings/mbcs.py +47 -0
- package/python/Lib/encodings/oem.py +41 -0
- package/python/Lib/encodings/palmos.py +308 -0
- package/python/Lib/encodings/ptcp154.py +312 -0
- package/python/Lib/encodings/punycode.py +253 -0
- package/python/Lib/encodings/quopri_codec.py +56 -0
- package/python/Lib/encodings/raw_unicode_escape.py +46 -0
- package/python/Lib/encodings/rot_13.py +113 -0
- package/python/Lib/encodings/shift_jis.py +39 -0
- package/python/Lib/encodings/shift_jis_2004.py +39 -0
- package/python/Lib/encodings/shift_jisx0213.py +39 -0
- package/python/Lib/encodings/tis_620.py +307 -0
- package/python/Lib/encodings/undefined.py +49 -0
- package/python/Lib/encodings/unicode_escape.py +46 -0
- package/python/Lib/encodings/utf_16.py +155 -0
- package/python/Lib/encodings/utf_16_be.py +42 -0
- package/python/Lib/encodings/utf_16_le.py +42 -0
- package/python/Lib/encodings/utf_32.py +150 -0
- package/python/Lib/encodings/utf_32_be.py +37 -0
- package/python/Lib/encodings/utf_32_le.py +37 -0
- package/python/Lib/encodings/utf_7.py +38 -0
- package/python/Lib/encodings/utf_8.py +42 -0
- package/python/Lib/encodings/utf_8_sig.py +130 -0
- package/python/Lib/encodings/uu_codec.py +103 -0
- package/python/Lib/encodings/zlib_codec.py +77 -0
- package/python/Lib/enum.py +2183 -0
- package/python/Lib/filecmp.py +320 -0
- package/python/Lib/fileinput.py +442 -0
- package/python/Lib/fnmatch.py +192 -0
- package/python/Lib/fractions.py +1043 -0
- package/python/Lib/ftplib.py +975 -0
- package/python/Lib/functools.py +1036 -0
- package/python/Lib/genericpath.py +200 -0
- package/python/Lib/getopt.py +215 -0
- package/python/Lib/getpass.py +192 -0
- package/python/Lib/gettext.py +657 -0
- package/python/Lib/glob.py +572 -0
- package/python/Lib/graphlib.py +250 -0
- package/python/Lib/gzip.py +693 -0
- package/python/Lib/hashlib.py +255 -0
- package/python/Lib/heapq.py +603 -0
- package/python/Lib/hmac.py +220 -0
- package/python/Lib/html/__init__.py +132 -0
- package/python/Lib/html/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/entities.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/html/entities.py +2513 -0
- package/python/Lib/html/parser.py +583 -0
- package/python/Lib/http/__init__.py +202 -0
- package/python/Lib/http/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookiejar.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookies.cpython-313.pyc +0 -0
- package/python/Lib/http/client.py +1598 -0
- package/python/Lib/http/cookiejar.py +2122 -0
- package/python/Lib/http/cookies.py +635 -0
- package/python/Lib/http/server.py +1355 -0
- package/python/Lib/imaplib.py +1769 -0
- package/python/Lib/importlib/__init__.py +136 -0
- package/python/Lib/importlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/_abc.py +39 -0
- package/python/Lib/importlib/_bootstrap.py +1559 -0
- package/python/Lib/importlib/_bootstrap_external.py +1826 -0
- package/python/Lib/importlib/abc.py +243 -0
- package/python/Lib/importlib/machinery.py +21 -0
- package/python/Lib/importlib/metadata/__init__.py +1093 -0
- package/python/Lib/importlib/metadata/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_collections.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_functools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_meta.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_text.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/_adapters.py +89 -0
- package/python/Lib/importlib/metadata/_collections.py +30 -0
- package/python/Lib/importlib/metadata/_functools.py +104 -0
- package/python/Lib/importlib/metadata/_itertools.py +73 -0
- package/python/Lib/importlib/metadata/_meta.py +67 -0
- package/python/Lib/importlib/metadata/_text.py +99 -0
- package/python/Lib/importlib/metadata/diagnose.py +21 -0
- package/python/Lib/importlib/readers.py +12 -0
- package/python/Lib/importlib/resources/__init__.py +43 -0
- package/python/Lib/importlib/resources/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_common.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_functional.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/_adapters.py +168 -0
- package/python/Lib/importlib/resources/_common.py +211 -0
- package/python/Lib/importlib/resources/_functional.py +81 -0
- package/python/Lib/importlib/resources/_itertools.py +38 -0
- package/python/Lib/importlib/resources/abc.py +173 -0
- package/python/Lib/importlib/resources/readers.py +203 -0
- package/python/Lib/importlib/resources/simple.py +106 -0
- package/python/Lib/importlib/simple.py +14 -0
- package/python/Lib/importlib/util.py +274 -0
- package/python/Lib/inspect.py +3479 -0
- package/python/Lib/io.py +99 -0
- package/python/Lib/ipaddress.py +2440 -0
- package/python/Lib/json/__init__.py +365 -0
- package/python/Lib/json/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/decoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/encoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/scanner.cpython-313.pyc +0 -0
- package/python/Lib/json/decoder.py +364 -0
- package/python/Lib/json/encoder.py +446 -0
- package/python/Lib/json/scanner.py +73 -0
- package/python/Lib/json/tool.py +90 -0
- package/python/Lib/keyword.py +64 -0
- package/python/Lib/linecache.py +236 -0
- package/python/Lib/locale.py +1987 -0
- package/python/Lib/logging/__init__.py +2330 -0
- package/python/Lib/logging/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/config.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/handlers.cpython-313.pyc +0 -0
- package/python/Lib/logging/config.py +1080 -0
- package/python/Lib/logging/handlers.py +1629 -0
- package/python/Lib/lzma.py +364 -0
- package/python/Lib/mailbox.py +2219 -0
- package/python/Lib/mimetypes.py +679 -0
- package/python/Lib/modulefinder.py +671 -0
- package/python/Lib/multiprocessing/__init__.py +37 -0
- package/python/Lib/multiprocessing/connection.py +1216 -0
- package/python/Lib/multiprocessing/context.py +383 -0
- package/python/Lib/multiprocessing/dummy/__init__.py +126 -0
- package/python/Lib/multiprocessing/dummy/connection.py +75 -0
- package/python/Lib/multiprocessing/forkserver.py +373 -0
- package/python/Lib/multiprocessing/heap.py +337 -0
- package/python/Lib/multiprocessing/managers.py +1397 -0
- package/python/Lib/multiprocessing/pool.py +957 -0
- package/python/Lib/multiprocessing/popen_fork.py +97 -0
- package/python/Lib/multiprocessing/popen_forkserver.py +74 -0
- package/python/Lib/multiprocessing/popen_spawn_posix.py +76 -0
- package/python/Lib/multiprocessing/popen_spawn_win32.py +147 -0
- package/python/Lib/multiprocessing/process.py +436 -0
- package/python/Lib/multiprocessing/queues.py +399 -0
- package/python/Lib/multiprocessing/reduction.py +281 -0
- package/python/Lib/multiprocessing/resource_sharer.py +154 -0
- package/python/Lib/multiprocessing/resource_tracker.py +499 -0
- package/python/Lib/multiprocessing/shared_memory.py +544 -0
- package/python/Lib/multiprocessing/sharedctypes.py +240 -0
- package/python/Lib/multiprocessing/spawn.py +307 -0
- package/python/Lib/multiprocessing/synchronize.py +404 -0
- package/python/Lib/multiprocessing/util.py +562 -0
- package/python/Lib/netrc.py +199 -0
- package/python/Lib/ntpath.py +872 -0
- package/python/Lib/nturl2path.py +69 -0
- package/python/Lib/numbers.py +427 -0
- package/python/Lib/opcode.py +115 -0
- package/python/Lib/operator.py +467 -0
- package/python/Lib/optparse.py +1681 -0
- package/python/Lib/os.py +1184 -0
- package/python/Lib/pathlib/__init__.py +12 -0
- package/python/Lib/pathlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_local.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/_abc.py +930 -0
- package/python/Lib/pathlib/_local.py +861 -0
- package/python/Lib/pdb.py +2550 -0
- package/python/Lib/pickle.py +1860 -0
- package/python/Lib/pickletools.py +2904 -0
- package/python/Lib/pkgutil.py +529 -0
- package/python/Lib/platform.py +1454 -0
- package/python/Lib/plistlib.py +948 -0
- package/python/Lib/poplib.py +477 -0
- package/python/Lib/posixpath.py +578 -0
- package/python/Lib/pprint.py +658 -0
- package/python/Lib/profile.py +616 -0
- package/python/Lib/pstats.py +778 -0
- package/python/Lib/pty.py +211 -0
- package/python/Lib/py_compile.py +212 -0
- package/python/Lib/pyclbr.py +314 -0
- package/python/Lib/pydoc.py +2861 -0
- package/python/Lib/queue.py +383 -0
- package/python/Lib/quopri.py +237 -0
- package/python/Lib/random.py +1078 -0
- package/python/Lib/re/__init__.py +428 -0
- package/python/Lib/re/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_casefix.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_compiler.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_constants.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/re/_casefix.py +106 -0
- package/python/Lib/re/_compiler.py +768 -0
- package/python/Lib/re/_constants.py +222 -0
- package/python/Lib/re/_parser.py +1081 -0
- package/python/Lib/reprlib.py +230 -0
- package/python/Lib/rlcompleter.py +222 -0
- package/python/Lib/runpy.py +326 -0
- package/python/Lib/sched.py +167 -0
- package/python/Lib/secrets.py +71 -0
- package/python/Lib/selectors.py +603 -0
- package/python/Lib/shelve.py +250 -0
- package/python/Lib/shlex.py +345 -0
- package/python/Lib/shutil.py +1569 -0
- package/python/Lib/signal.py +94 -0
- package/python/Lib/site.py +773 -0
- package/python/Lib/smtplib.py +1123 -0
- package/python/Lib/socket.py +988 -0
- package/python/Lib/socketserver.py +863 -0
- package/python/Lib/sqlite3/__init__.py +70 -0
- package/python/Lib/sqlite3/__main__.py +139 -0
- package/python/Lib/sqlite3/dbapi2.py +108 -0
- package/python/Lib/sqlite3/dump.py +118 -0
- package/python/Lib/sre_compile.py +7 -0
- package/python/Lib/sre_constants.py +7 -0
- package/python/Lib/sre_parse.py +7 -0
- package/python/Lib/ssl.py +1529 -0
- package/python/Lib/stat.py +212 -0
- package/python/Lib/statistics.py +1817 -0
- package/python/Lib/string.py +314 -0
- package/python/Lib/stringprep.py +272 -0
- package/python/Lib/struct.py +15 -0
- package/python/Lib/subprocess.py +2258 -0
- package/python/Lib/symtable.py +414 -0
- package/python/Lib/sysconfig/__init__.py +734 -0
- package/python/Lib/sysconfig/__main__.py +248 -0
- package/python/Lib/sysconfig/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tabnanny.py +340 -0
- package/python/Lib/tarfile.py +3136 -0
- package/python/Lib/tempfile.py +958 -0
- package/python/Lib/textwrap.py +497 -0
- package/python/Lib/this.py +28 -0
- package/python/Lib/threading.py +1602 -0
- package/python/Lib/timeit.py +381 -0
- package/python/Lib/token.py +141 -0
- package/python/Lib/tokenize.py +592 -0
- package/python/Lib/tomllib/__init__.py +10 -0
- package/python/Lib/tomllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_re.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_types.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/_parser.py +703 -0
- package/python/Lib/tomllib/_re.py +107 -0
- package/python/Lib/tomllib/_types.py +10 -0
- package/python/Lib/tomllib/mypy.ini +15 -0
- package/python/Lib/trace.py +754 -0
- package/python/Lib/traceback.py +1639 -0
- package/python/Lib/tracemalloc.py +560 -0
- package/python/Lib/tty.py +73 -0
- package/python/Lib/types.py +346 -0
- package/python/Lib/typing.py +3846 -0
- package/python/Lib/unittest/__init__.py +80 -0
- package/python/Lib/unittest/__main__.py +18 -0
- package/python/Lib/unittest/_log.py +86 -0
- package/python/Lib/unittest/async_case.py +146 -0
- package/python/Lib/unittest/case.py +1478 -0
- package/python/Lib/unittest/loader.py +460 -0
- package/python/Lib/unittest/main.py +280 -0
- package/python/Lib/unittest/mock.py +3189 -0
- package/python/Lib/unittest/result.py +256 -0
- package/python/Lib/unittest/runner.py +292 -0
- package/python/Lib/unittest/signals.py +71 -0
- package/python/Lib/unittest/suite.py +379 -0
- package/python/Lib/unittest/util.py +170 -0
- package/python/Lib/urllib/__init__.py +0 -0
- package/python/Lib/urllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/error.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/parse.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/request.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/response.cpython-313.pyc +0 -0
- package/python/Lib/urllib/error.py +74 -0
- package/python/Lib/urllib/parse.py +1264 -0
- package/python/Lib/urllib/request.py +2796 -0
- package/python/Lib/urllib/response.py +84 -0
- package/python/Lib/urllib/robotparser.py +363 -0
- package/python/Lib/uuid.py +784 -0
- package/python/Lib/warnings.py +735 -0
- package/python/Lib/wave.py +665 -0
- package/python/Lib/weakref.py +674 -0
- package/python/Lib/webbrowser.py +724 -0
- package/python/Lib/wsgiref/__init__.py +25 -0
- package/python/Lib/wsgiref/handlers.py +575 -0
- package/python/Lib/wsgiref/headers.py +192 -0
- package/python/Lib/wsgiref/simple_server.py +161 -0
- package/python/Lib/wsgiref/types.py +54 -0
- package/python/Lib/wsgiref/util.py +159 -0
- package/python/Lib/wsgiref/validate.py +438 -0
- package/python/Lib/xml/__init__.py +20 -0
- package/python/Lib/xml/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/dom/NodeFilter.py +27 -0
- package/python/Lib/xml/dom/__init__.py +140 -0
- package/python/Lib/xml/dom/domreg.py +99 -0
- package/python/Lib/xml/dom/expatbuilder.py +962 -0
- package/python/Lib/xml/dom/minicompat.py +109 -0
- package/python/Lib/xml/dom/minidom.py +2024 -0
- package/python/Lib/xml/dom/pulldom.py +336 -0
- package/python/Lib/xml/dom/xmlbuilder.py +389 -0
- package/python/Lib/xml/etree/ElementInclude.py +186 -0
- package/python/Lib/xml/etree/ElementPath.py +430 -0
- package/python/Lib/xml/etree/ElementTree.py +2116 -0
- package/python/Lib/xml/etree/__init__.py +33 -0
- package/python/Lib/xml/etree/cElementTree.py +3 -0
- package/python/Lib/xml/parsers/__init__.py +8 -0
- package/python/Lib/xml/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/__pycache__/expat.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/expat.py +8 -0
- package/python/Lib/xml/sax/__init__.py +94 -0
- package/python/Lib/xml/sax/_exceptions.py +127 -0
- package/python/Lib/xml/sax/expatreader.py +454 -0
- package/python/Lib/xml/sax/handler.py +387 -0
- package/python/Lib/xml/sax/saxutils.py +369 -0
- package/python/Lib/xml/sax/xmlreader.py +378 -0
- package/python/Lib/xmlrpc/__init__.py +1 -0
- package/python/Lib/xmlrpc/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/client.py +1503 -0
- package/python/Lib/xmlrpc/server.py +1002 -0
- package/python/Lib/zipapp.py +229 -0
- package/python/Lib/zipfile/__init__.py +2391 -0
- package/python/Lib/zipfile/__main__.py +4 -0
- package/python/Lib/zipfile/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__init__.py +452 -0
- package/python/Lib/zipfile/_path/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/glob.py +113 -0
- package/python/Lib/zipimport.py +803 -0
- package/python/Lib/zoneinfo/__init__.py +34 -0
- package/python/Lib/zoneinfo/_common.py +172 -0
- package/python/Lib/zoneinfo/_tzpath.py +189 -0
- package/python/Lib/zoneinfo/_zoneinfo.py +779 -0
- package/python/licenses/LICENSE.bdb.txt +126 -0
- package/python/licenses/LICENSE.bzip2.txt +37 -0
- package/python/licenses/LICENSE.cpython.txt +771 -0
- package/python/licenses/LICENSE.expat.txt +21 -0
- package/python/licenses/LICENSE.libX11.txt +942 -0
- package/python/licenses/LICENSE.libXau.txt +21 -0
- package/python/licenses/LICENSE.libedit.txt +29 -0
- package/python/licenses/LICENSE.libffi.txt +21 -0
- package/python/licenses/LICENSE.liblzma.txt +13 -0
- package/python/licenses/LICENSE.libuuid.txt +27 -0
- package/python/licenses/LICENSE.libxcb.txt +30 -0
- package/python/licenses/LICENSE.mpdecimal.txt +24 -0
- package/python/licenses/LICENSE.ncurses.txt +29 -0
- package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
- package/python/licenses/LICENSE.openssl-3.txt +177 -0
- package/python/licenses/LICENSE.sqlite.txt +23 -0
- package/python/licenses/LICENSE.tcl.txt +40 -0
- package/python/licenses/LICENSE.tix.txt +54 -0
- package/python/licenses/LICENSE.zlib.txt +21 -0
- package/python/python.exe +0 -0
- package/python/python3.dll +0 -0
- package/python/python313.dll +0 -0
- package/python/pythonw.exe +0 -0
- package/python/vcruntime140.dll +0 -0
- package/python/vcruntime140_1.dll +0 -0
|
@@ -0,0 +1,962 @@
|
|
|
1
|
+
"""Facility to use the Expat parser to load a minidom instance
|
|
2
|
+
from a string or file.
|
|
3
|
+
|
|
4
|
+
This avoids all the overhead of SAX and pulldom to gain performance.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# Warning!
|
|
8
|
+
#
|
|
9
|
+
# This module is tightly bound to the implementation details of the
|
|
10
|
+
# minidom DOM and can't be used with other DOM implementations. This
|
|
11
|
+
# is due, in part, to a lack of appropriate methods in the DOM (there is
|
|
12
|
+
# no way to create Entity and Notation nodes via the DOM Level 2
|
|
13
|
+
# interface), and for performance. The latter is the cause of some fairly
|
|
14
|
+
# cryptic code.
|
|
15
|
+
#
|
|
16
|
+
# Performance hacks:
|
|
17
|
+
#
|
|
18
|
+
# - .character_data_handler() has an extra case in which continuing
|
|
19
|
+
# data is appended to an existing Text node; this can be a
|
|
20
|
+
# speedup since pyexpat can break up character data into multiple
|
|
21
|
+
# callbacks even though we set the buffer_text attribute on the
|
|
22
|
+
# parser. This also gives us the advantage that we don't need a
|
|
23
|
+
# separate normalization pass.
|
|
24
|
+
#
|
|
25
|
+
# - Determining that a node exists is done using an identity comparison
|
|
26
|
+
# with None rather than a truth test; this avoids searching for and
|
|
27
|
+
# calling any methods on the node object if it exists. (A rather
|
|
28
|
+
# nice speedup is achieved this way as well!)
|
|
29
|
+
|
|
30
|
+
from xml.dom import xmlbuilder, minidom, Node
|
|
31
|
+
from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE
|
|
32
|
+
from xml.parsers import expat
|
|
33
|
+
from xml.dom.minidom import _append_child, _set_attribute_node
|
|
34
|
+
from xml.dom.NodeFilter import NodeFilter
|
|
35
|
+
|
|
36
|
+
TEXT_NODE = Node.TEXT_NODE
|
|
37
|
+
CDATA_SECTION_NODE = Node.CDATA_SECTION_NODE
|
|
38
|
+
DOCUMENT_NODE = Node.DOCUMENT_NODE
|
|
39
|
+
|
|
40
|
+
FILTER_ACCEPT = xmlbuilder.DOMBuilderFilter.FILTER_ACCEPT
|
|
41
|
+
FILTER_REJECT = xmlbuilder.DOMBuilderFilter.FILTER_REJECT
|
|
42
|
+
FILTER_SKIP = xmlbuilder.DOMBuilderFilter.FILTER_SKIP
|
|
43
|
+
FILTER_INTERRUPT = xmlbuilder.DOMBuilderFilter.FILTER_INTERRUPT
|
|
44
|
+
|
|
45
|
+
theDOMImplementation = minidom.getDOMImplementation()
|
|
46
|
+
|
|
47
|
+
# Expat typename -> TypeInfo
|
|
48
|
+
_typeinfo_map = {
|
|
49
|
+
"CDATA": minidom.TypeInfo(None, "cdata"),
|
|
50
|
+
"ENUM": minidom.TypeInfo(None, "enumeration"),
|
|
51
|
+
"ENTITY": minidom.TypeInfo(None, "entity"),
|
|
52
|
+
"ENTITIES": minidom.TypeInfo(None, "entities"),
|
|
53
|
+
"ID": minidom.TypeInfo(None, "id"),
|
|
54
|
+
"IDREF": minidom.TypeInfo(None, "idref"),
|
|
55
|
+
"IDREFS": minidom.TypeInfo(None, "idrefs"),
|
|
56
|
+
"NMTOKEN": minidom.TypeInfo(None, "nmtoken"),
|
|
57
|
+
"NMTOKENS": minidom.TypeInfo(None, "nmtokens"),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
class ElementInfo(object):
|
|
61
|
+
__slots__ = '_attr_info', '_model', 'tagName'
|
|
62
|
+
|
|
63
|
+
def __init__(self, tagName, model=None):
|
|
64
|
+
self.tagName = tagName
|
|
65
|
+
self._attr_info = []
|
|
66
|
+
self._model = model
|
|
67
|
+
|
|
68
|
+
def __getstate__(self):
|
|
69
|
+
return self._attr_info, self._model, self.tagName
|
|
70
|
+
|
|
71
|
+
def __setstate__(self, state):
|
|
72
|
+
self._attr_info, self._model, self.tagName = state
|
|
73
|
+
|
|
74
|
+
def getAttributeType(self, aname):
|
|
75
|
+
for info in self._attr_info:
|
|
76
|
+
if info[1] == aname:
|
|
77
|
+
t = info[-2]
|
|
78
|
+
if t[0] == "(":
|
|
79
|
+
return _typeinfo_map["ENUM"]
|
|
80
|
+
else:
|
|
81
|
+
return _typeinfo_map[info[-2]]
|
|
82
|
+
return minidom._no_type
|
|
83
|
+
|
|
84
|
+
def getAttributeTypeNS(self, namespaceURI, localName):
|
|
85
|
+
return minidom._no_type
|
|
86
|
+
|
|
87
|
+
def isElementContent(self):
|
|
88
|
+
if self._model:
|
|
89
|
+
type = self._model[0]
|
|
90
|
+
return type not in (expat.model.XML_CTYPE_ANY,
|
|
91
|
+
expat.model.XML_CTYPE_MIXED)
|
|
92
|
+
else:
|
|
93
|
+
return False
|
|
94
|
+
|
|
95
|
+
def isEmpty(self):
|
|
96
|
+
if self._model:
|
|
97
|
+
return self._model[0] == expat.model.XML_CTYPE_EMPTY
|
|
98
|
+
else:
|
|
99
|
+
return False
|
|
100
|
+
|
|
101
|
+
def isId(self, aname):
|
|
102
|
+
for info in self._attr_info:
|
|
103
|
+
if info[1] == aname:
|
|
104
|
+
return info[-2] == "ID"
|
|
105
|
+
return False
|
|
106
|
+
|
|
107
|
+
def isIdNS(self, euri, ename, auri, aname):
|
|
108
|
+
# not sure this is meaningful
|
|
109
|
+
return self.isId((auri, aname))
|
|
110
|
+
|
|
111
|
+
def _intern(builder, s):
|
|
112
|
+
return builder._intern_setdefault(s, s)
|
|
113
|
+
|
|
114
|
+
def _parse_ns_name(builder, name):
|
|
115
|
+
assert ' ' in name
|
|
116
|
+
parts = name.split(' ')
|
|
117
|
+
intern = builder._intern_setdefault
|
|
118
|
+
if len(parts) == 3:
|
|
119
|
+
uri, localname, prefix = parts
|
|
120
|
+
prefix = intern(prefix, prefix)
|
|
121
|
+
qname = "%s:%s" % (prefix, localname)
|
|
122
|
+
qname = intern(qname, qname)
|
|
123
|
+
localname = intern(localname, localname)
|
|
124
|
+
elif len(parts) == 2:
|
|
125
|
+
uri, localname = parts
|
|
126
|
+
prefix = EMPTY_PREFIX
|
|
127
|
+
qname = localname = intern(localname, localname)
|
|
128
|
+
else:
|
|
129
|
+
raise ValueError("Unsupported syntax: spaces in URIs not supported: %r" % name)
|
|
130
|
+
return intern(uri, uri), localname, prefix, qname
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class ExpatBuilder:
|
|
134
|
+
"""Document builder that uses Expat to build a ParsedXML.DOM document
|
|
135
|
+
instance."""
|
|
136
|
+
|
|
137
|
+
def __init__(self, options=None):
|
|
138
|
+
if options is None:
|
|
139
|
+
options = xmlbuilder.Options()
|
|
140
|
+
self._options = options
|
|
141
|
+
if self._options.filter is not None:
|
|
142
|
+
self._filter = FilterVisibilityController(self._options.filter)
|
|
143
|
+
else:
|
|
144
|
+
self._filter = None
|
|
145
|
+
# This *really* doesn't do anything in this case, so
|
|
146
|
+
# override it with something fast & minimal.
|
|
147
|
+
self._finish_start_element = id
|
|
148
|
+
self._parser = None
|
|
149
|
+
self.reset()
|
|
150
|
+
|
|
151
|
+
def createParser(self):
|
|
152
|
+
"""Create a new parser object."""
|
|
153
|
+
return expat.ParserCreate()
|
|
154
|
+
|
|
155
|
+
def getParser(self):
|
|
156
|
+
"""Return the parser object, creating a new one if needed."""
|
|
157
|
+
if not self._parser:
|
|
158
|
+
self._parser = self.createParser()
|
|
159
|
+
self._intern_setdefault = self._parser.intern.setdefault
|
|
160
|
+
self._parser.buffer_text = True
|
|
161
|
+
self._parser.ordered_attributes = True
|
|
162
|
+
self._parser.specified_attributes = True
|
|
163
|
+
self.install(self._parser)
|
|
164
|
+
return self._parser
|
|
165
|
+
|
|
166
|
+
def reset(self):
|
|
167
|
+
"""Free all data structures used during DOM construction."""
|
|
168
|
+
self.document = theDOMImplementation.createDocument(
|
|
169
|
+
EMPTY_NAMESPACE, None, None)
|
|
170
|
+
self.curNode = self.document
|
|
171
|
+
self._elem_info = self.document._elem_info
|
|
172
|
+
self._cdata = False
|
|
173
|
+
|
|
174
|
+
def install(self, parser):
|
|
175
|
+
"""Install the callbacks needed to build the DOM into the parser."""
|
|
176
|
+
# This creates circular references!
|
|
177
|
+
parser.StartDoctypeDeclHandler = self.start_doctype_decl_handler
|
|
178
|
+
parser.StartElementHandler = self.first_element_handler
|
|
179
|
+
parser.EndElementHandler = self.end_element_handler
|
|
180
|
+
parser.ProcessingInstructionHandler = self.pi_handler
|
|
181
|
+
if self._options.entities:
|
|
182
|
+
parser.EntityDeclHandler = self.entity_decl_handler
|
|
183
|
+
parser.NotationDeclHandler = self.notation_decl_handler
|
|
184
|
+
if self._options.comments:
|
|
185
|
+
parser.CommentHandler = self.comment_handler
|
|
186
|
+
if self._options.cdata_sections:
|
|
187
|
+
parser.StartCdataSectionHandler = self.start_cdata_section_handler
|
|
188
|
+
parser.EndCdataSectionHandler = self.end_cdata_section_handler
|
|
189
|
+
parser.CharacterDataHandler = self.character_data_handler_cdata
|
|
190
|
+
else:
|
|
191
|
+
parser.CharacterDataHandler = self.character_data_handler
|
|
192
|
+
parser.ExternalEntityRefHandler = self.external_entity_ref_handler
|
|
193
|
+
parser.XmlDeclHandler = self.xml_decl_handler
|
|
194
|
+
parser.ElementDeclHandler = self.element_decl_handler
|
|
195
|
+
parser.AttlistDeclHandler = self.attlist_decl_handler
|
|
196
|
+
|
|
197
|
+
def parseFile(self, file):
|
|
198
|
+
"""Parse a document from a file object, returning the document
|
|
199
|
+
node."""
|
|
200
|
+
parser = self.getParser()
|
|
201
|
+
first_buffer = True
|
|
202
|
+
try:
|
|
203
|
+
while buffer := file.read(16*1024):
|
|
204
|
+
parser.Parse(buffer, False)
|
|
205
|
+
if first_buffer and self.document.documentElement:
|
|
206
|
+
self._setup_subset(buffer)
|
|
207
|
+
first_buffer = False
|
|
208
|
+
parser.Parse(b"", True)
|
|
209
|
+
except ParseEscape:
|
|
210
|
+
pass
|
|
211
|
+
doc = self.document
|
|
212
|
+
self.reset()
|
|
213
|
+
self._parser = None
|
|
214
|
+
return doc
|
|
215
|
+
|
|
216
|
+
def parseString(self, string):
|
|
217
|
+
"""Parse a document from a string, returning the document node."""
|
|
218
|
+
parser = self.getParser()
|
|
219
|
+
try:
|
|
220
|
+
parser.Parse(string, True)
|
|
221
|
+
self._setup_subset(string)
|
|
222
|
+
except ParseEscape:
|
|
223
|
+
pass
|
|
224
|
+
doc = self.document
|
|
225
|
+
self.reset()
|
|
226
|
+
self._parser = None
|
|
227
|
+
return doc
|
|
228
|
+
|
|
229
|
+
def _setup_subset(self, buffer):
|
|
230
|
+
"""Load the internal subset if there might be one."""
|
|
231
|
+
if self.document.doctype:
|
|
232
|
+
extractor = InternalSubsetExtractor()
|
|
233
|
+
extractor.parseString(buffer)
|
|
234
|
+
subset = extractor.getSubset()
|
|
235
|
+
self.document.doctype.internalSubset = subset
|
|
236
|
+
|
|
237
|
+
def start_doctype_decl_handler(self, doctypeName, systemId, publicId,
|
|
238
|
+
has_internal_subset):
|
|
239
|
+
doctype = self.document.implementation.createDocumentType(
|
|
240
|
+
doctypeName, publicId, systemId)
|
|
241
|
+
doctype.ownerDocument = self.document
|
|
242
|
+
_append_child(self.document, doctype)
|
|
243
|
+
self.document.doctype = doctype
|
|
244
|
+
if self._filter and self._filter.acceptNode(doctype) == FILTER_REJECT:
|
|
245
|
+
self.document.doctype = None
|
|
246
|
+
del self.document.childNodes[-1]
|
|
247
|
+
doctype = None
|
|
248
|
+
self._parser.EntityDeclHandler = None
|
|
249
|
+
self._parser.NotationDeclHandler = None
|
|
250
|
+
if has_internal_subset:
|
|
251
|
+
if doctype is not None:
|
|
252
|
+
doctype.entities._seq = []
|
|
253
|
+
doctype.notations._seq = []
|
|
254
|
+
self._parser.CommentHandler = None
|
|
255
|
+
self._parser.ProcessingInstructionHandler = None
|
|
256
|
+
self._parser.EndDoctypeDeclHandler = self.end_doctype_decl_handler
|
|
257
|
+
|
|
258
|
+
def end_doctype_decl_handler(self):
|
|
259
|
+
if self._options.comments:
|
|
260
|
+
self._parser.CommentHandler = self.comment_handler
|
|
261
|
+
self._parser.ProcessingInstructionHandler = self.pi_handler
|
|
262
|
+
if not (self._elem_info or self._filter):
|
|
263
|
+
self._finish_end_element = id
|
|
264
|
+
|
|
265
|
+
def pi_handler(self, target, data):
|
|
266
|
+
node = self.document.createProcessingInstruction(target, data)
|
|
267
|
+
_append_child(self.curNode, node)
|
|
268
|
+
if self._filter and self._filter.acceptNode(node) == FILTER_REJECT:
|
|
269
|
+
self.curNode.removeChild(node)
|
|
270
|
+
|
|
271
|
+
def character_data_handler_cdata(self, data):
|
|
272
|
+
childNodes = self.curNode.childNodes
|
|
273
|
+
if self._cdata:
|
|
274
|
+
if ( self._cdata_continue
|
|
275
|
+
and childNodes[-1].nodeType == CDATA_SECTION_NODE):
|
|
276
|
+
childNodes[-1].appendData(data)
|
|
277
|
+
return
|
|
278
|
+
node = self.document.createCDATASection(data)
|
|
279
|
+
self._cdata_continue = True
|
|
280
|
+
elif childNodes and childNodes[-1].nodeType == TEXT_NODE:
|
|
281
|
+
node = childNodes[-1]
|
|
282
|
+
value = node.data + data
|
|
283
|
+
node.data = value
|
|
284
|
+
return
|
|
285
|
+
else:
|
|
286
|
+
node = minidom.Text()
|
|
287
|
+
node.data = data
|
|
288
|
+
node.ownerDocument = self.document
|
|
289
|
+
_append_child(self.curNode, node)
|
|
290
|
+
|
|
291
|
+
def character_data_handler(self, data):
|
|
292
|
+
childNodes = self.curNode.childNodes
|
|
293
|
+
if childNodes and childNodes[-1].nodeType == TEXT_NODE:
|
|
294
|
+
node = childNodes[-1]
|
|
295
|
+
node.data = node.data + data
|
|
296
|
+
return
|
|
297
|
+
node = minidom.Text()
|
|
298
|
+
node.data = node.data + data
|
|
299
|
+
node.ownerDocument = self.document
|
|
300
|
+
_append_child(self.curNode, node)
|
|
301
|
+
|
|
302
|
+
def entity_decl_handler(self, entityName, is_parameter_entity, value,
|
|
303
|
+
base, systemId, publicId, notationName):
|
|
304
|
+
if is_parameter_entity:
|
|
305
|
+
# we don't care about parameter entities for the DOM
|
|
306
|
+
return
|
|
307
|
+
if not self._options.entities:
|
|
308
|
+
return
|
|
309
|
+
node = self.document._create_entity(entityName, publicId,
|
|
310
|
+
systemId, notationName)
|
|
311
|
+
if value is not None:
|
|
312
|
+
# internal entity
|
|
313
|
+
# node *should* be readonly, but we'll cheat
|
|
314
|
+
child = self.document.createTextNode(value)
|
|
315
|
+
node.childNodes.append(child)
|
|
316
|
+
self.document.doctype.entities._seq.append(node)
|
|
317
|
+
if self._filter and self._filter.acceptNode(node) == FILTER_REJECT:
|
|
318
|
+
del self.document.doctype.entities._seq[-1]
|
|
319
|
+
|
|
320
|
+
def notation_decl_handler(self, notationName, base, systemId, publicId):
|
|
321
|
+
node = self.document._create_notation(notationName, publicId, systemId)
|
|
322
|
+
self.document.doctype.notations._seq.append(node)
|
|
323
|
+
if self._filter and self._filter.acceptNode(node) == FILTER_ACCEPT:
|
|
324
|
+
del self.document.doctype.notations._seq[-1]
|
|
325
|
+
|
|
326
|
+
def comment_handler(self, data):
|
|
327
|
+
node = self.document.createComment(data)
|
|
328
|
+
_append_child(self.curNode, node)
|
|
329
|
+
if self._filter and self._filter.acceptNode(node) == FILTER_REJECT:
|
|
330
|
+
self.curNode.removeChild(node)
|
|
331
|
+
|
|
332
|
+
def start_cdata_section_handler(self):
|
|
333
|
+
self._cdata = True
|
|
334
|
+
self._cdata_continue = False
|
|
335
|
+
|
|
336
|
+
def end_cdata_section_handler(self):
|
|
337
|
+
self._cdata = False
|
|
338
|
+
self._cdata_continue = False
|
|
339
|
+
|
|
340
|
+
def external_entity_ref_handler(self, context, base, systemId, publicId):
|
|
341
|
+
return 1
|
|
342
|
+
|
|
343
|
+
def first_element_handler(self, name, attributes):
|
|
344
|
+
if self._filter is None and not self._elem_info:
|
|
345
|
+
self._finish_end_element = id
|
|
346
|
+
self.getParser().StartElementHandler = self.start_element_handler
|
|
347
|
+
self.start_element_handler(name, attributes)
|
|
348
|
+
|
|
349
|
+
def start_element_handler(self, name, attributes):
|
|
350
|
+
node = self.document.createElement(name)
|
|
351
|
+
_append_child(self.curNode, node)
|
|
352
|
+
self.curNode = node
|
|
353
|
+
|
|
354
|
+
if attributes:
|
|
355
|
+
for i in range(0, len(attributes), 2):
|
|
356
|
+
a = minidom.Attr(attributes[i], EMPTY_NAMESPACE,
|
|
357
|
+
None, EMPTY_PREFIX)
|
|
358
|
+
value = attributes[i+1]
|
|
359
|
+
a.value = value
|
|
360
|
+
a.ownerDocument = self.document
|
|
361
|
+
_set_attribute_node(node, a)
|
|
362
|
+
|
|
363
|
+
if node is not self.document.documentElement:
|
|
364
|
+
self._finish_start_element(node)
|
|
365
|
+
|
|
366
|
+
def _finish_start_element(self, node):
|
|
367
|
+
if self._filter:
|
|
368
|
+
# To be general, we'd have to call isSameNode(), but this
|
|
369
|
+
# is sufficient for minidom:
|
|
370
|
+
if node is self.document.documentElement:
|
|
371
|
+
return
|
|
372
|
+
filt = self._filter.startContainer(node)
|
|
373
|
+
if filt == FILTER_REJECT:
|
|
374
|
+
# ignore this node & all descendents
|
|
375
|
+
Rejecter(self)
|
|
376
|
+
elif filt == FILTER_SKIP:
|
|
377
|
+
# ignore this node, but make it's children become
|
|
378
|
+
# children of the parent node
|
|
379
|
+
Skipper(self)
|
|
380
|
+
else:
|
|
381
|
+
return
|
|
382
|
+
self.curNode = node.parentNode
|
|
383
|
+
node.parentNode.removeChild(node)
|
|
384
|
+
node.unlink()
|
|
385
|
+
|
|
386
|
+
# If this ever changes, Namespaces.end_element_handler() needs to
|
|
387
|
+
# be changed to match.
|
|
388
|
+
#
|
|
389
|
+
def end_element_handler(self, name):
|
|
390
|
+
curNode = self.curNode
|
|
391
|
+
self.curNode = curNode.parentNode
|
|
392
|
+
self._finish_end_element(curNode)
|
|
393
|
+
|
|
394
|
+
def _finish_end_element(self, curNode):
|
|
395
|
+
info = self._elem_info.get(curNode.tagName)
|
|
396
|
+
if info:
|
|
397
|
+
self._handle_white_text_nodes(curNode, info)
|
|
398
|
+
if self._filter:
|
|
399
|
+
if curNode is self.document.documentElement:
|
|
400
|
+
return
|
|
401
|
+
if self._filter.acceptNode(curNode) == FILTER_REJECT:
|
|
402
|
+
self.curNode.removeChild(curNode)
|
|
403
|
+
curNode.unlink()
|
|
404
|
+
|
|
405
|
+
def _handle_white_text_nodes(self, node, info):
|
|
406
|
+
if (self._options.whitespace_in_element_content
|
|
407
|
+
or not info.isElementContent()):
|
|
408
|
+
return
|
|
409
|
+
|
|
410
|
+
# We have element type information and should remove ignorable
|
|
411
|
+
# whitespace; identify for text nodes which contain only
|
|
412
|
+
# whitespace.
|
|
413
|
+
L = []
|
|
414
|
+
for child in node.childNodes:
|
|
415
|
+
if child.nodeType == TEXT_NODE and not child.data.strip():
|
|
416
|
+
L.append(child)
|
|
417
|
+
|
|
418
|
+
# Remove ignorable whitespace from the tree.
|
|
419
|
+
for child in L:
|
|
420
|
+
node.removeChild(child)
|
|
421
|
+
|
|
422
|
+
def element_decl_handler(self, name, model):
|
|
423
|
+
info = self._elem_info.get(name)
|
|
424
|
+
if info is None:
|
|
425
|
+
self._elem_info[name] = ElementInfo(name, model)
|
|
426
|
+
else:
|
|
427
|
+
assert info._model is None
|
|
428
|
+
info._model = model
|
|
429
|
+
|
|
430
|
+
def attlist_decl_handler(self, elem, name, type, default, required):
|
|
431
|
+
info = self._elem_info.get(elem)
|
|
432
|
+
if info is None:
|
|
433
|
+
info = ElementInfo(elem)
|
|
434
|
+
self._elem_info[elem] = info
|
|
435
|
+
info._attr_info.append(
|
|
436
|
+
[None, name, None, None, default, 0, type, required])
|
|
437
|
+
|
|
438
|
+
def xml_decl_handler(self, version, encoding, standalone):
|
|
439
|
+
self.document.version = version
|
|
440
|
+
self.document.encoding = encoding
|
|
441
|
+
# This is still a little ugly, thanks to the pyexpat API. ;-(
|
|
442
|
+
if standalone >= 0:
|
|
443
|
+
if standalone:
|
|
444
|
+
self.document.standalone = True
|
|
445
|
+
else:
|
|
446
|
+
self.document.standalone = False
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
# Don't include FILTER_INTERRUPT, since that's checked separately
|
|
450
|
+
# where allowed.
|
|
451
|
+
_ALLOWED_FILTER_RETURNS = (FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP)
|
|
452
|
+
|
|
453
|
+
class FilterVisibilityController(object):
|
|
454
|
+
"""Wrapper around a DOMBuilderFilter which implements the checks
|
|
455
|
+
to make the whatToShow filter attribute work."""
|
|
456
|
+
|
|
457
|
+
__slots__ = 'filter',
|
|
458
|
+
|
|
459
|
+
def __init__(self, filter):
|
|
460
|
+
self.filter = filter
|
|
461
|
+
|
|
462
|
+
def startContainer(self, node):
|
|
463
|
+
mask = self._nodetype_mask[node.nodeType]
|
|
464
|
+
if self.filter.whatToShow & mask:
|
|
465
|
+
val = self.filter.startContainer(node)
|
|
466
|
+
if val == FILTER_INTERRUPT:
|
|
467
|
+
raise ParseEscape
|
|
468
|
+
if val not in _ALLOWED_FILTER_RETURNS:
|
|
469
|
+
raise ValueError(
|
|
470
|
+
"startContainer() returned illegal value: " + repr(val))
|
|
471
|
+
return val
|
|
472
|
+
else:
|
|
473
|
+
return FILTER_ACCEPT
|
|
474
|
+
|
|
475
|
+
def acceptNode(self, node):
|
|
476
|
+
mask = self._nodetype_mask[node.nodeType]
|
|
477
|
+
if self.filter.whatToShow & mask:
|
|
478
|
+
val = self.filter.acceptNode(node)
|
|
479
|
+
if val == FILTER_INTERRUPT:
|
|
480
|
+
raise ParseEscape
|
|
481
|
+
if val == FILTER_SKIP:
|
|
482
|
+
# move all child nodes to the parent, and remove this node
|
|
483
|
+
parent = node.parentNode
|
|
484
|
+
for child in node.childNodes[:]:
|
|
485
|
+
parent.appendChild(child)
|
|
486
|
+
# node is handled by the caller
|
|
487
|
+
return FILTER_REJECT
|
|
488
|
+
if val not in _ALLOWED_FILTER_RETURNS:
|
|
489
|
+
raise ValueError(
|
|
490
|
+
"acceptNode() returned illegal value: " + repr(val))
|
|
491
|
+
return val
|
|
492
|
+
else:
|
|
493
|
+
return FILTER_ACCEPT
|
|
494
|
+
|
|
495
|
+
_nodetype_mask = {
|
|
496
|
+
Node.ELEMENT_NODE: NodeFilter.SHOW_ELEMENT,
|
|
497
|
+
Node.ATTRIBUTE_NODE: NodeFilter.SHOW_ATTRIBUTE,
|
|
498
|
+
Node.TEXT_NODE: NodeFilter.SHOW_TEXT,
|
|
499
|
+
Node.CDATA_SECTION_NODE: NodeFilter.SHOW_CDATA_SECTION,
|
|
500
|
+
Node.ENTITY_REFERENCE_NODE: NodeFilter.SHOW_ENTITY_REFERENCE,
|
|
501
|
+
Node.ENTITY_NODE: NodeFilter.SHOW_ENTITY,
|
|
502
|
+
Node.PROCESSING_INSTRUCTION_NODE: NodeFilter.SHOW_PROCESSING_INSTRUCTION,
|
|
503
|
+
Node.COMMENT_NODE: NodeFilter.SHOW_COMMENT,
|
|
504
|
+
Node.DOCUMENT_NODE: NodeFilter.SHOW_DOCUMENT,
|
|
505
|
+
Node.DOCUMENT_TYPE_NODE: NodeFilter.SHOW_DOCUMENT_TYPE,
|
|
506
|
+
Node.DOCUMENT_FRAGMENT_NODE: NodeFilter.SHOW_DOCUMENT_FRAGMENT,
|
|
507
|
+
Node.NOTATION_NODE: NodeFilter.SHOW_NOTATION,
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
class FilterCrutch(object):
|
|
512
|
+
__slots__ = '_builder', '_level', '_old_start', '_old_end'
|
|
513
|
+
|
|
514
|
+
def __init__(self, builder):
|
|
515
|
+
self._level = 0
|
|
516
|
+
self._builder = builder
|
|
517
|
+
parser = builder._parser
|
|
518
|
+
self._old_start = parser.StartElementHandler
|
|
519
|
+
self._old_end = parser.EndElementHandler
|
|
520
|
+
parser.StartElementHandler = self.start_element_handler
|
|
521
|
+
parser.EndElementHandler = self.end_element_handler
|
|
522
|
+
|
|
523
|
+
class Rejecter(FilterCrutch):
|
|
524
|
+
__slots__ = ()
|
|
525
|
+
|
|
526
|
+
def __init__(self, builder):
|
|
527
|
+
FilterCrutch.__init__(self, builder)
|
|
528
|
+
parser = builder._parser
|
|
529
|
+
for name in ("ProcessingInstructionHandler",
|
|
530
|
+
"CommentHandler",
|
|
531
|
+
"CharacterDataHandler",
|
|
532
|
+
"StartCdataSectionHandler",
|
|
533
|
+
"EndCdataSectionHandler",
|
|
534
|
+
"ExternalEntityRefHandler",
|
|
535
|
+
):
|
|
536
|
+
setattr(parser, name, None)
|
|
537
|
+
|
|
538
|
+
def start_element_handler(self, *args):
|
|
539
|
+
self._level = self._level + 1
|
|
540
|
+
|
|
541
|
+
def end_element_handler(self, *args):
|
|
542
|
+
if self._level == 0:
|
|
543
|
+
# restore the old handlers
|
|
544
|
+
parser = self._builder._parser
|
|
545
|
+
self._builder.install(parser)
|
|
546
|
+
parser.StartElementHandler = self._old_start
|
|
547
|
+
parser.EndElementHandler = self._old_end
|
|
548
|
+
else:
|
|
549
|
+
self._level = self._level - 1
|
|
550
|
+
|
|
551
|
+
class Skipper(FilterCrutch):
|
|
552
|
+
__slots__ = ()
|
|
553
|
+
|
|
554
|
+
def start_element_handler(self, *args):
|
|
555
|
+
node = self._builder.curNode
|
|
556
|
+
self._old_start(*args)
|
|
557
|
+
if self._builder.curNode is not node:
|
|
558
|
+
self._level = self._level + 1
|
|
559
|
+
|
|
560
|
+
def end_element_handler(self, *args):
|
|
561
|
+
if self._level == 0:
|
|
562
|
+
# We're popping back out of the node we're skipping, so we
|
|
563
|
+
# shouldn't need to do anything but reset the handlers.
|
|
564
|
+
self._builder._parser.StartElementHandler = self._old_start
|
|
565
|
+
self._builder._parser.EndElementHandler = self._old_end
|
|
566
|
+
self._builder = None
|
|
567
|
+
else:
|
|
568
|
+
self._level = self._level - 1
|
|
569
|
+
self._old_end(*args)
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
# framework document used by the fragment builder.
|
|
573
|
+
# Takes a string for the doctype, subset string, and namespace attrs string.
|
|
574
|
+
|
|
575
|
+
_FRAGMENT_BUILDER_INTERNAL_SYSTEM_ID = \
|
|
576
|
+
"http://xml.python.org/entities/fragment-builder/internal"
|
|
577
|
+
|
|
578
|
+
_FRAGMENT_BUILDER_TEMPLATE = (
|
|
579
|
+
'''\
|
|
580
|
+
<!DOCTYPE wrapper
|
|
581
|
+
%%s [
|
|
582
|
+
<!ENTITY fragment-builder-internal
|
|
583
|
+
SYSTEM "%s">
|
|
584
|
+
%%s
|
|
585
|
+
]>
|
|
586
|
+
<wrapper %%s
|
|
587
|
+
>&fragment-builder-internal;</wrapper>'''
|
|
588
|
+
% _FRAGMENT_BUILDER_INTERNAL_SYSTEM_ID)
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
class FragmentBuilder(ExpatBuilder):
|
|
592
|
+
"""Builder which constructs document fragments given XML source
|
|
593
|
+
text and a context node.
|
|
594
|
+
|
|
595
|
+
The context node is expected to provide information about the
|
|
596
|
+
namespace declarations which are in scope at the start of the
|
|
597
|
+
fragment.
|
|
598
|
+
"""
|
|
599
|
+
|
|
600
|
+
def __init__(self, context, options=None):
|
|
601
|
+
if context.nodeType == DOCUMENT_NODE:
|
|
602
|
+
self.originalDocument = context
|
|
603
|
+
self.context = context
|
|
604
|
+
else:
|
|
605
|
+
self.originalDocument = context.ownerDocument
|
|
606
|
+
self.context = context
|
|
607
|
+
ExpatBuilder.__init__(self, options)
|
|
608
|
+
|
|
609
|
+
def reset(self):
|
|
610
|
+
ExpatBuilder.reset(self)
|
|
611
|
+
self.fragment = None
|
|
612
|
+
|
|
613
|
+
def parseFile(self, file):
|
|
614
|
+
"""Parse a document fragment from a file object, returning the
|
|
615
|
+
fragment node."""
|
|
616
|
+
return self.parseString(file.read())
|
|
617
|
+
|
|
618
|
+
def parseString(self, string):
|
|
619
|
+
"""Parse a document fragment from a string, returning the
|
|
620
|
+
fragment node."""
|
|
621
|
+
self._source = string
|
|
622
|
+
parser = self.getParser()
|
|
623
|
+
doctype = self.originalDocument.doctype
|
|
624
|
+
ident = ""
|
|
625
|
+
if doctype:
|
|
626
|
+
subset = doctype.internalSubset or self._getDeclarations()
|
|
627
|
+
if doctype.publicId:
|
|
628
|
+
ident = ('PUBLIC "%s" "%s"'
|
|
629
|
+
% (doctype.publicId, doctype.systemId))
|
|
630
|
+
elif doctype.systemId:
|
|
631
|
+
ident = 'SYSTEM "%s"' % doctype.systemId
|
|
632
|
+
else:
|
|
633
|
+
subset = ""
|
|
634
|
+
nsattrs = self._getNSattrs() # get ns decls from node's ancestors
|
|
635
|
+
document = _FRAGMENT_BUILDER_TEMPLATE % (ident, subset, nsattrs)
|
|
636
|
+
try:
|
|
637
|
+
parser.Parse(document, True)
|
|
638
|
+
except:
|
|
639
|
+
self.reset()
|
|
640
|
+
raise
|
|
641
|
+
fragment = self.fragment
|
|
642
|
+
self.reset()
|
|
643
|
+
## self._parser = None
|
|
644
|
+
return fragment
|
|
645
|
+
|
|
646
|
+
def _getDeclarations(self):
|
|
647
|
+
"""Re-create the internal subset from the DocumentType node.
|
|
648
|
+
|
|
649
|
+
This is only needed if we don't already have the
|
|
650
|
+
internalSubset as a string.
|
|
651
|
+
"""
|
|
652
|
+
doctype = self.context.ownerDocument.doctype
|
|
653
|
+
s = ""
|
|
654
|
+
if doctype:
|
|
655
|
+
for i in range(doctype.notations.length):
|
|
656
|
+
notation = doctype.notations.item(i)
|
|
657
|
+
if s:
|
|
658
|
+
s = s + "\n "
|
|
659
|
+
s = "%s<!NOTATION %s" % (s, notation.nodeName)
|
|
660
|
+
if notation.publicId:
|
|
661
|
+
s = '%s PUBLIC "%s"\n "%s">' \
|
|
662
|
+
% (s, notation.publicId, notation.systemId)
|
|
663
|
+
else:
|
|
664
|
+
s = '%s SYSTEM "%s">' % (s, notation.systemId)
|
|
665
|
+
for i in range(doctype.entities.length):
|
|
666
|
+
entity = doctype.entities.item(i)
|
|
667
|
+
if s:
|
|
668
|
+
s = s + "\n "
|
|
669
|
+
s = "%s<!ENTITY %s" % (s, entity.nodeName)
|
|
670
|
+
if entity.publicId:
|
|
671
|
+
s = '%s PUBLIC "%s"\n "%s"' \
|
|
672
|
+
% (s, entity.publicId, entity.systemId)
|
|
673
|
+
elif entity.systemId:
|
|
674
|
+
s = '%s SYSTEM "%s"' % (s, entity.systemId)
|
|
675
|
+
else:
|
|
676
|
+
s = '%s "%s"' % (s, entity.firstChild.data)
|
|
677
|
+
if entity.notationName:
|
|
678
|
+
s = "%s NOTATION %s" % (s, entity.notationName)
|
|
679
|
+
s = s + ">"
|
|
680
|
+
return s
|
|
681
|
+
|
|
682
|
+
def _getNSattrs(self):
|
|
683
|
+
return ""
|
|
684
|
+
|
|
685
|
+
def external_entity_ref_handler(self, context, base, systemId, publicId):
|
|
686
|
+
if systemId == _FRAGMENT_BUILDER_INTERNAL_SYSTEM_ID:
|
|
687
|
+
# this entref is the one that we made to put the subtree
|
|
688
|
+
# in; all of our given input is parsed in here.
|
|
689
|
+
old_document = self.document
|
|
690
|
+
old_cur_node = self.curNode
|
|
691
|
+
parser = self._parser.ExternalEntityParserCreate(context)
|
|
692
|
+
# put the real document back, parse into the fragment to return
|
|
693
|
+
self.document = self.originalDocument
|
|
694
|
+
self.fragment = self.document.createDocumentFragment()
|
|
695
|
+
self.curNode = self.fragment
|
|
696
|
+
try:
|
|
697
|
+
parser.Parse(self._source, True)
|
|
698
|
+
finally:
|
|
699
|
+
self.curNode = old_cur_node
|
|
700
|
+
self.document = old_document
|
|
701
|
+
self._source = None
|
|
702
|
+
return -1
|
|
703
|
+
else:
|
|
704
|
+
return ExpatBuilder.external_entity_ref_handler(
|
|
705
|
+
self, context, base, systemId, publicId)
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
class Namespaces:
|
|
709
|
+
"""Mix-in class for builders; adds support for namespaces."""
|
|
710
|
+
|
|
711
|
+
def _initNamespaces(self):
|
|
712
|
+
# list of (prefix, uri) ns declarations. Namespace attrs are
|
|
713
|
+
# constructed from this and added to the element's attrs.
|
|
714
|
+
self._ns_ordered_prefixes = []
|
|
715
|
+
|
|
716
|
+
def createParser(self):
|
|
717
|
+
"""Create a new namespace-handling parser."""
|
|
718
|
+
parser = expat.ParserCreate(namespace_separator=" ")
|
|
719
|
+
parser.namespace_prefixes = True
|
|
720
|
+
return parser
|
|
721
|
+
|
|
722
|
+
def install(self, parser):
|
|
723
|
+
"""Insert the namespace-handlers onto the parser."""
|
|
724
|
+
ExpatBuilder.install(self, parser)
|
|
725
|
+
if self._options.namespace_declarations:
|
|
726
|
+
parser.StartNamespaceDeclHandler = (
|
|
727
|
+
self.start_namespace_decl_handler)
|
|
728
|
+
|
|
729
|
+
def start_namespace_decl_handler(self, prefix, uri):
|
|
730
|
+
"""Push this namespace declaration on our storage."""
|
|
731
|
+
self._ns_ordered_prefixes.append((prefix, uri))
|
|
732
|
+
|
|
733
|
+
def start_element_handler(self, name, attributes):
|
|
734
|
+
if ' ' in name:
|
|
735
|
+
uri, localname, prefix, qname = _parse_ns_name(self, name)
|
|
736
|
+
else:
|
|
737
|
+
uri = EMPTY_NAMESPACE
|
|
738
|
+
qname = name
|
|
739
|
+
localname = None
|
|
740
|
+
prefix = EMPTY_PREFIX
|
|
741
|
+
node = minidom.Element(qname, uri, prefix, localname)
|
|
742
|
+
node.ownerDocument = self.document
|
|
743
|
+
_append_child(self.curNode, node)
|
|
744
|
+
self.curNode = node
|
|
745
|
+
|
|
746
|
+
if self._ns_ordered_prefixes:
|
|
747
|
+
for prefix, uri in self._ns_ordered_prefixes:
|
|
748
|
+
if prefix:
|
|
749
|
+
a = minidom.Attr(_intern(self, 'xmlns:' + prefix),
|
|
750
|
+
XMLNS_NAMESPACE, prefix, "xmlns")
|
|
751
|
+
else:
|
|
752
|
+
a = minidom.Attr("xmlns", XMLNS_NAMESPACE,
|
|
753
|
+
"xmlns", EMPTY_PREFIX)
|
|
754
|
+
a.value = uri
|
|
755
|
+
a.ownerDocument = self.document
|
|
756
|
+
_set_attribute_node(node, a)
|
|
757
|
+
del self._ns_ordered_prefixes[:]
|
|
758
|
+
|
|
759
|
+
if attributes:
|
|
760
|
+
node._ensure_attributes()
|
|
761
|
+
_attrs = node._attrs
|
|
762
|
+
_attrsNS = node._attrsNS
|
|
763
|
+
for i in range(0, len(attributes), 2):
|
|
764
|
+
aname = attributes[i]
|
|
765
|
+
value = attributes[i+1]
|
|
766
|
+
if ' ' in aname:
|
|
767
|
+
uri, localname, prefix, qname = _parse_ns_name(self, aname)
|
|
768
|
+
a = minidom.Attr(qname, uri, localname, prefix)
|
|
769
|
+
_attrs[qname] = a
|
|
770
|
+
_attrsNS[(uri, localname)] = a
|
|
771
|
+
else:
|
|
772
|
+
a = minidom.Attr(aname, EMPTY_NAMESPACE,
|
|
773
|
+
aname, EMPTY_PREFIX)
|
|
774
|
+
_attrs[aname] = a
|
|
775
|
+
_attrsNS[(EMPTY_NAMESPACE, aname)] = a
|
|
776
|
+
a.ownerDocument = self.document
|
|
777
|
+
a.value = value
|
|
778
|
+
a.ownerElement = node
|
|
779
|
+
|
|
780
|
+
if __debug__:
|
|
781
|
+
# This only adds some asserts to the original
|
|
782
|
+
# end_element_handler(), so we only define this when -O is not
|
|
783
|
+
# used. If changing one, be sure to check the other to see if
|
|
784
|
+
# it needs to be changed as well.
|
|
785
|
+
#
|
|
786
|
+
def end_element_handler(self, name):
|
|
787
|
+
curNode = self.curNode
|
|
788
|
+
if ' ' in name:
|
|
789
|
+
uri, localname, prefix, qname = _parse_ns_name(self, name)
|
|
790
|
+
assert (curNode.namespaceURI == uri
|
|
791
|
+
and curNode.localName == localname
|
|
792
|
+
and curNode.prefix == prefix), \
|
|
793
|
+
"element stack messed up! (namespace)"
|
|
794
|
+
else:
|
|
795
|
+
assert curNode.nodeName == name, \
|
|
796
|
+
"element stack messed up - bad nodeName"
|
|
797
|
+
assert curNode.namespaceURI == EMPTY_NAMESPACE, \
|
|
798
|
+
"element stack messed up - bad namespaceURI"
|
|
799
|
+
self.curNode = curNode.parentNode
|
|
800
|
+
self._finish_end_element(curNode)
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
class ExpatBuilderNS(Namespaces, ExpatBuilder):
|
|
804
|
+
"""Document builder that supports namespaces."""
|
|
805
|
+
|
|
806
|
+
def reset(self):
|
|
807
|
+
ExpatBuilder.reset(self)
|
|
808
|
+
self._initNamespaces()
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
class FragmentBuilderNS(Namespaces, FragmentBuilder):
|
|
812
|
+
"""Fragment builder that supports namespaces."""
|
|
813
|
+
|
|
814
|
+
def reset(self):
|
|
815
|
+
FragmentBuilder.reset(self)
|
|
816
|
+
self._initNamespaces()
|
|
817
|
+
|
|
818
|
+
def _getNSattrs(self):
|
|
819
|
+
"""Return string of namespace attributes from this element and
|
|
820
|
+
ancestors."""
|
|
821
|
+
# XXX This needs to be re-written to walk the ancestors of the
|
|
822
|
+
# context to build up the namespace information from
|
|
823
|
+
# declarations, elements, and attributes found in context.
|
|
824
|
+
# Otherwise we have to store a bunch more data on the DOM
|
|
825
|
+
# (though that *might* be more reliable -- not clear).
|
|
826
|
+
attrs = ""
|
|
827
|
+
context = self.context
|
|
828
|
+
L = []
|
|
829
|
+
while context:
|
|
830
|
+
if hasattr(context, '_ns_prefix_uri'):
|
|
831
|
+
for prefix, uri in context._ns_prefix_uri.items():
|
|
832
|
+
# add every new NS decl from context to L and attrs string
|
|
833
|
+
if prefix in L:
|
|
834
|
+
continue
|
|
835
|
+
L.append(prefix)
|
|
836
|
+
if prefix:
|
|
837
|
+
declname = "xmlns:" + prefix
|
|
838
|
+
else:
|
|
839
|
+
declname = "xmlns"
|
|
840
|
+
if attrs:
|
|
841
|
+
attrs = "%s\n %s='%s'" % (attrs, declname, uri)
|
|
842
|
+
else:
|
|
843
|
+
attrs = " %s='%s'" % (declname, uri)
|
|
844
|
+
context = context.parentNode
|
|
845
|
+
return attrs
|
|
846
|
+
|
|
847
|
+
|
|
848
|
+
class ParseEscape(Exception):
|
|
849
|
+
"""Exception raised to short-circuit parsing in InternalSubsetExtractor."""
|
|
850
|
+
pass
|
|
851
|
+
|
|
852
|
+
class InternalSubsetExtractor(ExpatBuilder):
|
|
853
|
+
"""XML processor which can rip out the internal document type subset."""
|
|
854
|
+
|
|
855
|
+
subset = None
|
|
856
|
+
|
|
857
|
+
def getSubset(self):
|
|
858
|
+
"""Return the internal subset as a string."""
|
|
859
|
+
return self.subset
|
|
860
|
+
|
|
861
|
+
def parseFile(self, file):
|
|
862
|
+
try:
|
|
863
|
+
ExpatBuilder.parseFile(self, file)
|
|
864
|
+
except ParseEscape:
|
|
865
|
+
pass
|
|
866
|
+
|
|
867
|
+
def parseString(self, string):
|
|
868
|
+
try:
|
|
869
|
+
ExpatBuilder.parseString(self, string)
|
|
870
|
+
except ParseEscape:
|
|
871
|
+
pass
|
|
872
|
+
|
|
873
|
+
def install(self, parser):
|
|
874
|
+
parser.StartDoctypeDeclHandler = self.start_doctype_decl_handler
|
|
875
|
+
parser.StartElementHandler = self.start_element_handler
|
|
876
|
+
|
|
877
|
+
def start_doctype_decl_handler(self, name, publicId, systemId,
|
|
878
|
+
has_internal_subset):
|
|
879
|
+
if has_internal_subset:
|
|
880
|
+
parser = self.getParser()
|
|
881
|
+
self.subset = []
|
|
882
|
+
parser.DefaultHandler = self.subset.append
|
|
883
|
+
parser.EndDoctypeDeclHandler = self.end_doctype_decl_handler
|
|
884
|
+
else:
|
|
885
|
+
raise ParseEscape()
|
|
886
|
+
|
|
887
|
+
def end_doctype_decl_handler(self):
|
|
888
|
+
s = ''.join(self.subset).replace('\r\n', '\n').replace('\r', '\n')
|
|
889
|
+
self.subset = s
|
|
890
|
+
raise ParseEscape()
|
|
891
|
+
|
|
892
|
+
def start_element_handler(self, name, attrs):
|
|
893
|
+
raise ParseEscape()
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
def parse(file, namespaces=True):
|
|
897
|
+
"""Parse a document, returning the resulting Document node.
|
|
898
|
+
|
|
899
|
+
'file' may be either a file name or an open file object.
|
|
900
|
+
"""
|
|
901
|
+
if namespaces:
|
|
902
|
+
builder = ExpatBuilderNS()
|
|
903
|
+
else:
|
|
904
|
+
builder = ExpatBuilder()
|
|
905
|
+
|
|
906
|
+
if isinstance(file, str):
|
|
907
|
+
with open(file, 'rb') as fp:
|
|
908
|
+
result = builder.parseFile(fp)
|
|
909
|
+
else:
|
|
910
|
+
result = builder.parseFile(file)
|
|
911
|
+
return result
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
def parseString(string, namespaces=True):
|
|
915
|
+
"""Parse a document from a string, returning the resulting
|
|
916
|
+
Document node.
|
|
917
|
+
"""
|
|
918
|
+
if namespaces:
|
|
919
|
+
builder = ExpatBuilderNS()
|
|
920
|
+
else:
|
|
921
|
+
builder = ExpatBuilder()
|
|
922
|
+
return builder.parseString(string)
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
def parseFragment(file, context, namespaces=True):
|
|
926
|
+
"""Parse a fragment of a document, given the context from which it
|
|
927
|
+
was originally extracted. context should be the parent of the
|
|
928
|
+
node(s) which are in the fragment.
|
|
929
|
+
|
|
930
|
+
'file' may be either a file name or an open file object.
|
|
931
|
+
"""
|
|
932
|
+
if namespaces:
|
|
933
|
+
builder = FragmentBuilderNS(context)
|
|
934
|
+
else:
|
|
935
|
+
builder = FragmentBuilder(context)
|
|
936
|
+
|
|
937
|
+
if isinstance(file, str):
|
|
938
|
+
with open(file, 'rb') as fp:
|
|
939
|
+
result = builder.parseFile(fp)
|
|
940
|
+
else:
|
|
941
|
+
result = builder.parseFile(file)
|
|
942
|
+
return result
|
|
943
|
+
|
|
944
|
+
|
|
945
|
+
def parseFragmentString(string, context, namespaces=True):
|
|
946
|
+
"""Parse a fragment of a document from a string, given the context
|
|
947
|
+
from which it was originally extracted. context should be the
|
|
948
|
+
parent of the node(s) which are in the fragment.
|
|
949
|
+
"""
|
|
950
|
+
if namespaces:
|
|
951
|
+
builder = FragmentBuilderNS(context)
|
|
952
|
+
else:
|
|
953
|
+
builder = FragmentBuilder(context)
|
|
954
|
+
return builder.parseString(string)
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
def makeBuilder(options):
|
|
958
|
+
"""Create a builder based on an Options object."""
|
|
959
|
+
if options.namespaces:
|
|
960
|
+
return ExpatBuilderNS(options)
|
|
961
|
+
else:
|
|
962
|
+
return ExpatBuilder(options)
|