亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tableparser.py

?? Requirement =====================================================================================
?? PY
?? 第 1 頁 / 共 2 頁
字號:
        rowseps = {}        for i in range(bottom - 1, top, -1):            if self.block[i][left] == '+':                rowseps[i] = [left]            elif self.block[i][left] != '|':                return None        return rowseps    def structure_from_cells(self):        """        From the data collected by `scan_cell()`, convert to the final data        structure.        """        rowseps = self.rowseps.keys()   # list of row boundaries        rowseps.sort()        rowindex = {}        for i in range(len(rowseps)):            rowindex[rowseps[i]] = i    # row boundary -> row number mapping        colseps = self.colseps.keys()   # list of column boundaries        colseps.sort()        colindex = {}        for i in range(len(colseps)):            colindex[colseps[i]] = i    # column boundary -> col number map        colspecs = [(colseps[i] - colseps[i - 1] - 1)                    for i in range(1, len(colseps))] # list of column widths        # prepare an empty table with the correct number of rows & columns        onerow = [None for i in range(len(colseps) - 1)]        rows = [onerow[:] for i in range(len(rowseps) - 1)]        # keep track of # of cells remaining; should reduce to zero        remaining = (len(rowseps) - 1) * (len(colseps) - 1)        for top, left, bottom, right, block in self.cells:            rownum = rowindex[top]            colnum = colindex[left]            assert rows[rownum][colnum] is None, (                  'Cell (row %s, column %s) already used.'                  % (rownum + 1, colnum + 1))            morerows = rowindex[bottom] - rownum - 1            morecols = colindex[right] - colnum - 1            remaining -= (morerows + 1) * (morecols + 1)            # write the cell into the table            rows[rownum][colnum] = (morerows, morecols, top + 1, block)        assert remaining == 0, 'Unused cells remaining.'        if self.head_body_sep:          # separate head rows from body rows            numheadrows = rowindex[self.head_body_sep]            headrows = rows[:numheadrows]            bodyrows = rows[numheadrows:]        else:            headrows = []            bodyrows = rows        return (colspecs, headrows, bodyrows)class SimpleTableParser(TableParser):    """    Parse a simple table using `parse()`.    Here's an example of a simple table::        =====  =====        col 1  col 2        =====  =====        1      Second column of row 1.        2      Second column of row 2.               Second line of paragraph.        3      - Second column of row 3.               - Second item in bullet                 list (row 3, column 2).        4 is a span        ------------        5        =====  =====    Top and bottom borders use '=', column span underlines use '-', column    separation is indicated with spaces.    Passing the above table to the `parse()` method will result in the    following data structure, whose interpretation is the same as for    `GridTableParser`::        ([5, 25],         [[(0, 0, 1, ['col 1']),           (0, 0, 1, ['col 2'])]],         [[(0, 0, 3, ['1']),           (0, 0, 3, ['Second column of row 1.'])],          [(0, 0, 4, ['2']),           (0, 0, 4, ['Second column of row 2.',                      'Second line of paragraph.'])],          [(0, 0, 6, ['3']),           (0, 0, 6, ['- Second column of row 3.',                      '',                      '- Second item in bullet',                      '  list (row 3, column 2).'])],          [(0, 1, 10, ['4 is a span'])],          [(0, 0, 12, ['5']),           (0, 0, 12, [''])]])    """    head_body_separator_pat = re.compile('=[ =]*$')    span_pat = re.compile('-[ -]*$')    def setup(self, block):        self.block = block[:]           # make a copy; it will be modified        self.block.disconnect()         # don't propagate changes to parent        # Convert top & bottom borders to column span underlines:        self.block[0] = self.block[0].replace('=', '-')        self.block[-1] = self.block[-1].replace('=', '-')        self.head_body_sep = None        self.columns = []        self.border_end = None        self.table = []        self.done = [-1] * len(block[0])        self.rowseps = {0: [0]}        self.colseps = {0: [0]}    def parse_table(self):        """        First determine the column boundaries from the top border, then        process rows.  Each row may consist of multiple lines; accumulate        lines until a row is complete.  Call `self.parse_row` to finish the        job.        """        # Top border must fully describe all table columns.        self.columns = self.parse_columns(self.block[0], 0)        self.border_end = self.columns[-1][1]        firststart, firstend = self.columns[0]        offset = 1                      # skip top border        start = 1        text_found = None        while offset < len(self.block):            line = self.block[offset]            if self.span_pat.match(line):                # Column span underline or border; row is complete.                self.parse_row(self.block[start:offset], start,                               (line.rstrip(), offset))                start = offset + 1                text_found = None            elif line[firststart:firstend].strip():                # First column not blank, therefore it's a new row.                if text_found and offset != start:                    self.parse_row(self.block[start:offset], start)                start = offset                text_found = 1            elif not text_found:                start = offset + 1            offset += 1    def parse_columns(self, line, offset):        """        Given a column span underline, return a list of (begin, end) pairs.        """        cols = []        end = 0        while 1:            begin = line.find('-', end)            end = line.find(' ', begin)            if begin < 0:                break            if end < 0:                end = len(line)            cols.append((begin, end))        if self.columns:            if cols[-1][1] != self.border_end:                raise TableMarkupError('Column span incomplete at line '                                       'offset %s.' % offset)            # Allow for an unbounded rightmost column:            cols[-1] = (cols[-1][0], self.columns[-1][1])        return cols    def init_row(self, colspec, offset):        i = 0        cells = []        for start, end in colspec:            morecols = 0            try:                assert start == self.columns[i][0]                while end != self.columns[i][1]:                    i += 1                    morecols += 1            except (AssertionError, IndexError):                raise TableMarkupError('Column span alignment problem at '                                       'line offset %s.' % (offset + 1))            cells.append([0, morecols, offset, []])            i += 1        return cells    def parse_row(self, lines, start, spanline=None):        """        Given the text `lines` of a row, parse it and append to `self.table`.        The row is parsed according to the current column spec (either        `spanline` if provided or `self.columns`).  For each column, extract        text from each line, and check for text in column margins.  Finally,        adjust for insigificant whitespace.        """        if not (lines or spanline):            # No new row, just blank lines.            return        if spanline:            columns = self.parse_columns(*spanline)            span_offset = spanline[1]        else:            columns = self.columns[:]            span_offset = start        self.check_columns(lines, start, columns)        row = self.init_row(columns, start)        for i in range(len(columns)):            start, end = columns[i]            cellblock = lines.get_2D_block(0, start, len(lines), end)            cellblock.disconnect()      # lines in cell can't sync with parent            cellblock.replace(self.double_width_pad_char, '')            row[i][3] = cellblock        self.table.append(row)    def check_columns(self, lines, first_line, columns):        """        Check for text in column margins and text overflow in the last column.        Raise TableMarkupError if anything but whitespace is in column margins.        Adjust the end value for the last column if there is text overflow.        """        # "Infinite" value for a dummy last column's beginning, used to        # check for text overflow:        columns.append((sys.maxint, None))        lastcol = len(columns) - 2        for i in range(len(columns) - 1):            start, end = columns[i]            nextstart = columns[i+1][0]            offset = 0            for line in lines:                if i == lastcol and line[end:].strip():                    text = line[start:].rstrip()                    new_end = start + len(text)                    columns[i] = (start, new_end)                    main_start, main_end = self.columns[-1]                    if new_end > main_end:                        self.columns[-1] = (main_start, new_end)                elif line[end:nextstart].strip():                    raise TableMarkupError('Text in column margin at line '                                           'offset %s.' % (first_line + offset))                offset += 1        columns.pop()    def structure_from_cells(self):        colspecs = [end - start for start, end in self.columns]        first_body_row = 0        if self.head_body_sep:            for i in range(len(self.table)):                if self.table[i][0][2] > self.head_body_sep:                    first_body_row = i                    break        return (colspecs, self.table[:first_body_row],                self.table[first_body_row:])def update_dict_of_lists(master, newdata):    """    Extend the list values of `master` with those from `newdata`.    Both parameters must be dictionaries containing list values.    """    for key, values in newdata.items():        master.setdefault(key, []).extend(values)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产视频在线| 另类小说色综合网站| 天天综合色天天综合| 成人午夜视频免费看| 在线播放欧美女士性生活| 亚洲国产精品99久久久久久久久| 五月天久久比比资源色| 99精品视频在线观看| 日韩三级在线免费观看| 亚洲猫色日本管| 国产馆精品极品| 日韩免费性生活视频播放| 亚洲精品国产无套在线观| 成人一道本在线| 久久人人97超碰com| 捆绑调教美女网站视频一区| 欧美性xxxxxx少妇| 韩国av一区二区三区| 欧美视频精品在线| 亚洲欧美中日韩| 国产精品18久久久久久vr| 67194成人在线观看| 一区二区三区在线播| 盗摄精品av一区二区三区| 精品久久人人做人人爰| 日韩经典一区二区| 欧美日本不卡视频| 亚洲高清久久久| 欧美性xxxxx极品少妇| 亚洲免费三区一区二区| 成人免费精品视频| 日本一区二区不卡视频| 国产久卡久卡久卡久卡视频精品| 欧美一级免费大片| 蜜桃av一区二区三区| 日韩一区二区电影| 麻豆91精品91久久久的内涵| 欧美一区二区三区在线电影| 日韩不卡在线观看日韩不卡视频| 91超碰这里只有精品国产| 亚洲18影院在线观看| 欧美精品v国产精品v日韩精品| 夜夜精品浪潮av一区二区三区| 一本大道久久a久久精二百 | 成人免费毛片aaaaa**| 久久久久成人黄色影片| 成人在线综合网站| 亚洲欧美激情一区二区| 欧美日韩在线三级| 免费的国产精品| 久久久综合视频| 成人av在线网| 亚洲线精品一区二区三区八戒| 亚洲免费av高清| 欧美视频在线播放| 久久激情五月激情| 国产情人综合久久777777| 不卡的av在线| 无码av中文一区二区三区桃花岛| 精品国产精品网麻豆系列| 成年人网站91| 天天综合网天天综合色| 久久久亚洲高清| 日本丶国产丶欧美色综合| 日本伊人色综合网| 国产精品午夜在线观看| 欧美在线不卡一区| 精品在线免费视频| 亚洲乱码国产乱码精品精98午夜| 4438成人网| 成人黄色大片在线观看| 五月激情六月综合| 国产精品福利在线播放| 欧美一区二区在线观看| 99久久综合狠狠综合久久| 天天免费综合色| 中文字幕一区二区三区精华液| 在线观看日韩精品| 高清国产一区二区三区| 午夜精品在线视频一区| 精品国产伦一区二区三区观看方式| 不卡视频在线观看| 精品一区二区在线观看| 亚洲精品国产视频| 国产欧美一区二区在线| 91精品国产综合久久精品性色| 成人a免费在线看| 黑人巨大精品欧美黑白配亚洲| 亚洲人成小说网站色在线 | 欧美性一二三区| 国产一区免费电影| 午夜久久久影院| 亚洲女厕所小便bbb| 国产亚洲va综合人人澡精品| 91麻豆精品国产91久久久更新时间 | 久久er精品视频| 亚洲免费资源在线播放| 久久精品在线观看| 91麻豆精品国产91久久久资源速度 | 欧美国产一区二区| 欧美不卡在线视频| 制服丝袜亚洲色图| 欧美视频日韩视频| 在线观看免费视频综合| 色婷婷激情综合| av成人老司机| 国产成人精品亚洲777人妖 | 亚洲一区二区三区自拍| 国产精品久久久久久久久免费桃花 | 国产网红主播福利一区二区| 9191国产精品| 91麻豆精品国产自产在线观看一区| 欧美性生活一区| 91女神在线视频| 99re成人在线| 精品国产一区二区三区不卡| 69p69国产精品| 3751色影院一区二区三区| 91精品啪在线观看国产60岁| 欧美二区三区的天堂| 欧美三级中文字幕在线观看| 在线免费视频一区二区| 欧美网站一区二区| 欧美久久久久久久久| 欧美日韩国产天堂| 日韩一级欧美一级| 精品少妇一区二区三区在线播放 | 亚洲成人动漫在线观看| 亚洲第一成人在线| 日韩中文字幕麻豆| 麻豆91免费观看| 成人黄色免费短视频| 一本高清dvd不卡在线观看| 在线精品观看国产| 日韩一区二区免费高清| 久久久久亚洲蜜桃| 亚洲精品乱码久久久久| 肉色丝袜一区二区| 激情综合色丁香一区二区| 成人av综合一区| 欧美图片一区二区三区| 91精品国产美女浴室洗澡无遮挡| 精品成人一区二区三区四区| 亚洲国产高清不卡| 爽好多水快深点欧美视频| 蜜芽一区二区三区| av网站免费线看精品| 欧美巨大另类极品videosbest | 中文字幕亚洲在| 亚洲国产欧美日韩另类综合| 韩国一区二区三区| 91丨九色porny丨蝌蚪| 欧美日本一区二区在线观看| 精品国产乱码久久久久久久| 欧美激情在线观看视频免费| 亚洲最大成人网4388xx| 久久97超碰国产精品超碰| 99久久精品免费精品国产| 欧美二区在线观看| 亚洲欧洲日产国码二区| 日本成人在线看| bt欧美亚洲午夜电影天堂| 91精品国产品国语在线不卡| 中文字幕中文在线不卡住| 喷水一区二区三区| 色先锋久久av资源部| 久久尤物电影视频在线观看| 亚洲福利视频三区| 高清在线不卡av| 欧美mv日韩mv国产网站app| 一区二区三区四区视频精品免费| 麻豆精品蜜桃视频网站| 91福利精品视频| 亚洲欧洲av另类| 国产凹凸在线观看一区二区| 8v天堂国产在线一区二区| 一区在线观看视频| 国产一区二区三区av电影 | 老司机精品视频导航| 欧美在线播放高清精品| 国产精品福利电影一区二区三区四区| 男女男精品视频网| 欧美高清性hdvideosex| 一区二区三区欧美视频| av一区二区久久| 中文字幕精品—区二区四季| 国产一区二区网址| 欧美一级片在线观看| 午夜精品一区二区三区三上悠亚| 91在线视频播放地址| 亚洲国产精品黑人久久久| 国产精品白丝av| 欧美精品一区二区蜜臀亚洲| 蜜乳av一区二区三区| 91精品视频网| 久久99久久精品欧美| 欧美xxxxxxxx| 国产乱码一区二区三区| 久久久久久久久久久久久女国产乱| 久久精品国产精品亚洲红杏|