Parsers a file or string and returns a list of AudioClipSpec
        
        Arguments:
            specsFileOrString (str): specifications' file or string
        
        Examples:
            >>> SpecsParser.parse('23.4 34.1\n40.2 79.65 Hello World!')
            [<AudioClipSpec start:23.40, end:34.10, text:''>, 
            <AudioClipSpec start:40.20, end:79.65, text:'Hello World!'>]

        Returns: list(AudioClipSpec) or None

def parse(cls, specsFileOrString):
        """Parsers a file or string and returns a list of AudioClipSpec
        
        Arguments:
            specsFileOrString (str): specifications' file or string
        
        Examples:
            >>> SpecsParser.parse('23.4 34.1\n40.2 79.65 Hello World!')
            [<AudioClipSpec start:23.40, end:34.10, text:''>, 
            <AudioClipSpec start:40.20, end:79.65, text:'Hello World!'>]

        Returns: list(AudioClipSpec) or None
        """
        stringToParse = None

        # Read the contents of the file if specsFileOrString is not a string
        if os.path.isfile(specsFileOrString):
            with open(specsFileOrString, 'r') as f:
                stringToParse = f.read()
        else:
            stringToParse = specsFileOrString

        # Audacity uses \r for newlines
        lines = [x.strip() for x in re.split(r'[\r\n]+', stringToParse)]

        clips = []
        for line in lines:
            if line != '':
                clips.append(cls._parseLine(line))

            # if spec != None:
            #     clips.append(spec)

        return clips