Exemplo n.º 1
0
    def extract_code_blocks(self, file, section_number, sub_section_number):
        code_blocks = data_structures.TPM2_Partx_File()

        code_offset = 0
        while True:
            line = file.readline()[:-1]
            if line == "":
                continue

            # end of page, either break, or calculate new offsets
            if "Page" in line and "Family" in line:
                for i in range(0, 5):
                    line = file.readline()[:-1]

                code_offset = 0

            result1 = re.search("^(\d{1,4})([^.].*)", line)
            if result1:
                line_number = result1.group(1)
                code_line = result1.group(2)
                code_offset = 4 - len(line_number) - 1

                s = code_line[code_offset:code_offset + 1]

                if s is " ":
                    code_offset += 1

                code_offset = max(0, code_offset)

                code_line = code_line[code_offset:]
                code_blocks.append(
                    data_structures.TPM2_Partx_CodeLine(code_line))

            else:
                if sub_section_number is not None and line.strip().startswith(
                        str(section_number) + "." +
                        str(sub_section_number + 1)):
                    break
                elif sub_section_number is None and line.strip().startswith(
                        section_number) or line.strip().startswith(
                            str(int(section_number) + 1)):
                    break

        return code_blocks
    def extract_code_blocks(self, entry, style):

        code_blocks = data_structures.TPM2_Partx_File()

        style_nr = int(re.search("([0-9]+)", style).group(1))

        cont = ExtractionNavigator.selector(entry)
        while cont:

            # if the current entry is a text:p, table:table, or test:list with the current style,
            # append it to code blocks
            if isinstance(entry, Tag) and entry.name == constants.XML_TEXT_P:
                element = data_structures.TPM2_Partx_CommentLine(
                    entry.get_text())
                code_blocks.append(element)  # once
            elif isinstance(entry,
                            Tag) and entry.name == constants.XML_TABLE_TABLE:
                table_rows = []
                rows = entry.find_all(constants.XML_TABLE_TABLE_ROW)
                for i in range(0, len(rows)):
                    r = []
                    cells = rows[i].find_all(constants.XML_TABLE_TABLE_CELL)
                    for cell in cells:
                        r.append(cell.get_text())
                    table_rows.append(r)
                element = data_structures.TPM2_Partx_Table(
                    "", "", 0, table_rows)
                code_blocks.append(element)  # once
            elif isinstance(entry, Tag) and entry.name == constants.XML_TEXT_LIST\
                    and entry.has_attr(constants.XML_TEXT_STYLE_NAME) \
                    and entry[constants.XML_TEXT_STYLE_NAME] == style:
                text_ps = entry.findAll(constants.XML_TEXT_P)

                for text_p in text_ps:
                    if not isinstance(text_p, Tag):
                        break
                    utils.convert_indentation(text_p)
                    text_p_text = text_p.get_text()
                    element = data_structures.TPM2_Partx_CodeLine(text_p_text)
                    code_blocks.append(element)  # for every code line

                # add an empty line for readability
                element = data_structures.TPM2_Partx_CodeLine("")
                code_blocks.append(element)  # once

            next_list = entry
            current_style_nr = style_nr
            cont = False
            while current_style_nr - style_nr < 2 or current_style_nr - style_nr > 4:
                if next_list:
                    next_list = next_list.next_sibling.next_sibling
                else:
                    break
                if next_list and next_list.has_attr(
                        constants.XML_TEXT_STYLE_NAME):
                    current_style = next_list[constants.XML_TEXT_STYLE_NAME]
                    result = re.search("WWNum([0-9]+)", current_style)
                    if result and int(result.group(1)) > style_nr:
                        current_style_nr = int(result.group(1))
                    if current_style == style:
                        cont = True
                        break

            entry = entry.next_sibling.next_sibling

        return code_blocks
Exemplo n.º 3
0
    def extract_code_blocks(self, file, section_number, sub_section_number):
        code_blocks = data_structures.TPM2_Partx_File()
        ###################################################################
        # FUNCTIONS BLOCKS (START)
        code_found = False
        table_found = False
        code_offset = 0
        while True:
            line = file.readline()[:-1]
            if line == "":
                continue

            # end of page, either break, or calculate new offsets
            if "Page" in line and "Family" in line:
                for i in range(0, 5):
                    line = file.readline()[:-1]
                    if re.search("Part[ ]+4:", line):
                        code_offset = len(
                            re.search("\f([ ]*).*", line).group(1))

                if "Annex" in line:
                    return code_blocks

                if line.strip().startswith(section_number + "." +
                                           str(int(sub_section_number) + 1)):
                    break

                if (line.startswith("  ") and
                        str(int(section_number) + 1) + "    " in line.strip()
                        and not section_number + "." + str(sub_section_number)
                        in line):
                    file.seek(file.tell() - len(line))
                    break

            result1 = re.search("^(\d{1,4}[ ]*)(.*)", line)
            if result1:
                code_found = True
                table_found = False
                if code_offset == 0:
                    code_offset = len(result1.group(1))
                code_line = line[code_offset:]
                code_blocks.append(
                    data_structures.TPM2_Partx_CodeLine(code_line))

            result2 = re.search("([ ]*Error Returns[ ]+Meaning.*)", line)
            if result2:
                table_found = True
                row = result2.group(1) + "\n"
                results = re.split("[ ]{5,}", row)
                offsets = []
                l = []
                for r in results:
                    r = r.strip()
                    l.append(r)
                    offsets.append(line.find(r))
                code_blocks.append(
                    data_structures.TPM2_Partx_Table(None, None, None, l))
            elif table_found:
                row = line + "\n"
                row = utils.split_row(row, offsets)
                code_blocks.elements[len(code_blocks.elements) - 1].append(row)
            elif line.strip().startswith(section_number + "." +
                                         str(int(sub_section_number) + 1)):
                break

            result2 = re.search("^[ ]{2,}(.*)", line)
            if not (table_found or code_found) and result2:
                code_blocks.append(
                    data_structures.TPM2_Partx_CommentLine(result2.group(1)))

            if not (result1 or result2):
                break
        # FUNCTIONS BLOCKS (END)
        ###################################################################

        return code_blocks
    def extract_tpm2_part3_command(self, function, style):
        command = data_structures.TPM2_Partx_File()

        entry = self.next_entry(function)
        """ distinguish between a text:list and a text:p tag:
        In case the tag is of type: text:list simply use its text:style-name as
        condition for further iteration (to find futher lines of the code).
        In case the tag is of type text:p, use its siblings text:style-name --
        assuming its next_sibling is of type text:list.
        """

        # extract the style
        if entry.name == constants.XML_TEXT_LIST:
            style = entry[constants.XML_TEXT_STYLE_NAME]
        if entry.name == constants.XML_TEXT_P:
            style = entry.next_sibling.next_sibling[
                constants.XML_TEXT_STYLE_NAME]

        # entry tag is of type text:list, text:p or table:table
        continue_extraction = self.selector(entry)

        while continue_extraction:
            if entry.name == constants.XML_TEXT_P:
                element = data_structures.TPM2_Partx_CommentLine(
                    entry.get_text())
                command.append(element)  # once
            elif entry.name == constants.XML_TABLE_TABLE:
                table_rows = []
                rows = entry.find_all(constants.XML_TABLE_TABLE_ROW)
                for i in range(0, len(rows)):
                    r = []
                    cells = rows[i].find_all(constants.XML_TABLE_TABLE_CELL)
                    for cell in cells:
                        r.append(cell.get_text())
                    table_rows.append(r)
                element = data_structures.TPM2_Partx_Table(
                    "", "", 0, table_rows)
                command.append(element)  # once
            elif entry.name == constants.XML_TEXT_LIST:
                text_ps = entry.findAll(constants.XML_TEXT_P)

                for text_p in text_ps:
                    if not isinstance(text_p, Tag):
                        break
                    utils.convert_indentation(text_p)
                    text_p_text = text_p.get_text()
                    element = data_structures.TPM2_Partx_CodeLine(text_p_text)
                    command.append(element)  # for every code line

                command.append(data_structures.TPM2_Partx_CodeLine(""))

            entry = entry.find_next(self.selector)

            if not isinstance(entry, Tag):
                continue_extraction = False
                continue

            if entry.name == constants.XML_TEXT_P:
                continue_extraction = True
            elif entry.name == constants.XML_TEXT_LIST:
                continue_extraction = (
                    entry[constants.XML_TEXT_STYLE_NAME] == style)
            elif entry.name == constants.XML_TABLE_TABLE:
                next_list = entry.find_next(constants.XML_TEXT_LIST)
                continue_extraction = (
                    next_list[constants.XML_TEXT_STYLE_NAME] == style)
            else:
                continue_extraction = False

        return command