From fab623885c80d1f841c9281520a2258795c23547 Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 31 Jan 2024 10:57:34 +0200 Subject: [PATCH] initial commit --- .gitignore | 3 + composer.json | 17 +++++ example/config.json | 21 ++++++ host/.gitignore | 1 + src/server.php | 164 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 206 insertions(+) create mode 100644 .gitignore create mode 100644 composer.json create mode 100644 example/config.json create mode 100644 host/.gitignore create mode 100644 src/server.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05388a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/vendor/ + +composer.lock \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..27ddc38 --- /dev/null +++ b/composer.json @@ -0,0 +1,17 @@ +{ + "name": "yggverse/dokuwiki-gemini-server", + "description": "DokuWiki bridge for Gemini Protocol", + "keywords": [ "yggverse", "gemini", "gemini-protocol", "gemini-server", "wiki", "dokuwiki", "bridge", "server" ], + "homepage": "https://github.com/yggverse/dokuwiki-to-gemini", + "type": "project", + "require": { + "yggverse/gemini": "^0.1", + "yggverse/titan-ii": "^1.0" + }, + "license": "MIT", + "autoload": { + "psr-4": { + "Yggverse\\DokuwikiGeminiServer\\": "src/" + } + } +} diff --git a/example/config.json b/example/config.json new file mode 100644 index 0000000..e4cf458 --- /dev/null +++ b/example/config.json @@ -0,0 +1,21 @@ +{ + "gemini": + { + "server": + { + "host":"127.0.0.1", + "port":1965 + } + }, + "dokuwiki": + { + "uri": + { + "home":"start" + }, + "url": + { + "canonical":"http://.." + } + } +} \ No newline at end of file diff --git a/host/.gitignore b/host/.gitignore new file mode 100644 index 0000000..aa51ac1 --- /dev/null +++ b/host/.gitignore @@ -0,0 +1 @@ +/*/ \ No newline at end of file diff --git a/src/server.php b/src/server.php new file mode 100644 index 0000000..ce7b31d --- /dev/null +++ b/src/server.php @@ -0,0 +1,164 @@ +setCert( + __DIR__ . '/../host/' . $argv[1] . '/cert.pem' +); + +$server->setKey( + __DIR__ . '/../host/' . $argv[1] . '/key.rsa' +); + +$server->setHandler( + function (\Yggverse\TitanII\Request $request): \Yggverse\TitanII\Response + { + global $config; + global $filesystem; + + $response = new \Yggverse\TitanII\Response(); + + $response->setCode( + 20 + ); + + $response->setMeta( + 'text/gemini' + ); + + // Route begin + switch ($request->getPath()) + { + // Home request + case null: + case '/': + + if ($path = $filesystem->getPagePathByUri($config->dokuwiki->uri->home)) + { + $reader = new \Yggverse\Gemini\Dokuwiki\Reader(); + + $response->setContent( + $reader->toGemini( + file_get_contents( + $path + ) + ) + ); + + return $response; + } + + // Internal page request + default: + + if (preg_match('/^\/([^\/]*)$/', $request->getPath(), $matches)) + { + if (!empty($matches[1])) + { + if ($path = $filesystem->getPagePathByUri($matches[1])) + { + $reader = new \Yggverse\Gemini\Dokuwiki\Reader(); + + $response->setContent( + $reader->toGemini( + file_get_contents( + $path + ) + ) + ); + + return $response; + } + } + } + } + + // Route not found + $response->setCode( + 51 + ); + + return $response; + } +); + +// Start server +echo sprintf( + _('Server "%s" started on %s:%d') . PHP_EOL, + $argv[1], + $config->gemini->server->host, + $config->gemini->server->port +); + +$server->start( + $config->gemini->server->host, + $config->gemini->server->port +); \ No newline at end of file