#?SuikaWikiConfig/2.0

Plugin:
  @Name: WikiDB
  @Description:
    @@@: WikiDatabase support
    @@lang:en
  @License: %%GPL%%
  @Author:
    @@Name:
      @@@@: Wakaba
      @@@lang:ja
      @@@script:Latn
    @@Mail[list]: w@suika.fam.cx
  @Date.RCS: $Date: 2004/02/08 08:52:03 $
  @RequiredModule[list]:
  @RequiredPlugin[list]:
    Error
    WikiView
    WikiStruct
    WikiLinking
    WikiResource
    HTML
  @Use:
    my $WIKIRESOURCE;

PluginConst:
  @NS_XHTML1:
    http://www.w3.org/1999/xhtml
  @WIKIRESOURCE:
    {($WIKIRESOURCE ||= SuikaWiki::Plugin->module_package ('WikiResource'))}

ViewDefinition:
  @Mode: -wdb--fatal-error
  @Description:
    @@@: Reporting fatal error with WikiDB system
    @@lang: en
  @method:
    @@Name: main
    @@@:
      require SuikaWiki::Output::HTTP;
      $opt2->{output} = SuikaWiki::Output::HTTP->new
        (wiki => $self->{view}->{wiki},
         view => $self->{view}, viewobj => $self);
      for (@{$self->{view}->{wiki}->{var}->{client}->{used_for_negotiate}},
           'Accept-Language') {
        $opt2->{output}->add_negotiate_header_field ($_);
      }
      
      $opt2->{template} = q#%html-document (
        title => {%res(name=>{WikiDB:FatalError:WebPageTitle});}p,
        link-meta => {%template (name => links);
                      %html-meta(name => ROBOTS, content => NOINDEX);}p,
          content => {
            %block (id => tools1, class => tools,
                    content => {%template (name => navbar);}p);
            %section (title => {%res (name => {WikiDB:FatalError:Title});}p,
              heading,
              content => {
                %paragraph (content => {%res (name =>
                                           {WikiDB:FatalError:Description});}p);
                %error-list (
                  no-error => {%res (name => {Error:NoErrorReported});}p,
                );
              }p,
            );
            %block (id => footer, content => {%template (name => ws--footer);}p);
          }p,
        );#;
        $opt2->{o} = bless {
                        wiki => $self->{view}->{wiki},
                        plugin => $self->{view}->{wiki}->{plugin},
                        var => {},
                      }, 'SuikaWiki::Plugin';  
        for (@{$self->{view}->{wiki}->{var}->{error}||[]}) {
          $opt2->{output}->{status_code} = $_->{http_status}
            if $opt2->{output}->{status_code} < $_->{http_status};
        }
        $opt2->{output}->{status_code} ||= 500;
        
        $opt2->{output}->{entity}->{media_type} = q#text/html#;
        $opt2->{output}->{entity}->{charset}
                 = $self->{view}->{wiki}->{config}->{charset}->{output};
        $opt2->{output}->set_expires
          (%{$self->{view}->{wiki}->{config}->{entity}->{expires}->{q#error#}});
        
        $self->{view}->{wiki}->close_db;
        $self->main_pre ($opt, $opt2);
         
        my $fmt = SuikaWiki::Plugin->formatter ('view');
        $opt2->{output}->{entity}->{body} 
          = $fmt->replace ($opt2->{template}, param => $opt2->{o});
        $opt2->{output}->output (output => 'http-cgi');
        $self->main_post ($opt, $opt2);

Function:
  @Name: reporting_error
  @Description:
    @@@:
      Reporting database error (or warning) message
    @@lang:en
  @Main:
    my (undef, $err, $wiki) = @_;
    my $error = {http_status => $err->{-def}->{http_status}};
    my $dl = $error->{description}
           = new Message::Markup::XML::Node
               (type => '#element',
                namespace_uri => $NS_XHTML1,
                local_name => 'dl');
## TODO: Use resource
    $dl->append_new_node (type => '#element',
                          namespace_uri => $NS_XHTML1,
                          local_name => 'dt')
       ->append_text ($WIKIRESOURCE->get (name => 'Error:Detail',
                                          wiki => $wiki));
    $dl->append_new_node (type => '#element',
                          namespace_uri => $NS_XHTML1,
                          local_name => 'dd')
       ->append_text ($err->text);
    $dl->append_new_node (type => '#element',
                          namespace_uri => $NS_XHTML1,
                          local_name => 'dt')
       ->append_text ($WIKIRESOURCE->get (name => 'Error:Call Stack Trace',
                                          wiki => $wiki));
    SuikaWiki::Plugin->module_package ('Error')->make_caller_trace_table
      ($dl->append_new_node (type => '#element',
                             namespace_uri => $NS_XHTML1,
                             local_name => 'dd'),
       {skip => 2});
    push @{$wiki->{var}->{error}||=[]}, $error;

Resource:
  @WikiDB:FatalError:Description:
    @@@:
      Some fatal error occurs during processing your request. 
      Please contact the administrator of the wiki 
      with error messages below.
    @@lang:en
  @WikiDB:FatalError:Title:
    @@@: Internal WikiDatabase Error
    @@lang:en
  @WikiDB:FatalError:WebPageTitle:
    @@@: WikiDatabase Error (%page-name;)
    @@lang:en