diff --git a/www/fragments/blogview_aoc_list.php b/www/fragments/blogview_aoc_list.php
index b5a0eb9..673202d 100644
--- a/www/fragments/blogview_aoc_list.php
+++ b/www/fragments/blogview_aoc_list.php
@@ -15,6 +15,8 @@ $post = $parameter['blogpost'];
$year = $post['extras']['aoc:year'];
+$FRAME_OPTIONS->alternative_url = "/adventofcode/$year";
+
?>
diff --git a/www/fragments/blogview_aoc_single.php b/www/fragments/blogview_aoc_single.php
index 12a37be..ed677b2 100644
--- a/www/fragments/blogview_aoc_single.php
+++ b/www/fragments/blogview_aoc_single.php
@@ -17,6 +17,8 @@ $year = $post['extras']['aoc:year'];
$day = $SITE->modules->AdventOfCode()->getDayFromStrIdent($year, $subview);
if ($day === NULL) { $FRAME_OPTIONS->forceResult(404, 'AdventOfCode entry not found'); return; }
+
+$FRAME_OPTIONS->alternative_url = $day['url-alternative'];
?>
diff --git a/www/frames/default_frame.php b/www/frames/default_frame.php
index 9b16bbe..e1989c7 100644
--- a/www/frames/default_frame.php
+++ b/www/frames/default_frame.php
@@ -23,7 +23,9 @@ require_once (__DIR__ . '/../internals/website.php');
canonical_url !== null) echo '' . "\n";
+ if ($FRAME_OPTIONS->canonical_url !== null) echo '' . "\n";
+ if ($FRAME_OPTIONS->alternative_url !== null) echo '' . "\n";
+
foreach ($FRAME_OPTIONS->stylesheets as $cssfile) echo '' . "\n";
foreach ($FRAME_OPTIONS->scripts as $scriptfile)
{
@@ -41,15 +43,37 @@ require_once (__DIR__ . '/../internals/website.php');
+
+
+
+
+
+ activeHeader === 'aoc' || intval(date('m')) === 12): ?>
+
+
+
+ activeHeader === 'books'): ?>
+
+
+
- isLoggedInByCookie()): ?>
Admin
+
+ isLoggedInByCookie()): ?>
+
Admin
+
+
+
- isLoggedInByCookie()): ?>
+
+ isLoggedInByCookie()): ?>
+
+
+
Github
diff --git a/www/index.php b/www/index.php
index f82a573..8029657 100644
--- a/www/index.php
+++ b/www/index.php
@@ -60,6 +60,10 @@ $URL_RULES =
[ 'url' => ['log', '?{id}', '?{name}', '?{subview}'], 'target' => 'blog_view.php', 'options' => [ ], 'parameter' => [ 'id' => '%URL%', 'subview' => '%URL%' ], ],
[ 'url' => ['blogpost', 'view'], 'target' => 'blog_view.php', 'options' => [ ], 'parameter' => [ 'id' => '%GET%', 'subview' => '' ], ],
+ [ 'url' => ['adventofcode'], 'target' => 'adventofcode_year.php', 'options' => [ ], 'parameter' => [ 'year' => '' ], ],
+ [ 'url' => ['adventofcode', '?{year}'], 'target' => 'adventofcode_year.php', 'options' => [ ], 'parameter' => [ 'year' => '%URL%' ], ],
+ [ 'url' => ['adventofcode', '?{year}', '?{day}'], 'target' => 'adventofcode_day.php', 'options' => [ ], 'parameter' => [ 'year' => '%URL%', 'day' => '%URL%' ], ],
+
[ 'url' => ['webapps'], 'target' => 'webapps_list.php', 'options' => [ ], 'parameter' => [ ], ],
[ 'url' => ['highscores', 'list.php'], 'target' => 'highscores_listentries.php', 'options' => [ 'http' ], 'parameter' => [ 'gameid' => '%GET%' ], ],
diff --git a/www/internals/modules/adventofcode.php b/www/internals/modules/adventofcode.php
index 0e3a0e1..9a3503e 100644
--- a/www/internals/modules/adventofcode.php
+++ b/www/internals/modules/adventofcode.php
@@ -83,7 +83,8 @@ class AdventOfCode implements IWebsiteModule
$n2p = str_pad($a['day'], 2, '0', STR_PAD_LEFT);
$a['day-padded'] = $n2p;
- $a['url'] = '/blog/' . $yeardata['blog-id'] . '/Advent_of_Code_' . $year . '/day-' . $n2p;
+ $a['url'] = '/blog/' . $yeardata['blog-id'] . '/Advent_of_Code_' . $year . '/day-' . $n2p;
+ $a['url-alternative'] = '/adventofcode/' . $year . '/' . $n2p;
$a['canonical'] = "https://www.mikescher.com" . $a['url'];
$a['url_aoc'] = $yeardata['url-aoc'] . $a['day']; // adventofcode.com/{year}/day/{day}
diff --git a/www/internals/modules/selftest.php b/www/internals/modules/selftest.php
index 2af2bda..f8b8656 100644
--- a/www/internals/modules/selftest.php
+++ b/www/internals/modules/selftest.php
@@ -97,11 +97,13 @@ class SelfTest implements IWebsiteModule
$this->addMethodPathStatus( "web::euler::euler-404-2", 404, '/blog/1/Project_Euler_with_Befunge/problem-99999');
$this->addMethodPathStatus( "web::euler::euler-404-3", 404, '/blog/1/Project_Euler_with_Befunge/asdf');
- $this->addMethodMultiPathStatus("web::aoc::aoc-list-1", 200, '{0}', function(){ return array_map(function($x){return Website::inst()->modules->AdventOfCode()->getURLForYear($x);},Website::inst()->modules->AdventOfCode()->listYears()); });
- $this->addMethodMultiPathStatus("web::aoc::aoc-show-1", 200, '{0}', function(){ return array_key_map(Website::inst()->modules->AdventOfCode()->listAllDays(), 'url'); });
- $this->addMethodPathStatus( "web::aoc::aoc-404-1", 404, '/blog/25/Advent_of_Code_2017/day-26');
- $this->addMethodPathStatus( "web::aoc::aoc-404-2", 404, '/blog/23/Advent_of_Code_2018/day-27');
- $this->addMethodPathStatus( "web::aoc::aoc-404-3", 404, '/blog/24/Advent_of_Code_2019/day-28');
+ $this->addMethodMultiPathStatus("web::aoc::aoc-list-1", 200, '{0}', function(){ return array_map(function($x){return Website::inst()->modules->AdventOfCode()->getURLForYear($x);},Website::inst()->modules->AdventOfCode()->listYears()); });
+ $this->addMethodMultiPathStatus("web::aoc::aoc-show-1", 200, '{0}', function(){ return array_key_map(Website::inst()->modules->AdventOfCode()->listAllDays(), 'url'); });
+ $this->addMethodPathStatus( "web::aoc::aoc-404-1", 404, '/blog/25/Advent_of_Code_2017/day-26');
+ $this->addMethodPathStatus( "web::aoc::aoc-404-2", 404, '/blog/23/Advent_of_Code_2018/day-27');
+ $this->addMethodPathStatus( "web::aoc::aoc-404-3", 404, '/blog/24/Advent_of_Code_2019/day-28');
+ $this->addMethodMultiPathStatus("web::aoc::aoc-redirect-1", 302, '{0}', function(){ return array_key_map(Website::inst()->modules->AdventOfCode()->listAllDays(), 'url-alternative'); });
+ $this->addMethodMultiPathStatus("web::aoc::aoc-redirect-1", 302, '/adventofcode/{0}', function(){ return Website::inst()->modules->AdventOfCode()->listYears(); });
$this->addCheckConsistency("modules::database::database-check-consistency", function(){ return Website::inst()->modules->Database(); });
$this->addCheckConsistency("modules::blog::blog-check-consistency", function(){ return Website::inst()->modules->Blog(); });
diff --git a/www/internals/pageframeoptions.php b/www/internals/pageframeoptions.php
index c9cc72b..7260f7a 100644
--- a/www/internals/pageframeoptions.php
+++ b/www/internals/pageframeoptions.php
@@ -36,6 +36,9 @@ class PageFrameOptions
/** @var string */
public $canonical_url = null;
+ /** @var string */
+ public $alternative_url = null;
+
/** @var string[] */
public $contentCSSClasses = [ 'content-responsive' ];
diff --git a/www/internals/utils.php b/www/internals/utils.php
index 6debb91..cb966c6 100644
--- a/www/internals/utils.php
+++ b/www/internals/utils.php
@@ -283,4 +283,8 @@ function curl_http_request($url)
return [ 'output'=>$output, 'statuscode'=>$httpcode, 'redirect'=>$redirect, 'errnum'=>$errnum, 'errstr'=>$errmsg ];
}
+function array_last(array $arr)
+{
+ return $arr[count($arr)-1];
+}
diff --git a/www/internals/website.php b/www/internals/website.php
index ffe41da..20b3a42 100644
--- a/www/internals/website.php
+++ b/www/internals/website.php
@@ -68,7 +68,7 @@ class Website
if ($result->force_redirect)
{
- header('Location: ' . $result->force_redirect_url);
+ header('Location: ' . $result->force_redirect_url); // http 302: Found
exit();
}
diff --git a/www/pages/adventofcode_day.php b/www/pages/adventofcode_day.php
new file mode 100644
index 0000000..c24a812
--- /dev/null
+++ b/www/pages/adventofcode_day.php
@@ -0,0 +1,21 @@
+
+
+parameter['year']);
+$day = intval($ROUTE->parameter['day']);
+
+if ($SITE->modules->AdventOfCode()->getSingleDay($year, $day) === null)
+{
+ $FRAME_OPTIONS->setForced404('Advent of Code not found');
+ return;
+}
+
+$FRAME_OPTIONS->setForcedRedirect($SITE->modules->AdventOfCode()->getSingleDay($year, $day)['url']);
+?>
diff --git a/www/pages/adventofcode_year.php b/www/pages/adventofcode_year.php
new file mode 100644
index 0000000..57437b6
--- /dev/null
+++ b/www/pages/adventofcode_year.php
@@ -0,0 +1,32 @@
+
+
+parameter['year'] === '')
+{
+ $year = array_last($SITE->modules->AdventOfCode()->listYears());
+ $FRAME_OPTIONS->setForcedRedirect($SITE->modules->AdventOfCode()->getURLForYear($year));
+ return;
+}
+else
+{
+ $year = intval($ROUTE->parameter['year']);
+
+ if (in_array($year, $SITE->modules->AdventOfCode()->listYears()))
+ {
+ $FRAME_OPTIONS->setForcedRedirect($SITE->modules->AdventOfCode()->getURLForYear($year));
+ return;
+ }
+ else
+ {
+ $FRAME_OPTIONS->setForced404('Advent of Code not found');
+ return;
+ }
+}
+?>
diff --git a/www/pages/blog_view.php b/www/pages/blog_view.php
index 595c105..814fafc 100644
--- a/www/pages/blog_view.php
+++ b/www/pages/blog_view.php
@@ -18,7 +18,7 @@ $FRAME_OPTIONS->canonical_url = $post['canonical'];
if ($post['type'] == 'euler')
$FRAME_OPTIONS->activeHeader = 'euler';
-else if ($post['type'] == 'euler' && $post['issubview'])
+else if ($post['type'] == 'aoc')
$FRAME_OPTIONS->activeHeader = 'aoc';
else
$FRAME_OPTIONS->activeHeader = 'blog';
diff --git a/www/pages/books_view.php b/www/pages/books_view.php
index 59de11a..422bbf7 100644
--- a/www/pages/books_view.php
+++ b/www/pages/books_view.php
@@ -14,7 +14,7 @@ if ($book === null) { $FRAME_OPTIONS->setForced404("Books not found"); return; }
$FRAME_OPTIONS->title = $book['title'];
$FRAME_OPTIONS->canonical_url = $book['url'];
-$FRAME_OPTIONS->activeHeader = 'book';
+$FRAME_OPTIONS->activeHeader = 'books';
$FRAME_OPTIONS->addScript('/data/javascript/ms_basic.js', true);
?>