$File::Sticker::Scribe::YamlPrefix::VERSION
=
'4.0101'
;
sub
whoami { (
caller
(1) )[3] }
sub
priority {
my
$class
=
shift
;
return
1;
}
sub
allowed_file {
my
$self
=
shift
;
my
$file
=
shift
;
say
STDERR whoami(),
" file=$file"
if
$self
->{verbose} > 2;
my
$ft
=
$self
->{file_magic}->info_from_filename(
$file
);
if
(-r
$file
and
$ft
->{mime_type} =~ m{^text/plain}
and
$file
!~ /\.yml$/)
{
return
1;
}
return
0;
}
sub
allowed_fields {
my
$self
=
shift
;
return
1;
}
sub
known_fields {
my
$self
=
shift
;
if
(
$self
->{wanted_fields})
{
return
$self
->{wanted_fields};
}
return
{};
}
sub
read_meta {
my
$self
=
shift
;
my
$filename
=
shift
;
say
STDERR whoami(),
" filename=$filename"
if
$self
->{verbose} > 2;
my
(
$yaml_str
,
$more
) =
$self
->_yaml_and_more(
$filename
);
my
%meta
= ();
my
$info
;
eval
{
$info
= Load(
$yaml_str
);};
if
($@)
{
warn
__PACKAGE__,
" Load of data failed: $@"
;
say
"======\n$yaml_str\n====="
if
$self
->{verbose} > 1;
return
\
%meta
;
}
if
(!
$info
)
{
warn
__PACKAGE__,
" no legal YAML"
;
return
\
%meta
;
}
foreach
my
$key
(
sort
keys
%{
$info
})
{
my
$val
=
$info
->{
$key
};
if
(
$val
)
{
if
(
$key
eq
'tags'
)
{
$meta
{tags} =
$val
;
if
(
$meta
{tags} !~ /,/)
{
$meta
{tags} =~ s/ /,/g;
}
}
elsif
(
$key
eq
'dublincore.source'
)
{
$meta
{
'url'
} =
$val
;
}
elsif
(
$key
eq
'dublincore.title'
)
{
$meta
{
'title'
} =
$val
;
}
elsif
(
$key
eq
'dublincore.creator'
)
{
$meta
{
'creator'
} =
$val
;
}
elsif
(
$key
eq
'dublincore.description'
)
{
$meta
{
'description'
} =
$val
;
}
elsif
(
$key
eq
'private'
)
{
}
else
{
$meta
{
$key
} =
$val
;
}
}
}
if
(
$info
->{private})
{
$meta
{tags} .=
",private"
;
}
if
(
$more
=~ m/\[\[\!meta title=
"([^"
]+)"\]\]/)
{
$meta
{title} = $1
if
!
$meta
{title};
$more
=~ s/\[\[\!meta title=
"([^"
]+)"\]\]//;
}
if
(
$more
=~ m/\[\[\!meta description=
"([^"
]+)"\]\]/)
{
$meta
{description} = $1
if
!
$meta
{description};
$more
=~ s/\[\[\!meta description=
"([^"
]+)"\]\]//;
}
return
\
%meta
;
}
sub
delete_field_from_file {
my
$self
=
shift
;
my
%args
=
@_
;
say
STDERR whoami(),
" filename=$args{filename}"
if
$self
->{verbose} > 2;
my
$filename
=
$args
{filename};
my
$field
=
$args
{field};
my
$info
=
$self
->_load_meta(
$filename
);
delete
$info
->{
$field
};
$self
->_write_meta(
filename
=>
$filename
,
meta
=>
$info
);
}
sub
replace_all_meta {
my
$self
=
shift
;
my
%args
=
@_
;
say
STDERR whoami(),
" filename=$args{filename}"
if
$self
->{verbose} > 2;
my
$filename
=
$args
{filename};
my
$meta
=
$args
{meta};
$self
->_write_meta(
filename
=>
$filename
,
meta
=>
$meta
);
}
sub
replace_one_field {
my
$self
=
shift
;
my
%args
=
@_
;
say
STDERR whoami(),
" filename=$args{filename}"
if
$self
->{verbose} > 2;
my
$filename
=
$args
{filename};
my
$field
=
$args
{field};
my
$value
=
$args
{value};
my
$info
=
$self
->_load_meta(
$filename
);
$info
->{
$field
} =
$value
;
$self
->_write_meta(
filename
=>
$filename
,
meta
=>
$info
);
}
sub
_has_yaml {
my
$self
=
shift
;
my
$filename
=
shift
;
my
$fh
;
if
(!
open
(
$fh
,
'<'
,
$filename
))
{
die
__PACKAGE__,
" Unable to open file '"
.
$filename
.
"': $!\n"
;
}
my
$first_line
= <
$fh
>;
close
(
$fh
);
return
0
if
!
$first_line
;
chomp
$first_line
;
return
(
$first_line
eq
'---'
);
}
sub
_yaml_and_more {
my
$self
=
shift
;
my
$filename
=
shift
;
say
STDERR whoami(),
" filename=$filename"
if
$self
->{verbose} > 2;
my
$fh
;
if
(!
open
(
$fh
,
'<'
,
$filename
))
{
die
__PACKAGE__,
" Unable to open file '"
.
$filename
.
"': $!\n"
;
}
my
$yaml_str
=
''
;
my
$more_str
=
''
;
my
$yaml_started
= 0;
my
$yaml_finished
= 0;
while
(<
$fh
>) {
if
(/^---$/) {
if
(!
$yaml_started
and !
$yaml_finished
)
{
$yaml_started
= 1;
next
;
}
elsif
(!
$yaml_finished
)
{
$yaml_started
= 0;
$yaml_finished
= 1;
next
;
}
}
if
(
$yaml_started
)
{
$yaml_str
.=
$_
;
}
elsif
(
$yaml_finished
)
{
$more_str
.=
$_
;
}
}
close
(
$fh
);
return
(
$yaml_str
,
$more_str
);
}
sub
_load_meta {
my
$self
=
shift
;
my
$filename
=
shift
;
say
STDERR whoami(),
" filename=$filename"
if
$self
->{verbose} > 2;
my
(
$yaml_str
,
$more
) =
$self
->_yaml_and_more(
$filename
);
my
$meta
;
eval
{
$meta
= Load(
$yaml_str
);};
if
($@)
{
warn
__PACKAGE__,
" Load of data failed: $@"
;
return
{};
}
if
(!
$meta
)
{
warn
__PACKAGE__,
" no legal YAML"
;
return
{};
}
return
$meta
;
}
sub
_write_meta {
my
$self
=
shift
;
my
%args
=
@_
;
my
$filename
=
$args
{filename};
my
$meta
=
$args
{meta};
foreach
my
$fn
(
keys
%{
$self
->{wanted_fields}})
{
if
(
$self
->{wanted_fields}->{
$fn
} eq
'MULTI'
and
exists
$meta
->{
$fn
}
and
defined
$meta
->{
$fn
}
and
$meta
->{
$fn
} =~ /,/)
{
my
@vals
=
split
(/,/,
$meta
->{
$fn
});
$meta
->{
$fn
} = \
@vals
;
}
}
my
(
$yaml_str
,
$file_rest
) =
$self
->_yaml_and_more(
$filename
);
my
$fh
;
if
(!
open
(
$fh
,
'>'
,
$filename
))
{
die
__PACKAGE__,
" Unable to open file '"
.
$filename
.
"': $!\n"
;
}
print
$fh
Dump(
$meta
);
print
$fh
"---\n"
;
print
$fh
$file_rest
;
close
$fh
;
}
1;