website-backend/webmake

  1 #!/usr/bin/perl -CSD
  2 use warnings;
  3 use strict;
  4 use v5.22;
  5 
  6 use File::Path qw(make_path remove_tree);
  7 use DateTime;
  8 use DateTime::Format::ISO8601;
  9 use File::pushd;
 10 use Text::VimColor;
 11 
 12 my %output_dir = (
 13         'nekodev' => '../nekodev',
 14         'blog.nekodev' => '../blog.nekodev',
 15     'code.nekodev' => '../code.nekodev',
 16         '' => '../tmp',
 17     'tmpdir' => '../tmp'
 18 );
 19 
 20 my %src_dirs = (
 21     'code-tmp' => 'code-tmp',
 22     'blog' => 'blog',
 23     'web' => 'web'
 24 );
 25 
 26 
 27 my $blog_index = $output_dir{'tmpdir'}.'/blog_index';
 28 
 29 sub make {
 30     foreach(@_) {
 31         system($^X, '-CSD', "../webcc", $_) if (-f $_);
 32         #`perl -d webcc $_` if (-f $_);
 33         if (-d $_) {
 34             print "Processing directory $_\n";
 35 
 36             my $dirGlob = $_.'/*';
 37             make(glob $dirGlob);
 38         }
 39     }
 40 }
 41 
 42 sub make_code_highlight {
 43 
 44     foreach(@_) {
 45         if (-f $_) {
 46             #$highlighter->syntax_mark_file($_);
 47             # need to overwrite vim options, as nvim doesn't provide -X flag
 48             my @vim_opts = [qw( -RZ -i NONE -u NONE -N -n ), "+set nomodeline"];
 49             my @extra_vim_opts = ['+setg number', '+set printoptions=number:y'];
 50             my $highlighter = Text::VimColor->new(
 51                 file => $_,
 52                 all_syntax_groups => 1,
 53                 vim_command => 'nvim',
 54                 vim_options => @vim_opts,
 55                 extra_vim_options => @extra_vim_opts
 56             );
 57 
 58             my $modDate = DateTime->from_epoch( epoch => (stat $_)[9])->iso8601();
 59             my $outFileName = $_ =~ s/^code\//code-tmp\//r;
 60             $outFileName .= ".code";
 61             my ($dir,$saneFileName) = $_ =~ /(.*)\/(.*)/;
 62             make_path($dir);
 63             print "outputting file $outFileName\n";
 64 
 65             open my $out_file, '>', $outFileName or die "Can't open out file $outFileName: $!";
 66             print {$out_file} "[title]\n$saneFileName\n[date]\n$modDate\n[content]\n<pre>\n";
 67 
 68             $saneFileName =~ s/\./_/g;
 69             my $lineNr = 1;
 70             foreach(split /^/, $highlighter->html) {
 71                 my $lineId = 'L'.$lineNr.$saneFileName;
 72                 print {$out_file} "<span id=\"$lineId\" class=\"synLineNr\">$lineNr </span>".$_;
 73                 $lineNr++;
 74             }
 75             print {$out_file} "</pre>\n";
 76             close $out_file;
 77         }
 78 
 79         if (-d $_) {
 80             print "Processing directory $_\n";
 81             my $dirGlob = $_.'/*';
 82             make_code_highlight(glob $dirGlob);
 83         }
 84     }
 85 }
 86 
 87 
 88 # setup tmpdirs
 89 {
 90     my $dir = pushd($src_dirs{'blog'});
 91     remove_tree($output_dir{'tmpdir'});
 92     make_path($output_dir{'tmpdir'});
 93 }
 94 
 95 make_code_highlight('code');
 96 
 97 foreach(values %src_dirs)
 98 {
 99     my $dir = pushd($_);
100     make(glob '*');
101 }
102 
103 
104 #make(@ARGV);
105 
106 # build blog.nekodex index.html
107 {
108 my $dir = pushd('tmp');
109 my %post2title;
110 my %post2date;
111 
112 open (my $FH, '<', $blog_index) or die "can't open blog_index file, no blog post or serious error: $!";
113 while( my $post = <$FH> ) {
114     chomp $post;
115 
116 
117     chomp( my $title = <$FH>);
118     chomp( my $date = <$FH>);
119 
120     if( $date ne '' and $title ne '' )
121     {
122         $post2title{$post} = $title;
123         $post2date{$post} = $date;
124     }
125 }
126 close $FH;
127 
128 # traverse by date
129 my $date_index = <<EOF;
130 [title]
131 Blogposts nach Datum sortiert
132 [content]
133 EOF
134 
135 my $lastMonth;
136 foreach my $post (sort { $post2date{$a} cmp $post2date{$b} } keys %post2date) {
137     my $date_str = $post2date{$post};
138     my $date = DateTime::Format::ISO8601->parse_datetime( $date_str );
139         # format with locale dependent text
140         $date->set_locale('de-DE');
141         my $localeDate_str = $date->strftime('%A, %d. %B %Y, %H:%M');
142 
143     my $curMonth = $date->strftime('%B %Y');
144     if (defined $lastMonth) {
145         if ($curMonth ne $lastMonth) {
146             $date_index .= "</ul><li><time datetime=<time datetime=$date_str>$curMonth</time></li><ul>\n";
147             $lastMonth = $curMonth;
148         }
149     } else {
150         $date_index .= "<ul><li><time datetime=<time datetime=$date_str>$curMonth</time></li><ul>\n";
151         $lastMonth = $curMonth;
152     }
153 
154     my $pattern = $output_dir{'blog.nekodev'}."\/";
155     my $linkPath = $post;
156     $linkPath =~ s/$pattern//;
157     $date_index .= "<li><a href=\"$linkPath\">$post2title{$post} | <time datetime=$date_str>$localeDate_str</time></a></li>\n";
158 }
159 $date_index .= "</ul></ul>\n";
160 
161 # We're in tmpdir
162 my $tmp_blog_index = 'date_index.blog';
163 
164 open (my $date_index_fh, '>', $tmp_blog_index) or die "can't open date_index file: $!";
165 print {$date_index_fh} $date_index;
166 close $date_index_fh;
167 
168 system($^X, '-CSD', "../webcc", $tmp_blog_index);
169 
170 
171 # build alphabeticat index of posts
172 my $alphaIndex =<<EOF;
173 [title]
174 Blogposts alphabetisch sortiert
175 [content]
176 <ul>
177 EOF
178 
179 foreach my $post (sort { $post2title{$a} cmp $post2title{$b} } keys %post2title) {
180     my $pattern = $output_dir{'blog.nekodev'}."\/";
181     my $linkPath = $post;
182     $linkPath =~ s/$pattern//;
183     $alphaIndex .= "<li><a href=\"$linkPath\">$post2title{$post}</li>\n";
184 }
185 $alphaIndex .= "</ul>\n";
186 
187 
188 # We're in tmpdir
189 my $tmp_alpha_index = 'alpha_index.blog';
190 
191 open (my $alpha_index_fh, '>', $tmp_alpha_index) or die "can't open alpha_index file: $!";
192 print {$alpha_index_fh} $alphaIndex;
193 close $alpha_index_fh;
194 
195 system($^X, '-CSD', "../webcc", $tmp_alpha_index);
196 }

Impressum