81 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# coding: utf-8
 | 
						|
 | 
						|
"""
 | 
						|
    The approach taken is explained below. I decided to do it simply.
 | 
						|
    Initially I was considering parsing the data into some sort of
 | 
						|
    structure and then generating an appropriate README. I am still
 | 
						|
    considering doing it - but for now this should work. The only issue
 | 
						|
    I see is that it only sorts the entries at the lowest level, and that
 | 
						|
    the order of the top-level contents do not match the order of the actual
 | 
						|
    entries.
 | 
						|
 | 
						|
    This could be extended by having nested blocks, sorting them recursively
 | 
						|
    and flattening the end structure into a list of lines. Revision 2 maybe ^.^.
 | 
						|
"""
 | 
						|
 | 
						|
def sort_blocks():
 | 
						|
    # First, we load the current README into memory
 | 
						|
    with open('README.md', 'r') as read_me_file:
 | 
						|
        read_me = read_me_file.read()
 | 
						|
 | 
						|
    # Separating the 'table of contents' from the contents (blocks)
 | 
						|
    table_of_contents = ''.join(read_me.split('- - -')[0])
 | 
						|
    blocks = ''.join(read_me.split('- - -')[1]).split('\n# ')
 | 
						|
    for i in range(len(blocks)):
 | 
						|
        if i == 0:
 | 
						|
            blocks[i] = blocks[i] + '\n'
 | 
						|
        else:
 | 
						|
            blocks[i] = '# ' + blocks[i] + '\n'
 | 
						|
 | 
						|
    # Sorting the libraries
 | 
						|
    inner_blocks = sorted(blocks[0].split('##'))
 | 
						|
    for i in range(1 , len(inner_blocks)):
 | 
						|
        if inner_blocks[i][0] != '#':
 | 
						|
            inner_blocks[i] = '##' + inner_blocks[i]
 | 
						|
    inner_blocks=''.join(inner_blocks)
 | 
						|
 | 
						|
    # Replacing the non-sorted libraries by the sorted ones and gathering all at the final_README file
 | 
						|
    blocks[0] = inner_blocks
 | 
						|
    final_README = table_of_contents + '- - -' + ''.join(blocks)
 | 
						|
 | 
						|
    with open('README.md', 'w+') as sorted_file:
 | 
						|
        sorted_file.write(final_README)
 | 
						|
 | 
						|
def main():
 | 
						|
    # First, we load the current README into memory as an array of lines
 | 
						|
    with open('README.md', 'r') as read_me_file:
 | 
						|
        read_me = read_me_file.readlines()
 | 
						|
 | 
						|
    # Then we cluster the lines together as blocks
 | 
						|
    # Each block represents a collection of lines that should be sorted
 | 
						|
    # This was done by assuming only links ([...](...)) are meant to be sorted
 | 
						|
    # Clustering is done by indentation
 | 
						|
    blocks = []
 | 
						|
    last_indent = None
 | 
						|
    for line in read_me:
 | 
						|
        s_line = line.lstrip()
 | 
						|
        indent = len(line) - len(s_line)
 | 
						|
 | 
						|
        if any([s_line.startswith(s) for s in ['* [', '- [']]):
 | 
						|
            if indent == last_indent:
 | 
						|
                blocks[-1].append(line)
 | 
						|
            else:
 | 
						|
                blocks.append([line])
 | 
						|
            last_indent = indent
 | 
						|
        else:
 | 
						|
            blocks.append([line])
 | 
						|
            last_indent = None
 | 
						|
 | 
						|
    with open('README.md', 'w+') as sorted_file:
 | 
						|
        # Then all of the blocks are sorted individually
 | 
						|
        blocks = [''.join(sorted(block, key=lambda s: s.lower())) for block in blocks]
 | 
						|
        # And the result is written back to README.md
 | 
						|
        sorted_file.write(''.join(blocks))
 | 
						|
 | 
						|
    # Then we call the sorting method
 | 
						|
    sort_blocks()
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |