feat: render push objects
This commit is contained in:
parent
9d0efee9aa
commit
fffaedaeb3
6 changed files with 117 additions and 28 deletions
|
@ -1,11 +1,15 @@
|
||||||
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
use std::cell::RefCell;
|
||||||
|
|
||||||
use derive_builder::*;
|
use derive_builder::*;
|
||||||
use derive_more::*;
|
use derive_more::*;
|
||||||
use serde::*;
|
use serde::*;
|
||||||
|
use tera::Context;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
use super::utils::*;
|
||||||
pub use super::*;
|
pub use super::*;
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize, Builder, Clone)]
|
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize, Builder, Clone)]
|
||||||
|
@ -18,3 +22,67 @@ pub struct Post {
|
||||||
pub post_content: String,
|
pub post_content: String,
|
||||||
pub post_html_url: Url,
|
pub post_html_url: Url,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const POST_PAGE: TemplateFile = TemplateFile::new("post_page", "post_page.html");
|
||||||
|
pub const POST_SEGMENT: TemplateFile = TemplateFile::new("post_segment.html", "post_segment.html");
|
||||||
|
pub const POSTS_SEGMENT: TemplateFile =
|
||||||
|
TemplateFile::new("posts_segment.html", "posts_segment.html");
|
||||||
|
|
||||||
|
pub fn register_templates(tera: &mut tera::Tera) {
|
||||||
|
for t in [POST_SEGMENT, POSTS_SEGMENT, POST_PAGE].iter() {
|
||||||
|
t.register(tera).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PostPage {
|
||||||
|
ctx: RefCell<Context>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PostPage {
|
||||||
|
pub fn new(p: &Post) -> Self {
|
||||||
|
let mut ctx = context();
|
||||||
|
|
||||||
|
ctx.insert(PAYLOAD_KEY, p);
|
||||||
|
|
||||||
|
let ctx = RefCell::new(ctx);
|
||||||
|
Self { ctx }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render(&self) -> String {
|
||||||
|
TEMPLATES
|
||||||
|
.render(POST_PAGE.name, &self.ctx.borrow())
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn page(p: &Post) -> String {
|
||||||
|
let p = Self::new(p);
|
||||||
|
p.render()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn render_page_and_write() {
|
||||||
|
const FILE: &str = "./tmp/post_page.html";
|
||||||
|
|
||||||
|
let post = PostBuilder::default()
|
||||||
|
.author_name("Batman".into())
|
||||||
|
.author_preferred_username("@batman@dc.com".into())
|
||||||
|
.author_html_url(Url::parse("https://batman.dc.com").unwrap())
|
||||||
|
.post_published("Now".into())
|
||||||
|
.post_content("I'm batman".into())
|
||||||
|
.post_html_url(Url::parse("https://batman.dc.com/posts/1").unwrap())
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let tw = TestWriterBuilder::default()
|
||||||
|
.file(FILE.into())
|
||||||
|
.contents(PostPage::page(&post))
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
tw.write();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -46,8 +46,6 @@ impl TemplateFile {
|
||||||
|
|
||||||
pub const PAYLOAD_KEY: &str = "payload";
|
pub const PAYLOAD_KEY: &str = "payload";
|
||||||
|
|
||||||
pub const POST_SEGMENT: TemplateFile = TemplateFile::new("post_segment.html", "post_segment.html");
|
|
||||||
|
|
||||||
pub const NAV_SEGMENT: TemplateFile = TemplateFile::new("nav_segment.html", "nav_segment.html");
|
pub const NAV_SEGMENT: TemplateFile = TemplateFile::new("nav_segment.html", "nav_segment.html");
|
||||||
|
|
||||||
pub const TAILWIND_CONFIG: TemplateFile =
|
pub const TAILWIND_CONFIG: TemplateFile =
|
||||||
|
@ -61,13 +59,15 @@ pub const TAILWIND_CONFIG: TemplateFile =
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref TEMPLATES: Tera = {
|
pub static ref TEMPLATES: Tera = {
|
||||||
let mut tera = Tera::default();
|
let mut tera = Tera::default();
|
||||||
for t in [POST_SEGMENT, NAV_SEGMENT, TAILWIND_CONFIG].iter() {
|
for t in [NAV_SEGMENT, TAILWIND_CONFIG].iter() {
|
||||||
t.register(&mut tera).unwrap();
|
t.register(&mut tera).unwrap();
|
||||||
}
|
}
|
||||||
// errors::register_templates(&mut tera);
|
// errors::register_templates(&mut tera);
|
||||||
tera.autoescape_on(vec![".html", ".sql"]);
|
tera.autoescape_on(vec![".html", ".sql"]);
|
||||||
crate::person_homepage::register_templates(&mut tera);
|
crate::person_homepage::register_templates(&mut tera);
|
||||||
crate::person_followers::register_templates(&mut tera);
|
crate::person_followers::register_templates(&mut tera);
|
||||||
|
crate::posts::register_templates(&mut tera);
|
||||||
|
crate::commits::register_templates(&mut tera);
|
||||||
// auth::register_templates(&mut tera);
|
// auth::register_templates(&mut tera);
|
||||||
// gists::register_templates(&mut tera);
|
// gists::register_templates(&mut tera);
|
||||||
tera
|
tera
|
||||||
|
|
|
@ -41,6 +41,6 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if payload.posts %} {% set posts = payload.posts %} {% include
|
{% if payload.posts %} {% set posts = payload.posts %} {% include
|
||||||
"post_segment.html" %} {% endif %}
|
"posts_segment.html" %} {% endif %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
20
web_ui/templates/post_page.html
Normal file
20
web_ui/templates/post_page.html
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title> Post | {{ payload.author_name }} </title>
|
||||||
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-backdrop">
|
||||||
|
{% include "tailwind_config.html" %} {% include "nav_segment.html" %}
|
||||||
|
|
||||||
|
|
||||||
|
<section class="w-2/4 m-auto mt-9 items-center">
|
||||||
|
{% set post = payload %}
|
||||||
|
{% include "post_segment.html" %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,24 +1,20 @@
|
||||||
<section class="w-2/4 m-auto mt-9 items-center">
|
<div class="m-auto w-full bg-lightest p-2 rounded-md mb-3">
|
||||||
{% for post in posts %}
|
<div class="flex flex-row items-center">
|
||||||
<div class="m-auto w-full bg-lightest p-2 rounded-md mb-3">
|
<span class="">
|
||||||
<div class="flex flex-row items-center">
|
<a
|
||||||
<span class="">
|
class="text-2xl text-darkest font-bold w-full"
|
||||||
<a
|
href="{{ post.author_html_url }}"
|
||||||
class="text-2xl text-darkest font-bold w-full"
|
>
|
||||||
href="{{ post.author_html_url }}"
|
{{ post.author_name }}</a
|
||||||
>
|
>
|
||||||
{{ post.author_name }}</a
|
<p class="text-sm text-dark mt-1 w-full">
|
||||||
>
|
{{ post.author_preferred_username }}
|
||||||
<p class="text-sm text-dark mt-1 w-full">
|
</p>
|
||||||
{{ post.author_preferred_username }}
|
</span>
|
||||||
</p>
|
<span class="grow"></span>
|
||||||
</span>
|
<p class="text-sm text-dark">{{ post.post_published }}</p>
|
||||||
<span class="grow"></span>
|
</div>
|
||||||
<p class="text-sm text-dark">{{ post.post_published }}</p>
|
<div class="mt-3">
|
||||||
</div>
|
<p class="text-lg text-darkest">{{ post.post_content }}</p>
|
||||||
<div class="mt-3">
|
</div>
|
||||||
<p class="text-lg text-darkest">{{ post.post_content }}</p>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</section>
|
|
||||||
|
|
5
web_ui/templates/posts_segment.html
Normal file
5
web_ui/templates/posts_segment.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<section class="w-2/4 m-auto mt-9 items-center">
|
||||||
|
{% for post in posts %}
|
||||||
|
{% include "post_segment.html" %}
|
||||||
|
{% endfor %}
|
||||||
|
</section>
|
Loading…
Reference in a new issue