> for rendering strings in UIs This is the bit that concerns me about user expectations. Rendering to a specific length can really only be done by the render engine since characters, kerning and spacing are variable width. The widest I know of is the single grapheme "﷽". And that also doesn't account for the unicode characters that do not take up space.
A minor nit is that I think the truncation is expected to be the total length of the string including the padding. So `leading <> padding ` would need to be trim the padding length from leading first. On Sunday, November 20, 2022 at 5:43:24 AM UTC+1 zachary....@gmail.com wrote: > It would be great to come up with some kind of heuristic and/or consistent > philosophy on what belongs in the standard library, to guide these > discussions. Some kind of rubric could make these kinds of conversations > easier or even prevent them entirely. For me, the main guiding principles > are whether or not there is exactly one right way to do the thing in > question, how ubiquitous the need for it is, and how obvious the > implementation is (on the flipside, how much we can prevent people from > hidden gotchas they wouldn't even think to reach for a library for). > > For example, the implementation actually requires only adding padding if > the string has been trimmed at all, and I'd bet there are lots of > suboptimal implementations out there. Ben's above isn't quite right, since > the idea is to only add the ellipses if it truncated the string, and then > it should only add exactly the string provided (not pad it out to the full > length of the string). Since a performant implementation probably might > not be quite as obvious to the less experienced (with elixir or in > general), and this seems like a relatively common operation (for rendering > strings in UIs or emails or w/e), I feel like a std library implementation > could be warranted. > > Something like this would probably be better since it avoids checking the > string length (a linear time operation) and also avoids things like > multiple slice operations in favor of a single traversal up to "length". > > ``` > def truncate("", 0, _), do: "" > def truncate(_, 0, padding), do: padding > > def truncate(string, length, padding) when length > 0 do > case String.split_at(string, length) do > {leading, ""} -> leading > {leading, _} -> leading <> padding > end > end > ``` > > > > On Sat, Nov 19 2022 at 9:45 PM, Ben Wilson <benwil...@gmail.com> wrote: > >> This seems reasonably straight forward to implement in your own code base: >> >> ``` >> def truncate(string, length, padding \\ ".") do >> string >> |> String.slice(0, length) >> |> String.pad_trailing(String.length(string), padding) >> end >> ``` >> >> Not seeing a strong need to include it in the standard library. Just my >> $0.02 >> On Saturday, November 19, 2022 at 2:12:19 PM UTC-5 Kip wrote: >> >>> That is comes from Laravel, not PHP core may be an indication it is >>> better implemented in a library? If there is momentum towards adding it to >>> the String module I think `String.truncate` would feel more natural to me >>> (its also what Ruby uses). >>> >>> Its difficult to make guarantees about the printable width though since >>> characters like ZWJ and Bidi text would mean that to do this properly is >>> not a simple or straight forward situation. For that reason I don't >>> personally think it belongs in Elixir itself. >>> >>> On Saturday, November 19, 2022 at 5:20:21 PM UTC+1 hassanr...@gmail.com >>> wrote: >>> >>>> Hi all, >>>> I came across from laravel <https://laravel.com> framework, where >>>> there are a lot of useful functions, I miss those functions in Elixir, One >>>> of the functions is called limit >>>> <https://laravel.com/docs/9.x/helpers#method-str-limit> function, I >>>> would like to have that in elixir. >>>> ``` >>>> iex> String.limit("elixir", 3) >>>> "eli..." >>>> >>>> iex> String.limit("elixir", 7) >>>> "elixir" >>>> >>>> iex> String.limit("elixir", 3, "***") >>>> "eli***" >>>> ``` >>>> This function would be really helpful with longer string, we can limit >>>> long string with some trailing string like (...). >>>> >>>> What do you think? If yes what should be the name you suggest? >>>> >>>> Thanks, >>>> Hassan >>>> >>>> >>>> >>>> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to elixir-lang-co...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/elixir-lang-core/35628c34-c8c4-4558-a985-de87ec7111d3n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/35628c34-c8c4-4558-a985-de87ec7111d3n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/2bcbc5b2-a6c2-4cbc-a9c7-168fd66bb19en%40googlegroups.com.