python / cpython

The Python programming language
https://www.python.org
Other
62.49k stars 29.99k forks source link

textwrap.wrap: new argument for more pleasing output #56694

Open 82d5d3e7-0df6-496f-8325-d2e5a662bf01 opened 13 years ago

82d5d3e7-0df6-496f-8325-d2e5a662bf01 commented 13 years ago
BPO 12485
Nosy @birkenfeld, @merwok, @bitdancer, @wiggin15
Files
  • textwrap.py-beautiful-2011-07-11_22-01-31_r71296+.diff: Addition of beautiful algorithm to textwrap.py
  • Issue12485.v2.patch: Addition of beautiful algorithm to textwrap.py with tests
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields: ```python assignee = None closed_at = None created_at = labels = ['type-feature', 'library'] title = 'textwrap.wrap: new argument for more pleasing output' updated_at = user = 'https://bugs.python.org/parent5446' ``` bugs.python.org fields: ```python activity = actor = 'wiggin15' assignee = 'none' closed = False closed_date = None closer = None components = ['Library (Lib)'] creation = creator = 'parent5446' dependencies = [] files = ['22626', '38978'] hgrepos = [] issue_num = 12485 keywords = ['patch', 'needs review'] message_count = 7.0 messages = ['139731', '139785', '139825', '139827', '139880', '140170', '240827'] nosy_count = 6.0 nosy_names = ['georg.brandl', 'eric.araujo', 'r.david.murray', 'wiggin15', 'parent5446', 'gavanderlinden'] pr_nums = [] priority = 'normal' resolution = None stage = 'test needed' status = 'open' superseder = None type = 'enhancement' url = 'https://bugs.python.org/issue12485' versions = ['Python 3.5'] ```

    82d5d3e7-0df6-496f-8325-d2e5a662bf01 commented 13 years ago

    Python's textwrap module can be helpful at times, but personally I think there are a couple of things that could be added.

    First, when it comes to text wrapping, usually you're not dealing with a monospace font where each letter is the same size. If you're working with the Python Imaging Library for example, there is a function that you pass the text to in order to determine how wide (or tall) a font is. Therefore, it would be useful to have a parameter where the user can pass a function that gives a custom width for a set of text. The default for this parameter, of course, would be len.

    Also, this module uses a rough and efficient algorithm for wrapping text, but the results are not always aesthetically pleasing (one word hanging off on a line). Sometimes the user may want something that is wrapped more beautifully, so to say, such as is found in TeX. So there should also be a beautiful option that goes back and redistributes the text so that it is more aesthetically pleasing.

    This isn't exactly that important (minor improvements to a module that is probably not used much), but I figured I'd get it out there as I run into the problem all the time when trying to wrap text to be put in images of a set size.

    merwok commented 13 years ago

    Hi! Thanks for the report and patch. Are your two requests related? If not, it would be best to open two reports.

    82d5d3e7-0df6-496f-8325-d2e5a662bf01 commented 13 years ago

    Nah, they're both unrelated. I'll separate the changes and remake the patches. (I'll keep this entry for the beautification part.)

    82d5d3e7-0df6-496f-8325-d2e5a662bf01 commented 13 years ago

    OK, so here is the patch for just the new algorithm.

    merwok commented 13 years ago

    xrange does not exist in Python 3, it’s called range. You should have seen yesterday that I changed the versions: as a new feature, this cannot go into stable releases, only into the next one.

    I’m adding Georg to nosy per http://docs.python.org/devguide/experts

    82d5d3e7-0df6-496f-8325-d2e5a662bf01 commented 13 years ago

    OK, sorry to get back so late, but here's the updated patch without xrange. I saw the version change but forgot that I used xrange in the function (old habits I guess).

    c01133da-2897-42c8-8a27-dc35d72938a9 commented 9 years ago

    Updated the patch and added tests. Fixed a problem with the previous patch: result of map function was assumed to be list, however map in Python3 returns an interator. So I replaced it with a list comprehension.