ruby - Split text at character limit and return string array -
using cpp skills, have developed following old-styled recursive method split text string array nearest word break capped or limit character-count parameter ("limit"):
#see below 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 = "" = 0 first_slice_length.times |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 == 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
its serving purpose, there better way (swift algorithm) achieve aforementioned goal?
edit:
sample usage
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 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 dignissim. mauris vitae nisi @ tortor hendrerit accumsan in @ est. phasellus erat mi, eleifend eu imperdiet sit amet, accumsan posuere risus. donec @ faucibus libero. proin lectus risus, aliquet dictum nec, iaculis 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 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 ", "dignissim. mauris vitae nisi @ tortor ", "hendrerit accumsan in @ est. phasellus ", "erat mi, eleifend eu imperdiet sit amet,", " accumsan posuere risus. donec @ ", "faucibus libero. proin lectus risus, ", "aliquet dictum nec, iaculis 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 "]
presuming that:
you want split text maximum-40-character long strings each. , each string has been split @ word boundary close possible limit (i.e. 40) should not exceed limit.
here 1 solution:
def datadump return <<-end_text suspendisse ut neque magna, nec elementum odio. integer quis massa tortor, commodo tincidunt augue. donec congue lacinia odio$ end_text end = datadump.split(/(.{1,40}\b)/) = a.reject{|el| el.size == 0} puts # or p see results
Comments
Post a Comment