diff --git a/assets/app.js b/assets/app.js index 8725cc5..95f9b08 100644 --- a/assets/app.js +++ b/assets/app.js @@ -1,10 +1,3 @@ -import './bootstrap.js'; -/* - * Welcome to your app's main JavaScript file! - * - * This file will be included onto the page via the importmap() Twig function, - * which should already be in your base.html.twig. - */ +import './styles/vars.css'; +import './styles/demdtrap.css'; import './styles/app.css'; - -console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉'); diff --git a/assets/styles/app.css b/assets/styles/app.css index dd6181a..652cb99 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -1,3 +1,13 @@ -body { - background-color: skyblue; +html { + font-family: sans; +} + +body { +} + +pre { + padding: var(--dt-spacing-2); + background-color: black; + border: 1px solid var(--dt-neutral-4); + margin-bottom: var(--dt-spacing-2) } diff --git a/assets/styles/demdtrap.css b/assets/styles/demdtrap.css new file mode 100644 index 0000000..6b419dc --- /dev/null +++ b/assets/styles/demdtrap.css @@ -0,0 +1,210 @@ +* { margin: 0px; padding: 0px; } + +ul { + margin-left: var(--dt-spacing-3) +} + +h1 { + margin-bottom: var(--dt-spacing-2); +} + +hr { + margin: var(--dt-spacing-2) var(--dt-spacing-0); + border: 0px; + border-bottom: 1px solid var(--dt-neutral-4); +} + +a { + color: var(--dt-primary-lighter); + text-decoration: none; + + &:hover { + background-color: var(--dt-primary-lighter); + color: var(--dt-neutral-2); + } +} + +/* ------------------------------------------------------------- Margins --- */ +.m-0 { margin: var(--dt-spacing-0); } +.m-1 { margin: var(--dt-spacing-1); } +.m-2 { margin: var(--dt-spacing-2); } +.m-3 { margin: var(--dt-spacing-3); } +.m-4 { margin: var(--dt-spacing-4); } +.m-5 { margin: var(--dt-spacing-5); } +.m-6 { margin: var(--dt-spacing-6); } +.mt-0 { margin-top: var(--dt-spacing-0); } +.mt-1 { margin-top: var(--dt-spacing-1); } +.mt-2 { margin-top: var(--dt-spacing-2); } +.mt-3 { margin-top: var(--dt-spacing-3); } +.mt-4 { margin-top: var(--dt-spacing-4); } +.mt-5 { margin-top: var(--dt-spacing-5); } +.mt-6 { margin-top: var(--dt-spacing-6); } +.mb-0 { margin-bottom: var(--dt-spacing-0); } +.mb-1 { margin-bottom: var(--dt-spacing-1); } +.mb-2 { margin-bottom: var(--dt-spacing-2); } +.mb-3 { margin-bottom: var(--dt-spacing-3); } +.mb-4 { margin-bottom: var(--dt-spacing-4); } +.mb-5 { margin-bottom: var(--dt-spacing-5); } +.mb-6 { margin-bottom: var(--dt-spacing-6); } +.ms-0 { margin-left: var(--dt-spacing-0); } +.ms-1 { margin-left: var(--dt-spacing-1); } +.ms-2 { margin-left: var(--dt-spacing-2); } +.ms-3 { margin-left: var(--dt-spacing-3); } +.ms-4 { margin-left: var(--dt-spacing-4); } +.ms-5 { margin-left: var(--dt-spacing-5); } +.ms-6 { margin-left: var(--dt-spacing-6); } +.me-0 { margin-right: var(--dt-spacing-0); } +.me-1 { margin-right: var(--dt-spacing-1); } +.me-2 { margin-right: var(--dt-spacing-2); } +.me-3 { margin-right: var(--dt-spacing-3); } +.me-4 { margin-right: var(--dt-spacing-4); } +.me-5 { margin-right: var(--dt-spacing-5); } +.me-6 { margin-right: var(--dt-spacing-6); } + +/* -------------------------------------------------------------- Padding --- */ +.p-0 { padding: var(--dt-spacing-0); } +.p-1 { padding: var(--dt-spacing-1); } +.p-2 { padding: var(--dt-spacing-2); } +.p-3 { padding: var(--dt-spacing-3); } +.p-4 { padding: var(--dt-spacing-4); } +.p-5 { padding: var(--dt-spacing-5); } +.p-6 { padding: var(--dt-spacing-6); } +.pt-0 { padding-top: var(--dt-spacing-0); } +.pt-1 { padding-top: var(--dt-spacing-1); } +.pt-2 { padding-top: var(--dt-spacing-2); } +.pt-3 { padding-top: var(--dt-spacing-3); } +.pt-4 { padding-top: var(--dt-spacing-4); } +.pt-5 { padding-top: var(--dt-spacing-5); } +.pt-6 { padding-top: var(--dt-spacing-6); } +.pb-0 { padding-bottom: var(--dt-spacing-0); } +.pb-1 { padding-bottom: var(--dt-spacing-1); } +.pb-2 { padding-bottom: var(--dt-spacing-2); } +.pb-3 { padding-bottom: var(--dt-spacing-3); } +.pb-4 { padding-bottom: var(--dt-spacing-4); } +.pb-5 { padding-bottom: var(--dt-spacing-5); } +.pb-6 { padding-bottom: var(--dt-spacing-6); } +.ps-0 { padding-left: var(--dt-spacing-0); } +.ps-1 { padding-left: var(--dt-spacing-1); } +.ps-2 { padding-left: var(--dt-spacing-2); } +.ps-3 { padding-left: var(--dt-spacing-3); } +.ps-4 { padding-left: var(--dt-spacing-4); } +.ps-5 { padding-left: var(--dt-spacing-5); } +.ps-6 { padding-left: var(--dt-spacing-6); } +.pe-0 { padding-right: var(--dt-spacing-0); } +.pe-1 { padding-right: var(--dt-spacing-1); } +.pe-2 { padding-right: var(--dt-spacing-2); } +.pe-3 { padding-right: var(--dt-spacing-3); } +.pe-4 { padding-right: var(--dt-spacing-4); } +.pe-5 { padding-right: var(--dt-spacing-5); } +.pe-6 { padding-right: var(--dt-spacing-6); } + +/* ---------------------------------------------------------------- Floats ---*/ +.float-end { float: right; } +.float-start { float: left; } + +/* --------------------------------------------------------------- Borders ---*/ +.border { border: 1px solid var(--dt-neutral-4); } +.border-top { border-top: 1px solid var(--dt-neutral-4); } +.border-bottom { border-bottom: 1px solid var(--dt-neutral-4); } +.border-start { border-left: 1px solid var(--dt-neutral-4); } +.border-end { border-right: 1px solid var(--dt-neutral-4); } + +/* --------------------------------------------------------------- Colors --- */ +.bg-neutral-1 { background-color: var(--dt-neutral-1) } +.bg-neutral-2 { background-color: var(--dt-neutral-2) } +.bg-neutral-3 { background-color: var(--dt-neutral-3) } +.bg-neutral-4 { background-color: var(--dt-neutral-4) } +.bg-neutral-5 { background-color: var(--dt-neutral-5) } +.bg-neutral-6 { background-color: var(--dt-neutral-6) } + +.color-white { color: white; } + +/* ------------------------------------------------------------------ Text ---*/ +.fw-bold { font-weight: bold; } + +.text-center { text-align: center; } +.text-start { text-align: left; } +.text-end { text-align: right; } + +.text-muted { color: var(--dt-neutral-5); } + +.fs-1 { font-size: 2.000rem !important; } +.fs-2 { font-size: 1.750rem !important; } +.fs-3 { font-size: 1.500rem !important; } +.fs-4 { font-size: 1.250rem !important; } +.fs-5 { font-size: 1.125rem !important; } +.fs-6 { font-size: 1.000rem !important; } +.fs-7 { font-size: 0.875rem !important; } +.fs-8 { font-size: 0.750rem !important; } +.fs-9 { font-size: 0.625rem !important; } +.fs-10 { font-size: 0.500rem !important; } + +/* -------------------------------------------------------------- Display --- */ +.d-contents { display: contents; } +.d-inline-block { display: inline-block; } +.d-block { display: block; } +.d-flex { display: flex; } + +/* ----------------------------------------------------------------- Flex --- */ +.flex-column { flex-direction: column; } +.flex-row { flex-direction: row; } +.flex-grow-1 { flex-grow: 1; } + +.gap-0 { gap: var(--dt-spacing-0); } +.gap-1 { gap: var(--dt-spacing-1); } +.gap-2 { gap: var(--dt-spacing-2); } +.gap-3 { gap: var(--dt-spacing-3); } +.gap-4 { gap: var(--dt-spacing-4); } +.gap-5 { gap: var(--dt-spacing-5); } +.gap-6 { gap: var(--dt-spacing-6); } + +.align-self-start { align-self: flex-start; } +.align-self-end { align-self: flex-end; } +.align-self-center { align-self: center; } +.align-self-baseline { align-self: baseline; } +.align-self-stretch { align-self: stretch; } + +/* ---------------------------------------------------------------- Sizes --- */ +.w-100 { width: 100%; } + +/* -------------------------------------------------------------- Buttons --- */ +.btn { + border: 0px; + padding: var(--dt-spacing-1) var(--dt-spacing-2); + color: white; + border: 1px solid red; +} +.btn-primary { background-color: var(--dt-primary); border-color: var(--dt-primary-darker); } +.btn-secondary { background-color: var(--dt-secondary); border-color: var(--dt-secondary-darker); } +.btn-success { background-color: var(--dt-success); border-color: var(--dt-success-darker); } +.btn-warning { background-color: var(--dt-warning); border-color: var(--dt-warning-darker); } +.btn-danger { background-color: var(--dt-danger); border-color: var(--dt-danger-darker); } +.btn-primary:hover { background-color: var(--dt-primary-darker); } +.btn-secondary:hover { background-color: var(--dt-secondary-darker); } +.btn-success:hover { background-color: var(--dt-success-darker); } +.btn-warning:hover { background-color: var(--dt-warning-darker); } +.btn-danger:hover { background-color: var(--dt-danger-darker); } + +.btn-group { + display: flex; + gap: 0px; +} + .btn-group > * { + width: 30px; + height: 30px; + border: 1px solid black; + border-left: none; + text-align: center; + line-height: 41px; + display: block; + color: white; + text-decoration: none; + font-weight: bold; + background-position: center; + background-repeat: no-repeat; + background-size: 15px; + } + .btn-group > :first-child { + border-left: 1px solid black; + } + diff --git a/assets/styles/vars.css b/assets/styles/vars.css new file mode 100644 index 0000000..b375274 --- /dev/null +++ b/assets/styles/vars.css @@ -0,0 +1,48 @@ +:root { + --dt-primary-darker: hsl(var(--dt-primary-darker-hsl)); + --dt-primary: hsl(var(--dt-primary-hsl)); + --dt-primary-lighter: hsl(var(--dt-primary-lighter-hsl)); + --dt-secondary-darker: hsl(var(--dt-secondary-darker-hsl)); + --dt-secondary: hsl(var(--dt-secondary-hsl)); + --dt-secondary-lighter: hsl(var(--dt-secondary-lighter-hsl)); + --dt-success-darker: hsl(var(--dt-success-darker-hsl)); + --dt-success: hsl(var(--dt-success-hsl)); + --dt-success-lighter: hsl(var(--dt-success-lighter-hsl)); + --dt-warning-darker: hsl(var(--dt-warning-darker-hsl)); + --dt-warning: hsl(var(--dt-warning-hsl)); + --dt-warning-lighter: hsl(var(--dt-warning-lighter-hsl)); + --dt-danger-darker: hsl(var(--dt-danger-darker-hsl)); + --dt-danger: hsl(var(--dt-danger-hsl)); + --dt-danger-lighter: hsl(var(--dt-danger-lighter-hsl)); + + --dt-primary-darker-hsl: 226deg 36% 19%; + --dt-primary-hsl: 226deg 36% 39%; + --dt-primary-lighter-hsl: 226deg 36% 59%; + --dt-secondary-darker-hsl: 219deg 87% 37%; + --dt-secondary-hsl: 219deg 87% 57%; + --dt-secondary-lighter-hsl: 219deg 87% 77%; + --dt-success-darker-hsl: 172deg 89% 17%; + --dt-success-hsl: 172deg 89% 37%; + --dt-success-lighter-hsl: 172deg 89% 57%; + --dt-warning-darker-hsl: 38deg 91% 43%; + --dt-warning-hsl: 38deg 91% 63%; + --dt-warning-lighter-hsl: 38deg 91% 83%; + --dt-danger-darker-hsl: 10deg 84% 41%; + --dt-danger-hsl: 10deg 84% 61%; + --dt-danger-lighter-hsl: 10deg 84% 81%; + + --dt-neutral-1: hsl(230deg 20% 10%); + --dt-neutral-2: hsl(230deg 10% 20%); + --dt-neutral-3: hsl(230deg 5% 30%); + --dt-neutral-4: hsl(230deg 2% 40%); + --dt-neutral-5: hsl(230deg 1% 50%); + --dt-neutral-6: hsl(230deg 1% 60%); + + --dt-spacing-0: 0.00rem; + --dt-spacing-1: 0.25rem; + --dt-spacing-2: 0.50rem; + --dt-spacing-3: 1.00rem; + --dt-spacing-4: 1.50rem; + --dt-spacing-5: 3.00rem; + --dt-spacing-6: 6.00rem; +} diff --git a/composer.json b/composer.json index dc2274e..1bbc412 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "doctrine/doctrine-bundle": "^2.14", "doctrine/doctrine-migrations-bundle": "^3.4", "doctrine/orm": "^3.3", + "league/commonmark": "^2.6", "phpdocumentor/reflection-docblock": "^5.6", "phpstan/phpdoc-parser": "^2.1", "symfony/asset": "7.2.*", @@ -42,7 +43,8 @@ "symfony/validator": "7.2.*", "symfony/web-link": "7.2.*", "symfony/yaml": "7.2.*", - "twig/extra-bundle": "^2.12|^3.0", + "twig/extra-bundle": "^3.20", + "twig/markdown-extra": "^3.20", "twig/twig": "^2.12|^3.0" }, "config": { diff --git a/composer.lock b/composer.lock index 240eb6d..c4dd7a2 100644 --- a/composer.lock +++ b/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": "f68397016d06f528151706c36312cad7", + "content-hash": "266b862176b540dfaa8cfb44566a8161", "packages": [ { "name": "composer/semver", @@ -87,6 +87,81 @@ ], "time": "2024-09-19T14:15:21+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, { "name": "doctrine/cache", "version": "2.2.0", @@ -1369,6 +1444,195 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "league/commonmark", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-12-29T14:10:59+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, { "name": "monolog/monolog", "version": "3.9.0", @@ -1472,6 +1736,154 @@ ], "time": "2025-03-24T10:02:05+00:00" }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.6", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "ce708655043c7050eb050df361c5e313cf708309" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", + "reference": "ce708655043c7050eb050df361c5e313cf708309", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.6" + }, + "time": "2025-03-30T21:06:30+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -7499,6 +7911,78 @@ ], "time": "2025-02-08T09:47:15+00:00" }, + { + "name": "twig/markdown-extra", + "version": "v3.20.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/markdown-extra.git", + "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/f4616e1dd375209dacf6026f846e6b537d036ce4", + "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4", + "shasum": "" + }, + "require": { + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "twig/twig": "^3.13|^4.0" + }, + "require-dev": { + "erusev/parsedown": "dev-master as 1.x-dev", + "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" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Twig\\Extra\\Markdown\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Markdown", + "homepage": "https://twig.symfony.com", + "keywords": [ + "html", + "markdown", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/markdown-extra/tree/v3.20.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2025-01-31T20:45:36+00:00" + }, { "name": "twig/twig", "version": "v3.20.0", diff --git a/src/Controller/MainController.php b/src/Controller/MainController.php new file mode 100644 index 0000000..7626a34 --- /dev/null +++ b/src/Controller/MainController.php @@ -0,0 +1,81 @@ +getParameter('kernel.project_dir') . '/var/data'; + + new Process(['git', '-C', $gitDir, 'fetch'])->mustRun(); + new Process(['git', '-C', $gitDir, 'reset', '--hard', 'FETCH_HEAD'])->mustRun(); + + return new Response('Updated.'); + } + + #[Route('/{path}', 'app_index', ['path' => '.+'])] + public function index(string $path): Response + { + $gitDir = $this->getParameter('kernel.project_dir') . '/var/data'; + + + // ---------------------------------------------- Get file contents --- + + $fullPath = sprintf( + '%s/var/data/%s', + $this->getParameter('kernel.project_dir'), + $path, + ); + + $fs = new Filesystem(); + if (!$fs->exists($fullPath)) throw $this->createNotFoundException(); + $contents = $fs->readFile($fullPath); + + + // -------------------------------------------------- Get data tree --- + + $finder = new Finder(); + $finder->files()->in($this->getParameter('kernel.project_dir') . '/var/data/'); + if (!$finder->hasResults()) throw $this->createNotFoundException(); + + + // Convert flat list into a nested tree + $tree = []; + foreach ($finder as $file) { + /** @var SplFileInfo $file */ + + $current = &$tree; + + // Dunno why it is undefined, it works + foreach (explode('/', $file->getRelativePath()) as $part) { + if ($part === '') break; + + if (!isset($current[$part])) { + $current[$part] = []; + } + $current = &$current[$part]; + } + + $current[] = $file; + + //usort($current, fn($a, $b) => strcmp(implode('/', $a), implode('/', $b))); + } + + return $this->render('main/index.html.twig', [ + 'path' => $path, + 'contents' => $contents, + 'tree' => $tree, + 'version' => new Process(['git', '-C', $gitDir, 'rev-parse', 'HEAD'])->mustRun()->getOutput(), + ]); + } +} diff --git a/templates/base.html.twig b/templates/base.html.twig index 3cda30f..e7da68c 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -1,5 +1,5 @@ - + {% block title %}Welcome!{% endblock %} diff --git a/templates/main/index.html.twig b/templates/main/index.html.twig new file mode 100644 index 0000000..53ee70f --- /dev/null +++ b/templates/main/index.html.twig @@ -0,0 +1,39 @@ +{% extends 'base.html.twig' %} + +{% block title %}{{ path }} | Gaisen{% endblock %} + +{% macro render_tree(tree) %} + +{% endmacro %} + +{% block body %} +
+ Gaisen +
+
+
+ {{ _self.render_tree(tree) }} +
+
+ {{ contents|markdown_to_html }} +
+
+
+ Version: {{ version }} +
+{% endblock %}