Browse Source

draft index menu

main
ghost 11 months ago
parent
commit
05f9929e37
  1. 4
      example/config.json
  2. 371
      src/server.php

4
example/config.json

@ -29,10 +29,14 @@ @@ -29,10 +29,14 @@
},
"string":
{
"resources":"Resources",
"links":"Links",
"sections":"Sections",
"pages":"Pages",
"actions":"Actions",
"main":"Main page",
"source":"Source",
"welcome":"About",
"about":"=> https://github.com/YGGverse/dokuwiki-gemini-server GitHub"
}
}

371
src/server.php

@ -107,131 +107,304 @@ $server->setHandler( @@ -107,131 +107,304 @@ $server->setHandler(
// Route begin
switch ($request->getPath())
{
// Home request
// Static route here
case null:
case '/':
case false:
case '':
if ($path = $filesystem->getPagePathByUri($config->dokuwiki->uri->home))
{
$reader = new \Yggverse\Gemini\Dokuwiki\Reader();
// @TODO redirect to document root (/)
$response->setContent(
$reader->toGemini(
file_get_contents(
$path
)
)
);
break;
return $response;
}
case '/search':
// @TODO implement search feature
break;
// Internal page request
default:
if (preg_match('/^\/([^\/]*)$/', $request->getPath(), $matches))
// Parse request
preg_match('/^\/([^\/]*)$/', $request->getPath(), $matches);
$uri = isset($matches[1]) ? $matches[1] : '';
// Directory request, build index links as no side menu in gemini version
if ($directory = $filesystem->getDirectoryPathByUri($uri))
{
if (!empty($matches[1]))
// Check for cached results
/*
if ($content = $memory->get('/'))
{
if ($path = $filesystem->getPagePathByUri($matches[1]))
{
// Check for cached results
if ($content = $memory->get($path))
{
$response->setContent(
$content
);
return $response;
}
// Init reader
$reader = new \Yggverse\Gemini\Dokuwiki\Reader();
// Define base URL
$reader->setMacros(
'~URL:base~',
sprintf(
'gemini://%s%s/%s',
$config->gemini->server->host,
$config->gemini->server->port == 1965 ? null : ':' . $config->gemini->server->port,
'' // @TODO append relative prefix (:)
)
);
$response->setContent(
$content
);
return $response;
}
*/
// Build home page
$lines = [
PHP_EOL
];
// Append header
$lines[] = sprintf(
'# %s',
$config->string->welcome
);
// Get children sections
$sections = [];
// Convert
$gemini = $reader->toGemini(
file_get_contents(
foreach ($filesystem->getTree() as $path => $files)
{
if (str_starts_with($path, $directory) && $path != $directory)
{
$sections[] = sprintf(
'=> gemini://%s%s/%s',
$config->gemini->server->host,
$config->gemini->server->port == 1965 ? null : ':' . $config->gemini->server->port,
$filesystem->getDirectoryUriByPath(
$path
)
);
}
}
$lines = [
$gemini
];
// Get page links
if ($links = $reader->getLinks($gemini))
{
$lines[] = sprintf(
'## %s',
$config->string->links
);
foreach ($links as $link)
{
$lines[] = sprintf(
'=> %s',
$link
);
}
}
// Append actions header
$lines[] = sprintf(
'## %s',
$config->string->actions
);
if ($sections)
{
// Keep unique
$sections = array_unique(
$sections
);
// Sort asc
sort(
$sections
);
// Append header
$lines[] = sprintf(
'## %s',
$config->string->sections
);
// Append sections
foreach ($sections as $section)
{
$lines[] = $section;
}
}
// Append source and homepage link
$lines[] = sprintf(
'=> gemini://%s%s %s',
// Get children pages
$pages = [];
foreach ($filesystem->getPagePathsByPath($directory) as $file)
{
$pages[] = sprintf(
'=> gemini://%s%s/%s',
$config->gemini->server->host,
$config->gemini->server->port == 1965 ? null : ':' . $config->gemini->server->port,
$filesystem->getPageUriByPath(
$file
)
);
}
if ($pages)
{
// Keep unique
$pages = array_unique(
$pages
);
// Sort asc
sort(
$pages
);
// Append header
$lines[] = sprintf(
'## %s',
$config->string->pages
);
// Append pages
foreach ($pages as $page)
{
$lines[] = $page;
}
}
// Append about info
$lines[] = sprintf(
'## %s',
$config->string->resources
);
// Append source link
$lines[] = sprintf(
'=> %s %s',
$config->dokuwiki->url->source,
$config->string->source
);
// Append about info
$lines[] = $config->string->about;
// Merge lines
$content = implode(
PHP_EOL,
$lines
);
// @TODO '~index:menu~'
// Cache results
$memory->set(
'/',
$content
);
// Response
$response->setContent(
$content
);
return $response;
}
// File request, get page content
if ($path = $filesystem->getPagePathByUri($uri))
{
// Check for cached results
if ($content = $memory->get($path))
{
$response->setContent(
$content
);
return $response;
}
// Init reader
$reader = new \Yggverse\Gemini\Dokuwiki\Reader();
// Define base URL
$reader->setMacros(
'~URL:base~',
sprintf(
'gemini://%s%s/%s',
$config->gemini->server->host,
$config->gemini->server->port == 1965 ? null : ':' . $config->gemini->server->port,
'' // @TODO append relative prefix (:)
)
);
// Define index menu
/* @TODO
$pages = [];
if ($directory = $filesystem->getDirectoryPathByUri($uri))
{
foreach ($filesystem->getPagePathsByPath($directory) as $file)
{
$pages[] = sprintf(
'=> gemini://%s%s/%s',
$config->gemini->server->host,
$config->gemini->server->port == 1965 ? null : ':' . $config->gemini->server->port,
$config->string->main
$filesystem->getPageUriByPath(
$file
)
);
}
}
// Append source link
$lines[] = sprintf(
'=> %s/%s %s',
$config->dokuwiki->url->source,
$matches[1],
$config->string->source
);
if ($pages)
{
$reader->setRule(
'/\{\{indexmenu>:([^\}]+)\}\}/i',
implode(
PHP_EOL,
$pages
)
);
}
*/
// Append about info
$lines[] = $config->string->about;
// Convert
$gemini = $reader->toGemini(
file_get_contents(
$path
)
);
// Merge lines
$content = implode(
PHP_EOL,
$lines
);
$lines = [
$gemini
];
// Cache results
$memory->set(
$path,
$content
);
// Get page links
if ($links = $reader->getLinks($gemini))
{
$lines[] = sprintf(
'## %s',
$config->string->links
);
// Response
$response->setContent(
$content
foreach ($links as $link)
{
$lines[] = sprintf(
'=> %s',
$link
);
return $response;
}
}
// Append actions header
$lines[] = sprintf(
'## %s',
$config->string->actions
);
// Append source and homepage link
$lines[] = sprintf(
'=> gemini://%s%s %s',
$config->gemini->server->host,
$config->gemini->server->port == 1965 ? null : ':' . $config->gemini->server->port,
$config->string->main
);
// Append source link
$lines[] = sprintf(
'=> %s/%s %s',
$config->dokuwiki->url->source,
$matches[1],
$config->string->source
);
// Append about info
$lines[] = $config->string->about;
// Merge lines
$content = implode(
PHP_EOL,
$lines
);
// Cache results
$memory->set(
$path,
$content
);
// Response
$response->setContent(
$content
);
return $response;
}
}

Loading…
Cancel
Save