diff --git a/build-scripts/build-web-examples.pl b/build-scripts/build-web-examples.pl
index 0053295e9f..6df912aa8c 100755
--- a/build-scripts/build-web-examples.pl
+++ b/build-scripts/build-web-examples.pl
@@ -71,6 +71,38 @@ sub build_latest {
}
}
+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;
+ }
+ closedir($dh);
+
+ return @categories;
+}
+
+sub get_examples_for_category {
+ my $category = shift;
+
+ my @examples = ();
+
+ opendir(my $dh, "$examples_dir/$category") or die("Couldn't opendir '$examples_dir/$category': $!\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/$category/$dir"; # only care about subdirectories.
+
+ push @examples, $dir;
+ }
+ closedir($dh);
+
+ return @examples;
+}
+
sub handle_example_dir {
my $category = shift;
my $example = shift;
@@ -146,6 +178,11 @@ sub handle_example_dir {
waitpid($pid, 0);
+ my $other_examples_html = "
";
+ foreach my $example (get_examples_for_category($category)) {
+ $other_examples_html .= "$category/$example ";
+ }
+ $other_examples_html .= " ";
my $html = '';
open my $htmltemplate, '<', "$examples_dir/template.html" or die("Couldn't open '$examples_dir/template.html': $!\n");
@@ -156,6 +193,7 @@ sub handle_example_dir {
s/\@javascript_file\@/$jsfname/g;
s/\@htmlified_source_code\@/$htmlified_source_code/g;
s/\@description\@/$description/g;
+ s/\@other_examples_html\@/$other_examples_html/g;
$html .= $_;
}
close($htmltemplate);
@@ -168,8 +206,6 @@ sub handle_example_dir {
sub handle_category_dir {
my $category = shift;
- # !!! FIXME: this needs to generate a preview page for all the examples things in the category.
-
print("Category $category ...\n");
do_mkdir("$output_dir/$category");
@@ -183,6 +219,35 @@ sub handle_category_dir {
}
closedir($dh);
+
+ my $examples_list_html = "";
+ foreach my $example (get_examples_for_category($category)) {
+ # !!! FIXME: image
+ my $example_image_url = "https://placehold.co/600x400/png";
+ $examples_list_html .= "
+
+
+
+
$category/$example
+
+ ";
+ }
+
+ # write category page
+ my $dst = "$output_dir/$category";
+ 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/\@examples_list_html\@/$examples_list_html/g;
+ $html .= $_;
+ }
+ close($htmltemplate);
+
+ open my $htmloutput, '>', "$dst/index.html" or die("Couldn't open '$dst/index.html': $!\n");
+ print $htmloutput $html;
+ close($htmloutput);
}
@@ -210,6 +275,8 @@ do_mkdir($output_dir);
build_latest();
+do_copy("$examples_dir/template.css", "$output_dir/examples.css");
+
opendir(my $dh, $examples_dir) or die("Couldn't opendir '$examples_dir': $!\n");
while (readdir($dh)) {
@@ -221,6 +288,38 @@ while (readdir($dh)) {
closedir($dh);
+# write homepage
+my $homepage_list_html = "";
+foreach my $category (get_categories()) {
+ $homepage_list_html .= "$category ";
+ $homepage_list_html .= "";
+ foreach my $example (get_examples_for_category($category)) {
+ # !!! FIXME: image
+ my $example_image_url = "https://placehold.co/600x400/png";
+ $homepage_list_html .= "
+
+
+
+
$category/$example
+
+ ";
+ }
+ $homepage_list_html .= "
";
+}
+
+my $dst = "$output_dir/";
+my $html = '';
+open my $htmltemplate, '<', "$examples_dir/template-homepage.html" or die("Couldn't open '$examples_dir/template-category.html': $!\n");
+while (<$htmltemplate>) {
+ s/\@project_name\@/$project/g;
+ s/\@homepage_list_html\@/$homepage_list_html/g;
+ $html .= $_;
+}
+close($htmltemplate);
+
+open my $htmloutput, '>', "$dst/index.html" or die("Couldn't open '$dst/index.html': $!\n");
+print $htmloutput $html;
+close($htmloutput);
+
print("All examples built successfully!\n");
exit(0); # success!
-
diff --git a/examples/template-category.html b/examples/template-category.html
new file mode 100644
index 0000000000..bc79e8d834
--- /dev/null
+++ b/examples/template-category.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ @project_name@ Examples: @category_name@
+
+
+
+
+
+
+
+
+
+ @project_name@ examples: @category_name@
+ @examples_list_html@
+
+
+
diff --git a/examples/template-homepage.html b/examples/template-homepage.html
new file mode 100644
index 0000000000..369237df9e
--- /dev/null
+++ b/examples/template-homepage.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ @project_name@ Examples
+
+
+
+
+
+
+
+
+
+ @project_name@ examples
+
+ Check out the @project_name@ examples here!
+
+ @homepage_list_html@
+
+
+
diff --git a/examples/template.css b/examples/template.css
new file mode 100644
index 0000000000..8e86723cd3
--- /dev/null
+++ b/examples/template.css
@@ -0,0 +1,284 @@
+/** from ghwikipp.css */
+:root {
+ color-scheme: dark light; /* both supported */
+}
+
+body {
+ background-color: white;
+ padding: 2vw;
+ color: #333;
+ max-width: 1200px;
+ margin: 0 auto;
+ font-size: 16px;
+ line-height: 1.5;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
+ Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
+ overflow-wrap: break-word;
+}
+
+a {
+ color: #0969da;
+ /* text-decoration: none; */
+}
+
+a:visited {
+ color: #064998;
+}
+
+h1 {
+ border-bottom: 2px solid #efefef;
+}
+
+h2 {
+ border-bottom: 1px solid #efefef;
+}
+
+p {
+ max-width: 85ch;
+}
+
+li {
+ max-width: 85ch;
+}
+
+div.sourceCode {
+ background-color: #f6f8fa;
+ max-width: 100%;
+ padding: 16px;
+}
+
+code {
+ background-color: #f6f8fa;
+ padding: 0px;
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
+ "Liberation Mono", monospace;
+}
+
+table {
+ border: 1px solid #808080;
+ border-collapse: collapse;
+}
+
+td {
+ border: 1px solid #808080;
+ padding: 5px;
+}
+
+tr:nth-child(even) {
+ background-color: #f6f8fa;
+}
+
+.wikitopbanner {
+ background-color: #efefef;
+ padding: 10px;
+ margin-bottom: 10px;
+ width: auto;
+}
+
+.wikibottombanner {
+ background-color: #efefef;
+ padding: 10px;
+ margin-top: 10px;
+ width: auto;
+}
+
+.alertBox {
+ background-color: #f8d7da;
+ border: 1px solid #f5c6cb;
+ max-width: 60%;
+ padding: 10;
+ margin: auto;
+}
+
+.anchorImage {
+ visibility: hidden;
+ padding-left: 0.2em;
+ color: #fff;
+}
+
+.anchorText:hover .anchorImage {
+ visibility: visible;
+}
+
+hr {
+ display: block;
+ height: 1px;
+ border: 0;
+ border-top: 1px solid #efefef;
+ margin: 1em 0;
+ padding: 0;
+}
+
+/* Text and background color for dark mode */
+@media (prefers-color-scheme: dark) {
+ body {
+ color: #e6edf3;
+ background-color: #0d1117;
+ }
+
+ h1 {
+ border-color: rgba(48, 54, 61, 0.7);
+ }
+
+ h2 {
+ border-color: rgba(48, 54, 61, 0.7);
+ }
+
+ hr {
+ border-color: rgba(48, 54, 61, 0.7);
+ }
+
+ div.sourceCode {
+ background-color: #161b22;
+ }
+
+ code {
+ background-color: #161b22;
+ }
+
+ a {
+ color: #4493f8;
+ }
+
+ a:visited {
+ color: #2f66ad;
+ }
+
+ table {
+ border-color: rgba(48, 54, 61, 0.7);
+ }
+
+ td {
+ border-color: rgba(48, 54, 61, 0.7);
+ }
+
+ tr:nth-child(even) {
+ background-color: #161b22;
+ }
+
+ .wikitopbanner {
+ background-color: #263040;
+ }
+
+ .wikibottombanner {
+ background-color: #263040;
+ }
+
+ .anchorText:hover .anchorImage {
+ filter: invert(100%);
+ }
+}
+
+@media print {
+ body {
+ font-size: 12px;
+ }
+
+ table {
+ font-size: inherit;
+ }
+
+ a:visited {
+ color: #0969da;
+ }
+
+ .wikitopbanner,
+ .anchorText,
+ .wikibottombanner {
+ display: none;
+ }
+}
+
+/** additional (& overrides) for examples */
+header {
+ background-color: #efefef;
+ padding: 10px;
+ font-size: 2rem;
+}
+
+header > a,
+header > a:hover,
+header > a:visited {
+ color: inherit;
+ text-decoration: none;
+}
+
+.breadcrumb {
+ padding: 0.75rem 0.75rem;
+}
+
+.breadcrumb ul {
+ display: flex;
+ flex-wrap: wrap;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.breadcrumb li:not(:last-child)::after {
+ display: inline-block;
+ margin: 0 0.25rem;
+ content: "ยป";
+}
+
+.list {
+ display: flex;
+ flex-flow: row wrap;
+ gap: 24px;
+}
+
+.list > a > div {
+ width: 200px;
+ border: 5px solid #efefef;
+ border-radius: 5px;
+ background: #efefef;
+
+ display: flex;
+ flex-flow: column nowrap;
+
+ transition: border 0.25s;
+}
+
+.list > a > div:hover {
+ border-color: #064998;
+}
+
+.list > a > div > img {
+ width: 100%;
+ border-radius: 5px;
+}
+
+.list > a > div > div {
+ text-align: center;
+}
+
+.list > a,
+.list > a:visited {
+ display: block;
+ color: inherit;
+ text-decoration: none;
+}
+.list > a:hover {
+ color: #0969da;
+}
+
+@media (prefers-color-scheme: dark) {
+ header {
+ background-color: #263040;
+ }
+
+ .breadcrumb li:not(:last-child)::after {
+ color: #efefef;
+ }
+
+ .list > a > div {
+ border-color: #333;
+ background: #333;
+ }
+}
+
+@media only screen and (max-width: 992px) {
+ .list > a > div {
+ width: 150px;
+ }
+}
diff --git a/examples/template.html b/examples/template.html
index e8be678b31..caf6dccca4 100644
--- a/examples/template.html
+++ b/examples/template.html
@@ -3,27 +3,48 @@
+
@project_name@ Example: @category_name@/@example_name@
+
-
-
-
-
- @description@
-
+
+
+
+
+
+
+
@project_name@ example: @category_name@/@example_name@
+
@description@
+
+
+
+
+
+
+