source: projects/paper-tape-project/trunk/web-frontend/generator.php @ 75

Last change on this file since 75 was 75, checked in by sven, 6 years ago

Diverse Bugfixing in Web-frontend: Implemented Font rendering, etc.

File size: 24.6 KB
Line 
1<?php
2/**
3 * The Paper Tape Project -- Visualisation Web frontend
4 *
5 * This PHP setup is capable of serving PNG and SVG files to clients
6 * by using the cli.c interface to the LOCHSTREIFEN cairo drawing
7 * routines. See index.html for all possible GET parameters.
8 *
9 * Currently this is a german-only subproject.
10 *
11 * Copyright (C) 2008  Sven Köppel
12 *
13 * This program is free software; you can redistribute
14 * it and/or modify it under the terms of the GNU General
15 * Public License as published by the Free Software
16 * Foundation; either version 3 of the License, or (at
17 * your option) any later version.
18 *
19 * This program is distributed in the hope that it will
20 * be useful, but WITHOUT ANY WARRANTY; without even the
21 * implied warranty of MERCHANTABILITY or FITNESS FOR A
22 * PARTICULAR PURPOSE. See the GNU General Public License
23 * for more details.
24 *
25 * You should have received a copy of the GNU General
26 * Public License along with this program; if not, see
27 * <http://www.gnu.org/licenses/>.
28 *
29 **/
30
31// Konstanten:
32$draw_program = "../visualisator/cli";
33
34$font_generator_program = "../schriften/neue-schrift.pl";
35
36// Ausgabeordner (ohne trailing slash)
37$output_dir = "temp";
38
39// mit Verbose-Switch wird der Programmaufruf verbose.
40$verbose = isset($_GET['verbose']) || isset($_POST['verbose']);
41$ajax = isset($_GET['ajax']); // ajax-antwort oder normale Webseite anzeigen?
42
43if(!$ajax)
44    echo makeHeader('Lochstreifenvisualisierung online');
45
46function makeHeader($title) {
47    // als Funktion wg. Report-Datei, die später noch generiert wird.
48    return <<<HERE
49<html>
50<head>
51   <title>$title - technikum29 Private Zone</title>
52   <link rel="stylesheet" href="http://dev.technikum29.de/src/private.design/style.css" type="text/css">
53   <link rel="stylesheet" href="design/formular.css" type="text/css">
54   <!--<script type="text/javascript" src="design/formular.js"></script>--><!-- hier nicht mehr -->
55   <meta name="date.initial" value="02.04.2008">
56   <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
57</head>
58<body>
59<h1><a href="../"><span>technikum29.de interne Projekte:</span></a><strong>Lochstreifenprojekt: Visualisierung</strong></h1>
60HERE;
61}
62
63/*
64 * Übersicht über POST-Parameter, die entgegen genommen werden:
65 
66   *'data-src' = file|input|font
67     -> file => 'data-file' (dateiupload)
68     -> form => 'data-form' = hex[0]|oct|bin|dec
69                'data-input' = auf Länge checken und format
70     -> font => 'data-text' = auf gute Zeichen checken ([a-zA-Z0-9 ])
71
72   *'format' = PNG|SVG
73   *'dimension-src' = width|height|diameter
74     -> width => dimension-width
75     -> height => dimension-height        jeweils auf int checken
76     -> diameter => dimension-diameter
77
78   *'alignment' => hor-[rtl|ltr]-[l|r] | ver-[btt|ttb]-[u|o]
79
80   komponenten = imagebg|tapebg|punched|notpunched|feedholes
81
82   *'show-'+[komponenten]  (nur toggle an/aus)
83   *'color-'+[komponenten] => #RRGGBB
84   *'lucency-'+[komponenten] => AA
85
86   *'empty-start', 'empty-end' => int
87*/
88
89if(empty($_POST)) {
90    // so einfach ist das.
91    print '<h2>Parameter fehlen</h2>';
92    exit; // ;)
93}
94
95function get($var) {
96    // kleine Helperfunktion
97    return isset($_POST[$var]) ? $_POST[$var] : false;
98}
99
100function my_ctype_digit($string) {
101    // meine Implementierung dieser netten Funkion
102    return preg_match('/^[0-9]+$/', $string);
103}
104
105// Sofort tötende Fehler. Anzuwenden bei brutalen Fehlern, die nicht
106// auf Fehleingabe im Formular berufen (Angriffsgefahr)
107function print_fatal($text) {
108    print "<h2>Falsche Benutzung!</h2>\n";
109    print '<p class="big-error">'.$text."</p>\n";
110    print "<p>Dieser Fehler wäre nicht aufgetreten, hätten sie das Formular benutzt.</p>";
111    exit;
112}
113
114// das große Fehlerarray.
115$errors = array();
116// das nicht-tödliche Warnungsarray
117$warnings = array();
118
119// mit allen Fehlern beenden
120function exit_errors() {
121    global $ajax,$errors,$warnings;
122
123    print "<h2>Fehler in den angegeben Daten</h2>";
124    foreach($warnings as $error) {
125        print '<p class="big-warning">'.$error."</p>\n";
126    }
127    foreach($errors as $error) {
128        print '<p class="big-error">'.$error."</p>\n";
129    }
130    if($ajax) {
131        print "<p>Gehen sie zurück zum Formular und korrigieren sie ihre Fehleingaben.
132               Klicken sie dann nochmals auf <i>Generieren</i>.</p>";
133        print '<p><a href="javascript:history.go();">Zurück zum Formular</a></p>';
134    }
135    exit;
136}
137
138// Schritt 0: Ausgabeverzeichnis pruefen
139if(!file_exists($output_dir)) {
140        if(is_writeable($output_dir)) {
141                mkdir($output_dir);
142        } else
143                $errors[] = "Ausgabeverzeichnis <i>$output_dir</i> nicht anlegbar!";
144}
145
146// Schritt 1: Eingaben entgegennehmen und validieren
147
148// 1/6: Punch-Daten
149$input_source = get('data-src');
150switch($input_source) {
151    case 'file': // Dateiupload. Tja. Datei direkt dem Programm übergeben. Vorher
152                 // Größe checken. Also mal los:
153                 if($ajax) {
154                     // wenn Ajax benutzt wird, wird die Datei noch nicht hochgeladen.
155                     break; // also erst anschließend machbar.
156                 }
157                 if(!isset($_FILES['data-file'])) {
158                     $errors[] = "Keine Datei hochgeladen, obwohl Dateiupload als Datenquelle ausgewählt war!";
159                 } elseif($_FILES['data-file']['size'] > 500*1024) {
160                     $errors[] = "Die hochgeladene Datei ist größer als ein 500kb. Derart große
161                                  Lochstreifen sind aus Perfomancegründen nicht erlaubt. Laden sie
162                                  sich das Visualisierungsprogramm runter und erstellen sie lokal
163                                  ihre Mammutlochstreifen.";
164                 } elseif($_FILES['data-file']['size'] == 0) {
165                     $warnings[] = "Die hochgeladene Datei ist leer (0 Bytes Inhalt). Das gibt keinen sonderlich
166                                    spannenden Lochstreifen...";
167                 }
168                 $original_filename = $_FILES['data-file']['name']; // fuer den Report weiter unten
169                 $input_filename = $_FILES['data-file']['tmp_name'];
170                 // usw.
171                 break;
172    case 'input': // Daten direkt eingetippt. Na dann...
173                 $text = get('data-input');
174                 $form = get('data-form');
175                 $input_binary = '';
176                 $parts = preg_split("/\s+|\n+/", $text);
177                 foreach($parts as $x => $byte) {
178                     if(!strlen($byte)) continue; // nur whitespace, Abfall durch das preg_split.
179
180                     // Alle Formen zu dezimal umwandeln.
181                     if($form == 'bin')
182                         $byte = bindec($byte);
183                     elseif($form == 'hex')
184                         $byte = hexdec($byte);
185                     elseif($form == 'oct')
186                         $byte = octdec($byte);
187                     elseif($form == 'hex0')
188                         $byte = hexdec(substr($byte,2)); // 0x wegschneiden.
189                     elseif($form != 'dec') {
190                         $errors[] = "Fehler: Ungültige Datenform <i>$form</i>!";
191                         break;
192                     }
193
194                     if(!is_numeric($byte)) {
195                         $errors[] = "Fehler: Byte $x mit dem Wert <i>$byte</i> ist keine entsprechende
196                                      Zahl des Types <i>$form</i>. Vielleicht haben sie nicht das
197                                      passende Format eingestellt, in dem sie ihre Daten eingegeben haben?";
198                         break;
199                      }
200
201                      $input_binary .= chr($byte); // <- the PHP way | the Perl way -> pack('C', $byte);
202                 } // foreach
203                 if(strlen($input_binary) > 1024*1024) {
204                     $errors[] = 'Sie haben über eine Millionen Bytes eingetippt! Derart große
205                                  Lochstreifen sind aus Perfomancegründen nicht erlaubt. Laden sie
206                                  sich das Visualisieurngsprogramm runter und erstellen sie ihren
207                                  Monsterstreifen lokal.';
208                     break; 
209                 } elseif(strlen($input_binary) == 0) {
210                     $errors[] = 'Sie haben keine Daten eingegeben, obwohl direkte Byteeingabe als
211                                  Datenquelle ausgewählt wurde!';
212                     break;
213                 }
214                 // so, jetzt liegts als $input_binary vor.
215                 break;
216    case 'font': // Text, der gepuncht werden soll
217                 $text = get('data-text');
218                 if(!preg_match('/^[a-zA-Z0-9 ]+$/', $text)) {
219                     $warnings[] = 'Im Text befinden sich nichtdruckbare Zeichen. Nur Buchstaben und Zahlen
220                                    können dargestellt werden, keine anderen Zeichen.';
221                 }
222                 if(strlen($text) == 0) {
223                     $errors[] = 'Sie haben keinen Text eingegeben, obwohl Textgenerierung als Datenquelle
224                                  ausgewählt wurde!';
225                 }
226                 if(strlen($text) > 1000) {
227                     $errors[] = 'Der Text ist mit über 1000 Zeichen eindeutig zu lang.
228                                  Aus Perfomancegründen ist das nicht erlaubt. Laden sie sich die
229                                  entsprechenden Programme runter und erstellen sie ihren Streifen lokal.';
230                 }
231                 // irgendwas mit dem Text machen.
232                 // und als $input_binary fertig machen.
233
234                 $file_generator = proc_open($font_generator_program, array(
235                        // descriptor array (0=stdin, 1=stdout, 2=stderr, like sh)
236                        0 => array('pipe', 'r'), // Programm wird von STDIN lesen
237                        1 => array('pipe', 'w'), // und zu STDOUT schreiben
238                        2 => array('pipe', 'w'), // und zu STDERR auch schreiben
239                 ), $font_pipes, NULL , NULL );
240
241                 if(is_resource($file_generator)) {
242                    fwrite($font_pipes[0], $text);
243                    fclose($font_pipes[0]); // nichts mehr zu schreiben
244                    $input_binary = stream_get_contents($font_pipes[1]); 
245                    //$stderr =  stream_get_contents($pipes[2]);
246                    proc_close($file_generator);
247                 } else
248                    $input_binary = "funktionierte nicht :("; // hier was sinnhafteres
249                 break;
250    default:     $errors[] = "Ungültige Datenquelle! Es konnten keine Daten entgegengenommen werden!";
251}
252
253// 2/6: Formatfragen.
254$format = strtolower(get('format'));
255if($format != 'png' && $format != 'svg') {
256    $errors[] = "Ungültiges Ausgabeformat <i>$format</i>! Erlaubt sind nur PNG und SVG!";
257}
258
259// 3/6: Dimensionen
260$dsrc = get('dimension-src');
261if($dsrc == 'width' || $dsrc == 'height' || $dsrc == 'diameter') {
262    $size = get("dimension-$dsrc");
263    if(!my_ctype_digit($size)) {
264        $errors[] = "Die Größenangabe zu den Dimensionen, die der Lochstreifen annehmen soll,
265                     ist fehlerhaft: $size ist keine positive ganze Dezimazahl!";
266    } elseif($dsrc == 'diameter' && $size > 100) {
267        $errors[] = "Der Durchmesser eines Loches ist mit 100 pxieln zu groß, ein so großes Bild
268                     darf aus Perfomancegründen nicht generiert werden. Bitte kleineren Wert
269                     einstellen.";
270    } elseif($size > 1000*100) {
271        $errors[] = "Die Größenangabe von über 100.000 Pixel ist viel zu groß. Bitte kleineren Wert
272                     einstellen.";
273    }
274    // alles klar. $size und $dsrc
275} else
276    $errors[] = "Es wurde keine Größenangabe zum Lochstreifen gemacht!";
277
278
279// 4/6: Ausrichtung des Lochstreifens
280$alignment = get('alignment');
281if(preg_match('/^(hor)-(rtl|ltr)-([ou])$|^(ver)-(btt|ttb)-([lr])$/', $alignment, $m)) {
282    // so, jetzt mal zusammenpuzzeln...
283    // $m[0] == hor | ver
284    // $m[1] == rtl | ltr | btt | ttb
285    // $m[2] == u | o | l | r
286    // Problem: In CLI ist es auch nicht vollstaendig implementiert... -.-
287} else
288    $errors[] = "Ungültige Ausrichtung des Lochstreifens: $alignment war nicht in der Auswahl!";
289
290
291// 5/6: Den ganzen komponentenweiten Kram
292$comp = array('imagebg', 'tapebg', 'punched', 'notpunched', 'feedholes');
293$comp_visibility = array(); $comp_color = array();
294$comp_translation = array('Bildhintergrund', 'Lochstreifen', 'Löcher', 'Nicht-Löcher', 'Führungslöcher');
295
296foreach($comp as $x => $component) {
297    $comp_visibility[$x] = get("show-$component") ? 1 : 0;
298    $color = substr(get("color-$component"), 1); // das "#" wegstrippen
299    $lucency = get("lucency-$component");
300    if(!preg_match('/^[0-9a-fA-F]{6}$/', $color)) {
301        $errors[] = "Die Farbangabe <i>$color</i> für den Komponenten <i>$component</i> ist keine korrekte Hexadezimalfarbangabe.";
302        continue;
303    } elseif(!preg_match('/^[0-9a-fA-F]{2}$/', $lucency)) {
304        $errors[] = "Die Transparenzangabe <i>$lucency</i> für den Komponenten <i>$component</i> ist nicht korrekt.";
305        continue;
306    }
307    $comp_color[$x] = "#${color}${lucency}";
308}
309
310// 6/6: Empty-start, Empty-End
311$empty_start = get('empty-start');
312$empty_end = get('empty-end');
313if(!my_ctype_digit($empty_start))
314    $errors[] = "Die Anzahl leerer Startbytes ist keine positive ganze Zahl ($empty_start)";
315if(!my_ctype_digit($empty_end))
316    $errors[] = "Die Anzahl leerer Endbytes ist keine positive ganze Zahl ($empty_end)";
317
318// fertig.
319
320// Fehler ausgeben und beenden.
321if(!empty($errors)) {
322    exit_errors();
323}
324
325// keine Fehler aufgetreten und in Ajax-Mode: "ok" zurückgeben
326if($ajax) {
327    echo "ok";
328    exit;
329}
330
331// Wenn wir hier sind, gehts schon mal weiter.
332
333echo '<h2>Lochstreifengenerator</h2>';
334
335if(!empty($warnings)) {
336    // es gibt Warnungen...
337    echo '<p>Es sind Probleme aufgetaucht, die allerdings nicht wirklich schlimm sind, der
338          Lochstreifen wurde trotzdem generiert:</p>';
339    foreach($warnings as $error) {
340        print '<p class="big-warning">'.$error."</p>\n";
341    }
342}
343
344// so, Parameter zusammenfummeln.
345
346$exec_params = '';
347
348// 2/6: Format:
349$exec_params .= "-f$format ";
350
351// 6/6 Empty Bytes:
352if($empty_start) $exec_params .= "--empty-start=$empty_start ";
353if($empty_end)   $exec_params .= "--empty-end=$empty_end ";
354
355// 5/6 Komponenten
356foreach($comp as $x => $component) {
357    if($comp_visibility[$x]) {
358        $exec_params .= "--color-$component=".$comp_color[$x].' ';
359    } else {
360        $exec_params .= "--hide-$component ";
361    }
362}
363
364// 3/6  Dimensionen
365$exec_params .= "--$dsrc=$size";
366
367// 4/6 Transformations and Rotations
368$exec_params .= $transformation_string.' ';
369
370// Output Filename erstellen
371$source_range = array_merge(range('a','z'), range('0', '9'));
372$output_hash = '';
373foreach(array_rand($source_range, 10) as $x) { $output_hash .= $source_range[$x]; }
374/* //alternativ sowas wie:
375$tmpx = mt_rand(0,32); // tempoaer fuer nen kurzen hash
376if($tmpx-32 < 10) $tmpx *= -1;
377$output_hash = substr(md5(rand() * time()), $tmpx, $tmpx+10);*/
378
379$image_filename = $output_dir.'/'.$output_hash.'.'.$format;
380$exec_params .= "--output=$image_filename";
381
382// 1/6 Input Data
383if($input_source == 'file') {
384    $exec_params .= "  '".$input_filename."'";
385} else {
386    // Binäre Daten liegen als $input_binary vor und wollen
387    // per STDIN eingefüttert werden.
388}
389
390print "<p>Der Lochstreifen wird nun generiert...\n";
391flush(); // damit er das wenigstens sieht...
392
393if($verbose) {
394    print "<h2>Verbose-Ausgaben</h2>";
395    print "<p>Alles zusammengepanscht ergibt:</p>";
396    print "<tt>$draw_program $exec_params</tt>";
397    print "<p>Rufe auf...\n";
398}
399
400// in PHP brauchts nen mörderischen Aufwand, um jetzt dieses
401// Programm anzuschmeißen:
402
403$proc_ressource = proc_open("/usr/bin/time $draw_program ".($verbose?'--verbose ':' ').$exec_params, array(
404    // descriptor array (0=stdin, 1=stdout, 2=stderr, like sh)
405    0 => array('pipe', 'r'), // Programm wird von STDIN lesen
406    1 => array('pipe', 'w'), // und zu STDOUT schreiben
407    2 => array('pipe', 'w'), // und zu STDERR auch schreiben
408), $pipes, NULL , NULL );
409
410if(is_resource($proc_ressource)) {
411    if($input_source != 'file') {
412        // Daten reinschreiben
413        fwrite($pipes[0], $input_binary);
414        fclose($pipes[0]); // nichts mehr zu schreiben
415    }
416
417    // STDOUT/STDERR lesen
418    $stdout = stream_get_contents($pipes[1]); 
419    $stderr =  stream_get_contents($pipes[2]); // fuer Speicherung der <times>-Ausgaben.
420
421    fclose($pipes[1]);
422    fclose($pipes[2]);
423    $return_value = proc_close($proc_ressource);
424
425    if($return_value) {
426        print "<p class='big-error'>Fehler: Generator wurde nicht ordnungsgemäß ausgeführt, das
427               Programm beendete mit <u>Statuscode $return_value</u>.</p>";
428    }
429
430    if($return_value || $verbose) {
431        if(!$verbose) {
432            print "<p>Folgende Ausgaben wurden zwecks Fehlersuche abgefangen:</p>\n";
433            print "<p>Aufruf: <tt>$draw_program $exec_params</tt>";
434        }
435
436        print "<pre>";
437        print "<b>STDOUT:</b>\n";
438        echo $stdout;
439
440        print "\n<b>STDERR:</b>\n";
441        echo $stderr;
442        print "</pre>";
443        print "\n<b>Return Value $return_value</b>\n";
444
445    }
446
447    // checken ob was gemacht wurde.
448    if(!is_file($image_filename)) {
449        print "<p class='big-error'>Gewünschtes Bild konnte nicht erstellt werden!</p>";
450        exit; // dann brauchts auch kein Report und so. Der braucht nämlich die Datei.
451    }
452} else
453    print '<p class="big-error">Konnte Generatorprozess nicht starten!</p>';
454
455// + Übersichtsseite machen, erst mal in String, und ausgeben.
456$dir_url = dirname($_SERVER['PHP_SELF']);
457$image_url = "$dir_url/$image_filename";
458$report_file = $output_dir.'/'.$output_hash.'.htm';
459$report_url = "$dir_url/$report_file";
460$filesize = DataSizeFormat(filesize($image_filename));
461
462$report = "<p>Der folgende Lochstreifen wurde am <b>".date('m.d.Y')." um ".date('H:i:s')." Uhr</b> von dem
463              Besucher mit der <b>IP-Adresse $_SERVER[REMOTE_ADDR]</b> generiert. Die erstellte Datei vom
464              Typ <b>".strtoupper($format)."</b> ist <b>$filesize</b> groß";
465
466if($format == 'png') {
467    $imagesize = GetImageSize($image_filename);
468    $report .= ", sie hat die Ausmaße von <b>$imagesize[0] x $imagesize[1]</b> Pixel.</p>\n";
469    $report .= "<p>Das Bild wurde gespeichert unter der Adresse <b><a href='$image_url'>$image_url</a></b>
470                und kann z.B. zur Weiterverwendung runtergeladen werden. Es sieht so aus:</p>
471                <p><img src='$image_url' alt='Der generierte Lochstreifen' $imagesize[2]></p>";
472} else {
473    $report .= ".</p><p>Das Bild wurde unter der Adresse <b><a href='$image_url'>$image_url</a></b> gespeichert.
474                Mit einem modernen Browser (Nicht Internet Explorer) können sie sich die SVG-Datei durch
475                Anklicken des Linkes anschauen. Laden sie sich (ansonten) die Datei runter und öffnen sie
476                es mit einem Vektorgrafikprogramm, z.B. mit dem frei erhältlichen <a href='www.inkscape.org'
477                >Inkscape</a>.</p>";
478}
479
480// Discmailer ;-)
481$report .= "<p>Bitte beachten sie: Die Verfügbarkeit des Bildes auf diesem Server gehört nicht in den
482            \"Dienstleistungsumfang\" des Generierungsprogramms. Das heißt, dass sie <u>durch Eingeben ihrer
483            Daten zugestimmt haben, dass diese mit dem Bild nach freiem Ermessen des Administrators gespeichert
484            werden und willkürlich gelöscht werden können</u>. Es besteht kein Anspruch auf selbst zeitlich
485            begrenztes Hosting! Wenn sie das Bild im Internet verfügbar machen wollen, können sie es z.B.
486            auf kostenlosen Bilderhostern hochladen. Suchen sie dazu mit der Suchmaschine ihres Vertrauens
487            nach so etwas wie z.B. \"<a href='http://www.google.de/search?q=free+image+hosting'
488            >image hosting</a>\"</i></p>";
489
490$report .= "<h3>Die Daten</h3>";
491
492// Daten als HEX aufbereiten
493if($input_source == 'file')
494    $input_binary = file_get_contents($input_filename);
495$report_input_source = array(
496    'file' => "als eine Datei mit dem Namen <b>$original_filename</b> hochgeladen",
497    'input' => "<b>$form</b>-kodiert eingetippt",
498    'font' => "als zu generierende Schrift eingetippt, zugrunde lag der Text <b>$text</b>"
499);
500
501$report .= "<p>Die Daten, die dem generierten Lochstreifen zugrundeliegen, wurden vom Benutzer
502            $report_input_source[$input_source]. Im folgenden wird ein Hexdump der <b>".strlen($input_binary)."
503            Bytes</b> angegeben, mit denen letztendlich der Lochstreifen generiert wurde. Mit geeigneten
504            Hilfmitteln (z.B. einem Hexeditor) können sie aus den Daten eine Binärdatei erstellen.";
505
506$report .= "<pre>";
507for($x=0; $x<strlen($input_binary); $x++) {
508    $report .= sprintf("%02x ", ord($input_binary[$x]));
509    if((($x+1) % 20) == 0) {
510        $report .= "\n";
511    }
512}
513$report .= "</pre>";
514
515// weitere Parameter abhandeln.
516
517$report .= "<h3>Weitere Parameter</h3>";
518
519$report .= "<p>Folgende Einstellungen/Farben liegen dem Lochstreifen zugrunde:</p><ul>";
520
521foreach($comp as $x => $c) {
522    $report .= "<li><b>$comp_translation[$x]</b> ($c): ".
523               ($comp_visibility[$x] ? "sichtbar, und zwar mit der Farbe <b>$comp_color[$x]</b> (Format #RRGGBBAA)"
524                                     : "nicht sichtbar (deaktiviert)");
525}
526
527$report .= "</ul>";
528
529$report .= "<p>Außerdem wurden <b>$empty_start leere Startbytes und $empty_end leere Endbytes</b> eingestellt.
530            Die eingestellte Rotation des Lochstreifens wird durch das folgende Bild verdeutlicht:</p>
531            <img src='$dir_url/design/$alignment.png' alt='$alignment'>
532            <p>Die Größe des Lochstreifens wurde von der Dimension <b>$dsrc</b> abhängig gemacht und auf
533            <b>$size</b> eingestellt.</p>";
534
535$report .= "<h3>Generierung</h3>";
536
537$report .= "<p>Mit dem Kommandozeilentool führ(t)en folgende <b>Parameter</b> zu der Generierung eines derart
538            gewünschten Lochstreifens:
539            <br><tt>$exec_params</tt>
540            <br>Durch Eingabe dieser Parameter mit den oben angezeigten Eingabedaten müsste jederzeit
541            das gleiche Bild reproduzierbar sein.</p>";
542
543$report .= "<!-- STDOUT:\n$stdout\n\nSTDERR:\n$stderr\n\n-->"; // debugging...
544
545$report .= "<p>Das Generieren des Lochstreifens nahm die folgende <b>Zeit in Anspruch</b>:<pre>$stderr</pre>
546            <p>Dabei steht <i>real</i> für die wirklich vergangene Zeit, die der Benutzer warten musste,
547            bevor er seinen Lochstreifen bekam, <i>user</i> für die tatsächliche Zeit, die das Programm
548            aktiv war (Abweichungen zu <i>real</i> können dadurch begründet sein, dass der Server noch
549            andere Sachen gleichzeit machte) und <i>system</i> für die Zeit, in der der Server wirklich
550            ernsthaft über den Lochstreifen nachgedacht hat ;-)</p>";
551
552//// REPORT zuende. Jetzt erst mal ausdrucken.
553
554if(!$verbose) echo "fertig</p>\n"; // als Antwort auf die "wird nun generiert..."-Ausgaben weit oben.
555echo "<p>Mit dem generierten Bild wurde eine Urkunde erstellt, in der alle Parameter, Daten und sonstige
556         interessante Dinge festgehalten sind. Es folgt nur dessen Inhalt:</p>";
557
558echo "<div class='big-okay' style='font-weight:normal'>"; // ;)
559echo $report;
560echo "</div>";
561
562echo "<p>Diese \"Urkunde\" wurde mit dem Bild zusammen gespeichert. Sie ist unter einer ähnlichen Adresse
563      wie das Bild erreichbar, und zwar unter <b><a href=\"$report_url\">$report_url</a></b>.</p>";
564
565echo "<p>Möchten sie noch etwas stanzen? <a href='$dir_url'>Erneut zum Stanzereingabeformular</a></p>";
566
567// und jetzt abspeichern!
568$fh = fopen($report_file, 'w');
569
570if(!$fh) {
571    print '<p class="big-error">Fehler: Konnte Report-File '.$report_file.' nicht zum Schreiben öffnen!</p>';
572    exit; // weil gibts ja nichts mehr zu tun.
573}
574
575fwrite($fh, makeHeader("Lochstreifen $output_hash -- Erstellungsbericht"));
576fwrite($fh, "<h2>Lochstreifen $output_hash</h2>");
577fwrite($fh, $report);
578fwrite($fh, "</body></html>");
579
580fclose($fh);
581
582// so, jetzt aber wirklich fertig. :)
583
584function DataSizeFormat($size,$ukb = "1024",$plain = "")
585{
586    // immer wieder eine schöne Funktion, die man sich von seinen
587    // alten Scripten immer wieder neu kopiert ;-)
588    $kb = $ukb;        // Kilobyte
589    $mb = $ukb * $kb;  // Megabyte
590    $gb = $ukb * $mb;  // Gigabyte
591    $tb = $ukb * $gb;  // Terabyte
592    $sp = '&nbsp;';    // No breaking space
593
594    if($size < $kb) {
595        $readable = $size;
596        $definition = $sp.'Byte';
597    }elseif($size < $mb) {
598        $readable = ($size/$kb);
599        $definition = $sp.'KB';
600    }elseif($size < $gb) {
601        $readable = ($size/$mb);
602        $definition = $sp.'MB';
603    }elseif($size < $tb) {
604        $readable = ($size/$gb);
605        $definition = $sp.'GB';
606    }else {
607        $readable = ($size/$tb);
608        $definition = $sp.'TB';
609    }
610    if ($plain == 1) {
611        $definition = "";
612    }
613    if ($size < $kb) {
614        if (empty($readable)) {
615            $readable = 0;
616        }
617        return $readable.$definition;
618    } else {
619        return number_format($readable,2).$definition;
620    }
621}
622
Note: See TracBrowser for help on using the repository browser.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License