Используя свои навыки cpp, я разработал следующий рекурсивный метод в старом стиле, чтобы разбить текст на строковый массив с ограничением ближайшего разрыва слова или ограничением параметром подсчета символов («limit»):
#see below for sample usage
def split_at_limit(text, limit, result)
slices = text.scan(/.{1,#{limit}}/m)
return if slices.blank?
first_slice = slices.first
if first_slice.last == " " || (slices.length > 1 && slices[1].first == " ")
result << first_slice
slices.delete_at 0
split_at_limit(slices.join, limit, result)
elsif slices.length > 1
first_slice_length = first_slice.length - 1
appendix = ""
i = 0
first_slice_length.times do |i|
break if first_slice[first_slice_length-i].chr == " "
appendix = "#{first_slice[first_slice_length-i].chr}#{appendix}"
first_slice[first_slice_length-i] = ''
end
first_slice = slices.first if i == first_slice.length
result << first_slice
slices.delete_at 0
slices[0] = "#{appendix}#{slices[0]}"
split_at_limit(slices.join, limit, result)
end
result
end
Это служит цели, но есть ли лучший способ (быстрый алгоритм) для достижения вышеупомянутой цели?
Редактировать:
Пример использования
def datadump
return <<-END_TEXT
Suspendisse ut neque magna, nec elementum odio. Integer quis massa tortor, commodo tincidunt augue. Donec congue lacinia odio in aliquet. Ut vehicula elementum mi id lobortis. Sed eget pretium orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vel velit hendrerit nisl facilisis gravida quis ac nunc. Morbi tincidunt ligula ut turpis faucibus placerat. Duis commodo turpis vehicula diam imperdiet eu sollicitudin erat luctus. Nulla facilisi. Aenean aliquam facilisis enim et ultrices. Nulla adipiscing semper massa quis egestas. Nam tempus suscipit semper. Suspendisse sed venenatis lacus.
Phasellus ac tortor a nisi porttitor rutrum eu nec odio. Cras pulvinar, eros non faucibus semper, odio odio mollis justo, vulputate rhoncus odio justo id purus. Donec tincidunt malesuada enim, luctus tempor augue interdum id. Maecenas luctus imperdiet justo, ut vulputate turpis varius et. Nunc placerat pellentesque interdum. Pellentesque porta dignissim neque a dignissim. Mauris vitae nisi at tortor hendrerit accumsan in at est. Phasellus erat mi, eleifend eu imperdiet sit amet, accumsan posuere risus. Donec at faucibus libero. Proin lectus risus, aliquet a dictum nec, iaculis a diam. Ut velit nibh, ultricies eget convallis a, dignissim vitae tortor. Fusce sed lorem mauris, non gravida nisi.
Aliquam malesuada cursus dui, in vestibulum lectus vulputate ut. Proin semper facilisis augue, ut imperdiet erat facilisis ac. Maecenas laoreet faucibus mi, ut mollis diam aliquet scelerisque. Praesent sit amet magna quam, nec auctor nisi. Cras tristique varius scelerisque. Donec vehicula lectus ac urna fermentum faucibus. Aenean nec augue vitae dui tristique luctus. Donec lacus leo, pellentesque ut aliquet vitae, eleifend bibendum neque. Vivamus id diam risus, et ornare magna. Praesent quam dui, congue ut cursus sed, egestas id tortor. Integer eget lacus purus. Sed fermentum convallis quam, sit amet dapibus mi tristique non. Donec vehicula ligula eget risus varius aliquam. Praesent ut odio eu sem mollis euismod. Donec egestas tincidunt dolor et imperdiet.
END_TEXT
end
puts split_at_limit(datadump, 40, []).inspect
#gives=>["Suspendisse ut neque magna, nec ", "elementum odio. Integer quis massa ", "tortor, commodo tincidunt augue. Donec ", "congue lacinia odio in aliquet. Ut ", "vehicula elementum mi id lobortis. Sed ", "eget pretium orci. Cum sociis natoque ", "penatibus et magnis dis parturient ", "montes, nascetur ridiculus mus. Nulla ", "vel velit hendrerit nisl facilisis ", "gravida quis ac nunc. Morbi tincidunt ", "ligula ut turpis faucibus placerat. Duis", " commodo turpis vehicula diam imperdiet ", "eu sollicitudin erat luctus. Nulla ", "facilisi. Aenean aliquam facilisis enim ", "et ultrices. Nulla adipiscing semper ", "massa quis egestas. Nam tempus suscipit ", "semper. Suspendisse sed venenatis ", "lacus.\n\n Phasellus ac tortor a nisi", " porttitor rutrum eu nec odio. Cras ", "pulvinar, eros non faucibus semper, odio", " odio mollis justo, vulputate rhoncus ", "odio justo id purus. Donec tincidunt ", "malesuada enim, luctus tempor augue ", "interdum id. Maecenas luctus imperdiet ", "justo, ut vulputate turpis varius et. ", "Nunc placerat pellentesque interdum. ", "Pellentesque porta dignissim neque a ", "dignissim. Mauris vitae nisi at tortor ", "hendrerit accumsan in at est. Phasellus ", "erat mi, eleifend eu imperdiet sit amet,", " accumsan posuere risus. Donec at ", "faucibus libero. Proin lectus risus, ", "aliquet a dictum nec, iaculis a diam. Ut", " velit nibh, ultricies eget convallis a,", " dignissim vitae tortor. Fusce sed lorem", " mauris, non gravida nisi.\n\n ", "Aliquam malesuada cursus dui, in ", "vestibulum lectus vulputate ut. Proin ", "semper facilisis augue, ut imperdiet ", "erat facilisis ac. Maecenas laoreet ", "faucibus mi, ut mollis diam aliquet ", "scelerisque. Praesent sit amet magna ", "quam, nec auctor nisi. Cras tristique ", "varius scelerisque. Donec vehicula ", "lectus ac urna fermentum faucibus. ", "Aenean nec augue vitae dui tristique ", "luctus. Donec lacus leo, pellentesque ut", " aliquet vitae, eleifend bibendum neque.", " Vivamus id diam risus, et ornare magna.", " Praesent quam dui, congue ut cursus ", "sed, egestas id tortor. Integer eget ", "lacus purus. Sed fermentum convallis ", "quam, sit amet dapibus mi tristique non.", " Donec vehicula ligula eget risus varius", " aliquam. Praesent ut odio eu sem mollis", " euismod. Donec egestas tincidunt dolor "]