summaryrefslogtreecommitdiff
path: root/src/web/_model/blog.php
blob: 18a9e0eb905f122222dfb84af299c69a9dc0e9ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php /* Copyright (c) 2024 Freya Murphy */
class Blog_model extends Model {

	private $markdown;

	function __construct()
	{
		$this->markdown = new MarkdownParser();
	}
	/**
	 * @param mixed $data
	 * @return void
	 */
	private function load_blog(&$data): void
	{
		$blog = array();
		$dir = ASSET_ROOT . '/blog';
		if ($handle = opendir($dir)) {
			while (false !== ($entry = readdir($handle))) {
				if (str_starts_with($entry, ".")) {
					continue;
				}
				$path = $dir . '/' . $entry;
				$md = $this->markdown->parse($path);
				$blog[$entry] = $md;
			}
		}
		krsort($blog);
		$data['blog'] = $blog;
	}

	public function get_data(): array {
		$data = parent::get_base_data('blog');
		$this->load_blog($data);
		$data['title'] = lang('title');
		$data['desc'] = lang('blog_short_desc');
		return $data;
	}

	private function update_images(string $md): string {
		$pattern = '/<img src="(.*)" alt="(.*)".*>/';
		$base = $this->get_url('');

		$replace = "<a href=\"{$base}\\1\">";
		$replace .= "<img src=\"{$base}\\1\" title=\"\\2\" alt=\"\\2\">";
		$replace .= "</a>";

		$md = preg_replace($pattern, $replace, $md);
		return $md;
	}

	/**
	 * @param mixed $name
	 * @return bool|<missing>
	 */
	private function render_post($name): ?array {
		$dir = ASSET_ROOT . '/blog';
		$path = $dir . '/' . $name . '.md';
		if(!file_exists($path)) {
			return NULL;
		}
		$md = $this->markdown->parse($path);
		$md['content'] = $this->update_images($md['content']);
		return $md;
	}
	/**
	 * @param mixed $name
	 * @return bool|null|array
	 */
	public function get_post($name): ?array {
		$data = parent::get_base_data();
		$post = $this->render_post($name);
		if (!$post) {
			return NULL;
		}
		$data['title'] = $post['meta']['name'];
		$data['desc'] = $post['meta']['desc'];
		$data['post'] = $post;
		return $data;
	}

	/**
	 * @param mixed $name
	 */
	private function render_writeup($name): ?array {
		$dir = ASSET_ROOT . '/writeup';
		$path = $dir . '/' . $name . '.md';
		if(!file_exists($path)) {
			return NULL;
		}
		$md = $this->markdown->parse($path);
		$md['content'] = $this->update_images($md['content']);
		return $md;
	}
	/**
	 * @param mixed $name
	 * @return bool|null|array
	 */
	public function get_writeup($name): ?array {
		$data = parent::get_base_data();
		$writeup = $this->render_writeup($name);
		if (!$writeup) {
			return NULL;
		}
		$data['title'] = $writeup['meta']['name'];
		$data['desc'] = $writeup['meta']['desc'];
		$data['post'] = $writeup;
		return $data;
	}
}
?>