Created
September 13, 2015 09:12
-
-
Save brianwisti/ffcdf19aa2f3db091cfe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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