URI: 
       Metadata.pm - lsg - Lumidify Site Generator
  HTML git clone git://lumidify.org/lsg.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/lsg.git (encrypted, but very slow)
  HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/lsg.git (over tor)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       Metadata.pm (3237B)
       ---
            1 #!/usr/bin/env perl
            2 
            3 # LSG::Metadata - metadata parser for the LSG
            4 # Written by lumidify <nobody@lumidify.org>
            5 #
            6 # To the extent possible under law, the author has dedicated
            7 # all copyright and related and neighboring rights to this
            8 # software to the public domain worldwide. This software is
            9 # distributed without any warranty.
           10 #
           11 # You should have received a copy of the CC0 Public Domain
           12 # Dedication along with this software. If not, see
           13 # <http://creativecommons.org/publicdomain/zero/1.0/>.
           14 
           15 package LSG::Metadata;
           16 use strict;
           17 use warnings;
           18 use utf8;
           19 use open qw< :encoding(UTF-8) >;
           20 binmode STDIN, ":encoding(UTF-8)";
           21 binmode STDOUT, ":encoding(UTF-8)";
           22 binmode STDERR, ":encoding(UTF-8)";
           23 use File::Find;
           24 use File::Spec::Functions qw(catfile catdir splitdir);
           25 use File::Path;
           26 use LSG::Config qw($config);
           27 
           28 sub parse_metadata_file {
           29         my $in = shift;
           30         my %tmp_fm = ();
           31         while (<$in> =~ /^([^:]*):(.*)$/) {
           32                 $tmp_fm{$1} = $2;
           33                 if (eof) {last}
           34         }
           35         return \%tmp_fm;
           36 }
           37 
           38 sub parse_metadata {
           39         if (!(-f)) {return};
           40         my $fullname = $File::Find::name;
           41         # Strip "pages/" from dirname
           42         my @dirs = splitdir($File::Find::dir);
           43         my $dirname = catdir(@dirs[1..$#dirs]);
           44         my $basename = substr($_, 0, $#_-2);
           45         # Note: this will only work if language codes are two chars
           46         my $lang = substr($_, -2);
           47         my $pageid = $basename;
           48         if ($dirname) {$pageid = catfile($dirname, $basename)};
           49         open(my $in, "<", $_) or die "Can't open $fullname: $!";
           50         my %tmp_md = %{parse_metadata_file($in)};
           51         close($in);
           52         my $modified_date = (stat($_))[9];
           53         $config->{"metadata"}->{$pageid}->{"modified"}->{$lang} = $modified_date;
           54         if (!exists($tmp_md{"template"})) {
           55                 die "ERROR: $fullname does not specify a template\n";
           56         }
           57         if (!exists($config->{"templates"}->{$tmp_md{"template"} . ".$lang.html"})) {
           58                 die "ERROR: $fullname: template " . $tmp_md{"template"} . " does not exist\n";
           59         }
           60         # Note: if different templates are specified for different languages,
           61         # the one from the last language analyzed is used.
           62         # FIXME: change this - if different templates are specified for different langs,
           63         # the template isn't checked for existance in other langs
           64         # Wait, why not just use the actual template given? It's stored in $config->{"metadata"} anyways
           65         $config->{"metadata"}->{$pageid}->{"template"} = $tmp_md{"template"};
           66         foreach my $md_id (split / /, $config->{"templates"}->{$tmp_md{"template"} . ".$lang.html"}->{"metadata"}) {
           67                 if (!exists($tmp_md{$md_id})) {
           68                         die "ERROR: $fullname does not include \"$md_id\" metadata\n";
           69                 }
           70         }
           71         foreach my $md_id (keys %tmp_md) {
           72                 $config->{"metadata"}->{$pageid}->{$lang}->{$md_id} = $tmp_md{$md_id};
           73         }
           74         $config->{"metadata"}->{$pageid}->{"dirname"} = $dirname;
           75         $config->{"metadata"}->{$pageid}->{"basename"} = $basename;
           76 }
           77 
           78 sub gen_metadata_hash {
           79         find(\&parse_metadata, "pages/");
           80 }
           81 
           82 sub check_metadata_langs {
           83         my $not_found;
           84         foreach my $pageid (keys %{$config->{"metadata"}}) {
           85                 $not_found = "";
           86                 foreach my $lang (keys %{$config->{"langs"}}) {
           87                         if (!exists($config->{"metadata"}->{$pageid}->{$lang})) {
           88                                 $not_found .= " $lang";
           89                         }
           90                 }
           91                 if ($not_found) {
           92                         die("ERROR: languages \"$not_found\" not found for $pageid\n");
           93                 }
           94         }
           95 }
           96 
           97 sub init_metadata {
           98         gen_metadata_hash();
           99         check_metadata_langs();
          100 }
          101 
          102 1;