#!/usr/bin/env perl # Sample usage: man sh | jack.pl # jack.pl -c -j jack.pl # (Based on jack.c by Jamie Zawinski.) use strict; my( $text, $keep, $work ); $text = "All work and no play makes Jack a dull boy. "; $keep = qr<\t>; while( 1 ) { $ARGV[0] =~ /-c/ and do { $keep = qr<[][;#(){}"]|/\*|\*/|//>; shift; next; }; $ARGV[0] =~ /-j/ and do { $text = "Just another Perl hacker. "; shift; next; }; last; } while( <> ) { # Stupid `man` formatting s/.\10//g; s/[^[:space:][:graph:]]//gs; # Expand tabs 1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e; xify( split /($keep|(?:\A|\z|\s){4,})/s ) } sub xify { print rep( shift ), shift while @_ } sub rep { my( $len, $s, @s, $i ); $s = shift; return "" unless $len = length $s; ($s, $work) = ($work . $text x (1 + (length($s) - length $work) / length $text)) =~ m/^(.{0,@{[length $s]}})(?=\s|\A|\z)\s*(.*)/s; @s = split /\s(?=\S)/, $s; return $s . ' ' x ($len - length $s) if @s < 2; $s[-1] =~ s/\s+$//; for( @s ) { $len -= length $_ } for( $i = 0; $len--; $i = ($i+1) % $#s ) { $s[$i] .= ' ' } join "", @s }