summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2021-01-04 14:33:34 +0100
committerYorhel <git@yorhel.nl>2021-01-04 14:33:36 +0100
commitb3c79d8c9deada792377a57b5bf4e2c81455004c (patch)
tree34f85db033ddca3384fad5ce9c7de28b2b251ae4
parente0fdfb55a21eecae700c969c728b5ea0fef2cf45 (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.pm74
-rw-r--r--lib/VNDB/Skins.pm29
-rw-r--r--lib/VNWeb/Docs/Lib.pm7
-rw-r--r--lib/VNWeb/Elm.pm5
-rw-r--r--lib/VNWeb/HTML.pm3
-rw-r--r--lib/VNWeb/User/Edit.pm3
-rwxr-xr-xutil/skingen.pl7
-rwxr-xr-xutil/vndb.pl7
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.