Skip to content

Instantly share code, notes, and snippets.

@brianwisti
Created September 13, 2015 09:12
Show Gist options
  • Save brianwisti/ffcdf19aa2f3db091cfe to your computer and use it in GitHub Desktop.
Save brianwisti/ffcdf19aa2f3db091cfe to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
# Initial pass at massaging some Jekyll posts for rendering by Hugo
use v5.22.0;
use autodie qw(:all);
use experimental qw(signatures);
no warnings 'experimental';
use Data::Dump 'pp';
use File::Find::Rule;
use File::Path qw(make_path remove_tree);
use File::Slurper qw(read_text write_text);
use YAML::Tiny;
sub convert_front_matter( $front_matter ) {
my @metadata = split "\n", $front_matter;
my %metadata;
for my $datum ( @metadata ) {
my @cells = split ": ", $datum;
next unless @cells;
$metadata{ $cells[0] } = $cells[1];
}
# Massage for Hugo
$metadata{categories} = [ $metadata{category} ];
$metadata{tags} = [ split " ", $metadata{tags} ];
$metadata{date} =~ m{(?<year>\d\d\d\d)[-/](?<month>\d\d)[-/](?<day>\d\d)}
and $metadata{date} = "$+{year}-$+{month}-$+{day}";
# Remove irrelevant metadata
delete $metadata{author};
delete $metadata{category};
return %metadata;
}
sub convert( $file ) {
my $original = read_text $file;
my ( $empty, $front_matter, $content ) = split /^---$/m, $original;
my %metadata = convert_front_matter( $front_matter );
if ( $file =~ m{
^.+
/ (?<category>\w+)
/ (?<year>\d\d\d\d)
- (?<month>\d\d)
- (?<day>\d\d)
- (?<slug>.+)
\.
.+$ }x ) {
my $alias = "/$+{category}/$+{year}/$+{month}/$+{day}_$+{slug}.html";
$metadata{aliases} = [ $alias ];
}
my $yaml = YAML::Tiny->new( \%metadata );
my $new_front_matter = $yaml->write_string;
my $converted = $new_front_matter . "---" . $content;
return $converted;
}
sub import_file( $file, $target ) {
if ( $file =~ m{/ (?<year>\d{4})-\d\d-\d\d-(?<stub>.+) \z }x ) {
my $target_dir = "$target/$+{year}";
(my $target_file = "$target/$+{year}/$+{stub}") =~ s/markdown$/md/;
make_path $target_dir, { verbose => 1 } unless -d $target_dir;
my $content = convert $file;
write_text $target_file, $content;
}
}
my $SOURCE = "$ENV{HOME}/Sites/randomgeekery.org/_posts";
my $TARGET = "$ENV{HOME}/Sites/rgb-hugo/content/post";
my @POSTS = qw(
*.markdown
*.md
*.rst
*.html
);
remove_tree $TARGET, { keep_root => 1 };
my @files = File::Find::Rule->file()
->name( @POSTS )
->in( $SOURCE );
import_file $_, $TARGET foreach @files;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment