summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornavewindre <boneyaard@gmail.com>2026-02-11 06:12:26 +0100
committernavewindre <boneyaard@gmail.com>2026-02-11 06:12:26 +0100
commite66257a6f66bf905d82c8df6e4e4d1a1509e0810 (patch)
tree5f035f8878a611997a6953fed97bf7dc3cc82c14
parentb8fce7dbca4383a46f74329af4666a09feb2853e (diff)
click callback for auto navigation, rendering fixes
-rw-r--r--web/renderer/index.js30
-rw-r--r--web/src/blog.tsx4
-rw-r--r--web/src/jsx.tsx32
-rw-r--r--web/src/pkg.tsx4
-rw-r--r--web/src/sidebar.tsx6
5 files changed, 65 insertions, 11 deletions
diff --git a/web/renderer/index.js b/web/renderer/index.js
index 497d245..2829275 100644
--- a/web/renderer/index.js
+++ b/web/renderer/index.js
@@ -46,13 +46,13 @@ let cache = async ( req, res ) => {
console.log( "caching page: " + target );
fs.writeFileSync( file, html );
- await page.close();
const headers = r.headers();
+ await page.close();
res.writeHead( 200, {
- 'content-type': headers['content-type'],
- 'date': headers['date'],
- 'etag': headers['etag'],
+ 'content-type': headers['content-type'] || "text/html",
+ 'date': headers['date'] || "",
+ 'etag': headers['etag'] || "",
} );
res.end( html );
@@ -62,12 +62,34 @@ let cache = async ( req, res ) => {
}
}
+let allowedExt = [
+ ".html",
+ ".xml",
+ ".css",
+ ".ico",
+ ".js",
+ "/"
+];
+
app.get( "/", cache );
app.get( /\/$/, cache );
app.get( /#$/, cache );
app.get( /^\/[^.]*$/, cache );
app.use( async ( req, res ) => {
let url = new URL( req.url, host );
+ let found = 0;
+ for( let ext of allowedExt ) {
+ if( url.pathname.endsWith( ext ) ) {
+ found = 1;
+ break;
+ }
+ }
+
+ if( !found ) {
+ res.status( 403 );
+ return res.end( "forbidden" );
+ }
+
const r = await fetch( url.href );
if( r.ok ) {
diff --git a/web/src/blog.tsx b/web/src/blog.tsx
index 1fcfec2..738dd7c 100644
--- a/web/src/blog.tsx
+++ b/web/src/blog.tsx
@@ -53,11 +53,11 @@ function BlogEntry( props: any ) {
../
</a> }
{ entry.name != "../" && !entry.isdir &&
- <a href='#' onclick={ () => JSX.navigate( urlForHref( entry.name, entry.isdir ) ) } class="package-entry-link">
+ <a href={ urlForHref( entry.name, entry.isdir ) } class="package-entry-link">
{entry.name.replace( /_/g, " " )}
</a> }
{ entry.name != "../" && entry.isdir &&
- <a href='#' onclick={ () => JSX.navigate( urlForHref( entry.name, entry.isdir ) ) } class="package-entry-link">
+ <a href={ urlForHref( entry.name, entry.isdir ) } class="package-entry-link">
{entry.name}
</a> }
</td>
diff --git a/web/src/jsx.tsx b/web/src/jsx.tsx
index 749e93f..1243398 100644
--- a/web/src/jsx.tsx
+++ b/web/src/jsx.tsx
@@ -78,6 +78,7 @@ export function onPostNavigate( callback: Function ) {
onpostnavigate = callback;
}
+
/**
* replaces the root element with the route component
**/
@@ -127,6 +128,17 @@ export function navigateParams( route: string, params: any ) {
}
/**
+ * convenience function to pass to href elements
+ **/
+export function href( e: Event ) {
+ const el = $( e.target );
+ if( el.is( 'a' ) ) {
+ e.preventDefault();
+ navigate( el.attr( 'href' ) );
+ }
+}
+
+/**
* wrapper for history.pushState
**/
export function pushParams( params: any ) {
@@ -302,3 +314,23 @@ export function createFragment( props: any ) {
function setTitle() {
document.title = defaultTitle;
}
+
+document.addEventListener( "click", e => {
+ let a = ( e.target ) as HTMLAnchorElement;
+ if( !a )
+ return;
+ if( a.origin !== location.origin )
+ return;
+
+ e.preventDefault();
+ if( !a.onclick ) {
+ if( routeForPath( a.pathname ) )
+ return navigate( a.pathname );
+
+ const hasExt = /\.[a-zA-Z0-9]{1,8}$/.test( a.href );
+ if( hasExt )
+ location.href = a.href;
+ else
+ navigate( err404page );
+ }
+} );
diff --git a/web/src/pkg.tsx b/web/src/pkg.tsx
index b1f38c9..95ea242 100644
--- a/web/src/pkg.tsx
+++ b/web/src/pkg.tsx
@@ -32,11 +32,11 @@ function PackageEntry( props: any ) {
../
</a> }
{ entry.name != "../" && !entry.isdir &&
- <a href={urlForHref( entry.name, entry.isdir )} class="package-entry-link">
+ <a href={ urlForHref( entry.name, entry.isdir ) } class="package-entry-link">
{entry.name}
</a> }
{ entry.name != "../" && entry.isdir &&
- <a href='#' onclick={ () => JSX.navigate( urlForHref( entry.name, entry.isdir ) ) } class="package-entry-link">
+ <a href={ urlForHref( entry.name, entry.isdir ) } class="package-entry-link">
{entry.name}
</a> }
</td>
diff --git a/web/src/sidebar.tsx b/web/src/sidebar.tsx
index 6ada6f9..9fa6b71 100644
--- a/web/src/sidebar.tsx
+++ b/web/src/sidebar.tsx
@@ -89,21 +89,21 @@ export function Sidebar() {
<hr/>
<div class="sidebar-row">
<h4>
- <a class="nogradient" style="margin-bottom: 0" href="#" onclick={ () => JSX.navigate( "/" ) }>
+ <a class="nogradient" style="margin-bottom: 0" href="/">
homepage
</a>
</h4>
</div>
<div class="sidebar-row" style="margin-top: -18px">
<h4>
- <a class="nogradient" href="#" onclick={ () => JSX.navigate( "/pkg" ) }>
+ <a class="nogradient" href="/pkg">
slackware packages
</a>
</h4>
</div>
<div class="sidebar-row" style="margin-top: -18px">
<h4>
- <a class="nogradient" href="#" onclick={ () => JSX.navigate( "/blog" ) }>
+ <a class="nogradient" href="/blog">
blog entries
</a>
</h4>