UHTML–Beispiel

uHTML

Ausliefern gleicher Daten

Die Kopfdaten eines Webauftritts sind üblicherweise bei den meisten Dokumentdateien weitgehend gleich. Es ist sinnvoll, die gleichbleibenden Abschnitte in eine separate Datei auszulagern und zentral zu verwalten. Leider bietet HTML keinen Mechanismus an, der Dateien automatisch in die Dokumente einfügt. Mit UHTML kann man ein <include>-Element definieren, das genau dies tut, sprich, die in der Datei head-data ausgelagerten Daten automatisch einfügt.

Angenommen die Datei head-data wird im Unterverzeichnis include des Dokumentverzeichnisses abgelegt. In diesem Fall könnte die Benutzung von <include> so aussehen:

index.uhtml

  <html>
    <head>
      <include file="/include/head-data">
      ...
    </head>
  ...
  </html>

Ein solches <include>-Element kann in vielen Projekten Verwendung finden. Ensprechend der oben beschriebenen Konvention wird der Programmcode in der Datei uHTML/include.pm im Skriptverzeichnis abgelegt. Der Inhalt von include.pm könnte dann so aussehen:

include.pm

  use uHTML ;

  sub Include($) {
  my $Node = shift;
  $Node->map(join('',<FH>),'')
    if $Node->Attr('file') and
      open FH,$ENV{'DOCUMENT_ROOT'}.$Node->Attr('file');
  }

  uHTML->registerTag('include',\&Include);

Verwendung in Verbindung mit FCGI, Plack und nginx

Nginx liefert nur statische Inhalte aus und reicht dynamische Inhalte an einen anderen Server weiter. Für UHTML hat sich FCGI mit Plack bewährt. UHTML muß dafür Systemweit installiert sein.

Um diese kleine Bibliotheksfunktion mit einem Webauftritt zu verbinden, braucht man ein kurzes psgi Skript, das in der Datei uHTML.psgi im Skriptverzeichnis abgelegt wird:

uHTML.psgi

 use uHTML;
 use Encode;

 sub
 {
   my $env  = shift ;
   my( $FILE,$DATA,$HTML,@HEAD,$LEN ) ;

   if( open $FILE,$env->{'PATH_TRANSLATED'} and
       $LEN = -s $FILE and
       read( $FILE,$DATA,$LEN ) == $LEN )
   {
     $HTML = uHTML::recoded_list( $DATA,$env ) ;
     $LEN  = 0 ;
     $LEN += length Encode::encode( 'UTF-8',$_ )
        foreach @{$HTML} ;

     push @HEAD,'Content-Type','text/html; charset=UTF-8' ;
     push @HEAD,'Content-Length',$LEN ;
     push @HEAD,'x-powered-by','uHTML' ;
     return [ 200,\@HEAD, $HTML ] ;
   }

   return [ 404,
            [ 'Content-Type' => 'text/plain' ],
            [ 'File Not Found' ]
          ] ;
 }

Jetzt kann der FCGI Server mit plack gestartet werden:


plackup -s FCGI -S /tmp/uHTML -a /srv/cgi-bin/uHTML.psgi

In der nginx Konfiguration muß ein Abschnitt, der UHTML Aufrufe and den plack Server umleitet, hinzugefüt werden:

nginx configuration
location ~ \.uhtml$
{
  try_files $uri /index.uhtml =404 ;

  fastcgi_keep_conn on ;
  fastcgi_split_path_info ^()(.*uhtml)$;

  fastcgi_pass   unix:/tmp/uHTML ;
  fastcgi_index  index.uhtml;

  fastcgi_param  URI                  $uri;
  fastcgi_param  SCRIPT_FILENAME
      $document_root$fastcgi_script_name;
  fastcgi_param  SCRIPT_NAME          $fastcgi_script_name;
  fastcgi_param  PATH_TRANSLATED
      $document_root$fastcgi_path_info;
  fastcgi_param  QUERY_STRING         $query_string;
  fastcgi_param  REQUEST_METHOD       $request_method;
  fastcgi_param  CONTENT_TYPE         $content_type;
  fastcgi_param  CONTENT_LENGTH       $content_length;
  fastcgi_param  REQUEST_URI          $request_uri;
  fastcgi_param  REQUEST              $request;
  fastcgi_param  REQUEST_SCHEME       $scheme ;
  fastcgi_param  REQUEST_FILE         $request_filename;
  fastcgi_param  DOCUMENT_URI         $document_uri;
  fastcgi_param  DOCUMENT_ROOT        $document_root;
  fastcgi_param  SERVER_PROTOCOL      $server_protocol;
  fastcgi_param  GATEWAY_INTERFACE    CGI/1.1;
  fastcgi_param  SERVER_SOFTWARE      nginx/$nginx_version;
  fastcgi_param  REMOTE_ADDR          $remote_addr;
  fastcgi_param  REMOTE_PORT          $remote_port;
  fastcgi_param  SERVER_ADDR          $server_addr;
  fastcgi_param  SERVER_PORT          $server_port;
  fastcgi_param  SERVER_NAME          $server_name;
  fastcgi_param  HOST_NAME            $hostname;
  fastcgi_param  HTTPS                $https;
  fastcgi_param  HTTP_COOKIE          $http_cookie;
  fastcgi_param  HTTP_ACCEPT_LANGUAGE $http_accept_language;
  fastcgi_param  REDIRECT_STATUS      200;
  fastcgi_param  SCRIPT_ROOT          /srv/cgi-bin ;
  fastcgi_param  DATA_ROOT            /srv/cgi-bin ;
}

location /
{
}

Verwendung in Verbindung mit CGI and Apache

Um diese kleine Bibliotheksfunktion mit einem Webauftritt zu verbinden, braucht man ein kurzes cgi-Programm, das in der Datei uhtml.pl im Skriptverzeichnis abgelegt wird:

uhtml.pl

  #!/usr/bin/perl

  use uHTML;

  open $FILE,"$ENV{'DOCUMENT_ROOT'}$ENV{'PATH_INFO'}"
   or die "File: $ENV{'PATH_INFO'} not found";
  print "Content-type: text/html\n\n";
  print uHTML::recode(join('',<$FILE>));

Durch ein paar Zeilen, die man der Datei .htaccess im Dokumentverzeichnis hinzufügt, wird UHTML quasi “magisch” in einen Webauftritt integriert und in allen *.uhtml Dateien lauffähig gemacht.

.htaccess
  DirectoryIndex index.uhtml
  RewriteEngine on
  RewriteRule ^(/?)(.*\.uhtml) $1cgi-bin/uhtml.pl/$2 [L,QSA]

Dieses voll funktionsfähige Beispiel zeigt das Prinzip der Integration von einem benutzedefiniertem UHTML–Element in einen Webauftritt. Zwar kommen darin weder variable Parameter vor noch erfordert die Serveranfrage eine Initialisierung oder Datenübernahme, die Erweiterung um diese Elemente ist jedoch trivial.

  • Dieses Beispiel mit allen Dateien und Verzeichnissen so wie vom apache benötigt:

    Vollständiges uHTML Beispiel uHTML Beispiel (10.47kB, from 06.07.2021, 12:34:05)

divider

English Version
 

Externe Seiten:

uHTML-Logo 2008 All Rights Reserved Amina Mendez & Roland Okello Valid HTML 4.01 Transitional CSS is valide!