Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Shortening paths for display

by morelenmir (Beadle)
on Oct 22, 2016 at 21:08 UTC ( [id://1174520]=perlquestion: print w/replies, xml ) Need Help??

morelenmir has asked for the wisdom of the Perl Monks concerning the following question:

There used to be an undocumented win32 function called 'PathSetDlgItemPath'. This allowed you to set the text of a windows control to a file or folder path, automatically editing what was displayed to fit inside the available client area. It did this where necessary by shortening the path using '...' ellipsis characters.

I wondered if there was anything similar for perl? I guess, rather than the size of a windows control it would need to be told the maximum number of characters you wanted to display.

"Aure Entuluva!" - Hurin Thalion at the Nirnaeth Arnoediad.

Replies are listed 'Best First'.
Re: Shortening paths for display
by BrowserUk (Patriarch) on Oct 22, 2016 at 22:31 UTC
    There used to be an undocumented win32 function called 'PathSetDlgItemPath'.

    A quick google for that function at ms.com turns up this page; and the first line of the description says that this is the function that underlies it.

    Looking at the example for the latter page, its functionality can be described as: throw away characters, preceding the right-most backslash until the specified width is met; or, only ... is left preceding that backslash. (Ignoring that it uses pixels and the current font.)

    So, a simple perl implementation might be:

    #! perl -slw use strict; sub compactPath { my( $p, $n ) = @_; my $discard = length( $p ) - $n + 3; my $min = $p =~ m[\\[^\\]+$]; $p =~ s[.{$min,$discard}(?=\\[^\\]+$)][...]; return $p; } my $path = "C:\\path1\\path2\\sample.txt";; print $path; print compactPath( $path, $_ ) for reverse 0 .. length $path; __END__ C:\test>junk47 C:\path1\path2\sample.txt C:\path1\pa...\sample.txt C:\path1\p...\sample.txt C:\path1\...\sample.txt C:\path1...\sample.txt C:\path...\sample.txt C:\pat...\sample.txt C:\pa...\sample.txt C:\p...\sample.txt C:\...\sample.txt C:...\sample.txt C...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt ...\sample.txt

    Does that meet your expectations?


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
    In the absence of evidence, opinion is indistinguishable from prejudice.

      Many thanks indeed!!! The code snippet looks perfect and I will try to learn from it, not just do a copy/paste! Its surprizing nothing similar has made its way in to File::Spec or some such - perhaps exactly because it is so straightforward to implement.

      Going back to that link, it looks like the API function finally made it out of the undocumented locker at some point over the last 17 years!!!

      "Aure Entuluva!" - Hurin Thalion at the Nirnaeth Arnoediad.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1174520]
Approved by BrowserUk
Front-paged by kcott
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (4)
As of 2024-04-24 22:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found