https://git.spwbk.site/swatson/git-site-gen/raw/master/lib/Gsg/MdParse.pm
___________________________________
package Gsg::MdParse;
use strict;
use warnings;
use Log::Log4perl qw(:easy);
use Exporter qw(import);
our @EXPORT_OK = qw(render_readme);

sub link_line($) {

       my $line = shift;
       if ( $line =~ m/(<(http.*)>)/ ) {
               my $markup_link = $1;
               my $link = $2;
               my $link_replace = "<a href=\"$link\">$link</a>";
               $line =~ s/\Q$1\E/$link_replace/g;
               return $line;
       }

       return $line;

}

sub strike_line($) {

       my $line = shift;
       #if ( $line =~ m/~~(.*)~~/ ) {
       if ( $line =~ m/^(.*)~~(.*)~~(.*)/ ) {
               $line = "$1<s>$2</s>$3";
               return $line;
       }

       return $line;

}

# README content is passed in as a var, sub returned an HTML version of the parsed markdown
sub render_readme($$) {

       my $readme_content = shift;
       my $logger = shift;

       my $html_readme;
       # Might be a better way to do this? TODO
       open my $fh, '>>', \$html_readme or die "Can't open variable: $!";

       # Main parsing logic, doing it line by line
       # I have some ideas on how to make this more robust/efficient,
       # but starting with below for POC
       # TODO:
       # Headers parsing can be one concise subroutine
       # Started building a suite of simple subs to handle everything else,
       # each line should be run through the 'sub suite' to handle all parsing
       my @readme_lines = split("\n", $readme_content);
       my $inside_code = 0;
       foreach my $line ( @readme_lines ) {
               # HEADERS
               if ( $line =~ m/^#{1}(?!#)(.*)#$|^#{1}(?!#)(.*)$/ && $inside_code == 0 ) {
                       my $parsed_line;
                       if ( ! defined $1 || $1 eq "" ) {
                               $parsed_line = "<h1>$2</h1>";
                       } else {
                               $parsed_line = "<h1>$1</h1>";
                       }
                       print $fh "$parsed_line";
               } elsif ( $line =~ m/^#{2}(?!#)(.*)#{2}$|^#{2}(?!#)(.*)$/ && $inside_code == 0) {
                       my $parsed_line;
                       if ( ! defined $1 || $1 eq "" ) {
                               $parsed_line = "<h2>$2</h2>";
                       } else {
                               $parsed_line = "<h2>$1</h2>";
                       }
                       print $fh "$parsed_line";
               } elsif ( $line =~ m/^#{3}(?!#)(.*)#{3}$|^#{3}(?!#)(.*)$/ && $inside_code == 0) {
                       my $parsed_line;
                       if ( ! defined $1 || $1 eq "" ) {
                               $parsed_line = "<h3>$2</h3>";
                       } else {
                               $parsed_line = "<h3>$1</h3>";
                       }
                       print $fh "$parsed_line";
               } elsif ( $line =~ m/^#{4}(?!#)(.*)#{4}$|^#{4}(?!#)(.*)$/ && $inside_code == 0) {
                       my $parsed_line;
                       if ( ! defined $1 || $1 eq "" ) {
                               $parsed_line = "<h4>$2</h4>";
                       } else {
                               $parsed_line = "<h4>$1</h4>";
                       }
                       print $fh "$parsed_line";
               } elsif ( $line =~ m/^#{5}(?!#)(.*)#{5}$|^#{5}(?!#)(.*)$/ && $inside_code == 0) {
                       my $parsed_line;
                       if ( ! defined $1 || $1 eq "" ) {
                               $parsed_line = "<h5>$2</h5>";
                       } else {
                               $parsed_line = "<h5>$1</h5>";
                       }
                       print $fh "$parsed_line";
               } elsif ( $line =~ m/^\*(.*)/ && $inside_code == 0) {
                       $line = strike_line($1);
                       $line = link_line($line);
                       my $parsed_line = "<ul><li>$line</li></ul>";
                       print $fh "$parsed_line";
               } elsif ( $line =~ m/^```$/ ) {
                       if ( $inside_code == 0 ) {
                               $inside_code = 1;
                               print $fh "<br>";
                       } elsif ( $inside_code == 1 ) {
                               $inside_code = 0;
                       }
               } elsif ( $inside_code == 1 ) {
                       print $fh "<code>$line</code><br>";
               } elsif ( $line =~ m/(http.*)/ ) {
                       $line = link_line($line);
                       print $fh "$line<br>";
               } elsif ( $line =~ m/^~~(.*)~~/ ) {
                       $line = strike_line($line);
                       print $fh "$line<br>";
               }
               else {
                       print $fh "$line<br>";
               }
       }

       print $fh "<br>";
       close $fh;
       $logger->info("Parsed README");
       return $html_readme;

}
1;