aboutsummaryrefslogtreecommitdiff
path: root/pastebin/website-pastebin
blob: 1171dcf390a40d3fca5927b6e4afe8cdc4c04922 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env perl

=head1 NAME

website pastebin - Create new pastebins from the org-mode template.

=head1 SYNOPSIS

website pastebin [options]

  Options:
    --help            Show the manpage.
    --title           Title of the pastebin.

=head1 OPTIONS

=over 4

=item B<-h, --help>

Prints the manual page and exits.

=item B<-t, --title>

The title of the pastebin. This string will be slugified and the output is used to create the pastebin file name. Special characters are simplified or discarded.

=back

=head1 DESCRIPTION

B<website pastebin> creates a pastebin org-mode text files, that are later processed to produce HTML to be deployed statically.

=cut

use strict;
use warnings;
use Getopt::Long qw(:config no_ignore_case bundling);
use Pod::Usage qw(pod2usage);
use Unicode::Normalize qw(NFKD);
use File::Basename qw(dirname);
use Term::ANSIColor;

my $help = 0;
my $title = '';
my $test = 0;
GetOptions(
  'help|h|?' => \$help,
  'title|t=s' => \$title,
  'test|?' => \$test
) or pod2usage(-verbose => 1, -exitval => 2);
pod2usage(
  -verbose => 2,
  -exitval => 0
) if $help;
pod2usage(
  -verbose => 1,
  -exitval => 2,
  -message => colored("Missing required --title argument.", "red")
) if !$title && !$test;

# Taken from:
# https://stackoverflow.com/a/4009519
sub slugify {
  my $input = shift;
  $input = NFKD($input);      # Normalize (decompose) the Unicode string
  $input =~ tr/\000-\177//cd; # Strip non-ASCII characters (>127)
  $input =~ s/[^\w\s-]//g;    # Remove all characters that are not word characters (includes _), spaces, or hyphens
  $input =~ s/^\s+|\s+$//g;   # Trim whitespace from both ends
  $input = lc($input);
  $input =~ s/[-\s]+/-/g;     # Replace all occurrences of spaces and hyphens with a single hyphen
  return $input;
}

if ($test) {
  eval "use Test::More tests => 4"; die $@ if $@;
  is(slugify("My Custom Title String"), "my-custom-title-string");
  is(slugify("String with áccents and sym?bol-s."), "string-with-accents-and-symbol-s");
  is(slugify("unicode-↓æđ-chars"), "unicode-aaa-chars");
  is(slugify("   spaces   and line
break"), "spaces-and-line-break");
  done_testing();
  exit;
}

our $dirname = dirname(__FILE__);
our $in = "$dirname/skeleton.org";
our $out;
my $date = `date +"%Y-%m-%d %A %H:%M"`;
chomp $date;
my %ENV = (title => $title, date => $date);

# Derived from both:
# https://unix.stackexchange.com/a/294836
# https://stackoverflow.com/a/47664214
sub envsubst {
  open(IN, '<'.$in) or die $!;
  open(OUT, '>'.$out) or die $!;
  while(<IN>) {
    $_ =~ s/\$([_a-zA-Z]+)/$ENV{$1}/g;
    print OUT $_;
  }
  close(IN);
  close(OUT);
}

my $slug = slugify($title);
$out = `realpath $dirname/../site/pastebin/$slug.org`;
chomp $out;

envsubst();

`cat $out | vipe | sponge $out`;

print "$out\n";