---
# System prepended metadata

title: 18 May - 22 May 2020
tags: [Study Note]

---

# 18 May - 22 May 2020
###### tags: `Study Note`

## Monday, 18 May 2020
- Continue analyze the difference between the FAPI file with FH_Lib
- redesign the code

## Tuesday, 19 May 2020
- implement the code

## Wednesday, 20 May 2020
- continue implementing the code

## Thursday, 21 May 2020
- continue implementing the code

## Friday, 22 May 2020

Result code

```
#!/usr/bin/python

# import sys
import re

file_header = """..    Copyright (c) 2019 Intel
..
..  Licensed under the Apache License, Version 2.0 (the "License");
..  you may not use this file except in compliance with the License.
..  You may obtain a copy of the License at
..
..      http://www.apache.org/licenses/LICENSE-2.0
..
..  Unless required by applicable law or agreed to in writing, software
..  distributed under the License is distributed on an "AS IS" BASIS,
..  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
..  See the License for the specific language governing permissions and
..  limitations under the License.


"""


def open_files(filename):
    global f
    f = open(filename, encoding="utf8")


def decode_contents():
    global f
    global content_list

    content_list = []
    h1_count = 0
    in_contents = False

    while(True):
        isH1 = False
        current_line = f.readline()

        if current_line == "\n":
            # ganti line
            continue

        if in_contents:
            if current_line == "Figures\n":
                # end of content
                f.seek(0)   # Reset the files
                print(content_list)
                break

            next_line = f.readline()
            while next_line != "\n":
                current_line += ' ' + next_line
                next_line = f.readline()


            current_line = re.sub('[^A-Za-z0-9 .,\[\]{}/\_]+', '', re.sub('<[^>]+>`__', '', current_line)).strip()

            if re.match('Appendix [0-9]+ [A-Za-z0-9 ]+', current_line):

                # delete the page numbering
                heading = current_line.rsplit(' ', 1)[0]
                isH1 = True
                h1_count += 1
            else:
                section_tag = current_line.split(' ', 1)[0].split('.')
                if len(section_tag) == 1:
                    isH1 = True
                    h1_count += 1
                elif len(section_tag) == 2 and section_tag[1] == '0':
                    isH1 = True
                    h1_count += 1

                # delete the section tag & page numbering
                heading = current_line.split(' ', 1)[1].rsplit(' ', 1)[0]
            print(str(h1_count) + " " + heading if isH1 else "   " + heading)
            content_list.append([isH1, heading])

        if current_line == "Contents\n":
            in_contents = True


def create_index():
    global content_list
    global file_header
    index_format = ["Contents",
                    "Revision History"]
    new_file = open("index.rst", "w", encoding="utf-8")
    new_file.write(file_header)

    # differentiate the doc title with other docs
    lines = f.readline()
    new_file.write(lines)
    new_file.write("=" * (len(lines)-1)+"\n\n")

    # copy and paste until meet the contents
    lines = ""
    while(lines != index_format[0]+"\n"):
        #   new_file.write("aa" + lines + "aa   \n")
        if lines == "\n" or lines == "":
            lines = f.readline()
            continue
        next_line = ""
        while(next_line != '\n'):
            lines += next_line
            next_line = f.readline()
        new_file.write("| " + lines + "\n")
        lines = f.readline()

    # Contents
    new_file.write("""
Contents
--------

.. toctree::
   :maxdepth: 2
   :caption: Contents:

""")
    for i in content_list:      # write all rst files that will generated
        if i[0]:
            new_file.write("   " + i[1].replace(' ', '-').replace(',', '')+".rst\n")

    while lines != index_format[1] + "\n":  # skip lines until find the next index part
        lines = f.readline()

    # write other index parts
    index_sub = 1
    new_file.write("\n")  # line padding
    while len(lines) != 2 and not re.match('[A-Za-z0-9 ][\n]',lines):     # check until next content list
        #  lines = re.sub('[^A-Za-z0-9 .,\[\]{}]+', '', re.sub('<[^>]+>', '', lines)).strip()
        if index_sub < len(index_format):
            if lines == index_format[index_sub] + "\n":  # mark the sub heading
                new_file.write(lines)
                new_file.write("-"*(len(lines)-1))
                index_sub += 1
            else:
                new_file.write(lines)
        else:
            new_file.write(lines)
        lines = f.readline()

    # Close index file
    new_file.close()


def transfer_doc():
    global content_list
    header_list = []
    next_line = ""

    for i in content_list:
        if i[0]:
            header_list.append(i[1])

    print(header_list)

    # scroll to next H1
    prev_line = next_line
    next_line = f.readline()
    scroll_to = header_list[0]
    while prev_line != scroll_to + "\n":
        prev_line = next_line
        next_line = f.readline()
        print("169\n")

    copy_until = ""
    for i in range(0, len(header_list)):
        # set current header
        rst_header = header_list[i]
        if re.match('Appendix [0-9]+ [A-Za-z0-9 ]+', rst_header):
            rst_header = rst_header.split(' ', 2)[2]

        # Generate the new file
        new_file = open(rst_header.replace(' ', '-').replace(',', '').replace('/', '')+".rst", "w", encoding="utf-8")
        new_file.write(file_header)

        # Assume the cursor is pointing on the right line
        while prev_line != rst_header and not re.match(copy_until, prev_line):
            print("a")
            prev_line = next_line
            next_line = f.readline()

        new_file.write(rst_header + "\n")
        new_file.write("="*len(rst_header)+"\n")

        while prev_line != "\n":
            print("b")
            prev_line = next_line
            next_line = f.readline()

        # set stop header
        if i != len(header_list)-1:
            next_header = header_list[i+1]
            if re.match('Appendix [0-9]+ [A-Za-z0-9 ]+', next_header):
                # it's an appendix
                next_header = next_header.split(' ', 2)[2]
                copy_until = '[0-9]+. ' + next_header + '\n'
            else:
                copy_until = next_header + '[\n]'
                # it's not appendix
        else:
            next_header = "None"
            copy_until = '[^A-Za-z0-9# ][\n]'

        # rst contents
        # gak nemu -
        #
        while prev_line == "\n":
            prev_line = next_line
            next_line = f.readline()
            print("219\n")
        while not re.match(copy_until, next_line):
            # break fo the last line in case can't break by the while
            if prev_line == "":
                break
            # removing the original .. |image.... tag
            if prev_line[0:9] == ".. |image":
                prev_line = next_line
                next_line = f.readline()
                prev_line = next_line
                next_line = f.readline()
            # add the image based on Figure tag.
            if re.match(r"Figure [0-9]*[.] +", prev_line):
                image_path = "images/" + re.sub(r"[\s\/\\]", "-", re.sub(r"Figure [0-9]*[.] ", "", prev_line).strip())+".jpg"
                new_file.write(".. image:: " + image_path + "\n")
                new_file.write("  :width: 400\n")
                new_file.write("  :alt: " + prev_line + "\n")
                print(prev_line)
            else:
                new_file.write(prev_line.strip(' '))
            # print(rst_header + " :  "+ prev_line)
            prev_line = next_line
            next_line = f.readline()
        # close the file
        new_file.close()
        print(i)
    print(len(header_list))


def main():
    filename = "O-RAN_FH_Lib_SAS.rst"
    # filename = "5G_FAPI_IAPI_Translator_Module.rst"
    open_files(filename)
    decode_contents()
    create_index()
    transfer_doc()
    # print command line arguments
    # for arg in sys.argv[1:]:
    #    print(arg)


if __name__ == "__main__":
    main()

```