<filename>jsonsimpleconfig/jscparser/jsc_parser.py
# -*- coding: utf-8 -*-
# * ********************************************************************* *
# *   Copyright (C) 2018 by xmz                                           *
# * ********************************************************************* *

__author__ = "<NAME> (<EMAIL>)"
__copyright__ = "Copyright (C) xmz. All Rights Reserved."

###############################################################################
# Import(s)                                                                   #
###############################################################################

import logging
from typing import Union

from jsonsimpleconfig import JscComments, JscData, JscSection


###############################################################################
# Class                                                                       #
###############################################################################


class JscParser:
    """
    JscParser
    """

    def __init__(self):
        self.__jsc_data = None
        self.__current_section = None
        self.__current_section_data = None

    def __new_section(self, section_name):
        if section_name[0] == "[":
            section_name = section_name.lstrip("[")
        if section_name[-1] == "]":
            section_name = section_name.rstrip("]")
        if section_name != JscSection.GLOBAL_SECTION_NAME:
            section_name = section_name.strip()
            if section_name[0] != '"':
                section_name = '"' + section_name
            if section_name[-1] != '"':
                section_name = section_name + '"'

        self.__current_section = section_name
        self.__current_section_data = "{"

    def __end_section(self):
        if self.__current_section_data is None:
            return
        self.__current_section_data += "}"
        if self.__jsc_data is None:
            self.__jsc_data = JscData()

        section_name = self.__current_section
        json_string = self.__current_section_data
        self.__current_section_data = self.__current_section = None
        self.__jsc_data.add_section_json_string(section_name, json_string)

    def __parse_line(self, line):
        line = JscComments.strip_comments(line)
        line = line.strip()
        if line:
            if line[0] == "[" and line[-1] == "]":
                if self.__current_section is not None and self.__current_section_data is not None:
                    self.__end_section()
                self.__new_section(line)

            else:
                if self.__current_section is None and self.__current_section_data is None:
                    self.__new_section(JscSection.GLOBAL_SECTION_NAME)
                if self.__current_section_data is None:
                    self.__current_section_data = ""
                if self.__current_section_data != "{":
                    self.__current_section_data += ","
                self.__current_section_data += line

    def parse_file(self, jsc_file_path, parse_line_by_line=False) -> Union[JscData, None]:
        """
        parse_file
        :param jsc_file_path:
        :param parse_line_by_line:
        :return:
        """
        self.__jsc_data = None
        try:
            with open(jsc_file_path, encoding="UTF-8") as jsc_file:

                if jsc_file.readable():
                    if parse_line_by_line:
                        for line in jsc_file:
                            self.__parse_line(line)
                    else:
                        jsc_text = JscComments.strip_comments(jsc_file.read())
                        lines = jsc_text.splitlines()
                        for line in lines:
                            self.__parse_line(line)
            self.__end_section()
            jsc_file.close()

        except Exception as exception:
            self.__jsc_data = None
            logging.debug(exception)

        return self.__jsc_data

    def parse_string(self, jsc_string) -> Union[JscData, None]:
        """
        parse_string
        :param jsc_string:
        :return:
        """
        self.__jsc_data = None
        try:
            jsc_text = JscComments.strip_comments(jsc_string)
            lines = jsc_text.splitlines()
            for line in lines:
                self.__parse_line(line)
            self.__end_section()

        except Exception as exception:
            self.__jsc_data = None
            logging.debug(exception)

        return self.__jsc_data


###############################################################################
#                                End of file                                  #
###############################################################################

<filename>jsonsimpleconfig/jscparser/jsc_parser.py
# -*- coding: utf-8 -*-
# * ********************************************************************* *
# *   Copyright (C) 2018 by xmz                                           *
# * ********************************************************************* *

__author__ = "<NAME> (<EMAIL>)"
__copyright__ = "Copyright (C) xmz. All Rights Reserved."

###############################################################################
# Import(s)                                                                   #
###############################################################################

import logging
from typing import Union

from jsonsimpleconfig import JscComments, JscData, JscSection


###############################################################################
# Class                                                                       #
###############################################################################


class JscParser:
    """
    JscParser
    """

    def __init__(self):
        self.__jsc_data = None
        self.__current_section = None
        self.__current_section_data = None

    def __new_section(self, section_name):
        if section_name[0] == "[":
            section_name = section_name.lstrip("[")
        if section_name[-1] == "]":
            section_name = section_name.rstrip("]")
        if section_name != JscSection.GLOBAL_SECTION_NAME:
            section_name = section_name.strip()
            if section_name[0] != '"':
                section_name = '"' + section_name
            if section_name[-1] != '"':
                section_name = section_name + '"'

        self.__current_section = section_name
        self.__current_section_data = "{"

    def __end_section(self):
        if self.__current_section_data is None:
            return
        self.__current_section_data += "}"
        if self.__jsc_data is None:
            self.__jsc_data = JscData()

        section_name = self.__current_section
        json_string = self.__current_section_data
        self.__current_section_data = self.__current_section = None
        self.__jsc_data.add_section_json_string(section_name, json_string)

    def __parse_line(self, line):
        line = JscComments.strip_comments(line)
        line = line.strip()
        if line:
            if line[0] == "[" and line[-1] == "]":
                if self.__current_section is not None and self.__current_section_data is not None:
                    self.__end_section()
                self.__new_section(line)

            else:
                if self.__current_section is None and self.__current_section_data is None:
                    self.__new_section(JscSection.GLOBAL_SECTION_NAME)
                if self.__current_section_data is None:
                    self.__current_section_data = ""
                if self.__current_section_data != "{":
                    self.__current_section_data += ","
                self.__current_section_data += line

    def parse_file(self, jsc_file_path, parse_line_by_line=False) -> Union[JscData, None]:
        """
        parse_file
        :param jsc_file_path:
        :param parse_line_by_line:
        :return:
        """
        self.__jsc_data = None
        try:
            with open(jsc_file_path, encoding="UTF-8") as jsc_file:

                if jsc_file.readable():
                    if parse_line_by_line:
                        for line in jsc_file:
                            self.__parse_line(line)
                    else:
                        jsc_text = JscComments.strip_comments(jsc_file.read())
                        lines = jsc_text.splitlines()
                        for line in lines:
                            self.__parse_line(line)
            self.__end_section()
            jsc_file.close()

        except Exception as exception:
            self.__jsc_data = None
            logging.debug(exception)

        return self.__jsc_data

    def parse_string(self, jsc_string) -> Union[JscData, None]:
        """
        parse_string
        :param jsc_string:
        :return:
        """
        self.__jsc_data = None
        try:
            jsc_text = JscComments.strip_comments(jsc_string)
            lines = jsc_text.splitlines()
            for line in lines:
                self.__parse_line(line)
            self.__end_section()

        except Exception as exception:
            self.__jsc_data = None
            logging.debug(exception)

        return self.__jsc_data


###############################################################################
#                                End of file                                  #
###############################################################################

# -*- coding: utf-8 -*- # * ********************************************************************* * # *   Copyright (C) 2018 by xmz                                           * # * ********************************************************************* * ############################################################################### # Import(s)                                                                   # ############################################################################### ############################################################################### # Class                                                                       # ############################################################################### JscParser parse_file         :param jsc_file_path:         :param parse_line_by_line:         :return: parse_string         :param jsc_string:         :return: ############################################################################### #                                End of file                                  # ###############################################################################