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.41kB, from 09.05.2021, 10:24:06)

divider

English Version
 

Externe Seiten:

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