| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 | class tag:    '''    This class is responsible for create HTML tag, such as script, link and    other. It is requied for creating tags in the app view.    '''    def __init__(self, name: str, twice: bool) -> None:        '''        This function create new tag from its name. It also require parameter        named 'twice'. Twice told that tag has second closing tag. For example        when twice is True, then tag look like <a></a>, but when twice is         False, tag looks like <br/>.        Parameters:            name (str): Name of the tag            twice (bool): True when tag has closing tag, false when not        '''        name = name.strip()        if len(name) == 0:            raise Exception("Can not create tag without name.")        for letter in name:            if letter.isspace():                raise Exception("HTML Tag can not contain white space.")                self.__name = name        self.__twice = twice        self.__content = str()        self.__attributes = dict()    @property    def name(self) -> str:        ''' This function return name of the tag. '''        return self.__name    @property    def twice(self) -> bool:        ''' This function return that tag has closing tag. '''        return self.__twice    @property    def content(self) -> str:        ''' This function return content of the tag, like innerHTML. '''        return self.__content    @content.setter    def content(self, target: str) -> None:        ''' This function set new content, like innerHTML. '''        self.__content = target    def set_attribute(        self,        name: str,         content: str | int | float | bool | None    ) -> None:        '''         This function set value for tag attribute.         Parameters:            name (str): Name of the attribute            content (str | int | float | bool | None): Content of the attribute        '''        name = name.strip()        for letter in name:            if letter.isspace():                raise Exception("Tag attribute can not contain white char.")        self.__attributes[name] = content    def drop_attribute(self, name: str) -> str | int | float | bool | None:        '''        This function remove attribute by name, when parameter exists.        Parameters:            name (str): Name of the attribute        Returns:            (str | int | float | bool | None): Content of the droped attribute        '''        if not name in self.__attributes:            return None        copy = self.__attributes[name]        del self.__attributes[name]        return copy    def get_attribute(self, name: str) -> str | int | float | bool | None:        '''        This function return content of the attribute, when exists.        Parameters:            name (str): Name of the attribute        Returns:            (str | int | float | bool | None): Content of the attribute         '''        if not name in self.__attributes:            raise Exception("Attribute " + name + " not exists.")        return self.__attributes[name]    def has_attribute(self, name: str) -> bool:        ''' This function return that attribute exists or not. '''        return name in self.__attributes    @property    def attributes(self) -> list:        ''' This function return copy of the attributes dict. '''        return self.__attributes.copy()     def render(self) -> str:        '''        This function return tag rendered to string.        '''        attributes = str()        for attribute in self.attributes.keys():            content = self.get_attribute(attribute)            if content is None:                attributes = attributes + " " + attribute                continue            content = str(content)            content = content.replace("\"", "\\\"")            attributes = attributes + " " + attribute + "=\""            attributes = attributes + content + "\""        tag = "<" + self.name + attributes + ">\n"        if not self.twice:            return tag        closing_tag = "</" + self.name + ">"        return tag + self.content + "\n" + closing_tag + "\n"    def __str__(self) -> str:        ''' This function return tag rendered to string. '''                return self.render()class style(tag):    '''    This class is responsible for style.    '''    def __init__(self, content: str | None = None):        '''        This create new style tag, with optional setuped content.        Parameters:            content (str | None): Stylesheet of the style tag        '''        super().__init__("style", True)        if content is not None:            self.content = contentclass script(tag):    '''     This class is responsible for script loading.    '''    def __init__(self, src: str | None = None):        '''        This create new script tag.        Parameters:            src (str | None) = None: Source of the script        '''        super().__init__("script", True)        if src is not None:            self.set_attribute("src", src)    @property    def src(self) -> str | None:        ''' Return source of the script, or None when not set. '''        if self.has_attribute("src"):            return self.get_attribute("src")        return None    @src.setter    def src(self, target: str | None) -> None:        ''' This function set soure of the script, or drop it when None. '''        if target is not None:            self.set_attribute("src", target)            return        if self.has_attribute("src"):            self.drop_attribute("src")            returnclass link(tag):    '''    This class is responsible for creating link tags.    '''    def __init__(self):        ''' This function initialize link tag. '''        super().__init__("link", False)    @property    def rel(self) -> str | None:        ''' This function return rel of the link, or None when not set. '''        if not self.has_attribute("rel"):            return None        return self.get_attribute("rel")    @property    def href(self) -> str | None:        ''' This function return href of the link, or None, when not set. '''        if not self.has_attribute("href"):            return None        return self.get_attribute("href")    @property    def type(self) -> str | None:        ''' This function return type of the link, or None when not set. '''        if not self.has_attribute("type"):            return None        return self.get_attribute("type")    @rel.setter    def rel(self, target: str | None) -> None:        ''' This function set rel of the link, or drop it when None. '''        if target is not None:            self.set_attribute("rel", target)            return        if self.has_attribute("rel"):            self.drop_attribute("rel")    @href.setter    def href(self, target: str | None) -> None:        ''' This function set href of the link, or drop it when None. '''                if target is not None:            self.set_attribute("href", target)            return        if self.has_attribute("href"):            self.drop_attribute("href")    @type.setter    def type(self, target: str | None) -> None:        ''' This function set type of the link, or drop it when None. '''                if target is not None:            self.set_attribute("type", target)            return        if self.has_attribute("type"):            self.drop_attribute("type")
 |