Skip to content
Snippets Groups Projects
titlemd.py 5.42 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    """ titlemd """
    
    from __future__ import print_function
    
    import argparse
    import sys
    
    try:
        from titlecase import titlecase
    except ImportError:
        print("Please install titlecase")
    
    def arg_parse():
        """
        argument parser
        """
        parser = argparse.ArgumentParser(
            description="Titlemd"
        )
        parser.add_argument('-t', '--test',
                            action='store_true',
                            help="test")
        parser.add_argument('location',
                            nargs='?',
                            default='.',
                            help="location, default current directory")
        return parser.parse_args()
    
    def mkdocs_available(location):
        """ Is mkdocs.yml available? """
        if location.find("mkdocs.yml") != -1:
            return True
        return False
    
    def linestart(line, disabled, test, prev_line=None):
        """ linestart """
        if test:
            if (line.startswith("``") or line.startswith("extra:")) and not disabled:
                return True
            if (line.startswith("``") or prev_line.startswith("pages:")) and disabled:
                return False
        else:
            if line.startswith("``") and not disabled:
                return True
            if line.startswith("``") and disabled:
                return False
        return disabled
    
    def testdata(arg):
        """ test """
        # Spelling exceptions
        with open('.spelling') as fdata:
            spelling = fdata.readlines()
    
        # pylint: disable=unused-argument,inconsistent-return-statements
        def abbreviations(word, **kwargs):
            """ abbreviations """
            if word+"\n" in spelling:
                return word
    
        # Open the file and read the lines as a list
        with open(arg.location) as fdata:
            lines = fdata.readlines()
    
        # Loop through the list of lines and titlecase
        # any line beginning with '#'.
        return_value = 0
        prev_line = lines[0]
        echo_filename = False
        disabled = mkdocs_available(arg.location)
        for line in lines:
            disabled = linestart(line, disabled, arg.test, prev_line)
            if line.startswith('#') and not disabled and not mkdocs_available(arg.location):
                if line != titlecase(line[:(line.find("]"))],
                                     callback=abbreviations)+line[(line.find("]")):]:
                    if return_value == 0 and not echo_filename:
                        print("%s" % arg.location)
                        echo_filename = True
                    print("-"+line, end="")
                    print("+"+titlecase(line[:(line.find("]"))],
                                        callback=abbreviations)+line[(line.find("]")):], end="")
                    print()
                    return_value = 1
            if (line.startswith('---') or line.startswith('===')) and not disabled:
                if prev_line != titlecase(prev_line[:(prev_line.find("]"))],
                                          callback=abbreviations)+prev_line[(prev_line.find("]")):]:
                    if return_value == 0 and not echo_filename:
                        print("%s" % arg.location)
                        echo_filename = True
                    print("-"+prev_line, end="")
                    print("+"+titlecase(prev_line[:(prev_line.find("]"))],
                                        callback=abbreviations)+prev_line[(prev_line.find("]")):],
                          end="")
                    print()
                    return_value = 1
            if (mkdocs_available(arg.location) and not line.startswith('#') and not disabled):
                if line != titlecase(line[:(line.find(":"))],
                                     callback=abbreviations)+line[(line.find(":")):]:
                    if return_value == 0 and not echo_filename:
                        print("%s" % arg.location)
                        echo_filename = True
                    print("-"+line, end="")
                    print("+"+titlecase(line[:(line.find(":"))],
                                        callback=abbreviations)+line[(line.find(":")):], end="")
                    print()
                    return_value = 1
                prev_line = line
        return return_value
    
    def writedata(arg):
        """ writedata """
        # Spelling exceptions
        with open('.spelling') as fdata:
            spelling = fdata.readlines()
    
        # pylint: disable=unused-argument,inconsistent-return-statements
        def abbreviations(word, **kwargs):
            """ abbreviations """
            if word+"\n" in spelling:
                return word
    
        # Open the file and read the lines as a list
        with open(arg.location) as fdata:
            lines = fdata.readlines()
    
        with open(arg.location, 'w') as fdata:
            # Loop through the list of lines and titlecase
            # any line beginning with '#'.
            prev_line = lines[0]
            disabled = False
            for line in lines:
                disabled = linestart(line, disabled, arg.test)
                if line.startswith('#') and not disabled:
                    line = titlecase(line[:(line.find("]"))],
                                     callback=abbreviations)+line[(line.find("]")):]
                if (line.startswith('---') or line.startswith('===')) and not disabled:
                    prev_line = titlecase(prev_line[:(prev_line.find("]"))],
                                          callback=abbreviations)+prev_line[(prev_line.find("]")):]
                fdata.write(prev_line)
                prev_line = line
            fdata.write(prev_line)
    
    def main():
        """
        main function
        """
    
        arg = arg_parse()
    
        if arg.test:
            sys.exit(testdata(arg))
        else:
            writedata(arg)
    
    if __name__ == "__main__":
        main()