Skip to main content

Split string into chunks of max size stopping at line break

I am currently working on a feature for a discord bot which allows the user to grab the lyrics of the currently playing song. Sadly discord has a maximum limit of 1024 characters for every embed so songs with a big amount of lyrics get cut off/throw an error.

To avoid this I tried to split the lyrics into seperate pages using 200 words per page. (Obviously this still has room for error with long words and just isn't really optimized for this use case)

def create_embed(lyrics, song):

    words = re.findall(r"\S+|\n", lyrics)
    num_pages = (len(words) // 200) + 1
    n = 200
    pages = [" ".join(words[i:i + n]) for i in range(0, len(words), n)]

The problem with this is, since I use this for lyrics, the text gets split in really awkward positions like in the middle of the sentence, making it hard to read.

What I want to do is set my n = 200 as a maximum range in which I search for the next linebreak. Let's say I have this text:

Shadows fall over my heart \n I black out the moon \n

And I have n = 10 leaving me with

Shadows fall over my heart \n I black out the

but instead I want it to stop at the last linebreak in this string meaning:

Shadows fall over my heart \n

What is the simplest way to implement something like this? Would I need to search using a for_loop with negative steps? It would seem that this would be a rather forced approach.



source https://stackoverflow.com/questions/72883396/split-string-into-chunks-of-max-size-stopping-at-line-break

Comments