diff --git a/docker_dev/mysql_schema.sql b/docker_dev/mysql_schema.sql index baf0a58..869935a 100644 --- a/docker_dev/mysql_schema.sql +++ b/docker_dev/mysql_schema.sql @@ -6,7 +6,6 @@ USE dragon_fire; CREATE TABLE posts ( post_id INTEGER AUTO_INCREMENT, - host VARCHAR(64) NOT NULL, post_path VARCHAR(255) NOT NULL, post_path_depth INTEGER NOT NULL DEFAULT 0, @@ -21,9 +20,9 @@ CREATE TABLE posts ( post_content MEDIUMTEXT, PRIMARY KEY(post_id), - CONSTRAINT unique_post UNIQUE (host, post_path), + CONSTRAINT unique_post_path UNIQUE (post_path), - INDEX(host, post_path), + INDEX(post_path), INDEX(post_path_depth, post_path), INDEX(post_create_time), INDEX(post_update_time) @@ -31,7 +30,6 @@ CREATE TABLE posts ( CREATE TABLE path_access_counts ( access_time DATETIME NOT NULL, - host VARCHAR(64) NOT NULL, post_path VARCHAR(255), agent VARCHAR(255), referrer VARCHAR(255), @@ -39,11 +37,10 @@ CREATE TABLE path_access_counts ( path_access_count INTEGER DEFAULT 0, path_processing_time DOUBLE PRECISION DEFAULT 0, - PRIMARY KEY(access_time, host, post_path, agent, referrer) + PRIMARY KEY(access_time, post_path, agent, referrer) ); CREATE TABLE feed_cache ( - host VARCHAR(64) NOT NULL, search_path VARCHAR(255), export_type VARCHAR(255), @@ -51,7 +48,7 @@ CREATE TABLE feed_cache ( feed_content MEDIUMTEXT, - PRIMARY KEY(host, search_path, export_type) + PRIMARY KEY(search_path, export_type) ); INSERT INTO posts (post_path, post_path_depth, post_metadata, post_content) diff --git a/www/.htaccess b/www/.htaccess index eb86f63..d624f34 100644 --- a/www/.htaccess +++ b/www/.htaccess @@ -3,21 +3,12 @@ AddType text/plain .md AddType text/plain .atom AddType text/plain .rss -# php_value upload_max_filesize 40M -# php_value post_max_size 42M +php_value upload_max_filesize 40M +php_value post_max_size 42M RewriteEngine On RewriteBase / -RewriteCond %{REQUEST_URI} !^/(raw|static)/ -RewriteRule ^.*\.(flv|gif|ico|jpg|jpeg|mp4|mpeg|png|svg|swf|webp)$ raw/%{HTTP_HOST}%{REQUEST_URI} [L,END] - -RewriteRule ^/?raw/(.*)$ raw/%{HTTP_HOST}/$1 [L,END] - -RewriteEngine On -RewriteCond %{HTTPS} !on -RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,END] - RewriteCond %{REQUEST_URI} !^/?(static|raw|robots\.txt).* RewriteRule (.*) router.php diff --git a/www/composer.json b/www/composer.json index 4edcc55..eb01954 100644 --- a/www/composer.json +++ b/www/composer.json @@ -4,9 +4,6 @@ "twig/markdown-extra": "^3.6", "league/commonmark": "^2.4", "spatie/yaml-front-matter": "^2.0", - "laminas/laminas-feed": "^2.6", - "erusev/parsedown": "^1.7", - "erusev/parsedown-extra": "^0.8.1", - "scrivo/highlight.php": "v9.18.1.10" + "laminas/laminas-feed": "^2.6" } } diff --git a/www/composer.lock b/www/composer.lock index c157e3a..e227088 100644 --- a/www/composer.lock +++ b/www/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "34ef4bdab7508bbe6f60a1a56e33d08c", + "content-hash": "ae80529cc2442878a51f38de1f7017a4", "packages": [ { "name": "dflydev/dot-access-data", @@ -81,442 +81,6 @@ }, "time": "2022-10-27T11:44:00+00:00" }, - { - "name": "erusev/parsedown", - "version": "1.7.4", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35" - }, - "type": "library", - "autoload": { - "psr-0": { - "Parsedown": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", - "keywords": [ - "markdown", - "parser" - ], - "support": { - "issues": "https://github.com/erusev/parsedown/issues", - "source": "https://github.com/erusev/parsedown/tree/1.7.x" - }, - "time": "2019-12-30T22:54:17+00:00" - }, - { - "name": "erusev/parsedown-extra", - "version": "0.8.1", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown-extra.git", - "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/91ac3ff98f0cea243bdccc688df43810f044dcef", - "reference": "91ac3ff98f0cea243bdccc688df43810f044dcef", - "shasum": "" - }, - "require": { - "erusev/parsedown": "^1.7.4" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35" - }, - "type": "library", - "autoload": { - "psr-0": { - "ParsedownExtra": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "An extension of Parsedown that adds support for Markdown Extra.", - "homepage": "https://github.com/erusev/parsedown-extra", - "keywords": [ - "markdown", - "markdown extra", - "parsedown", - "parser" - ], - "support": { - "issues": "https://github.com/erusev/parsedown-extra/issues", - "source": "https://github.com/erusev/parsedown-extra/tree/0.8.x" - }, - "time": "2019-12-30T23:20:37+00:00" - }, - { - "name": "laminas/laminas-escaper", - "version": "2.13.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/af459883f4018d0f8a0c69c7a209daef3bf973ba", - "reference": "af459883f4018d0f8a0c69c7a209daef3bf973ba", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-mbstring": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "conflict": { - "zendframework/zend-escaper": "*" - }, - "require-dev": { - "infection/infection": "^0.27.0", - "laminas/laminas-coding-standard": "~2.5.0", - "maglnet/composer-require-checker": "^3.8.0", - "phpunit/phpunit": "^9.6.7", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.9" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\Escaper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "homepage": "https://laminas.dev", - "keywords": [ - "escaper", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-escaper/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-escaper/issues", - "rss": "https://github.com/laminas/laminas-escaper/releases.atom", - "source": "https://github.com/laminas/laminas-escaper" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2023-10-10T08:35:13+00:00" - }, - { - "name": "laminas/laminas-feed", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-feed.git", - "reference": "c1594cb32b117d3b409d4beee12c724cb26daa71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/c1594cb32b117d3b409d4beee12c724cb26daa71", - "reference": "c1594cb32b117d3b409d4beee12c724cb26daa71", - "shasum": "" - }, - "require": { - "laminas/laminas-escaper": "~2.5", - "laminas/laminas-stdlib": "~2.5", - "laminas/laminas-zendframework-bridge": "^1.0", - "php": ">=5.5" - }, - "replace": { - "zendframework/zend-feed": "self.version" - }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "laminas/laminas-cache": "~2.5", - "laminas/laminas-db": "~2.5", - "laminas/laminas-http": "~2.5", - "laminas/laminas-validator": "~2.5", - "phpunit/phpunit": "~4.0", - "psr/http-message": "^1.0" - }, - "suggest": { - "laminas/laminas-cache": "Laminas\\Cache component, for optionally caching feeds between requests", - "laminas/laminas-db": "Laminas\\Db component, for use with PubSubHubbub", - "laminas/laminas-http": "Laminas\\Http for PubSubHubbub, and optionally for use with Laminas\\Feed\\Reader", - "laminas/laminas-servicemanager": "Laminas\\ServiceManager component, for easily extending ExtensionManager implementations", - "laminas/laminas-validator": "Laminas\\Validator component, for validating feeds and Atom entries in the Writer subcomponent", - "psr/http-message": "PSR-7 ^1.0, if you wish to use Laminas\\Feed\\Reader\\Http\\Psr7ResponseDecorator" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev", - "dev-develop": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\Feed\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides functionality for consuming RSS and Atom feeds", - "homepage": "https://laminas.dev", - "keywords": [ - "feed", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-feed/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-feed/issues", - "rss": "https://github.com/laminas/laminas-feed/releases.atom", - "source": "https://github.com/laminas/laminas-feed" - }, - "time": "2019-12-31T16:50:31+00:00" - }, - { - "name": "laminas/laminas-hydrator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-hydrator.git", - "reference": "acab29a3327a70be0a653d88906655b15de15517" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-hydrator/zipball/acab29a3327a70be0a653d88906655b15de15517", - "reference": "acab29a3327a70be0a653d88906655b15de15517", - "shasum": "" - }, - "require": { - "laminas/laminas-stdlib": "^2.5.1", - "laminas/laminas-zendframework-bridge": "^1.0", - "php": ">=5.5" - }, - "replace": { - "zendframework/zend-hydrator": "self.version" - }, - "require-dev": { - "laminas/laminas-eventmanager": "^2.5.1", - "laminas/laminas-filter": "^2.5.1", - "laminas/laminas-inputfilter": "^2.5.1", - "laminas/laminas-serializer": "^2.5.1", - "laminas/laminas-servicemanager": "^2.5.1", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "^2.0@dev" - }, - "suggest": { - "laminas/laminas-eventmanager": "^2.5.1, to support aggregate hydrator usage", - "laminas/laminas-filter": "^2.5.1, to support naming strategy hydrator usage", - "laminas/laminas-serializer": "^2.5.1, to use the SerializableStrategy", - "laminas/laminas-servicemanager": "^2.5.1, to support hydrator plugin manager usage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev", - "dev-develop": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\Hydrator\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "homepage": "https://laminas.dev", - "keywords": [ - "hydrator", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-hydrator/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-hydrator/issues", - "rss": "https://github.com/laminas/laminas-hydrator/releases.atom", - "source": "https://github.com/laminas/laminas-hydrator" - }, - "time": "2019-12-31T17:06:20+00:00" - }, - { - "name": "laminas/laminas-stdlib", - "version": "2.7.4", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-stdlib.git", - "reference": "b69e2741673daabdf720bc76668448ceb1e4c537" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/b69e2741673daabdf720bc76668448ceb1e4c537", - "reference": "b69e2741673daabdf720bc76668448ceb1e4c537", - "shasum": "" - }, - "require": { - "laminas/laminas-hydrator": "~1.0", - "laminas/laminas-zendframework-bridge": "^1.0", - "php": ">=5.5" - }, - "replace": { - "zendframework/zend-stdlib": "self.version" - }, - "require-dev": { - "athletic/athletic": "~0.1", - "fabpot/php-cs-fixer": "1.7.*", - "laminas/laminas-config": "~2.5", - "laminas/laminas-eventmanager": "~2.5", - "laminas/laminas-filter": "~2.5", - "laminas/laminas-inputfilter": "~2.5", - "laminas/laminas-serializer": "~2.5", - "laminas/laminas-servicemanager": "~2.5", - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "laminas/laminas-eventmanager": "To support aggregate hydrator usage", - "laminas/laminas-filter": "To support naming strategy hydrator usage", - "laminas/laminas-serializer": "Laminas\\Serializer component", - "laminas/laminas-servicemanager": "To support hydrator plugin manager usage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev", - "dev-develop": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\Stdlib\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "homepage": "https://laminas.dev", - "keywords": [ - "laminas", - "stdlib" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-stdlib/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-stdlib/issues", - "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", - "source": "https://github.com/laminas/laminas-stdlib" - }, - "time": "2019-12-31T17:51:00+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "eb0d96c708b92177a92bc2239543d3ed523452c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/eb0d96c708b92177a92bc2239543d3ed523452c6", - "reference": "eb0d96c708b92177a92bc2239543d3ed523452c6", - "shasum": "" - }, - "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.4", - "psalm/plugin-phpunit": "^0.18.0", - "squizlabs/php_codesniffer": "^3.7.1", - "vimeo/psalm": "^5.16.0" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "abandoned": true, - "time": "2023-11-24T13:56:19+00:00" - }, { "name": "league/commonmark", "version": "2.4.1", @@ -769,16 +333,16 @@ }, { "name": "nette/utils", - "version": "v4.0.3", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015" + "reference": "cead6637226456b35e1175cc53797dd585d85545" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015", - "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015", + "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", + "reference": "cead6637226456b35e1175cc53797dd585d85545", "shasum": "" }, "require": { @@ -849,9 +413,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.3" + "source": "https://github.com/nette/utils/tree/v4.0.2" }, - "time": "2023-10-29T21:02:13+00:00" + "time": "2023-09-19T11:58:07+00:00" }, { "name": "psr/event-dispatcher", @@ -903,101 +467,23 @@ }, "time": "2019-01-08T18:20:26+00:00" }, - { - "name": "scrivo/highlight.php", - "version": "v9.18.1.10", - "source": { - "type": "git", - "url": "https://github.com/scrivo/highlight.php.git", - "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/850f4b44697a2552e892ffe71490ba2733c2fc6e", - "reference": "850f4b44697a2552e892ffe71490ba2733c2fc6e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=5.4" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.7", - "sabberworm/php-css-parser": "^8.3", - "symfony/finder": "^2.8|^3.4|^5.4", - "symfony/var-dumper": "^2.8|^3.4|^5.4" - }, - "suggest": { - "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" - }, - "type": "library", - "autoload": { - "files": [ - "HighlightUtilities/functions.php" - ], - "psr-0": { - "Highlight\\": "", - "HighlightUtilities\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Geert Bergman", - "homepage": "http://www.scrivo.org/", - "role": "Project Author" - }, - { - "name": "Vladimir Jimenez", - "homepage": "https://allejo.io", - "role": "Maintainer" - }, - { - "name": "Martin Folkers", - "homepage": "https://twobrain.io", - "role": "Contributor" - } - ], - "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", - "keywords": [ - "code", - "highlight", - "highlight.js", - "highlight.php", - "syntax" - ], - "support": { - "issues": "https://github.com/scrivo/highlight.php/issues", - "source": "https://github.com/scrivo/highlight.php" - }, - "funding": [ - { - "url": "https://github.com/allejo", - "type": "github" - } - ], - "time": "2022-12-17T21:53:22+00:00" - }, { "name": "spatie/yaml-front-matter", - "version": "2.0.8", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/spatie/yaml-front-matter.git", - "reference": "f2f1f749a405fafc9d6337067c92c062d51a581c" + "reference": "f49f228994de70827ca857efffdd3bd7703aea34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/f2f1f749a405fafc9d6337067c92c062d51a581c", - "reference": "f2f1f749a405fafc9d6337067c92c062d51a581c", + "url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/f49f228994de70827ca857efffdd3bd7703aea34", + "reference": "f49f228994de70827ca857efffdd3bd7703aea34", "shasum": "" }, "require": { "php": "^7.0|^8.0", - "symfony/yaml": "^3.0|^4.0|^5.0|^6.0|^7.0" + "symfony/yaml": "^3.0|^4.0|^5.0|^6.0" }, "require-dev": { "phpunit/phpunit": "^9.0" @@ -1029,7 +515,7 @@ "yaml" ], "support": { - "source": "https://github.com/spatie/yaml-front-matter/tree/2.0.8" + "source": "https://github.com/spatie/yaml-front-matter/tree/2.0.7" }, "funding": [ { @@ -1041,11 +527,11 @@ "type": "github" } ], - "time": "2023-12-04T10:02:52+00:00" + "time": "2022-04-06T12:03:55+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -1092,7 +578,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -1360,27 +846,28 @@ }, { "name": "symfony/yaml", - "version": "v7.0.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0055b230c408428b9b5cde7c55659555be5c0278" + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0055b230c408428b9b5cde7c55659555be5c0278", - "reference": "0055b230c408428b9b5cde7c55659555be5c0278", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", + "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<5.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "symfony/console": "^5.4|^6.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -1411,7 +898,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.0.0" + "source": "https://github.com/symfony/yaml/tree/v6.3.3" }, "funding": [ { @@ -1427,32 +914,32 @@ "type": "tidelift" } ], - "time": "2023-11-07T10:26:03+00:00" + "time": "2023-07-31T07:08:24+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.8.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "b6e4954ab60030233df5d293886b5404558daac8" + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/b6e4954ab60030233df5d293886b5404558daac8", - "reference": "b6e4954ab60030233df5d293886b5404558daac8", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/83dfa86a0379f784ea30bdb9c15a356b8aabf780", + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780", "shasum": "" }, "require": { - "php": ">=7.2.5", - "twig/twig": "^3.0" + "php": ">=7.1.3", + "twig/twig": "^2.7|^3.0" }, "require-dev": { "erusev/parsedown": "^1.7", "league/commonmark": "^1.0|^2.0", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", - "symfony/phpunit-bridge": "^6.4|^7.0" + "symfony/phpunit-bridge": "^5.4|^6.3" }, "type": "library", "autoload": { @@ -1483,7 +970,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.8.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.7.1" }, "funding": [ { @@ -1495,31 +982,30 @@ "type": "tidelift" } ], - "time": "2023-11-21T14:02:01+00:00" + "time": "2023-07-29T15:34:56+00:00" }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", "autoload": { @@ -1555,7 +1041,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" }, "funding": [ { @@ -1567,7 +1053,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2023-08-28T11:09:02+00:00" } ], "packages-dev": [], diff --git a/www/dergdown.php b/www/dergdown.php deleted file mode 100644 index 8380be7..0000000 --- a/www/dergdown.php +++ /dev/null @@ -1,39 +0,0 @@ - - -highlighter = new Highlighter(); - } - - protected function blockFencedCodeComplete($block) - { - if (! isset($block['element']['text']['attributes'])) { - return $block; - } - - $code = $block['element']['text']['text']; - $languageClass = $block['element']['text']['attributes']['class']; - $language = explode('-', $languageClass); - - try { - $highlighted = $this->highlighter->highlight($language[1], $code); - $block['element']['text']['attributes']['class'] = vsprintf('%s hljs %s', [ - $languageClass, - $highlighted->language, - ]); - $block['element']['text']['rawHtml'] = $highlighted->value; - unset($block['element']['text']['text']); - } catch (DomainException $e) { - } - - return $block; - } -} \ No newline at end of file diff --git a/www/fontawesome.php b/www/fontawesome.php index 91b82d5..61f4c87 100644 --- a/www/fontawesome.php +++ b/www/fontawesome.php @@ -3,7 +3,6 @@ $FONT_AWESOME_ARRAY=[ 'markdown' => '', 'image' => '', - 'images' => '', 'folder' => '', 'rss' => '' ]; diff --git a/www/mysql_adapter.php b/www/mysql_adapter.php index 3d845b6..e9bdb5d 100644 --- a/www/mysql_adapter.php +++ b/www/mysql_adapter.php @@ -3,10 +3,8 @@ class MySQLAdapter { public $raw; - function __construct($SITE_CONFIG) { - $this->SITE_CONFIG = $SITE_CONFIG; - - $db_params = $SITE_CONFIG['db']; + function __construct() { + $db_params = json_decode(file_get_contents('secrets/db.json'), true); try { if(false !== getenv('MYSQL_HOST')) { @@ -16,16 +14,18 @@ class MySQLAdapter { getenv('MYSQL_PORT')); } else { - $this->raw = mysqli_connect($db_params['host'], - $db_params['user'], $db_params['password'], - $db_params['database'], - $db_params['port']); + $this->raw = mysqli_connect($db_params['MYSQL_HOST'], + $db_params['MYSQL_USER'], $db_params['MYSQL_PASSWORD'], + $db_params['MYSQL_DATABASE'], + $db_params['MYSQL_PORT']); } } catch (\Throwable $th) { echo 'Connection failed
'; echo 'Error number: ' . mysqli_connect_errno() . '
'; echo 'Error message: ' . mysqli_connect_error() . '
'; die(); + + //throw $th; } } @@ -69,14 +69,6 @@ class MySQLAdapter { return $post_data; } - function _normalize_post_array($post_data) { - $post_data ??= []; - - return array_map(function($post) { - return $this->_normalize_post_data($post); - }, $post_data); - } - function bump_post($post_path, $post_metadata = [], $create_dirs = true) { $post_path = $this->_sanitize_path($post_path); $path_depth = substr_count($post_path, "/"); @@ -87,13 +79,12 @@ class MySQLAdapter { $qry = " INSERT INTO posts - (host, post_path, post_path_depth, post_metadata, post_content) + (post_path, post_path_depth, post_metadata, post_content) VALUES - ( ?, ?, ?, ?, ?) AS new + ( ?, ?, ?, ?) AS new ON DUPLICATE KEY UPDATE post_path=new.post_path;"; - $this->_exec($qry, "ssiss", - $this->SITE_CONFIG['HTTP_HOST'], + $this->_exec($qry, "siss", $post_path, $path_depth, json_encode($post_metadata), @@ -119,28 +110,27 @@ class MySQLAdapter { $qry = "INSERT INTO path_access_counts (access_time, - host, post_path, agent, referrer, + post_path, agent, referrer, path_access_count, path_processing_time) VALUES ( from_unixtime(floor(unix_timestamp(CURRENT_TIMESTAMP) / 300)*300), - ?, ?, ?, ?, 1, ? + ?, ?, ?, 1, ? ) AS new ON DUPLICATE KEY UPDATE path_access_count=path_access_counts.path_access_count+1, path_processing_time=path_access_counts.path_processing_time+new.path_processing_time; "; - $this->_exec($qry, "ssssd", $this->SITE_CONFIG['HTTP_HOST'], $post_path, $agent, $referrer, $time); + $this->_exec($qry, "sssd", $post_path, $agent, $referrer, $time); if(preg_match('/^user/', $agent)) { - $this->_exec("UPDATE posts SET post_access_count=post_access_count+1 WHERE post_path=? AND host=?", "ss", - $post_path, $this->SITE_CONFIG['HTTP_HOST']); + $this->_exec("UPDATE posts SET post_access_count=post_access_count+1 WHERE post_path=?", "s", $post_path); } } function get_post_access_counters() { $qry = " - SELECT host, post_path, agent, path_access_count, path_processing_time + SELECT post_path, agent, path_access_count, path_processing_time FROM path_access_counts WHERE path_last_access_time > ( CURRENT_TIMESTAMP - INTERVAL 10 MINUTE ); "; @@ -167,7 +157,7 @@ class MySQLAdapter { function get_post_access_counters_line() { $qry = " - SELECT host, access_time, post_path, agent, referrer, path_access_count, path_processing_time + SELECT access_time, post_path, agent, referrer, path_access_count, path_processing_time FROM path_access_counts WHERE access_time < ( CURRENT_TIMESTAMP - INTERVAL 6 MINUTE ) ORDER BY access_time DESC; @@ -179,7 +169,7 @@ class MySQLAdapter { try { $data = $this->_exec($qry, "")->fetch_all(MYSQLI_ASSOC); - $data_prefix="access_metrics"; + $data_prefix="access_metrics,host=" . $_SERVER['SERVER_NAME']; $out_data = ""; @@ -190,8 +180,7 @@ class MySQLAdapter { if($path == '') { $path = '/'; } - $out_data .= $data_prefix . ",host=" . $post_data['host'] . ",agent=".$post_data['agent']; - $out_data .= ",path=".$path.",referrer=".$post_data['referrer']; + $out_data .= $data_prefix . ",agent=".$post_data['agent'].",path=".$path.",referrer=".$post_data['referrer']; $out_data .= " access_sum=" . $post_data['path_access_count'] . ",time_sum=" . $post_data['path_processing_time']; $out_data .= " " . strtotime($post_data['access_time']) . "000000000\n"; @@ -216,88 +205,8 @@ class MySQLAdapter { $this->_exec(" UPDATE posts SET post_settings_cache=NULL - WHERE host = ? AND post_path LIKE ?; - ", "ss", $this->SITE_CONFIG['HTTP_HOST'], $post_path . "%"); - } - - function escape_tag($tag) { - return preg_replace_callback('/[\WZ]/', function($match) { - return "Z" . ord($match[0]); - }, strtolower($tag)); - } - - function escape_search_tag($tag) { - preg_match("/^([\+\-]?)(.*?)(\*?)$/", $tag, $matches); - - if(!isset($matches[1])) { - echo "Problem with tag!"; - var_dump($tag); - } - - return $matches[1] . $this->escape_tag($matches[2]) . $matches[3]; - } - - function update_post_search_data($post_path, $post_tags) { - $post_tags []= "path:" . $post_path; - $post_tags []= "host:" . $this->SITE_CONFIG['HTTP_HOST']; - - $post_tags = array_unique($post_tags); - $post_tags = array_map(function($val) { - return $this->escape_tag($val); - }, $post_tags); - - asort($post_tags); - $post_tags = join(' ', $post_tags); - - $qry = " - INSERT INTO posts - ( host, post_path, post_tags ) - VALUES - ( ?, ?, ? ) AS new - ON DUPLICATE KEY - UPDATE post_tags=new.post_tags; - "; - - $this->_exec($qry, "sss", - $this->SITE_CONFIG['HTTP_HOST'], $post_path, $post_tags); - } - - function perform_post_search($taglist, $order = null, $limit = 20, $page = 0) { - $allowed_ordering = [ - "post_create_time" - ]; - - $qry = " - SELECT post_path, post_metadata - FROM posts - WHERE MATCH(post_tags) AGAINST (? IN BOOLEAN MODE) - "; - - if(!is_array($taglist)) { - $taglist = explode(' ', $taglist); - } - - $taglist []= '+host:' . $this->SITE_CONFIG['HTTP_HOST']; - $taglist = array_unique($taglist); - $taglist = array_map(function($key) { - return $this->escape_search_tag($key); - }, $taglist); - - $taglist = implode(' ', $taglist); - - if(isset($order) and in_array($order, $allowed_ordering)) { - $qry = $qry . " ORDER BY " . $order; - } - - $qry = $qry . " LIMIT ? OFFSET ?"; - - $search_results = $this->_exec($qry, "sii", $taglist, $limit, $limit * $page)->fetch_all(MYSQLI_ASSOC); - $search_results = [ - "query_string" => $taglist, - "results" => $this->_normalize_post_array($search_results) - ]; - - return $search_results; + WHERE post_path LIKE ?; + ", "s", $post_path . "%"); } function update_or_create_post($post_path, $post_metadata, $post_content) { @@ -310,22 +219,19 @@ class MySQLAdapter { $qry = " INSERT INTO posts - (host, post_path, post_path_depth, post_metadata, post_content) + (post_path, post_path_depth, post_metadata, post_content) VALUES - ( ?, ?, ?, ?, ?) AS new + ( ?, ?, ?, ?) AS new ON DUPLICATE KEY UPDATE post_metadata=new.post_metadata, post_content=new.post_content, post_update_time=CURRENT_TIMESTAMP;"; - $this->_exec($qry, "ssiss", - $this->SITE_CONFIG['HTTP_HOST'], + $this->_exec($qry, "siss", $post_path, $path_depth, json_encode($post_metadata), $post_content); - - $this->update_post_search_data($post_path, $post_metadata['tags'] ?? []); } function get_settings_for_path($post_path) { @@ -334,8 +240,8 @@ class MySQLAdapter { $post_settings = $this->_exec(" SELECT post_path, post_settings_cache FROM posts - WHERE post_path = ? AND host = ? - ", "ss", $post_path, $this->SITE_CONFIG['HTTP_HOST'])->fetch_assoc(); + WHERE post_path = ? + ", "s", $post_path)->fetch_assoc(); if(!isset($post_settings)) { return []; @@ -353,8 +259,8 @@ class MySQLAdapter { $post_metadata = $this->_exec(" SELECT post_path, post_metadata FROM posts - WHERE post_path = ? AND host = ? - ", "ss", $post_path, $this->SITE_CONFIG['HTTP_HOST'])->fetch_assoc(); + WHERE post_path = ? + ", "s", $post_path)->fetch_assoc(); if(isset($post_metadata['post_metadata'])) { $post_metadata = json_decode($post_metadata['post_metadata'], true); @@ -376,15 +282,16 @@ class MySQLAdapter { $with_subposts = false, $with_settings = true) { $qry = "SELECT * - FROM posts - WHERE post_path = ? AND host = ? + FROM posts WHERE post_path = ? "; $post_path = $this->_sanitize_path($post_path); - $post_data = $this->_exec($qry, "ss", $post_path, $this->SITE_CONFIG['HTTP_HOST'])->fetch_assoc(); + $post_data = $this->_exec($qry, "s", $post_path)->fetch_assoc(); - $post_data ??= ['found' => false]; + if(!isset($post_data)) { + $post_data = ['found' => false]; + } $post_data['post_path'] = $post_path; $post_data = $this->_normalize_post_data($post_data); @@ -412,17 +319,18 @@ class MySQLAdapter { $qry = "SELECT post_path, post_metadata, post_update_time FROM posts - WHERE - host = ? - AND (post_path LIKE CONCAT(?,'/%')) + WHERE (post_path LIKE CONCAT(?,'/%')) AND post_path_depth = ? - ORDER BY post_path ASC - LIMIT 50"; + ORDER BY post_create_time DESC + LIMIT 10"; - $post_data = $this->_exec($qry, "ssi", $this->SITE_CONFIG['HTTP_HOST'], - $path, $path_depth+1)->fetch_all(MYSQLI_ASSOC); + $post_data = $this->_exec($qry, "si", $path, $path_depth+1)->fetch_all(MYSQLI_ASSOC); - $post_data = $this->_normalize_post_array($post_data); + $fn = function($data) { + return $this->_normalize_post_data($data); + }; + + $post_data = array_map($fn, $post_data); return $post_data; } diff --git a/www/post_adapter.php b/www/post_adapter.php index 65b4ced..fc0297e 100644 --- a/www/post_adapter.php +++ b/www/post_adapter.php @@ -8,57 +8,12 @@ use Laminas\Feed\Writer\Feed; class PostHandler extends MySQLAdapter { public $data_directory; - function __construct($SITE_CONFIG) { - parent::__construct($SITE_CONFIG); + function __construct() { + parent::__construct(); - $this->data_directory = 'raw/' . $this->SITE_CONFIG['HTTP_HOST']; + $this->data_directory = 'raw'; } - function deduce_post_type($post_path) { - $ext = pathinfo($post_path, PATHINFO_EXTENSION); - - if(preg_match("/\.(\w+)\.md$/", $post_path, $ext_match)) { - $ext = $ext_match[1]; - } - - $ext_mapping = [ - '' => 'directory', - 'md' => 'text/markdown', - 'png' => 'image', - 'jpg' => 'image', - 'jpeg' => 'image' - ]; - - return $ext_mapping[$ext] ?? '?'; - } - - function fill_in_post_meta($post_path, $meta) { - $icon_mapping = [ - '' => 'question', - 'text/markdown' => 'markdown', - 'directory' => 'folder', - 'gallery' => 'images', - 'image' => 'image' - ]; - - $meta["title"] ??= basename($post_path); - - if($meta["title"] == "") { - $meta["title"] = "root"; - } - - if(!isset($meta['media_file']) and preg_match("/\.(\w+)\.md$/", $post_path)) { - $meta['media_file'] = "https://" . $this->SITE_CONFIG['HTTP_HOST'] . chop($post_path, ".md"); - } - - $meta['tags'] ??= []; - $meta['type'] ??= $this->deduce_post_type($post_path); - - $meta['icon'] ??= $icon_mapping[$meta['type']] ?? 'question'; - - return $meta; - } - function _normalize_post_data($post_data) { $post_data = parent::_normalize_post_data($post_data); @@ -69,12 +24,47 @@ class PostHandler extends MySQLAdapter { $post_data["post_basename"] = basename($post_data["post_path"]); $post_meta = $post_data['post_metadata']; - - $post_data['post_metadata'] = $this->fill_in_post_meta( - $post_data['post_path'], - $post_meta); - $post_data["post_file_dir"] = '/raw' . $post_data["post_path"]; + $post_meta["title"] ??= basename($post_data["post_path"]); + if($post_meta["title"] == "") { + $post_meta["title"] = "root"; + } + + if(!isset($post_meta['type'])) { + $type = null; + + $ext = pathinfo($post_data['post_basename'], PATHINFO_EXTENSION); + + $ext_mapping = [ + '' => 'directory', + 'md' => 'text/markdown', + 'png' => 'image', + 'jpg' => 'image', + 'jpeg' => 'image' + ]; + + if(isset($ext_mapping[$ext])) { + $post_meta['type'] = $ext_mapping[$ext]; + } + else { + $post_meta['type'] = '?'; + } + } + + if(!isset($post_meta['icon'])) { + $icon_mapping = [ + '' => 'question', + 'text/markdown' => 'markdown', + 'directory' => 'folder', + 'image' => 'image' + ]; + + $post_meta['icon'] = $icon_mapping[$post_meta['type']] ?? 'question'; + } + + $post_data['post_metadata'] = $post_meta; + + $post_data["post_file_dir"] = '/' . $this->data_directory . $post_data["post_path"]; return $post_data; } @@ -93,6 +83,7 @@ class PostHandler extends MySQLAdapter { } function save_file($post_path, $file_path) { + $this->bump_post($post_path); move_uploaded_file($file_path, $this->data_directory . $post_path); } @@ -101,15 +92,8 @@ class PostHandler extends MySQLAdapter { $post_path = $this->_sanitize_path($post_path); $post_content = $frontmatter_post->body(); - $post_metadata = $frontmatter_post->matter(); - $post_metadata = $this->fill_in_post_meta( - $post_path, - $post_metadata); - - $post_metadata['tags'][]= 'type:' . $post_metadata['type']; - if(basename($post_path) == "README.md") { $readme_metadata = []; if(isset($post_metadata['settings'])) { @@ -135,6 +119,9 @@ class PostHandler extends MySQLAdapter { move_uploaded_file($file_path, $this->data_directory . $post_path); break; + case "mddesc": + $this->save_markdown_post(chop($post_path, '.mddesc'), file_get_contents($file_path)); + break; default: $this->save_file($post_path, $file_path); } @@ -143,8 +130,7 @@ class PostHandler extends MySQLAdapter { function try_get_cached_feed($path, $export_opt) { $post_cache = $this->_exec("SELECT feed_content, feed_created_on FROM feed_cache - WHERE host=? AND search_path=? AND export_type=?", - "sss", $this->SITE_CONFIG['HTTP_HOST'], $path, $export_opt)->fetch_assoc(); + WHERE search_path=? AND export_type=?", "ss", $path, $export_opt)->fetch_assoc(); if(!isset($post_cache)) { return null; @@ -159,12 +145,12 @@ class PostHandler extends MySQLAdapter { $feed = @new Feed; $feed->setTitle("DergFeed"); - $feed->setLink($this->SITE_CONFIG['uri_prefix'] . $path); - $feed->setFeedLink($this->SITE_CONFIG['uri_prefix'] . "/feeds/atom" . $path, "atom"); + $feed->setLink("https://lucidragons.de" . $path); + $feed->setFeedLink("https://lucidragons.de/feeds/atom" . $path, "atom"); $feed->setDateModified(time()); - $feed->setDescription("DergenFeed for all your " . $path . " needs"); + $feed->setDescription("DergenFeed for all your " . $path . " needs <3"); $feed_posts = $this->_exec("SELECT post_path, @@ -172,9 +158,9 @@ class PostHandler extends MySQLAdapter { post_content, post_metadata FROM posts - WHERE (host = ?) AND ((post_path = ?) OR (post_path LIKE ?)) + WHERE (post_path = ?) OR (post_path LIKE ?) ORDER BY post_create_time DESC LIMIT 200", - "sss", $this->SITE_CONFIG['HTTP_HOST'], $path, $path . '/%'); + "ss", $path, $path . '/%'); while($row = $feed_posts->fetch_array(MYSQLI_ASSOC)) { $row = $this->_normalize_post_data($row); @@ -187,7 +173,7 @@ class PostHandler extends MySQLAdapter { $entry = $feed->createEntry(); $entry->setTitle($row['post_path'] . '> ' . $pmeta['title']); - $entry->setLink($this->SITE_CONFIG['uri_prefix'] . $row['post_path']); + $entry->setLink('https://lucidragons.de' . $row['post_path']); $entry->setDateModified(strtotime($row['post_update_time'])); $entry->setDateCreated(strtotime($row['post_create_time'])); @@ -211,13 +197,12 @@ class PostHandler extends MySQLAdapter { $feed = $this->construct_feed($path); $this->_exec("INSERT INTO feed_cache - (host, search_path, export_type, feed_content) + (search_path, export_type, feed_content) VALUES - (?, ?, 'atom', ?), - (?, ?, 'rss', ?)", - "ssssss", - $this->SITE_CONFIG['HTTP_HOST'], $path, $feed->export('atom'), - $this->SITE_CONFIG['HTTP_HOST'], $path, $feed->export('rss')); + (?, 'atom', ?), + (?, 'rss', ?)", + "ssss", $path, $feed->export('atom'), + $path, $feed->export('rss')); return $this->try_get_cached_feed($path, $export_opt); } diff --git a/www/router.php b/www/router.php index 18c4641..4f2f0d8 100644 --- a/www/router.php +++ b/www/router.php @@ -6,41 +6,18 @@ require_once 'vendor/autoload.php'; require_once 'post_adapter.php'; require_once 'fontawesome.php'; -require_once 'dergdown.php'; -use Symfony\Component\Yaml\Yaml; - -$SERVER_HOST = $_SERVER['HTTP_HOST']; -if(!preg_match('/^[\w\.]+$/', $SERVER_HOST)) { - die(); -} - -$SERVER_PREFIX = "https://" . $SERVER_HOST; - -$SITE_CONFIG = Yaml::parseFile('secrets/' . $SERVER_HOST . '.config.yml'); -$SITE_CONFIG['uri_prefix'] = $SERVER_PREFIX; -$SITE_CONFIG['HTTP_HOST'] = $SERVER_HOST; - -$adapter = new PostHandler($SITE_CONFIG); +$adapter = new PostHandler(); $loader = new \Twig\Loader\FilesystemLoader(['./templates', './user_content']); -$twig = new \Twig\Environment($loader,[ - 'debug' => true, - 'cache' => 'twig_cache' -]); +$twig = new \Twig\Environment($loader,['debug' => true]); $twig->addExtension(new Twig\Extra\Markdown\MarkdownExtension()); use Twig\Extra\Markdown\DefaultMarkdown; use Twig\Extra\Markdown\MarkdownRuntime; use Twig\RuntimeLoader\RuntimeLoaderInterface; -function dergdown_to_html($text) { - $Parsedown = new Dergdown(); - - return $Parsedown->text($text); -} - function deduce_user_agent() { $real_agent=$_SERVER['HTTP_USER_AGENT']; @@ -88,7 +65,6 @@ $twig->addRuntimeLoader(new class implements RuntimeLoaderInterface { function render_twig($template, $args = []) { global $twig; global $FONT_AWESOME_ARRAY; - global $SITE_CONFIG; $args['fa'] = $FONT_AWESOME_ARRAY; @@ -96,33 +72,27 @@ function render_twig($template, $args = []) { $settings = $post['settings'] ?? []; $meta = $post['post_metadata'] ?? []; - $args['banner'] ??= $settings['banners'] ?? $SITE_CONFIG['banners']; + $args['banner'] ??= $settings['banners'] ?? [ + ["src"=> "/static/banner/0.png"], + ["src" => "/static/banner/1.png"] + ]; $args['og'] = array_merge([ - "site_name" => $SITE_CONFIG['opengraph']['site_name'], - "title" => $meta['title'] ?? $SITE_CONFIG['opengraph']['site_name'], + "title" => $meta['title'] ?? "Dergennibble", "url" => $_SERVER['REQUEST_URI'], - "type" => "article", "description" => $meta['description'] ?? $settings['description'] - ?? $SITE_CONFIG['opengraph']['description'] + ?? "The softest spot to find dragons on" ], $args['og'] ?? []); if(($meta['type'] ?? '') == 'image') { - $args['og']['image'] ??= $meta['media_file']; - $args['og']['type'] = "image"; + $args['og']['image'] ??= "https://lucidragons.de" . $post['post_file_dir']; } - $args['og']['image'] ??= $args['banner'][0]["src"]; + $args['og']['image'] ??= 'https://lucidragons.de' . $args['banner'][0]["src"]; $args['banner'] = json_encode($args['banner']); - $args['site_config'] = $SITE_CONFIG; - - $args['age_gate'] = (!isset($_COOKIE['AgeConfirmed'])) && isset($SITE_CONFIG['age_gate']); - - $args['content_html'] ??= dergdown_to_html($post['post_content'] ?? ''); - echo $twig->render($template, $args); } @@ -166,25 +136,6 @@ function try_render_post($SURI) { ]); break; - case 'gallery': - if(preg_match('/^(.*[^\/])((?:#.*)?)$/', $SURI, $match)) { - header('Location: ' . $match[1] . '/' . $match[2]); - - die(); - } - - $search_query = $post['post_metadata']['search_tags'] ?? - ('+type:image +path:' . $post['post_path'] . '/*'); - - $search_result = $adapter->perform_post_search($search_query); - - echo render_twig('post_types/gallery.html', [ - "post" => $post, - "subposts" => $adapter->get_subposts_by_path($SURI), - "gallery_images" => $search_result['results'] - ]); - break; - case 'image': echo render_twig('post_types/image.html', [ "post" => $post, @@ -242,10 +193,6 @@ function generate_website($SURI) { } elseif($SURI == '/api/upload') { echo $twig->render('upload.html'); - } elseif($SURI == '/api/search') { - - header('Content-Type: application/json'); - echo json_encode($adapter->perform_post_search($_GET['search_query'])); } } elseif(preg_match('/^\/feed(?:\/(rss|atom)(.*))?$/', $SURI, $match)) { $feed = $adapter->get_laminas_feed($match[2] ?? '/', $match[1] ?? 'rss'); @@ -255,14 +202,16 @@ function generate_website($SURI) { header('Etag: W/"' . $SURI . '/' . strtotime($feed['feed_ts']) . '"'); echo $feed['feed']; + } elseif(preg_match('/^\s*image/', $_SERVER['HTTP_ACCEPT'])) { + header('Location: /raw' . $SURI); + exit(0); } elseif(true) { try_render_post($SURI); } } -$URL_PATH = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); -generate_website($URL_PATH); +generate_website($_SERVER['REQUEST_URI']); -log_and_die($URL_PATH); +log_and_die($_SERVER['REQUEST_URI']); ?> diff --git a/www/static/age_gate_check.js b/www/static/age_gate_check.js deleted file mode 100644 index 716ba3c..0000000 --- a/www/static/age_gate_check.js +++ /dev/null @@ -1,12 +0,0 @@ - - -function confirmAge() { - let ageGate = document.getElementById("age_gate_block"); - ageGate.style.opacity = 0; - - setTimeout(() => { - ageGate.parentElement.removeChild(ageGate); - }, 1000); - - document.cookie += "AgeConfirmed=true; path=/; max-age=31536000" -} \ No newline at end of file diff --git a/www/static/banner.js b/www/static/banner.js index 1dc78c1..7af1dc4 100644 --- a/www/static/banner.js +++ b/www/static/banner.js @@ -76,7 +76,7 @@ class BannerHandler { this.bannerDOM.style.opacity = 0; } fadeIn() { - this.bannerDOM.style.opacity = this.currentBannerData.opacity || 0.3; + this.bannerDOM.style.opacity = 0.3; } loadNextBanner() { diff --git a/www/static/dergstyle.css b/www/static/dergstyle.css index ccde5fa..6051215 100644 --- a/www/static/dergstyle.css +++ b/www/static/dergstyle.css @@ -20,7 +20,6 @@ body { --highlight_2: #edd29e; --text_1: #FFFFFF; - --text_border: #A0A0A080; color: var(--text_1); background: var(--bg_1); @@ -53,45 +52,6 @@ a:hover { color: var(--highlight_2); } -#age_gate_block { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.4); - backdrop-filter: blur(20px); - - transition: opacity 0.8s linear; -} - -#age_gate_block div { - background-color: var(--bg_3); - border-radius: 1em; - - padding: 1em; - - width: 12em; - - margin:0 auto; - display: table; - position: absolute; - - left: 0; - right:0; - top: 50%; - -webkit-transform:translateY(-50%); - -moz-transform:translateY(-50%); - -ms-transform:translateY(-50%); - -o-transform:translateY(-50%); - transform:translateY(-50%); -} - -#age_gate_block p { - min-height: 5em; -} - #main_header { overflow: hidden; position: relative; @@ -150,15 +110,11 @@ a:hover { margin-right: 2rem; } -:target { - scroll-margin-top: 6rem; -} - #main_content_wrapper { --content-width: min(100vw, calc(20rem + 40vw)); --content-total-margin: calc(calc(100vw - var(--content-width)) / 2); - --content-padding: max(0.5rem, min(1rem, var(--content-total-margin))); + --content-padding: max(0px, min(1rem, var(--content-total-margin))); --content-margin: max(0px, calc(var(--content-total-margin) - 1rem)); padding: 0rem var(--content-padding) 1rem var(--content-padding); @@ -180,9 +136,6 @@ a:hover { top: 0px; background: var(--bg_2); - - box-shadow: 0px 5px 5px 0px #00000040; - z-index: 5; } #post_file_titles { @@ -231,6 +184,13 @@ a:hover { padding: 0.75rem; } +#main_content_wrapper article h1 { + text-align: left; + padding-left: 3vmin; + margin-bottom: 0.2rem; + + border-bottom: solid 1px darkgrey; +} #main_content_wrapper article img { display: block; diff --git a/www/static/gallerystyle.css b/www/static/gallerystyle.css deleted file mode 100644 index c73ab1a..0000000 --- a/www/static/gallerystyle.css +++ /dev/null @@ -1,64 +0,0 @@ -.gallery { - display: flex; - flex-direction: row; - - flex-flow: row wrap; - - justify-content: center; - - list-style-type: none; - margin-top: 1rem; - padding: 0px; -} - -.gallery li { - margin: 0.2rem; - margin-bottom: 1rem; - border: 1px solid var(--text_border); - float: left; - - border-radius: 1rem; - box-shadow: 0px 5px 5px 0px #00000040; - - background: var(--bg_2); - - height: auto; - - transition: 0.3s; - z-index: 1; -} - -.gallery li:hover { - border: 1px solid var(--text_1); - transform: scale(1.02); -} - -#main_content_wrapper .gallery img { - width: 100%; - height: 15rem; - margin: 0; - - border-radius: 1rem 1rem 0 0; - - object-fit: cover; -} - -@media screen and (max-width: 48rem) { - .gallery li { - width: 45%; - } - - #main_content_wrapper .gallery img { - height: 100%; - width: auto; - } - - #main_content_wrapper .gallery figure { - height: auto; - } -} - -.gallery figcaption { - padding: 0.1rem; - text-align: center; -} \ No newline at end of file diff --git a/www/static/modest.css b/www/static/modest.css deleted file mode 100644 index d45177d..0000000 --- a/www/static/modest.css +++ /dev/null @@ -1,203 +0,0 @@ -/* -modest.css, licensed under MIT license, Crafted with <3 by John Otander (@4lpine). - -Taken from: https://github.com/markdowncss/modest - -Modified to fit Dergsite needs -*/ - -@media print { - *, - *:before, - *:after { - background: transparent !important; - color: #000 !important; - box-shadow: none !important; - text-shadow: none !important; - } - - a, - a:visited { - text-decoration: underline; - } - - a[href]:after { - content: " (" attr(href) ")"; - } - - abbr[title]:after { - content: " (" attr(title) ")"; - } - - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - - thead { - display: table-header-group; - } - - tr, - img { - page-break-inside: avoid; - } - - img { - max-width: 100% !important; - } - - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - - h2, - h3 { - page-break-after: avoid; - } -} - -pre, -code { - font-family: Menlo, Monaco, "Courier New", monospace; -} - -.modest-no-decoration { - text-decoration: none; -} - -html { - font-size: 14px; -} - -@media screen and (min-width: 32rem) and (max-width: 48rem) { - html { - font-size: 16px; - } -} - -@media screen and (min-width: 48rem) { - html { - font-size: 17px; - } -} - -article { - line-height: 1.5; -} - -article p, -.modest-p { - font-size: 1rem; - margin-bottom: 1.3rem; -} - -article h1, -.modest-h1, -article h2, -.modest-h2, -article h3, -.modest-h3, -article h4, -.modest-h4 { - margin: 1.5em 0 .3em; - font-weight: inherit; - line-height: 1.42; - - padding-left: 1.5rem; -} - -article > :first-child { - margin-top: 0.3rem !important; -} - -article h1, -.modest-h1 { - margin-top: 0; - font-size: 1.998rem; -} - -article h2, -.modest-h2 { - font-size: 1.427rem; -} - -article h3, -.modest-h3 { - font-size: 1.299rem; -} - -article h4, -.modest-h4 { - font-size: 1.1rem; -} - -article h5, -.modest-h5 { - font-size: 1rem; -} - -article h6, -.modest-h6 { - font-size: .88rem; -} - -article small, -.modest-small { - font-size: .707rem; -} - -/* https://github.com/mrmrs/fluidity */ - -article h1, -article h2, -article h3 { - border-bottom: 1px solid var(--text_border); - padding-bottom: .3rem; -} - -blockquote { - padding-left: 0.8rem; - margin-left: 0.8rem; - margin-right: 4em; -} - -blockquote { - border-left: 4px solid var(--text_border); - text-align: justify; -} - -pre { - border-radius: 0.5rem; - - box-shadow: 2px 5px 5px 0px #00000040; - - border-left: 4px solid #206475; - background-color: var(--bg_2); - margin-bottom: 1.3rem; - margin-left: 0.8rem; - margin-right: 4em; -} -pre code { - border-radius: 0.5rem; -} - -@media screen and (max-width: 32rem) { - pre, blockquote { - margin-right: 1.5em; - } -} - -article ul, -article ol { - padding-left: 2em; -} \ No newline at end of file diff --git a/www/static/solarized-dark.css b/www/static/solarized-dark.css deleted file mode 100644 index b4c0da1..0000000 --- a/www/static/solarized-dark.css +++ /dev/null @@ -1,84 +0,0 @@ -/* - -Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #002b36; - color: #839496; -} - -.hljs-comment, -.hljs-quote { - color: #586e75; -} - -/* Solarized Green */ -.hljs-keyword, -.hljs-selector-tag, -.hljs-addition { - color: #859900; -} - -/* Solarized Cyan */ -.hljs-number, -.hljs-string, -.hljs-meta .hljs-meta-string, -.hljs-literal, -.hljs-doctag, -.hljs-regexp { - color: #2aa198; -} - -/* Solarized Blue */ -.hljs-title, -.hljs-section, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #268bd2; -} - -/* Solarized Yellow */ -.hljs-attribute, -.hljs-attr, -.hljs-variable, -.hljs-template-variable, -.hljs-class .hljs-title, -.hljs-type { - color: #b58900; -} - -/* Solarized Orange */ -.hljs-symbol, -.hljs-bullet, -.hljs-subst, -.hljs-meta, -.hljs-meta .hljs-keyword, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-link { - color: #cb4b16; -} - -/* Solarized Red */ -.hljs-built_in, -.hljs-deletion { - color: #dc322f; -} - -.hljs-formula { - background: #073642; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/www/templates/pathed_content.html b/www/templates/pathed_content.html index af5b566..7ac1cdf 100644 --- a/www/templates/pathed_content.html +++ b/www/templates/pathed_content.html @@ -3,10 +3,8 @@ {% extends "root.html" %} {% block feed_links %} - -{{ parent() }} - - + + {% endblock %} {% block second_title %} diff --git a/www/templates/post_types/directory.html b/www/templates/post_types/directory.html index ffacda0..2872ab4 100644 --- a/www/templates/post_types/directory.html +++ b/www/templates/post_types/directory.html @@ -8,11 +8,11 @@ {%block content_article%} {% if subposts|length > 0 %} -

Directory contents:

+ - + @@ -21,11 +21,11 @@ -
Directory contents:
NameName Title Modified
{{ fa[subpost.post_metadata.icon] | raw }} + {{subpost.post_basename}} - {{ subpost.post_metadata.title }} + {{ subpost.post_metadata.title }} {{ subpost.post_update_time }} diff --git a/www/templates/post_types/gallery.html b/www/templates/post_types/gallery.html deleted file mode 100644 index 4e96b3d..0000000 --- a/www/templates/post_types/gallery.html +++ /dev/null @@ -1,59 +0,0 @@ - - -{% extends "pathed_content.html" %} - -{% block extra_head %} - - -{%endblock%} - -{%block content_article%} - {% if subposts|length > 0 %} - -

Art Subfolders:

- - - - - - - {% for subpost in subposts %} - - - - - - - {% endfor %} -
NameTitleModified
- {{ fa[subpost.post_metadata.icon] | raw }} - - {{subpost.post_basename}} - - {{ subpost.post_metadata.title }} - - {{ subpost.post_update_time }} -
- {% endif %} - - {{ content_html|raw }} - - {% if gallery_images|length > 0 %} - - {%else%} -

How sad. There are no images yet... What a real shame :c

- {% endif %} -{%endblock%} diff --git a/www/templates/post_types/image.html b/www/templates/post_types/image.html index aff2115..00ea107 100644 --- a/www/templates/post_types/image.html +++ b/www/templates/post_types/image.html @@ -10,16 +10,18 @@ {{ parent() }} + + {%endblock %} {%block content_article%}
- - + +
- {{ content_html|raw }} + {{ post.post_content|markdown_to_html }}
{%endblock%} diff --git a/www/templates/post_types/markdown.html b/www/templates/post_types/markdown.html index b9d147c..f874fbc 100644 --- a/www/templates/post_types/markdown.html +++ b/www/templates/post_types/markdown.html @@ -9,5 +9,5 @@ {%endblock %} {%block content_article%} - {{ content_html|raw }} + {{ post['post_content']|markdown_to_html }} {% endblock %} \ No newline at end of file diff --git a/www/templates/root.dergplate b/www/templates/root.dergplate new file mode 100644 index 0000000..fa4e62b --- /dev/null +++ b/www/templates/root.dergplate @@ -0,0 +1,18 @@ + + + PHP Test + + + Hello World

'; + + require 'src/templater.php'; + + $test = new TemplateFillout('test.dergplate'); + + $test->render(); + + ?> + + diff --git a/www/templates/root.html b/www/templates/root.html index 01a87d6..13ba701 100644 --- a/www/templates/root.html +++ b/www/templates/root.html @@ -1,41 +1,31 @@ - {{og.site_name}} - {{og.title}} + The Dergsite - {{og.title}} - - - {% block feed_links %} - + {% endblock %} {% block extra_head %}{% endblock %} {% block opengraph_tags %} - + - - - + - + - - - - - {% endblock %} - {%if age_gate %} - -
-
-

- This website may contain content meant for an 18+ audience. -

- - -
-
- - - {% endif %} -
full picture -

{% block big_title %}{{og.site_name}}{%endblock%}

+

{% block big_title %}The dergsite{%endblock%}

{% block second_title %}{% endblock %}