## Major CodePress CMS Enhancement

### 🚀 New Features
- **League CommonMark Integration**: Replaced basic Markdown parser with full CommonMark 2.7 support
- **Bootstrap Sass Architecture**: Modern SCSS build system with Bootstrap 5.3.8
- **Enhanced Navigation**: Uses filenames instead of H1 titles for consistency
- **Improved Styling**: Transparent navigation backgrounds, no rounded corners

### 🎨 UI/UX Improvements
- Navigation items now use formatted filenames (e.g., "kennis-boven-aantallen" → "Kennis Boven Aantallen")
- Transparent navigation backgrounds with subtle hover effects
- Removed rounded corners from first-level navigation
- 50% opacity navigation background using Bootstrap variables

### 🔧 Technical Improvements
- **Class Organization**: Extracted CodePressCMS and SimpleTemplate to separate files
- **Full PHPDoc Documentation**: Complete documentation for all methods
- **Modern Build Process**: npm scripts for SCSS compilation
- **Enhanced Markdown Support**: Tables, strikethrough, task lists, autolinks
- **Security**: Proper HTML sanitization with CommonMark

### 📦 Dependencies
- Added `league/commonmark` for professional Markdown parsing
- Added `bootstrap` for SCSS-based styling
- Updated `sass` build process

### 🐛 Bug Fixes
- Fixed content directory path configuration
- Resolved navigation title inconsistencies
- Improved Markdown bold/italic formatting
- Fixed homepage 404 issues

### 🔄 Migration Notes
- Content directory moved from `content/` to `public/content/`
- Navigation now displays filenames instead of content H1 titles
- CSS now compiled from SCSS source files

The CMS now provides a professional, modern experience with robust Markdown support and clean, maintainable code architecture.
This commit is contained in:
2025-11-21 20:23:20 +01:00
parent dfe2df141b
commit 863661612a
434 changed files with 36256 additions and 1027 deletions
@@ -0,0 +1,21 @@
<?php
declare(strict_types=1);
/*
* This file is part of the league/config package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\Config\Exception;
/**
* Marker interface for any/all exceptions thrown by this library
*/
interface ConfigurationExceptionInterface extends \Throwable
{
}
@@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
/*
* This file is part of the league/config package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\Config\Exception;
class InvalidConfigurationException extends \UnexpectedValueException implements ConfigurationExceptionInterface
{
/**
* @param string $option Name/path of the option
* @param mixed $valueGiven The invalid option that was provided
* @param ?string $description Additional text describing the issue (optional)
*/
public static function forConfigOption(string $option, $valueGiven, ?string $description = null): self
{
$message = \sprintf('Invalid config option for "%s": %s', $option, self::getDebugValue($valueGiven));
if ($description !== null) {
$message .= \sprintf(' (%s)', $description);
}
return new self($message);
}
/**
* @param mixed $value
*
* @psalm-pure
*/
private static function getDebugValue($value): string
{
if (\is_object($value)) {
return \get_class($value);
}
return \print_r($value, true);
}
}
@@ -0,0 +1,33 @@
<?php
declare(strict_types=1);
/*
* This file is part of the league/config package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\Config\Exception;
use Throwable;
final class UnknownOptionException extends \InvalidArgumentException implements ConfigurationExceptionInterface
{
private string $path;
public function __construct(string $message, string $path, int $code = 0, ?Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
$this->path = $path;
}
public function getPath(): string
{
return $this->path;
}
}
@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
/*
* This file is part of the league/config package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\Config\Exception;
use Nette\Schema\ValidationException as NetteException;
final class ValidationException extends InvalidConfigurationException
{
/** @var string[] */
private array $messages;
public function __construct(NetteException $innerException)
{
parent::__construct($innerException->getMessage(), (int) $innerException->getCode(), $innerException);
$this->messages = $innerException->getMessages();
}
/**
* @return string[]
*/
public function getMessages(): array
{
return $this->messages;
}
}