Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated sort.py #2613

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 44 additions & 73 deletions sort.py
Original file line number Diff line number Diff line change
@@ -1,83 +1,54 @@
#!/usr/bin/env python
# coding: utf-8
def read_read_me():
# read file README.md en modo lectura

"""
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.
with open("README.md", "r") as read_me_file:
read_me = read_me_file.readlines() # Leer todas las líneas

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)
current_block = []

if any([s_line.startswith(s) for s in ['* [', '- [']]):
if indent == last_indent:
blocks[-1].append(line)
else:
blocks.append([line])
last_indent = indent
# Detecting list items by starting character
for line in read_me:
stripped_line = line.lstrip()

# check is the line is part of the list then add it to a block
if stripped_line.startswith(('* [')):
if current_block:
blocks.append(current_block)
current_block = [line]
else:
if current_block:
blocks.append(current_block)
current_block = []
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=str.lower)) for block in blocks
]
# And the result is written back to README.md
sorted_file.write(''.join(blocks))
if current_block:
blocks.append(current_block)

# show block before sorting
print("before sorted block:")
for block in blocks:
print(block)

# sort each block individually
sorted_blocks = []
for block in blocks:
# Solo ordenar bloques que comiencen con '* [' o '- ['
if block and isinstance(block, str) and block.lstrip().startswith(('* [')):
sorted_block = sorted(block, key = lambda x: x.lower())
sorted_block.append(sorted_blocks)
else:
sorted_blocks.append(block)

# Show sorted block
print("after sorted block:")
for block in sorted_blocks:
print(block)

# Then we call the sorting method
sort_blocks()
# Write sorted blocks in README.md
with open("README.md", "w+") as read_me_file:
for block in sorted_blocks:
read_me_file.write(''.join(block))


if __name__ == "__main__":
main()
read_read_me()