Вставлять ТОЛЬКО новую строку при разрыве слов, чтобы ни одна строка не превышала 80 символов - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть различные блоки текста переменной длины, которые могут содержать или не содержать несколько разрывов строк.Я хочу взять каждую строку этого текста и вставить дополнительные символы новой строки, но ТОЛЬКО в разрывы слов (пробелы), чтобы ни одна строка не превышала 80 символов.Они могут быть меньше 80, но я хочу, чтобы они были как можно ближе к 80 символам, не переходя и не разбивая слово пополам.

Вот как может выглядеть пример содержимого:

"""
Mittens the cat ate a salad on Friday morning. He's a cat, so I'm not really sure why he was eating a salad, but that's what he was doing. Do cats normally like salad? It wasn't salmon-flavored or anything crazy like that.

I can think of three reasons why a cat might eat salad:
1. The cat is insane
2. The cat likes mice, and just last week we noticed that a mice was eating some salad, so maybe the cat decided to shortcut the food chain and eat a salad instead of getting the nutrients of the salad from the consumption of the mouse.
3. Cats are weird.
"""

И после запуска новой строки-вставки это выглядело бы так:

"""
Mittens the cat ate a salad on Friday morning. He's a cat, so I'm not really
sure why he was eating a salad, but that's what he was doing. Do cats normally
like salad? It wasn't salmon-flavored or anything crazy like that.

I can think of three reasons why a cat might eat salad:
1. The cat is insane
2. The cat likes mice, and just last week we noticed that a mice was eating some
salad, so maybe the cat decided to shortcut the food chain and eat a salad
instead of getting the nutrients of the salad from the consumption of the mouse.
3. Cats are weird.
"""

Я нашел несколько вопросов, решающих (откровенно тривиальную) проблему добавления новой строки с ровно N символов.Я знаю, что могу разделить на пробелы и считать символов и вернуться назад, чтобы добавить новую строку, если строка превышает 80 символов, но это утомительно и не совсем «элегантное» решение, которое я ищу; p

Я пойду по этому пути, если не смогу найти лучшего пути, хотя .... Я думаю.

Мой инстинкт подсказывает мне, что есть хорошее решение для этого с помощью регулярных выражений и вида-aheads / look-backs.

Это то, что я имею до сих пор:

content = """
this is some content with words and stuff
and here is another line things
"""
content = content.gsub(%r{(.{10}) }, "\\1\n")
puts content

Какие выходные данные:

this is some
content with
words and stuff
and here is
another line
things

Но это позволяет линиям идти только выше 10 символов, а не чуть ниже.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Рельсовый путь:

puts content.gsub(/(.{1,10})(?:\s+|$)/, "\\1\n")
# >>this is
# >>some
# >>content
# >>with words
# >>and stuff
# >>and here
# >>is another
# >>line
# >>things

Ср.https://apidock.com/rails/ActionView/Helpers/TextHelper/word_wrap

0 голосов
/ 22 декабря 2018

Я закончил тем, что пошел с маршрутом прохождения слова:

def wordwrap(content, line_length)
  words = content.scan(/(?:\A|\s)[^\s]*/)
  remaining = line_length
  words.each do |word|
    if word.length > remaining
      word.gsub!(/^\s/, "")
      remaining = line_length - word.length
      word.insert(0, "\n")
    else
      if word =~ /^\n/
        remaining = line_length - word.length - 1
      else
        remaining -= word.length
      end
    end
  end

  words.join
end

Это вставляет новые строки перед словами, которые в противном случае заставили бы строку превышать line_length символов.

Этонемного сложнее, чем я надеялся, но он справился с работой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...