HTMLを綺麗に、色んなテスト関係関数の修正

諏訪子 <suwako@076.moe>、2025-11-20 22:39
コミット 4f70e6d4e4717aa3c3df7466e331b3aea7d9a5f2 ・親 8513c53 ・ファイルを見る

11個のファイル、+144 -70

@@ -56,7 +56,7 @@
5656 ##### ケロケロ
5757 [076スタジオ合同会社](https://076.moe/)\
5858 <諏訪子>(すわこ)\
59-`int i = 0;`\
59+`int i = 0;`
6060
6161 ###### ケロケロ
6262 1. アセンブリ言語
@@ -69,7 +69,7 @@
6969 // 各ファイルにHTMLの出力の作成
7070 $html = '';
7171 foreach ($fileDiffs as $fileName => $diff) {
72- $html .= "<h2>ファイル: ".htmlspecialchars($fileName)."</h2>\n";
72+ $html .= "\n <h2>ファイル: ".htmlspecialchars($fileName)."</h2>\n";
7373 $html .= $this->generateHtml($diff['leftLines'], $diff['rightLines']);
7474 }
7575
@@ -106,25 +106,25 @@
106106 }
107107
108108 private function generateHtml(array $leftLines, array $rightLines): string {
109- $html = '<table class="diff-table">';
110- $html .= '<tr class="diff-header"><th colspan="2">前</th><th colspan="2">新</th></tr>';
109+ $html = " <p>\n <table class=\"diff-table\">\n";
110+ $html .= " <tr class=\"diff-header\"><th colspan=\"2\">前</th><th colspan=\"2\">新</th></tr>\n";
111111
112112 $maxLines = max(count($leftLines), count($rightLines));
113113 for ($i = 0; $i < $maxLines; $i++) {
114114 $left = isset($leftLines[$i]) ? $leftLines[$i] : ['content' => '', 'type' => 'empty', 'line' => ''];
115115 $right = isset($rightLines[$i]) ? $rightLines[$i] : ['content' => '', 'type' => 'empty', 'line' => ''];
116116
117- $html .= '<tr>';
117+ $html .= " <tr>\n";
118118 // 左(変更前)
119- $html .= '<td class="line-number">' . ($left['line'] ?: '&nbsp;') . '</td>';
120- $html .= '<td class="' . $left['type'] . '">' . ($left['content'] ?: '&nbsp;') . '</td>';
119+ $html .= " <td class=\"line-number\">".($left['line'] ?: '&nbsp;')."</td>\n";
120+ $html .= " <td class=\"{$left['type']}\">".($left['content'] ?: '&nbsp;')."</td>\n";
121121 // 右(変更後)
122- $html .= '<td class="line-number">' . ($right['line'] ?: '&nbsp;') . '</td>';
123- $html .= '<td class="' . $right['type'] . '">' . ($right['content'] ?: '&nbsp;') . '</td>';
124- $html .= '</tr>';
122+ $html .= " <td class=\"line-number\">".($right['line'] ?: '&nbsp;')."</td>\n";
123+ $html .= " <td class=\"{$right['type']}\">".($right['content'] ?: '&nbsp;')."</td>\n";
124+ $html .= " </tr>\n";
125125 }
126126
127- $html .= '</table>';
127+ $html .= " </table>\n </p>\n";
128128 return $html;
129129 }
130130 }
@@ -98,7 +98,7 @@
9898 if (preg_match('/^```(\w*)$/', $line, $matches)) {
9999 if (!$this->inCodeBlock) {
100100 if (!empty($currentParagraph)) {
101- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
101+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
102102 $currentParagraph = [];
103103 }
104104 $this->inCodeBlock = true;
@@ -121,7 +121,7 @@
121121 // テーブルの処理
122122 if (preg_match('/^\|(.+)\|$/', $line)) {
123123 if (!empty($currentParagraph)) {
124- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
124+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
125125 $currentParagraph = [];
126126 }
127127 $cells = array_map('trim', explode('|', trim($line, '|')));
@@ -145,17 +145,17 @@
145145 // 水平線の処理
146146 if (preg_match('/^([\-\*\_])\1{2,}$/', $line)) {
147147 if (!empty($currentParagraph)) {
148- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
148+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
149149 $currentParagraph = [];
150150 }
151- $this->html[] = "<hr>";
151+ $this->html[] = " <hr />\n";
152152 continue;
153153 }
154154
155155 // 引用ブロックの処理
156156 if (preg_match('/^>\s(.+)/', $line, $matches)) {
157157 if (!empty($currentParagraph)) {
158- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
158+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
159159 $currentParagraph = [];
160160 }
161161 $inBlockquote = true;
@@ -176,7 +176,7 @@
176176 $inList = false;
177177 }
178178 if (!empty($currentParagraph)) {
179- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
179+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
180180 $currentParagraph = [];
181181 }
182182
@@ -191,19 +191,19 @@
191191 $inList = false;
192192 }
193193 if (!empty($currentParagraph)) {
194- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
194+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
195195 $currentParagraph = [];
196196 }
197197
198198 $level = strlen($m[1]);
199- $this->html[] = "<h{$level}>".$this->parseInline($m[2])."</h{$level}>";
199+ $this->html[] = " <h{$level}>".$this->parseInline($m[2])."</h{$level}>";
200200 continue;
201201 }
202202
203203 // 箇条書きリスト
204204 if (preg_match('/^(\s*)([\*\-])\s(.+)/', $line, $m)) {
205205 if (!empty($currentParagraph)) {
206- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
206+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
207207 $currentParagraph = [];
208208 }
209209 $inList = true;
@@ -221,7 +221,7 @@
221221 // 番号付きリスト
222222 if (preg_match('/^(\s*)\d+\.\s(.+)/', $line, $m)) {
223223 if (!empty($currentParagraph)) {
224- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
224+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
225225 $currentParagraph = [];
226226 }
227227 $inList = true;
@@ -246,7 +246,7 @@
246246 $parsedLine = $this->parseInline($line);
247247 $currentParagraph[] = $parsedLine;
248248 if ($hasBR) {
249- $currentParagraph[] = "<br />";
249+ $currentParagraph[] = "<br />\n ";
250250 }
251251 }
252252
@@ -254,7 +254,7 @@
254254 if ($inBlockquote) $this->html[] = $this->createBlockquote($blockquoteContent);
255255 if ($inTable) $this->html[] = $this->createTable($tableHeaders, $tableRows);
256256 if (!empty($currentParagraph))
257- $this->html[] = " <p>".implode("", $currentParagraph)."</p>";
257+ $this->html[] = " <p>\n ".implode("", $currentParagraph)."\n </p>";
258258
259259 return implode("\n", $this->html);
260260 }
@@ -456,11 +456,11 @@
456456 $currentType = $item['type'];
457457 }
458458
459- $html .= "<{$currentType}>\n";
459+ $html .= " <p>\n <{$currentType}>\n";
460460 foreach ($items as $item) {
461- $html .= str_repeat(' ', $currentLevel)." <li>".$item['content']."</li>\n";
461+ $html .= str_repeat(' ', $currentLevel)." <li>".$item['content']."</li>\n";
462462 }
463- $html .= "</{$currentType}>";
463+ $html .= " </{$currentType}>\n </p>";
464464
465465 while (!empty($listStack)) {
466466 $html .= str_repeat(' ', $currentLevel)."</".array_pop($listStack).">\n";
@@ -478,7 +478,7 @@
478478 private function createCodeBlock(): string {
479479 $code = htmlspecialchars(implode("\n", $this->codeBlockContent));
480480 $class = $this->codeBlockLanguage ? " class=\"language-{$this->codeBlockLanguage}\"" : '';
481- return "<pre><code{$class}>{$code}</code></pre>";
481+ return " <p>\n <pre><code{$class}>{$code}</code></pre>";
482482 // $raw = implode("\n", $this->codeBlockContent);
483483 // $lang = $this->codeBlockLanguage ?: 'txt';
484484 // $class = $lang === 'txt' ? '' : " class=\"language-{$lang}\"";
@@ -487,7 +487,7 @@
487487 }
488488
489489 private function createBlockquote(array $content): string {
490- return "<blockquote>\n <p>".implode("</p>\n <p>", $content)."</p>\n</blockquote>";
490+ return " <p>\n <blockquote>\n ".implode("<br />\n ", $content)."\n </blockquote>\n </p>";
491491 }
492492
493493 /**
@@ -498,31 +498,31 @@
498498 * @return string HTMLのテーブル
499499 */
500500 private function createTable(array $headers, array $rows): string {
501- $html = "<table>\n";
501+ $html = " <p>\n <table>\n";
502502
503503 // ヘッダーを追加
504504 if (!empty($headers)) {
505- $html .= " <thead>\n <tr>\n";
505+ $html .= " <thead>\n <tr>\n";
506506 foreach ($headers as $header) {
507- $html .= " <th>".$this->parseInline($header)."</th>\n";
507+ $html .= " <th>".$this->parseInline($header)."</th>\n";
508508 }
509- $html .= " </tr>\n </thead>\n";
509+ $html .= " </tr>\n </thead>\n";
510510 }
511511
512512 // 行を追加
513513 if (!empty($rows)) {
514- $html .= " <tbody>\n";
514+ $html .= " <tbody>\n";
515515 foreach ($rows as $row) {
516- $html .= " <tr>\n";
516+ $html .= " <tr>\n";
517517 foreach ($row as $cell) {
518- $html .= " <td>".$this->parseInline($cell)."</td>\n";
518+ $html .= " <td>".$this->parseInline($cell)."</td>\n";
519519 }
520- $html .= " </tr>\n";
520+ $html .= " </tr>\n";
521521 }
522- $html .= " </tbody>\n";
522+ $html .= " </tbody>\n";
523523 }
524524
525- $html .= "</table>";
525+ $html .= " </table>\n </p>";
526526 return $html;
527527 }
528528
@@ -81,7 +81,7 @@
8181 $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
8282 if ($this->socket === false) {
8383 $msg = 'ソケットの作成に失敗: '.socket_strerror(socket_last_error());
84- logger(\LogType::MySQL, $msg);
84+ \logger(\LogType::MySQL, $msg);
8585 throw new \Exception($msg);
8686 }
8787
@@ -89,7 +89,7 @@
8989 if ($res === false) {
9090 $msg = 'ソケットに接続に失敗: '
9191 .socket_strerror(socket_last_error($this->socket));
92- logger(\LogType::MySQL, $msg);
92+ \logger(\LogType::MySQL, $msg);
9393 throw new \Exception($msg);
9494 }
9595
@@ -102,7 +102,7 @@
102102 $code = unpack('v', substr($response, 1, 2))[1];
103103 $mes = substr($response, 3);
104104 $msg = "認証応答に失敗: {$code} - {$mes}";
105- logger(\LogType::MySQL, $msg);
105+ \logger(\LogType::MySQL, $msg);
106106 throw new \Exception($msg);
107107 }
108108
@@ -151,7 +151,7 @@
151151 $code = unpack('v', substr($res, 1, 2))[1];
152152 $mes = substr($res, 3);
153153 $msg = "データベースの選択に失敗: {$code} - {$mes}";
154- logger(\LogType::MySQL, $msg);
154+ \logger(\LogType::MySQL, $msg);
155155 throw new \Exception($msg);
156156 }
157157
@@ -179,7 +179,7 @@
179179 $code = unpack('v', substr($res, 1, 2))[1];
180180 $mes = substr($res, 3);
181181 $msg = "準備に失敗: {$code} - {$mes}";
182- logger(\LogType::MySQL, $msg);
182+ \logger(\LogType::MySQL, $msg);
183183 throw new \Exception($msg);
184184 }
185185
@@ -236,14 +236,14 @@
236236
237237 if (!isset($this->prepared[$statementId])) {
238238 $msg = "不正なステートメントID: {$statementId}";
239- logger(\LogType::MySQL, $msg);
239+ \logger(\LogType::MySQL, $msg);
240240 throw new \Exception($msg);
241241 }
242242
243243 $stmtInfo = $this->prepared[$statementId];
244244 if (count($params) != $stmtInfo['num_params']) {
245245 $msg = "パラメータ数が一致しません: 期待 {$stmtInfo['num_params']}, 取得 ".count($params);
246- logger(\LogType::MySQL, $msg);
246+ \logger(\LogType::MySQL, $msg);
247247 throw new \Exception($msg);
248248 }
249249
@@ -341,7 +341,7 @@
341341 $code = unpack('v', substr($res, 1, 2))[1];
342342 $mes = substr($res, 3);
343343 $msg = "実行に失敗: {$code} - {$mes}";
344- logger(\LogType::MySQL, $msg);
344+ \logger(\LogType::MySQL, $msg);
345345 throw new \Exception($msg);
346346 }
347347
@@ -389,7 +389,7 @@
389389 $code = unpack('v', substr($res, 1, 2))[1];
390390 $mes = substr($res, 3);
391391 $msg = "クエリに失敗: {$code} - {$mes}";
392- logger(\LogType::MySQL, $msg);
392+ \logger(\LogType::MySQL, $msg);
393393 throw new \Exception($msg);
394394 }
395395
@@ -402,7 +402,7 @@
402402 // @todo LOCAL INFILEリクエストの処理を実装
403403 if (ord($res[0]) === 0xFB) {
404404 $msg = "LOCAL INFOリクエストは未対応です";
405- logger(\LogType::MySQL, $msg);
405+ \logger(\LogType::MySQL, $msg);
406406 throw new \Exception($msg);
407407 }
408408
@@ -490,7 +490,7 @@
490490 $mes = substr($res, 3);
491491 $this->close();
492492 $msg = "認証に失敗: {$code} - {$mes}";
493- logger(\LogType::MySQL, $msg);
493+ \logger(\LogType::MySQL, $msg);
494494 throw new \Exception($msg);
495495 }
496496
@@ -518,7 +518,7 @@
518518 $eofPacket = $this->readPacket();
519519 if (ord($eofPacket[0]) !== 0xFE) {
520520 $msg = "フィールド説明の後にEOFパケットが期待されます";
521- logger(\LogType::MySQL, $msg);
521+ \logger(\LogType::MySQL, $msg);
522522 throw new \Exception($msg);
523523 }
524524
@@ -664,7 +664,7 @@
664664 private function parseOkPacket(string $packet): array {
665665 if (strlen($packet) < 2) {
666666 $msg = "OKパケットが短すぎます: ".strlen($packet)."バイト";
667- logger(\LogType::MySQL, $msg);
667+ \logger(\LogType::MySQL, $msg);
668668 throw new \Exception($msg);
669669 }
670670
@@ -678,7 +678,7 @@
678678
679679 if (strlen($packet) < $pos + 2) {
680680 $msg = "OKパケットにサーバーステータス用のデータが不足しています";
681- logger(\LogType::MySQL, $msg);
681+ \logger(\LogType::MySQL, $msg);
682682 throw new \Exception($msg);
683683 }
684684 $serverStatus = unpack('v', substr($packet, $pos, 2))[1];
@@ -686,7 +686,7 @@
686686
687687 if (strlen($packet) < $pos + 2) {
688688 $msg = "OKパケットに警告カウント用のデータが不足しています";
689- logger(\LogType::MySQL, $msg);
689+ \logger(\LogType::MySQL, $msg);
690690 throw new \Exception($msg);
691691 }
692692 $warningCount = unpack('v', substr($packet, $pos, 2))[1];
@@ -712,7 +712,7 @@
712712 $bytesRead = socket_recv($this->socket, $header, 4, MSG_WAITALL);
713713 if ($bytesRead !== 4) {
714714 $msg = "パケットヘッダーの読み込みに失敗: 期待 4 バイト, 取得 {$bytesRead}";
715- logger(\LogType::MySQL, $msg);
715+ \logger(\LogType::MySQL, $msg);
716716 throw new \Exception($msg);
717717 }
718718
@@ -738,7 +738,7 @@
738738 if ($bytesRead === false) {
739739 $msg = "パケット内容の読み込みに失敗: エラー "
740740 .socket_strerror(socket_last_error($this->socket));
741- logger(\LogType::MySQL, $msg);
741+ \logger(\LogType::MySQL, $msg);
742742 throw new \Exception($msg);
743743 }
744744
@@ -811,7 +811,7 @@
811811 $sent = socket_write($this->socket, $header, 4);
812812 if ($sent !== 4) {
813813 $msg = "パケットヘッダーの送信に失敗";
814- logger(\LogType::MySQL, $msg);
814+ \logger(\LogType::MySQL, $msg);
815815 throw new \Exception($msg);
816816 }
817817
@@ -819,7 +819,7 @@
819819 $sent = socket_write($this->socket, $data, $len);
820820 if ($sent !== $len) {
821821 $msg = "パケットデータの送信に失敗";
822- logger(\LogType::MySQL, $msg);
822+ \logger(\LogType::MySQL, $msg);
823823 throw new \Exception($msg);
824824 }
825825
@@ -19,6 +19,7 @@
1919 private bool $colorOutput = true;
2020 private bool $verboseOutput = true;
2121 private bool $stopOnFailure = false;
22+ private bool $skipCurrentDescribe = false;
2223 private array $beforeEachCallbacks = [];
2324 private array $afterEachCallbacks = [];
2425 private array $beforeAllCallbacks = [];
@@ -119,6 +120,7 @@
119120 */
120121 public function describe(string $description, callable $callback): Tester {
121122 $this->currentTestCase = $description;
123+ $this->skipCurrentDescribe = false;
122124 $this->output($this->colorize('bold', "テストケース: {$description}"));
123125
124126 try {
@@ -149,6 +151,11 @@
149151 * @return Tester このインスタンス
150152 */
151153 public function it(string $description, callable $callback): Tester {
154+ if ($this->skipCurrentDescribe) {
155+ $this->skip($description, 'skipAll() が呼び出されました');
156+ return $this;
157+ }
158+
152159 $this->currentTest = $description;
153160 $this->testCount++;
154161
@@ -435,7 +442,42 @@
435442 }
436443
437444 /**
438- * Print a summary of the test results
445+ * コレクションが指定された要素数を持つ事
446+ *
447+ * @param int $expoected 期待される要素数
448+ * @param iterable $collection 配列または Traversable
449+ * @param string|null $message 失敗時のカスタムメッセージ
450+ * @return Tester
451+ *
452+ * @throws AssertionFailedException
453+ */
454+ public function assertCount(int $expected, iterable $collection, ?string $message = null): Tester {
455+ $actual = is_countable($collection) ? count($collection) : iterator_count($collection);
456+
457+ if ($actual !== $expected) {
458+ $message ??= "要素数が {$expected} であることを期待しましたが、{$actual} でした";
459+ throw new AssertionFailedException($message);
460+ }
461+
462+ return $this;
463+ }
464+
465+ /**
466+ * 現在の describe ブロック内の残りすべての it() をスキップ
467+ *
468+ * @param string $reason スキップ理由(出力に表示)
469+ * @return void
470+ */
471+ public function skipAll(string $reason = 'このテストケースはスキップされました'): void {
472+ $this->skipCurrentDescribe = true;
473+
474+ if ($this->verboseOutput) {
475+ $this->output($this->colorize('cyan', " スキップAll: {$reason}"));
476+ }
477+ }
478+
479+ /**
480+ * テスト結果の詳細を表示する
439481 *
440482 * @return Tester
441483 */
@@ -61,4 +61,6 @@
6161 } catch (\Exception $e) {
6262 echo 'エラー: '.$e->getMessage()."\n";
6363 }
64-});
64+});
65+
66+$test->printSummary();
変更 tester.php
@@ -1,5 +1,7 @@
11 <?php
22 require_once __DIR__.DIRECTORY_SEPARATOR.'/autoload.php';
3+define('ROOT', realpath(__DIR__));
4+require_once __DIR__.DIRECTORY_SEPARATOR.'/config/config.php';
35
46 $testDir = __DIR__.DIRECTORY_SEPARATOR.'src/Site/Test';
57 $testFiles = glob($testDir.'/*.php');
変更 util.php
@@ -61,3 +61,33 @@
6161 file_put_contents($logfile, $arg."\n", FILE_APPEND);
6262 }
6363 }
64+
65+function to_money($amount, $lang) {
66+ $amount = floatval($amount);
67+
68+ switch (strtolower($lang)) {
69+ case 'ja':
70+ if ($amount >= 100000000) {
71+ $oku = $amount / 100000000;
72+ return $oku.'億円';
73+ } else if ($amount >= 10000) {
74+ $man = $amount / 10000;
75+ return $man.'万円';
76+ }
77+ return number_format($amount, 0).'円';
78+ case 'en':
79+ if ($amount >= 1000000000) {
80+ $billion = $amount / 1000000000;
81+ return '¥ '.$billion.' billion';
82+ } else if ($amount >= 1000000) {
83+ $million = $amount / 1000000;
84+ return '¥ '.$million.' million';
85+ } else if ($amount >= 1000) {
86+ $thousand = $amount / 1000;
87+ return '¥ '.$thousand.' thousand';
88+ }
89+ return '¥ '.number_format($amount, 0);
90+ default:
91+ return '¥ '.number_format($amount, 0);
92+ }
93+}
@@ -1,6 +1,5 @@
11 {@ include(common/header) @}
22 {@ include(common/search) @}
3-
43 <div class="news-article">
54 {@ if (isset($meta->thumbnail) && $meta->thumbnail != '') @}
65 <div class="thumbnail{{ isset($meta->thumborient) && $meta->thumborient != 'center' ? ' '.$meta->thumborient : '' }}">
@@ -12,16 +11,11 @@
1211 <div class="meta-author">{{ $meta->author }}</div>
1312 {@ if (isset($meta->category) && !empty($meta->category) && $meta->category[0] !== '') @}
1413 {@ foreach ($meta->category as $cat) @}
15- <div class="meta-category">
16- {{ $cat }}
17-
18- </div>
14+ <div class="meta-category">{{ $cat }}</div>
1915 {@ endforeach @}
2016 {@ endif @}
2117 </div>
22-
2318 <h1 class="title">{{{ $meta->title }}}</h1>
24-{{{ $article }}}
25-
19+{{{ $article."\n" }}}
2620 </div>
2721 {@ include(common/footer) @}
@@ -1,7 +1,9 @@
11 </main>
22 <footer>
3- <address>Copyright{{ defined('COPYRIGHT_YEAR') ? ' '.COPYRIGHT_YEAR : '' }} © <a href="https://076.moe/">076スタジオ合同会社</a></address><br />
3+ <address>
4+ Copyright{{ defined('COPYRIGHT_YEAR') ? ' '.COPYRIGHT_YEAR : '' }} © <a href="https://076.moe/">076スタジオ合同会社</a><br />
45 Powered By <a href="https://technicalsuwako.moe/littlebeast">Little Beast</a>
6+ </address>
57 </footer>
68 </div>
79 </body>
@@ -12,13 +12,15 @@
1212 {@ endforeach @}
1313 {@ endif @}
1414 {@ if (isset($meta)) @}
15+{@ if (isset($meta->author)) @}
1516 <meta name="author" content="{{ $meta->author }}" />
17+{@ endif @}
1618 {@ if (isset($meta->thumbnail)) @}
1719 <meta name="thumbnail" content="/static/{{ $meta->thumbnail }}" />
1820 {@ endif @}
1921 {@ endif @}
2022 <meta name="description" content="{{ $description }}" />
21- <meta name="keywords" content="{{ SITEINFO['tags'].',' }}{@ if (isset($meta)) @}{@ foreach ($meta->category as $cat) @}{{ $cat.',' }}{@ endforeach @}{@ endif @}" />
23+ <meta name="keywords" content="{{ SITEINFO['tags'].(isset($meta->category) ? ',' : '') }}{@ if (isset($meta) && isset($meta->category)) @}{@ foreach ($meta->category as $k => $cat) @}{{ $cat.($k === array_key_last($meta->category) ? '' : ',') }}{@ endforeach @}{@ endif @}" />
2224
2325 <meta property="og:title" content="{{ SITEINFO['title'] }}: {{ $pagetit }}" />
2426 <meta property="og:description" content="{{ $description }}" />
@@ -46,7 +48,7 @@
4648 <div class="container">
4749 <header>
4850 <div class="logo">
49- {{ SITEINFO['title'] }}
51+ {{ SITEINFO['title'] }}{{ "\n" }}
5052 </div>
5153 <nav>
5254 {@ foreach ($menu as $m) @}