package HTML::WebMake::CGI::Edit;
use strict;
use HTML::WebMake::CGI::CGIBase;
use HTML::WebMake::CGI::Site;
use vars qw{
@ISA
};
@ISA = qw(HTML::WebMake::CGI::CGIBase);
###########################################################################
sub new {
my $class = shift;
$class = ref($class) || $class;
my $self = $class->SUPER::new (@_);
$self->{read_metas} = { };
bless ($self, $class);
$self;
}
###########################################################################
sub base_edit_form {
my $self = shift;
my $q = shift;
my $form;
if ($q->param ('upload')) {
$form = $q->start_multipart_form();
} else {
$form = $q->startform();
}
$form .= q{
};
# read the text from the file, or from the CGI parameters for fileless
# edits.
my $text = $self->get_item_text ($q);
if (!$q->param ('nometas')) {
$form .= $self->edit_metadata_ui($q);
}
$form .= "| | |
\n\n";
if ($q->param ('upload')) {
$form .= $q->hidden(-name=>'upload',-value=>'1');
$form .= $q->Tr (" Upload file: | "
. $q->td ( $q->filefield (-name => 'upload_file',
-default => '',
-size => 50,
-maxlength => 256)));
$form .= q{
|
[Edit file in-page]
|
};
} else {
my @txtfrom;
if ($self->is_media($self->{filename})) {
$form .= $q->hidden(-name=>'upload',-value=>'0');
@txtfrom = $q->radio_group (-name => 'text_from',
-values => [
'Load from URL',
],
-default => 'Load from URL');
} else {
$form .= $q->hidden(-name=>'upload',-value=>'0');
@txtfrom = $q->radio_group (-name => 'text_from',
-values => [
'Load from URL',
'Textbox'
], -default => 'Textbox');
}
if (!$self->is_media($self->{filename})) {
$form .= $q->Tr ($q->td ({'-valign'=>'top'}, $txtfrom[1] . ":")
. $q->td ( $q->textarea (-name => 'upload_text',
-id => 'upload_text',
-default => $text,
-rows => 20,
-columns => 120,
-class => 'wm_textarea',
-onkeyup => 'ReloadTextDiv();'
)
. "[Live "
. "HTML preview window] (requires Javascript)
"
));
}
$form .= "| | |
\n\n";
$form .= $q->Tr ($q->td ({'-valign'=>'top'}, $txtfrom[0] . ":")
. $q->td ( $q->textfield (-name => 'upload_url',
-class => 'wm_textfield',
-size => 65, -default => '')
. q{
(Note: "load from URL" has not been implemented yet.
Do not use it. TODO)
}
));
$form .= "| | |
\n\n";
$form .= q{
Upload from disk: |
[Display raw file]
[Upload new file]
|
};
}
$form .= "| | |
\n\n";
# $form .= $q->Tr ($q->td ("Link text:")
# . $q->td ( $q->textfield (-name => 'link_text',
# -class => 'wm_textfield',
# -size => 65,
# -default => '')));
$form .= " | ";
$form .= $q->hidden(-name=>'step',-value=>'editing')
# . $q->submit(-name=>'Preview',-value=>'Preview')
# . " "
. $q->submit(-name=>'Save',-value=>'Save')
. " "
. $self->cgi_hidden_items ($q);
$form .= $self->std_cgi_hidden_items($q);
$form .= $q->endform();
$form .= " |
";
$form;
}
# ---------------------------------------------------------------------------
sub edit_metadata_ui {
my ($self, $q) = @_;
my $form = "| "
. "Title:"
. " | "
. $q->textfield (-name => 'm_title',
-class => 'wm_textfield',
-size => 65,
-default => $self->{read_metas}->{title})
. " |
";
if ($q->param ('allmetadata')) {
$form .=
"| | |
"
. " | Other Metadata: |
"
. $q->Tr ($q->td ($q->p ("Section:"))
. $q->td ( $q->textfield (-name => 'm_section',
-class => 'wm_textfield',
-default => $self->{read_metas}->{section})))
. $q->Tr ( $q->td ("Score:")
. $q->td ( $q->textfield (-name => 'm_score',
-class => 'wm_textfield',
-default => $self->{read_metas}->{score})))
. $q->Tr ( $q->td ({'-valign' => 'top'}, "Abstract:")
. $q->td ( $q->textarea (-name => 'm_abstract',
-default => $self->{read_metas}->{abstract},
-class => 'wm_textarea',
-rows => 5,
-columns => 80)))
. $q->Tr ( $q->td ("Up:")
. $q->td ( $q->textfield (-name => 'm_up',
-class => 'wm_textfield',
-default => $self->{read_metas}->{up})))
. $q->Tr ( $q->td ("Author:")
. $q->td ( $q->textfield (-name => 'm_author',
-class => 'wm_textfield',
-size => 65,
-default => $self->{read_metas}->{author})));
$form .= q{
|
|
[Less Metadata...]
|
};
} else {
$form .= q{
|
|
[More Metadata...]
|
};
}
if ($self->is_media($self->{filename})) {
$form .= q{
|
|
(Note: since this is a non-text item, this metadata cannot be stored in
the content file itself. Instead, it will be stored in a metatable called
metadata.xml in the top-level directory. You may need to modify
the WebMake file for this site to read this file.)
|
};
}
return $form;
}
# ---------------------------------------------------------------------------
sub write_dump_page
{
my $self = shift;
my $q = $self->{q};
# print a header
my $ctype = 'application/octet-stream'; # default
if ($self->is_media($self->{filename})) {
if ($self->{filename} =~ /\.gif$/i) { $ctype = 'image/gif'; }
if ($self->{filename} =~ /\.png$/i) { $ctype = 'image/png'; }
if ($self->{filename} =~ /\.jpe?g?$/i) { $ctype = 'image/jpeg'; }
else { $ctype = 'application/octet-stream'; }
} else {
$ctype = 'text/plain';
}
print "Content-Type: $ctype\r\n\r\n";
print $self->get_item_text ($q);
return '';
}
# ---------------------------------------------------------------------------
sub write_preview_page
{
my $self = shift;
my $q = $self->{q};
"TODO";
}
###########################################################################
sub create_wmmetas {
my ($self) = @_;
my $q = $self->{q};
$self->{wmmetas} = '';
if ($q->param ('nometas')) { return 1; }
foreach my $name ($q->param()) {
next unless ($name =~ /^m_(\S+)/);
my $metaname = $1; $metaname =~ s/\"/_/gs;
my $val = $q->param ($name);
next if ($val =~ /^\s*$/);
$val =~ s/<(\/\s*wmmeta\s*>)/\<$1/gs; # escape end-of-metadata tags
$self->{wmmetas} .= "$val\n";
}
1;
}
# ---------------------------------------------------------------------------
sub strip_wmmetas {
my ($self, $t) = @_;
return $t if (!defined $t);
return $t if ($self->{q}->param ('nometas'));
$t =~ s/\s*(.*?)<\/\s*wmmeta\s*>\s*/
$self->_strip_wmmeta_item ($1, $2); /gies;
$t =~ s/\s*]+)\s*>(.*?)<\/\s*wmmeta\s*>\s*/
$self->_strip_wmmeta_item ($1, $2); /gies;
$t =~ s/\s*]+?)\"?\s+value=\"?([^\">]+?)\"?\s*\/>\s*/
$self->_strip_wmmeta_item ($1, $2); /gies;
$t;
}
sub _strip_wmmeta_item {
my ($self, $name, $val) = @_;
$name =~ tr!A-Z!a-z!;
$self->{read_metas}->{$name} = $val;
return '';
}
###########################################################################
1;