aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Utils.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/Utils.pm')
-rw-r--r--perllib/Utils.pm120
1 files changed, 120 insertions, 0 deletions
diff --git a/perllib/Utils.pm b/perllib/Utils.pm
index c16a02cd4..bf8ac2805 100644
--- a/perllib/Utils.pm
+++ b/perllib/Utils.pm
@@ -12,6 +12,8 @@
package Utils;
use strict;
+use Encode;
+use POSIX qw(strftime);
use mySociety::DBHandle qw(dbh);
use mySociety::GeoUtil;
use mySociety::Locale;
@@ -136,4 +138,122 @@ sub london_categories {
};
}
+=head2 trim_text
+
+ my $text = trim_text( $text_to_trim );
+
+Strip leading and trailing white space from a string. Also reduces all
+white space to a single space.
+
+Trim
+
+=cut
+
+sub trim_text {
+ my $input = shift;
+ for ($input) {
+ last unless $_;
+ s{\s+}{ }g; # all whitespace to single space
+ s{^ }{}; # trim leading
+ s{ $}{}; # trim trailing
+ }
+ return $input;
+}
+
+
+=head2 cleanup_text
+
+Tidy up text including removing contentious phrases,
+SHOUTING and new lines and adding sentence casing. Takes an optional HASHREF
+of args as follows.
+
+=over
+
+=item allow_multiline
+
+Do not flatten down to a single line if true.
+
+=back
+
+=cut
+
+sub cleanup_text {
+ my $input = shift || '';
+ my $args = shift || {};
+
+ # lowercase everything if looks like it might be SHOUTING
+ $input = lc $input if $input !~ /[a-z]/;
+
+ # clean up language and tradmarks
+ for ($input) {
+
+ # shit -> poo
+ s{\bdog\s*shit\b}{dog poo}ig;
+
+ # 'portakabin' to '[portable cabin]' (and variations)
+ s{\b(porta)\s*([ck]abin|loo)\b}{[$1ble $2]}ig;
+ s{kabin\]}{cabin\]}ig;
+ }
+
+ # Remove unneeded whitespace
+ my @lines = grep { m/\S/ } split m/\n\n/, $input;
+ for (@lines) {
+ $_ = trim_text($_);
+ $_ = ucfirst $_; # start with capital
+ }
+
+ my $join_char = $args->{allow_multiline} ? "\n\n" : " ";
+ $input = join $join_char, @lines;
+
+ return $input;
+}
+
+sub prettify_epoch {
+ my ($s, $short) = @_;
+ my @s = localtime($s);
+ my $tt = strftime('%H:%M', @s);
+ my @t = localtime();
+ if (strftime('%Y%m%d', @s) eq strftime('%Y%m%d', @t)) {
+ $tt = "$tt " . _('today');
+ } elsif (strftime('%Y %U', @s) eq strftime('%Y %U', @t)) {
+ $tt = "$tt, " . decode_utf8(strftime('%A', @s));
+ } elsif ($short) {
+ $tt = "$tt, " . decode_utf8(strftime('%e %b %Y', @s));
+ } elsif (strftime('%Y', @s) eq strftime('%Y', @t)) {
+ $tt = "$tt, " . decode_utf8(strftime('%A %e %B %Y', @s));
+ } else {
+ $tt = "$tt, " . decode_utf8(strftime('%a %e %B %Y', @s));
+ }
+ return $tt;
+}
+
+# argument is duration in seconds, rounds to the nearest minute
+sub prettify_duration {
+ my ($s, $nearest) = @_;
+ if ($nearest eq 'week') {
+ $s = int(($s+60*60*24*3.5)/60/60/24/7)*60*60*24*7;
+ } elsif ($nearest eq 'day') {
+ $s = int(($s+60*60*12)/60/60/24)*60*60*24;
+ } elsif ($nearest eq 'hour') {
+ $s = int(($s+60*30)/60/60)*60*60;
+ } elsif ($nearest eq 'minute') {
+ $s = int(($s+30)/60)*60;
+ return _('less than a minute') if $s == 0;
+ }
+ my @out = ();
+ _part(\$s, 60*60*24*7, _('%d week'), _('%d weeks'), \@out);
+ _part(\$s, 60*60*24, _('%d day'), _('%d days'), \@out);
+ _part(\$s, 60*60, _('%d hour'), _('%d hours'), \@out);
+ _part(\$s, 60, _('%d minute'), _('%d minutes'), \@out);
+ return join(', ', @out);
+}
+sub _part {
+ my ($s, $m, $w1, $w2, $o) = @_;
+ if ($$s >= $m) {
+ my $i = int($$s / $m);
+ push @$o, sprintf(mySociety::Locale::nget($w1, $w2, $i), $i);
+ $$s -= $i * $m;
+ }
+}
+
1;