]>
git.bts.cx Git - cx.git/blob - cx/lib/posts.php
3 cx_require('lib', 'db.php');
4 cx_require('lib', 'setup.php');
5 cx_require('third_party', 'parsedown', 'Parsedown.php');
7 function mk_markdown($markdown) {
8 static $Parsedown = new Parsedown();
10 return $Parsedown->text($markdown);
15 public $hero_image_alt;
17 public function __construct($dict) {
18 $this->hero_image
= $dict['post_hero_image'];
19 $this->hero_image_alt
= $dict['post_hero_image_alt'];
33 public function __construct($dict) {
34 $this->id
= $dict['post_id']; // FIXME, hide when not used?
35 $this->title
= $dict['post_title'];
36 $this->slug
= $dict['post_slug'];
37 $this->date
= $dict['post_date'];
38 $this->is_draft
= $dict['post_is_draft'];
39 $this->data
= $dict['post_data'];
40 $this->html_content
= mk_markdown($this->data
);
41 $this->html_excerpt
= null;
44 $segments = explode('---', $this->data
, 2);
45 if (count($segments) > 1) {
46 $this->html_excerpt
= mk_markdown($segments[0]);
50 public function get_metadata() {
53 $doc = new DOMDocument();
54 $doc->loadHTML($this->html_content
);
56 $image_tag = $doc->getElementsByTagName('img')[0];
58 if ($image_tag != null) {
59 $data['post_hero_image'] = $image_tag->getAttribute('src');
60 $data['post_hero_image_alt'] = htmlspecialchars($image_tag->getAttribute('alt'));
63 return new PostMetadata($data);
67 function cx_post_make_slug($title) {
68 $alnum_title = preg_replace('/[^A-Za-z0-9 ]?/', '', $title);
70 $slug_components = explode(' ', $alnum_title, 10);
71 $slug_components = array_filter($slug_components);
72 $slug_components = array_values($slug_components); // re-index
74 $slug = join('-', $slug_components);
75 $slug = strtolower($slug);
80 function cx_posts_add_post($site_id, $title, $slug, $date, $draft, $data) {
81 $creation_time = $update_time = time();
84 $slug = cx_post_make_slug($title);
91 $sql = 'INSERT INTO posts (
102 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);';
103 cx_db_exec($sql, $site_id, $creation_time, $update_time, $slug, $date, false, $draft, $title, $data, 1);
106 function cx_posts_update_post($post_id, $title, $slug, $date, $draft, $data) {
107 $update_time = time();
110 $slug = cx_post_make_slug($title);
114 $date = $update_time;
118 SET post_update_time = ?,
124 WHERE post_id == ?;';
126 cx_db_exec($sql, $update_time, $slug, $date, $draft, $title, $data, $post_id);
129 function cx_posts_delete_post($post_id) {
130 $sql = 'DELETE FROM posts
131 WHERE post_id == ?;';
133 cx_db_exec($sql, $post_id);
136 function cx_posts_get(int $limit = 0, bool $include_drafts = false) {
145 WHERE post_is_page == FALSE';
147 if ($include_drafts == false) {
148 $sql .= ' AND post_is_draft == FALSE';
151 $sql .= ' ORDER BY post_date DESC';
154 $sql .= ' LIMIT ' . $limit;
159 foreach (cx_db_query($sql) as $post) {
160 $p = new Post($post);
165 function cx_posts_find_post($post_id) {
174 WHERE post_is_page == FALSE
178 foreach (cx_db_query($sql, $post_id) as $post) {
179 $p = new Post($post);
186 function cx_posts_find_post_id($post_slug) {
193 foreach (cx_db_query($sql, $post_slug) as $post) {
194 return $post['post_id'];
200 function cx_pages_get() {
209 WHERE post_is_page == TRUE
210 AND post_is_draft == FALSE
211 ORDER BY post_creation_time DESC;';
213 foreach (cx_db_query($sql) as $post) {
214 $p = new Post($post);
219 cx_setup_register(1, function() {
220 cx_db_exec('CREATE TABLE posts (
221 post_id INTEGER PRIMARY KEY,
222 post_site_id INTEGER,
223 post_creation_time INTEGER,
224 post_update_time INTEGER,
227 post_is_page BOOLEAN,
228 post_is_draft BOOLEAN,
231 post_data_version INTEGER,
233 FOREIGN KEY(post_site_id) REFERENCES sites(site_id)