diff options
author | Yorhel <git@yorhel.nl> | 2021-01-04 14:33:34 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2021-01-04 14:33:36 +0100 |
commit | b3c79d8c9deada792377a57b5bf4e2c81455004c (patch) | |
tree | 34f85db033ddca3384fad5ce9c7de28b2b251ae4 | |
parent | e0fdfb55a21eecae700c969c728b5ea0fef2cf45 (diff) |
refactor: Move & simplify SkinFile into VNDB::Skins
VNDB::Skins now behaves the same way as VNDB::Config - it provides a
single function that returns all the info you'll need.
This removes the tuwf->{skins} global variable, making skin-querying
code independent of the TUWF object, and, again, moving some
library-related functionality out of vndb.pl.
-rw-r--r-- | lib/SkinFile.pm | 74 | ||||
-rw-r--r-- | lib/VNDB/Skins.pm | 29 | ||||
-rw-r--r-- | lib/VNWeb/Docs/Lib.pm | 7 | ||||
-rw-r--r-- | lib/VNWeb/Elm.pm | 5 | ||||
-rw-r--r-- | lib/VNWeb/HTML.pm | 3 | ||||
-rw-r--r-- | lib/VNWeb/User/Edit.pm | 3 | ||||
-rwxr-xr-x | util/skingen.pl | 7 | ||||
-rwxr-xr-x | util/vndb.pl | 7 |
8 files changed, 42 insertions, 93 deletions
diff --git a/lib/SkinFile.pm b/lib/SkinFile.pm deleted file mode 100644 index 78608f89..00000000 --- a/lib/SkinFile.pm +++ /dev/null @@ -1,74 +0,0 @@ - -package SkinFile; - -use strict; -use warnings; -use Fcntl 'LOCK_SH', 'SEEK_SET'; - - -sub new { - my($class, $root, $open) = @_; - my $self = bless { root => $root }, $class; - $self->open($open) if $open; - return $self; -} - - -sub list { - return map /\/([^\/]+)\/conf/?$1:(), glob "$_[0]{root}/*/conf"; -} - - -sub open { - my($self, $dir, $force) = @_; - return if $self->{"s_$dir"} && !$force; - my %o; - open my $F, '<:utf8', "$self->{root}/$dir/conf" or die $!; - flock $F, LOCK_SH or die $!; - seek $F, 0, SEEK_SET or die $!; - local $_; - while(<$F>) { - chomp; - s/\r//g; - s{[\t\s]*//.+$}{}; - next if !/^([a-z0-9]+)[\t\s]+(.+)$/; - $o{$1} = $2; - } - close $F; - $self->{"s_$dir"} = \%o; - $self->{opened} = $dir; -} - - -sub get { - my($self, $dir, $var) = @_; - $self->open($dir) if defined $var; - $var = $dir if !defined $var; - $var ? $self->{"s_$self->{opened}"}{$var} : keys %{$self->{"s_$self->{opened}"}}; -} - - -1; - - -__END__ - -=pod - -=head1 NAME - -SkinFile - Simple object oriented interface to parsing skin configuration files - -=head1 USAGE - - use SkinFile; - my $s = SkinFile->new($dir); - my @skins = $s->list; - - $s->open($skins[0]); - my $name = $s->get('name'); - - # same as above, but in one function - my $name = $s->get($skins[0], 'name'); - - diff --git a/lib/VNDB/Skins.pm b/lib/VNDB/Skins.pm new file mode 100644 index 00000000..a0716024 --- /dev/null +++ b/lib/VNDB/Skins.pm @@ -0,0 +1,29 @@ +package VNDB::Skins; + +use v5.26; +use warnings; +use Exporter 'import'; +our @EXPORT = ('skins'); + +my $ROOT = $INC{'VNDB/Skins.pm'} =~ s{/lib/VNDB/Skins\.pm$}{}r; + +my $skins; + +sub skins { + $skins ||= do { +{ map { + my $skin = /\/([^\/]+)\/conf/ ? $1 : die; + my %o; + open my $F, '<:utf8', $_ or die $!; + while(<$F>) { + chomp; + s/\r//g; + s{[\t\s]*//.+$}{}; + next if !/^([a-z0-9]+)[\t\s]+(.+)$/; + $o{$1} = $2; + } + +( $skin, \%o ) + } glob "$ROOT/static/s/*/conf" } }; + $skins; +} + +1; diff --git a/lib/VNWeb/Docs/Lib.pm b/lib/VNWeb/Docs/Lib.pm index 19097adf..6c7351d4 100644 --- a/lib/VNWeb/Docs/Lib.pm +++ b/lib/VNWeb/Docs/Lib.pm @@ -1,6 +1,7 @@ package VNWeb::Docs::Lib; use VNWeb::Prelude; +use VNDB::Skins; our @EXPORT = qw/enrich_html/; @@ -26,10 +27,10 @@ sub _moderators { sub _skincontrib { my %users; - push $users{ tuwf->{skins}{$_}[1] }->@*, [ $_, tuwf->{skins}{$_}[0] ] - for sort { tuwf->{skins}{$a}[0] cmp tuwf->{skins}{$b}[0] } keys tuwf->{skins}->%*; + push $users{ skins->{$_}{userid} }->@*, [ $_, skins->{$_}{name} ] + for sort { skins->{$a}{name} cmp skins->{$b}{name} } keys skins->%*; - my $u = tuwf->dbAlli('SELECT id, username FROM users WHERE id IN', [keys %users]); + my $u = tuwf->dbAlli('SELECT id, username FROM users WHERE id IN', [keys %users], 'ORDER BY id'); xml_string sub { dl_ sub { diff --git a/lib/VNWeb/Elm.pm b/lib/VNWeb/Elm.pm index 698a7ae8..04a05100 100644 --- a/lib/VNWeb/Elm.pm +++ b/lib/VNWeb/Elm.pm @@ -18,6 +18,7 @@ use VNDB::Config; use VNDB::Types; use VNDB::Func 'fmtrating'; use VNDB::ExtLinks (); +use VNDB::Skins; use VNWeb::Validation; use VNWeb::Auth; @@ -418,9 +419,7 @@ sub write_types { my $data = ''; $data .= def adminEMail => String => string config->{admin_email}; - $data .= def skins => 'List (String, String)' => - list map tuple(string $_, string tuwf->{skins}{$_}[0]), - sort { tuwf->{skins}{$a}[0] cmp tuwf->{skins}{$b}[0] } keys tuwf->{skins}->%*; + $data .= def skins => 'List (String, String)' => list map tuple(string $_, string skins->{$_}{name}), sort { skins->{$a}{name} cmp skins->{$b}{name} } keys skins->%*; $data .= def languages => 'List (String, String)' => list map tuple(string $_, string $LANGUAGE{$_}), sort { $LANGUAGE{$a} cmp $LANGUAGE{$b} } keys %LANGUAGE; $data .= def platforms => 'List (String, String)' => list map tuple(string $_, string $PLATFORM{$_}), keys %PLATFORM; $data .= def releaseTypes => 'List (String, String)' => list map tuple(string $_, string $RELEASE_TYPE{$_}), keys %RELEASE_TYPE; diff --git a/lib/VNWeb/HTML.pm b/lib/VNWeb/HTML.pm index 611d02bb..10aac6f7 100644 --- a/lib/VNWeb/HTML.pm +++ b/lib/VNWeb/HTML.pm @@ -13,6 +13,7 @@ use Carp 'croak'; use JSON::XS; use VNDB::Config; use VNDB::BBCode; +use VNDB::Skins; use VNWeb::Auth; use VNWeb::Validation; use VNWeb::DB; @@ -155,7 +156,7 @@ sub _head_ { 'SELECT customcss, skin FROM users WHERE pubskin_can AND pubskin_enabled AND id =', \$o->{dbobj}{id} ) : {}; my $skin = tuwf->reqGet('skin') || $pubskin->{skin} || auth->pref('skin') || ''; - $skin = config->{skin_default} if !tuwf->{skins}{$skin}; + $skin = config->{skin_default} if !skins->{$skin}; my $customcss = $pubskin->{customcss} || auth->pref('customcss'); meta_ charset => 'utf-8'; diff --git a/lib/VNWeb/User/Edit.pm b/lib/VNWeb/User/Edit.pm index 76dbab5c..5455fe62 100644 --- a/lib/VNWeb/User/Edit.pm +++ b/lib/VNWeb/User/Edit.pm @@ -1,6 +1,7 @@ package VNWeb::User::Edit; use VNWeb::Prelude; +use VNDB::Skins; my $FORM = { @@ -40,7 +41,7 @@ my $FORM = { tags_ero => { anybool => 1 }, tags_tech => { anybool => 1 }, spoilers => { uint => 1, range => [ 0, 2 ] }, - skin => { enum => tuwf->{skins} }, + skin => { enum => skins }, customcss => { required => 0, default => '', maxlength => 2000 }, # Supporter options diff --git a/util/skingen.pl b/util/skingen.pl index 8d9f3b4e..2114b7fc 100755 --- a/util/skingen.pl +++ b/util/skingen.pl @@ -8,7 +8,7 @@ our($ROOT, %S); BEGIN { ($ROOT = abs_path $0) =~ s{/util/skingen\.pl$}{}; } use lib "$ROOT/lib"; -use SkinFile; +use VNDB::Skins; my $iconcss = do { @@ -49,8 +49,7 @@ sub mtime($) { [stat("$ROOT/static$_[0]")]->[9] } sub writeskin { # $name my $name = shift; - my $skin = SkinFile->new("$ROOT/static/s", $name); - my %o = map +($_ => $skin->get($_)), $skin->get; + my %o = skins->{$name}->%*; $o{iconcss} = $iconcss; # get the right top image @@ -94,7 +93,7 @@ sub writeskin { # $name if(@ARGV) { writeskin($_) for (@ARGV); } else { - writeskin($_) for (SkinFile->new("$ROOT/static/s")->list); + writeskin($_) for (keys skins->%*); } diff --git a/util/vndb.pl b/util/vndb.pl index 982b33e8..dca72b19 100755 --- a/util/vndb.pl +++ b/util/vndb.pl @@ -18,18 +18,11 @@ my $ROOT; BEGIN { ($ROOT = abs_path $0) =~ s{/util/vndb\.pl$}{}; } use lib $ROOT.'/lib'; -use SkinFile; -use VNDB::Func (); use VNDB::Config; use VNWeb::Auth; use VNWeb::HTML (); use VNWeb::Validation (); - -# load the skins -my $skin = SkinFile->new("$ROOT/static/s"); -tuwf->{skins} = { map +($_ => [ $skin->get($_, 'name'), $skin->get($_, 'userid') ]), $skin->list }; - TUWF::set %{ config->{tuwf} }; # Signal to VNWeb::Elm whether it should generate the Elm files. |