Untitled

mail@pastecode.io avatar
unknown
javascript
11 days ago
3.7 kB
3
Indexable
Never
function breakSentence(text) {
    const maxLength = 300; // Maximum length of each piece
    const pieces = [];
    let startIndex = 0;

    while (startIndex < text.length) {
        const remainingText = text.substring(startIndex);
        
        // If the remaining text is shorter than or equal to maxLength, add it to pieces
        if (remainingText.length <= maxLength) {
            pieces.push(remainingText.trim());
            break;
        }

        // Define the endIndex at the max length
        let endIndex = startIndex + maxLength;
        let lastBreakIndex = -1;

        // Search backward for the last punctuation or space within maxLength
        for (let i = endIndex; i > startIndex; i--) {
            const char = remainingText[i - startIndex];
            if (['.', '!', '?', ',', ';', ':'].includes(char)) {
                lastBreakIndex = i; // Found punctuation
                break;
            }
            // Keep track of the last space if no punctuation is found
            if (char === ' ') {
                lastBreakIndex = i; // Update to last space
            }
        }

        // If no punctuation is found, use the last space
        if (lastBreakIndex === -1) {
            lastBreakIndex = remainingText.lastIndexOf(' ', maxLength);
            // If there's no space, break at the max length
            if (lastBreakIndex === -1) {
                lastBreakIndex = maxLength;
            }
        }

        // Create a piece from startIndex to the last punctuation/word boundary
        let piece = remainingText.substring(0, lastBreakIndex).trim();

        // If the piece doesn't end with punctuation, ensure it does
        if (!['.', '!', '?', ',', ';', ':'].includes(piece[piece.length - 1])) {
            piece += '.'; // Append a period if necessary
        }

        // Push the trimmed piece to the pieces array
        pieces.push(piece);

        // Update startIndex to the next part
        startIndex += lastBreakIndex;

        // Ensure we skip over any punctuation at the start of the next piece
        while (startIndex < text.length && ['.', '!', '?', ',', ';', ':'].includes(remainingText[startIndex])) {
            startIndex++; // Skip the punctuation
        }

        // Skip over any leading spaces
        while (startIndex < text.length && remainingText[startIndex] === ' ') {
            startIndex++;
        }
    }

    return pieces;
}

// Provided text
const exampleText = "Жил да был на свете пёс. Было у него значит 4 сардельки, с которыми он управлялся вот уже 4 час. Очень вкусные они для него оказались. Ему нравятся отварные сардельки домашнего приготовления. Хозяйка умеет делать качественный фарш из дикой утки. Утка добыта добротным охотником в диком лесу. Погода на тот момент была очень не лётная. Добыл он их и принёс домой. Хозяйка быстро управилась с дичью. Вот и сказочке конец, а кто слушал, молодец.";

// Test the function with the provided example and log the pieces count and lengths
const result = breakSentence(exampleText);
console.log(`Original Text: ${exampleText}`);
console.log(`Pieces Count: ${result.length}`);
console.log('Pieces:');
result.forEach((piece, pieceIndex) => {
    console.log(`  Piece ${pieceIndex + 1} (Length: ${piece.length}): ${piece}`);
});
Leave a Comment