sg/staticgen.pl
2025-01-19 12:16:01 -05:00

134 lines
3.5 KiB
Perl
Executable file

#!/usr/bin/perl
use strict;
use warnings;
use Carp;
#use HTML::Template;
$SIG{__WARN__} = sub { die @_; };
sub DisplayUsage
{
my $options_ref = shift;
my @options = @$options_ref;
print "Usage:\n";
for my $opt (@options)
{
my $opt_str = " " . (defined $opt->{sopt} ? "-$opt->{sopt}, " : " ");
$opt_str .= (defined $opt->{lopt} ? "--$opt->{lopt}" : "");
if (lc $opt->{arg} eq "required")
{
$opt_str .= "=<value>";
}
elsif (lc $opt->{arg} eq "optional")
{
$opt_str .= "[=<value>]";
}
print $opt_str . "\n " . ($opt->{desc} // "") . "\n\n";
}
exit 0;
}
sub HandleArgs
{
my ($args_ref, $options_ref) = @_;
my @args = @$args_ref;
my @options = @$options_ref;
for my $arg (@args)
{
if ($arg =~ m@^(-(?<sopts>\w{2,})|-(?<sopt>\w)|-+(?<lopt>[\w-]+))(=(?<optarg>.+))?\z@i)
{
my @soptlist;
@soptlist = split //, $+{sopts} if defined $+{sopts};
my $optarg;
my $handled = 1;
DisplayUsage($options_ref)
if ((defined $+{sopt} and $+{sopt} eq "h") or
(defined $+{lopt} and $+{lopt} eq "help"));
for my $opt (@options)
{
die "No option name to handle!"
unless defined $opt->{lopt} or defined $opt->{sopt};
if (defined $opt->{sopt})
{
if (grep { $_ eq $opt->{sopt} } @soptlist)
{
die "Option -$opt->{sopt} cannot be in a list as it requires an argument!\n"
if $opt->{arg} eq "required";
$opt->{handler}();
}
elsif (defined $+{sopt} and $+{sopt} // "" eq $opt->{sopt})
{
$optarg = $+{optarg} // ();
$opt->{handler}($optarg);
}
}
if (defined $opt->{lopt} and $+{lopt} // "" eq $opt->{lopt})
{
$optarg = $+{optarg} // ();
$opt->{handler}($optarg);
}
}
die "Unrecognized option: $arg\n"
unless $handled;
}
}
}
sub HandleConf
{
my $filename = shift;
print "Loading configuration from: $filename\n";
}
my @optArray = (
{
lopt => "config",
sopt => "c",
desc => "Loads a custom config file at a specified path.",
arg => "required",
handler => \&HandleConf
},
{
lopt => "new-post",
sopt => "n",
desc => "Create a new post.",
arg => "none",
handler => sub { print "do something\n"; }
},
{
lopt => "build",
sopt => "b",
desc => "Build all posts and templates into HTML.",
arg => "optional",
handler => sub { print "do something\n"; }
},
{
lopt => "publish",
sopt => "p",
desc => "Publish built files.",
arg => "none",
handler => sub { print "do something\n"; }
},
);
sub Main
{
HandleArgs(\@ARGV, \@optArray);
}
&Main();
exit 0;