mirror of
https://git.joinplu.me/Plume/Plume.git
synced 2024-12-23 02:26:36 +00:00
Add markdown support for summary (#482)
* Add markdown support for summary * Save both md and html summary
This commit is contained in:
parent
191eb89958
commit
570d7fe2d0
12 changed files with 79 additions and 12 deletions
|
@ -0,0 +1,2 @@
|
|||
-- This file should undo anything in `up.sql`
|
||||
ALTER TABLE users DROP COLUMN summary_html;
|
3
migrations/postgres/2019-03-16-143637_summary-md/up.sql
Normal file
3
migrations/postgres/2019-03-16-143637_summary-md/up.sql
Normal file
|
@ -0,0 +1,3 @@
|
|||
-- Your SQL goes here
|
||||
ALTER TABLE users ADD COLUMN summary_html TEXT NOT NULL DEFAULT '';
|
||||
UPDATE users SET summary_html = summary;
|
47
migrations/sqlite/2019-03-16-143637_summary-md/down.sql
Normal file
47
migrations/sqlite/2019-03-16-143637_summary-md/down.sql
Normal file
|
@ -0,0 +1,47 @@
|
|||
-- This file should undo anything in `up.sql`
|
||||
CREATE TABLE users2 (
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
username VARCHAR NOT NULL,
|
||||
display_name VARCHAR NOT NULL DEFAULT '',
|
||||
outbox_url VARCHAR NOT NULL UNIQUE,
|
||||
inbox_url VARCHAR NOT NULL UNIQUE,
|
||||
is_admin BOOLEAN NOT NULL DEFAULT 'f',
|
||||
summary TEXT NOT NULL DEFAULT '',
|
||||
email TEXT,
|
||||
hashed_password TEXT,
|
||||
instance_id INTEGER REFERENCES instances(id) ON DELETE CASCADE NOT NULL,
|
||||
creation_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
ap_url TEXT NOT NULL default '' UNIQUE,
|
||||
private_key TEXT,
|
||||
public_key TEXT NOT NULL DEFAULT '',
|
||||
shared_inbox_url VARCHAR,
|
||||
followers_endpoint VARCHAR NOT NULL DEFAULT '' UNIQUE,
|
||||
avatar_id INTEGER REFERENCES medias(id) ON DELETE SET NULL,
|
||||
last_fetched_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
fqn TEXT NOT NULL DEFAULT '',
|
||||
CONSTRAINT blog_authors_unique UNIQUE (username, instance_id)
|
||||
);
|
||||
|
||||
INSERT INTO users2 SELECT
|
||||
id,
|
||||
username,
|
||||
display_name,
|
||||
outbox_url,
|
||||
inbox_url,
|
||||
is_admin,
|
||||
summary,
|
||||
email,
|
||||
hashed_password,
|
||||
instance_id,
|
||||
creation_date,
|
||||
ap_url,
|
||||
private_key,
|
||||
public_key,
|
||||
shared_inbox_url,
|
||||
followers_endpoint,
|
||||
avatar_id,
|
||||
last_fetched_date,
|
||||
fqn
|
||||
FROM users;
|
||||
DROP TABLE users;
|
||||
ALTER TABLE users2 RENAME TO users;
|
3
migrations/sqlite/2019-03-16-143637_summary-md/up.sql
Normal file
3
migrations/sqlite/2019-03-16-143637_summary-md/up.sql
Normal file
|
@ -0,0 +1,3 @@
|
|||
-- Your SQL goes here
|
||||
ALTER TABLE users ADD COLUMN summary_html TEXT NOT NULL DEFAULT '';
|
||||
UPDATE users SET summary_html = summary;
|
|
@ -203,6 +203,7 @@ table! {
|
|||
avatar_id -> Nullable<Int4>,
|
||||
last_fetched_date -> Timestamp,
|
||||
fqn -> Text,
|
||||
summary_html -> Text,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ use plume_common::activity_pub::{
|
|||
sign::{gen_keypair, Signer},
|
||||
ActivityStream, ApSignature, Id, IntoId, PublicKey,
|
||||
};
|
||||
use plume_common::utils;
|
||||
use reqwest::{
|
||||
header::{HeaderValue, ACCEPT},
|
||||
Client,
|
||||
|
@ -52,7 +53,7 @@ pub struct User {
|
|||
pub outbox_url: String,
|
||||
pub inbox_url: String,
|
||||
pub is_admin: bool,
|
||||
pub summary: SafeString,
|
||||
pub summary: String,
|
||||
pub email: Option<String>,
|
||||
pub hashed_password: Option<String>,
|
||||
pub instance_id: i32,
|
||||
|
@ -65,6 +66,7 @@ pub struct User {
|
|||
pub avatar_id: Option<i32>,
|
||||
pub last_fetched_date: NaiveDateTime,
|
||||
pub fqn: String,
|
||||
pub summary_html: SafeString,
|
||||
}
|
||||
|
||||
#[derive(Default, Insertable)]
|
||||
|
@ -75,7 +77,7 @@ pub struct NewUser {
|
|||
pub outbox_url: String,
|
||||
pub inbox_url: String,
|
||||
pub is_admin: bool,
|
||||
pub summary: SafeString,
|
||||
pub summary: String,
|
||||
pub email: Option<String>,
|
||||
pub hashed_password: Option<String>,
|
||||
pub instance_id: i32,
|
||||
|
@ -85,6 +87,7 @@ pub struct NewUser {
|
|||
pub shared_inbox_url: Option<String>,
|
||||
pub followers_endpoint: String,
|
||||
pub avatar_id: Option<i32>,
|
||||
pub summary_html: SafeString,
|
||||
}
|
||||
|
||||
pub const AUTH_COOKIE: &str = "user_id";
|
||||
|
@ -212,6 +215,7 @@ impl User {
|
|||
.set((
|
||||
users::display_name.eq(name),
|
||||
users::email.eq(email),
|
||||
users::summary_html.eq(utils::md_to_html(&summary,"").0),
|
||||
users::summary.eq(summary),
|
||||
))
|
||||
.execute(conn)?;
|
||||
|
@ -320,7 +324,12 @@ impl User {
|
|||
.ap_actor_props
|
||||
.inbox_string()?,
|
||||
is_admin: false,
|
||||
summary: SafeString::new(
|
||||
summary:acct
|
||||
.object
|
||||
.object_props
|
||||
.summary_string()
|
||||
.unwrap_or_default(),
|
||||
summary_html: SafeString::new(
|
||||
&acct
|
||||
.object
|
||||
.object_props
|
||||
|
@ -684,7 +693,7 @@ impl User {
|
|||
.set_name_string(self.display_name.clone())?;
|
||||
actor
|
||||
.object_props
|
||||
.set_summary_string(self.summary.get().clone())?;
|
||||
.set_summary_string(self.summary_html.get().clone())?;
|
||||
actor
|
||||
.object_props
|
||||
.set_url_string(self.ap_url.clone())?;
|
||||
|
@ -902,7 +911,8 @@ impl NewUser {
|
|||
username,
|
||||
display_name,
|
||||
is_admin,
|
||||
summary: SafeString::new(summary),
|
||||
summary: summary.to_owned(),
|
||||
summary_html: SafeString::new(&utils::md_to_html(&summary,"").0),
|
||||
email: Some(email),
|
||||
hashed_password: Some(password),
|
||||
instance_id: Instance::get_local(conn)?.id,
|
||||
|
@ -1050,7 +1060,7 @@ pub(crate) mod tests {
|
|||
).unwrap();
|
||||
assert_eq!(updated.display_name, "new name");
|
||||
assert_eq!(updated.email.unwrap(), "em@il");
|
||||
assert_eq!(updated.summary.get(), "<p>summary</p>");
|
||||
assert_eq!(updated.summary_html.get(), "<p>summary</p>");
|
||||
|
||||
Ok(())
|
||||
});
|
||||
|
|
|
@ -225,7 +225,7 @@ pub fn edit(name: String, user: User, conn: DbConn, intl: I18n) -> Result<Ructe,
|
|||
UpdateUserForm {
|
||||
display_name: user.display_name.clone(),
|
||||
email: user.email.clone().unwrap_or_default(),
|
||||
summary: user.summary.to_string(),
|
||||
summary: user.summary,
|
||||
},
|
||||
ValidationErrors::default()
|
||||
)))
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<a href="@uri!(user::details: name = &author.fqn)">@author.name()</a>
|
||||
<a rel="author" class="u-url" href="@author.ap_url"></a>
|
||||
</h2>
|
||||
<p>@Html(&author.summary)</h2>
|
||||
<p>@Html(&author.summary_html)</h2>
|
||||
</div>
|
||||
@if !ctx.2.as_ref().map(|u| u.id == author.id).unwrap_or(false) {
|
||||
<form action="@uri!(user::follow: name = &author.fqn)" method="POST">
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
@input!(ctx.1, display_name (text), "Display name", form, errors.clone())
|
||||
@input!(ctx.1, email (text), "Email", form, errors.clone())
|
||||
@input!(ctx.1, summary (text), "Summary", form, errors)
|
||||
<label for="summary">@i18n!(ctx.1, "Summary")</label>
|
||||
<textarea id="summary" name="summary">@form.summary</textarea>
|
||||
|
||||
<input type="submit" value="@i18n!(ctx.1, "Update account")"/>
|
||||
</form>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
@for follow in followed {
|
||||
<div class="card">
|
||||
<h3><a href="@uri!(user::details: name = &follow.fqn)">@follow.name()</a> <small>@format!("@{}", &follow.fqn)</small></h3>
|
||||
<main><p>@Html(follow.summary)</p></main>
|
||||
<main><p>@Html(follow.summary_html)</p></main>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
@for follower in followers {
|
||||
<div class="card">
|
||||
<h3><a href="@uri!(user::details: name = &follower.fqn)">@follower.name()</a> <small>@format!("@{}", &follower.fqn)</small></h3>
|
||||
<main><p>@Html(follower.summary)</p></main>
|
||||
<main><p>@Html(follower.summary_html)</p></main>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
|
|
@ -43,6 +43,6 @@
|
|||
}
|
||||
</div>
|
||||
<div class="user-summary p-note">
|
||||
@Html(user.summary.clone())
|
||||
@Html(user.summary_html.clone())
|
||||
</div>
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue