瀏覽代碼

examples: Improve webpage generation in various ways, add thumbnails, etc.

Ryan C. Gordon 4 月之前
父節點
當前提交
90efb63e52
共有 53 個文件被更改,包括 118 次插入38 次删除
  1. 100 33
      build-scripts/build-web-examples.pl
  2. 二進制
      examples/asyncio/01-load-bitmaps/thumbnail.png
  3. 1 0
      examples/asyncio/description.txt
  4. 二進制
      examples/audio/onmouseover.webp
  5. 二進制
      examples/audio/thumbnail.png
  6. 二進制
      examples/camera/01-read-and-draw/onmouseover.webp
  7. 二進制
      examples/camera/01-read-and-draw/thumbnail.png
  8. 13 0
      examples/categories.txt
  9. 二進制
      examples/demo/01-snake/onmouseover.webp
  10. 二進制
      examples/demo/01-snake/thumbnail.png
  11. 二進制
      examples/demo/02-woodeneye-008/onmouseover.webp
  12. 二進制
      examples/demo/02-woodeneye-008/thumbnail.png
  13. 二進制
      examples/demo/03-infinite-monkeys/onmouseover.webp
  14. 二進制
      examples/demo/03-infinite-monkeys/thumbnail.png
  15. 二進制
      examples/demo/04-bytepusher/onmouseover.webp
  16. 二進制
      examples/demo/04-bytepusher/thumbnail.png
  17. 1 0
      examples/demo/description.txt
  18. 二進制
      examples/input/01-joystick-polling/onmouseover.webp
  19. 二進制
      examples/input/01-joystick-polling/thumbnail.png
  20. 二進制
      examples/input/02-joystick-events/onmouseover.webp
  21. 二進制
      examples/input/02-joystick-events/thumbnail.png
  22. 二進制
      examples/pen/01-drawing-lines/onmouseover.webp
  23. 二進制
      examples/pen/01-drawing-lines/thumbnail.png
  24. 二進制
      examples/renderer/01-clear/onmouseover.webp
  25. 二進制
      examples/renderer/01-clear/thumbnail.png
  26. 二進制
      examples/renderer/02-primitives/thumbnail.png
  27. 二進制
      examples/renderer/03-lines/onmouseover.webp
  28. 二進制
      examples/renderer/03-lines/thumbnail.png
  29. 二進制
      examples/renderer/04-points/onmouseover.webp
  30. 二進制
      examples/renderer/04-points/thumbnail.png
  31. 二進制
      examples/renderer/05-rectangles/onmouseover.webp
  32. 二進制
      examples/renderer/05-rectangles/thumbnail.png
  33. 二進制
      examples/renderer/06-textures/onmouseover.webp
  34. 二進制
      examples/renderer/06-textures/thumbnail.png
  35. 二進制
      examples/renderer/07-streaming-textures/onmouseover.webp
  36. 二進制
      examples/renderer/07-streaming-textures/thumbnail.png
  37. 二進制
      examples/renderer/08-rotating-textures/onmouseover.webp
  38. 二進制
      examples/renderer/08-rotating-textures/thumbnail.png
  39. 二進制
      examples/renderer/09-scaling-textures/onmouseover.webp
  40. 二進制
      examples/renderer/09-scaling-textures/thumbnail.png
  41. 二進制
      examples/renderer/10-geometry/onmouseover.webp
  42. 二進制
      examples/renderer/10-geometry/thumbnail.png
  43. 二進制
      examples/renderer/11-color-mods/onmouseover.webp
  44. 二進制
      examples/renderer/11-color-mods/thumbnail.png
  45. 二進制
      examples/renderer/14-viewport/thumbnail.png
  46. 二進制
      examples/renderer/15-cliprect/onmouseover.webp
  47. 二進制
      examples/renderer/15-cliprect/thumbnail.png
  48. 二進制
      examples/renderer/17-read-pixels/onmouseover.webp
  49. 二進制
      examples/renderer/17-read-pixels/thumbnail.png
  50. 二進制
      examples/renderer/18-debug-text/thumbnail.png
  51. 3 3
      examples/template-category.html
  52. 0 2
      examples/template-homepage.html
  53. 二進制
      examples/template-placeholder.png

+ 100 - 33
build-scripts/build-web-examples.pl

@@ -71,17 +71,41 @@ sub build_latest {
     }
 }
 
+sub get_category_description {
+    my $category = shift;
+    my $retval = ucfirst($category);
+
+    if (open(my $fh, '<', "$examples_dir/$category/description.txt")) {
+        $retval = <$fh>;
+        chomp($retval);
+        close($fh);
+    }
+
+    return $retval;
+}
+
 sub get_categories {
     my @categories = ();
 
-    opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
-    foreach my $dir (sort readdir $dh) {
-        next if ($dir eq '.') || ($dir eq '..');  # obviously skip current and parent entries.
-        next if not -d "$examples_dir/$dir";   # only care about subdirectories.
-
-        push @categories, $dir;
+    if (open(my $fh, '<', "$examples_dir/categories.txt")) {
+        while (<$fh>) {
+            chomp;
+            s/\A\s+//;
+            s/\s+\Z//;
+            next if $_ eq '';
+            next if /\A\#/;
+            push @categories, $_;
+        }
+        close($fh);
+    } else {
+        opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
+        foreach my $dir (sort readdir $dh) {
+            next if ($dir eq '.') || ($dir eq '..');  # obviously skip current and parent entries.
+            next if not -d "$examples_dir/$dir";   # only care about subdirectories.
+            push @categories, $dir;
+        }
+        closedir($dh);
     }
-    closedir($dh);
 
     return @categories;
 }
@@ -131,10 +155,16 @@ sub handle_example_dir {
     $basefname = "$category-$basefname";
     my $jsfname = "$basefname.js";
     my $wasmfname = "$basefname.wasm";
+    my $thumbnailfname = 'thumbnail.png';
+    my $onmouseoverfname = 'onmouseover.webp';
     my $jssrc = "$compile_dir/examples/$jsfname";
     my $wasmsrc = "$compile_dir/examples/$wasmfname";
+    my $thumbnailsrc = "$examples_dir/$category/$example/$thumbnailfname";
+    my $onmouseoversrc = "$examples_dir/$category/$example/$onmouseoverfname";
     my $jsdst = "$dst/$jsfname";
     my $wasmdst = "$dst/$wasmfname";
+    my $thumbnaildst = "$dst/$thumbnailfname";
+    my $onmouseoverdst = "$dst/$onmouseoverfname";
 
     my $description = '';
     if (open(my $readmetxth, '<', "$examples_dir/$category/$example/README.txt")) {
@@ -150,6 +180,8 @@ sub handle_example_dir {
     do_mkdir($dst);
     do_copy($jssrc, $jsdst);
     do_copy($wasmsrc, $wasmdst);
+    do_copy($thumbnailsrc, $thumbnaildst) if ( -f $thumbnailsrc );
+    do_copy($onmouseoversrc, $onmouseoverdst) if ( -f $onmouseoversrc );
 
     my $highlight_cmd = "highlight '--outdir=$dst' --style-outfile=highlight.css --fragment --enclose-pre --stdout --syntax=c '--plug-in=$examples_dir/highlight-plugin.lua'";
     print("$highlight_cmd\n");
@@ -184,11 +216,14 @@ sub handle_example_dir {
     }
     $other_examples_html .= "</ul>";
 
+    my $category_description = get_category_description($category);
+
     my $html = '';
     open my $htmltemplate, '<', "$examples_dir/template.html" or die("Couldn't open '$examples_dir/template.html': $!\n");
     while (<$htmltemplate>) {
         s/\@project_name\@/$project/g;
         s/\@category_name\@/$category/g;
+        s/\@category_description\@/$category_description/g;
         s/\@example_name\@/$example/g;
         s/\@javascript_file\@/$jsfname/g;
         s/\@htmlified_source_code\@/$htmlified_source_code/g;
@@ -203,6 +238,51 @@ sub handle_example_dir {
     close($htmloutput);
 }
 
+sub generate_example_thumbnail {
+    my $project = shift;
+    my $category = shift;
+    my $example = shift;
+
+    my $example_no_num = "$example";
+    $example_no_num =~ s/\A\d+\-//;
+
+    my $example_image_url;
+    if ( -f "$examples_dir/$category/$example/thumbnail.png" ) {
+        $example_image_url = "/$project/$category/$example/thumbnail.png";
+    } elsif ( -f "$examples_dir/$category/thumbnail.png" ) {
+        $example_image_url = "/$project/$category/thumbnail.png";
+    } else {
+        $example_image_url = "/$project/thumbnail.png";
+    }
+
+    my $example_mouseover_html = '';
+    if ( -f "$examples_dir/$category/$example/onmouseover.webp" ) {
+        $example_mouseover_html = "onmouseover=\"this.src='/$project/$category/$example/onmouseover.webp'\" onmouseout=\"this.src='$example_image_url'\";";
+    } elsif ( -f "$examples_dir/$category/onmouseover.webp" ) {
+        $example_mouseover_html = "onmouseover=\"this.src='/$project/$category/onmouseover.webp'\" onmouseout=\"this.src='$example_image_url'\";";
+    }
+
+    return "
+        <a href='/$project/$category/$example'>
+          <div>
+            <img src='$example_image_url' $example_mouseover_html />
+            <div>$example_no_num</div>
+          </div>
+        </a>"
+    ;
+}
+
+sub generate_example_thumbnails_for_category {
+    my $project = shift;
+    my $category = shift;
+    my @examples = get_examples_for_category($category);
+    my $retval = '';
+    foreach my $example (@examples) {
+        $retval .= generate_example_thumbnail($project, $category, $example);
+    }
+    return $retval;
+}
+
 sub handle_category_dir {
     my $category = shift;
 
@@ -220,26 +300,22 @@ sub handle_category_dir {
 
     closedir($dh);
 
-    my $examples_list_html = "";
-    foreach my $example (get_examples_for_category($category)) {
-        # !!! FIXME: image
-        my $example_image_url = "/$project/placeholder.png";
-        $examples_list_html .= "
-        <a href='/$project/$category/$example'>
-          <div>
-            <img src='$example_image_url' />
-            <div>$category/$example</div>
-          </div>
-        </a>";
-    }
+    my $examples_list_html = generate_example_thumbnails_for_category($project, $category);
 
-    # write category page
     my $dst = "$output_dir/$category";
+
+    do_copy("$examples_dir/$category/thumbnail.png", "$dst/thumbnail.png") if ( -f "$examples_dir/$category/thumbnail.png" );
+    do_copy("$examples_dir/$category/onmouseover.webp", "$dst/onmouseover.webp") if ( -f "$examples_dir/$category/onmouseover.webp" );
+
+    my $category_description = get_category_description($category);
+
+    # write category page
     my $html = '';
     open my $htmltemplate, '<', "$examples_dir/template-category.html" or die("Couldn't open '$examples_dir/template-category.html': $!\n");
     while (<$htmltemplate>) {
         s/\@project_name\@/$project/g;
         s/\@category_name\@/$category/g;
+        s/\@category_description\@/$category_description/g;
         s/\@examples_list_html\@/$examples_list_html/g;
         $html .= $_;
     }
@@ -276,7 +352,7 @@ do_mkdir($output_dir);
 build_latest();
 
 do_copy("$examples_dir/template.css", "$output_dir/examples.css");
-do_copy("$examples_dir/template-placeholder.png", "$output_dir/placeholder.png");
+do_copy("$examples_dir/template-placeholder.png", "$output_dir/thumbnail.png");
 
 opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
 
@@ -292,19 +368,10 @@ closedir($dh);
 # write homepage
 my $homepage_list_html = "";
 foreach my $category (get_categories()) {
-    $homepage_list_html .= "<h2>$category</h2>";
+    my $category_description = get_category_description($category);
+    $homepage_list_html .= "<h2>$category_description</h2>";
     $homepage_list_html .= "<div class='list'>";
-    foreach my $example (get_examples_for_category($category)) {
-        # !!! FIXME: image
-        my $example_image_url = "/$project/placeholder.png";
-        $homepage_list_html .= "
-            <a href='/$project/$category/$example'>
-            <div>
-                <img src='$example_image_url' />
-                <div>$category/$example</div>
-            </div>
-            </a>";
-    }
+    $homepage_list_html .= generate_example_thumbnails_for_category($project, $category);
     $homepage_list_html .= "</div>";
 }
 

二進制
examples/asyncio/01-load-bitmaps/thumbnail.png


+ 1 - 0
examples/asyncio/description.txt

@@ -0,0 +1 @@
+Asynchronous I/O

二進制
examples/audio/onmouseover.webp


二進制
examples/audio/thumbnail.png


二進制
examples/camera/01-read-and-draw/onmouseover.webp


二進制
examples/camera/01-read-and-draw/thumbnail.png


+ 13 - 0
examples/categories.txt

@@ -0,0 +1,13 @@
+# Blank lines and lines that start with '#' in this file are ignored.
+
+# Categories, by directory name, go in here, in the order they should be
+# listed on the main page. If this file is missing, it'll assume any
+# subdirectory is a category and sort them alphabetically.
+
+renderer
+input
+audio
+camera
+asyncio
+pen
+demo

二進制
examples/demo/01-snake/onmouseover.webp


二進制
examples/demo/01-snake/thumbnail.png


二進制
examples/demo/02-woodeneye-008/onmouseover.webp


二進制
examples/demo/02-woodeneye-008/thumbnail.png


二進制
examples/demo/03-infinite-monkeys/onmouseover.webp


二進制
examples/demo/03-infinite-monkeys/thumbnail.png


二進制
examples/demo/04-bytepusher/onmouseover.webp


二進制
examples/demo/04-bytepusher/thumbnail.png


+ 1 - 0
examples/demo/description.txt

@@ -0,0 +1 @@
+Full game and app demos

二進制
examples/input/01-joystick-polling/onmouseover.webp


二進制
examples/input/01-joystick-polling/thumbnail.png


二進制
examples/input/02-joystick-events/onmouseover.webp


二進制
examples/input/02-joystick-events/thumbnail.png


二進制
examples/pen/01-drawing-lines/onmouseover.webp


二進制
examples/pen/01-drawing-lines/thumbnail.png


二進制
examples/renderer/01-clear/onmouseover.webp


二進制
examples/renderer/01-clear/thumbnail.png


二進制
examples/renderer/02-primitives/thumbnail.png


二進制
examples/renderer/03-lines/onmouseover.webp


二進制
examples/renderer/03-lines/thumbnail.png


二進制
examples/renderer/04-points/onmouseover.webp


二進制
examples/renderer/04-points/thumbnail.png


二進制
examples/renderer/05-rectangles/onmouseover.webp


二進制
examples/renderer/05-rectangles/thumbnail.png


二進制
examples/renderer/06-textures/onmouseover.webp


二進制
examples/renderer/06-textures/thumbnail.png


二進制
examples/renderer/07-streaming-textures/onmouseover.webp


二進制
examples/renderer/07-streaming-textures/thumbnail.png


二進制
examples/renderer/08-rotating-textures/onmouseover.webp


二進制
examples/renderer/08-rotating-textures/thumbnail.png


二進制
examples/renderer/09-scaling-textures/onmouseover.webp


二進制
examples/renderer/09-scaling-textures/thumbnail.png


二進制
examples/renderer/10-geometry/onmouseover.webp


二進制
examples/renderer/10-geometry/thumbnail.png


二進制
examples/renderer/11-color-mods/onmouseover.webp


二進制
examples/renderer/11-color-mods/thumbnail.png


二進制
examples/renderer/14-viewport/thumbnail.png


二進制
examples/renderer/15-cliprect/onmouseover.webp


二進制
examples/renderer/15-cliprect/thumbnail.png


二進制
examples/renderer/17-read-pixels/onmouseover.webp


二進制
examples/renderer/17-read-pixels/thumbnail.png


二進制
examples/renderer/18-debug-text/thumbnail.png


+ 3 - 3
examples/template-category.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8" />
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <title>@project_name@ Examples: @category_name@</title>
+    <title>@project_name@ Examples: @category_description@</title>
     <link
       rel="stylesheet"
       type="text/css"
@@ -18,7 +18,7 @@
   </head>
   <body>
     <header>
-      <a href="/">SDL Examples</a>
+      <a href="/">@project_name@ Examples</a>
     </header>
     <main>
       <nav class="breadcrumb">
@@ -27,7 +27,7 @@
           <li><a href="/@project_name@/@category_name@">@category_name@</a></li>
         </ul>
       </nav>
-      <h1>@project_name@ examples: @category_name@</h1>
+      <h1>@project_name@ examples: @category_description@</h1>
       <div class="list">@examples_list_html@</div>
     </main>
   </body>

+ 0 - 2
examples/template-homepage.html

@@ -28,8 +28,6 @@
       </nav>
       <h1>@project_name@ examples</h1>
 
-      <p>Check out the @project_name@ examples here!</p>
-
       @homepage_list_html@
     </main>
   </body>

二進制
examples/template-placeholder.png