From abc51ad87c8f27b36b84f836d8fad219e3833107 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 16 Mar 2023 09:19:13 +0100 Subject: [PATCH] corrections diverses --- Cargo.lock | 2 ++ Cargo.toml | 2 ++ db/db.sql | 4 +++ db/db.sqlite3 | Bin 217088 -> 217088 bytes src/commons.rs | 6 ++-- src/db.rs | 47 ++++++++++++++++++++++++++-- src/index.rs | 16 +++++++--- src/main.rs | 8 ++--- src/page.rs | 40 ++++++++++++++++-------- static/cheezenotes.css | 29 +++++++++++++----- static/modules/cheezenotes.js | 4 ++- static/modules/md.js | 56 +++++++++++++++++++++++++++++----- templates/index.html | 9 ++++-- templates/page.html | 8 ++--- 14 files changed, 182 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4530c42..97d66c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -518,6 +518,7 @@ dependencies = [ "rusqlite", "serde", "serde_json", + "uuid 1.3.0", ] [[package]] @@ -2431,6 +2432,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" dependencies = [ "getrandom", + "rand", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index fc5bc06..5ab8a72 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,8 @@ edition = "2021" clap = { version = "4.0.18", features = ["derive"] } +uuid = {version = "1.3.0", features=["v4", "fast-rng"]} + actix-web = "4" actix-files = "0.6.2" actix-session = { version = "0.7.2", features = ["cookie-session"] } diff --git a/db/db.sql b/db/db.sql index b1e54c7..b5a5f3e 100644 --- a/db/db.sql +++ b/db/db.sql @@ -4,4 +4,8 @@ create table pages ( page_text text, active boolean default true not null, primary key (domain, page_name) +); + +create table pages_histo ( + ); \ No newline at end of file diff --git a/db/db.sqlite3 b/db/db.sqlite3 index 16d71f049694ba6278687ec9f2ac833c079e47e4..b5a0d8c95b6de0cc97c2d57badc88b191fca60f0 100644 GIT binary patch delta 26659 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 GIsb32cv`>! delta 875 zcmb`E+e=hY6vp@3d!L&#<9KNr$K&N>T27(eZK5nOC4#Q>rlcKbjxixR-XeOab`2(C zq)F|Uv@z>ZXi_*-57|RlK`;*^rIK`kh(gI;dZ}m|2K@mo_Ig4QKn?Fnz(zy4E8Ubklm}{v&MWiMHzg@Wcr$}kk>&4A29aj4vL9_f<5{lNK4`wdaH$df)z11bh_U~;8S?z`yi8O_SW=FWC zxowqL3H<0ZqHLrUO3sND~%YmPY;d}_#tX_HKaN5+F7mPCl1I, + pub app_name: String, + pub base_url: String, + pub db_pool: Pool, } diff --git a/src/db.rs b/src/db.rs index 11a91a4..e1c6a2c 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,9 +1,16 @@ use actix_web::{error, web, Error}; use serde::{Deserialize, Serialize}; +use uuid::Uuid; pub type Pool = r2d2::Pool; pub type Connection = r2d2::PooledConnection; +#[allow(unused)] +fn uuid4() -> String { + let id = Uuid::new_v4(); + id.to_string() +} + #[derive(Debug, Serialize, Deserialize)] pub struct Page { pub domain: String, @@ -11,7 +18,38 @@ pub struct Page { pub page_text: String, } -pub async fn get_page_by_name(pool: &Pool, domain: String, pagename: String) -> Result, Error> { +pub struct Domain { + pub domain: String, + pub domain_name: String, +} + +pub async fn get_domains(pool: &Pool) -> Result, Error> { + let pool = pool.clone(); + + let conn = web::block(move || pool.get()) + .await? + .map_err(error::ErrorInternalServerError)?; + web::block(move || { + let mut stmt = conn + .prepare("SELECT distinct domain, REPLACE(domain, '_', ' ') from pages WHERE active=true order by domain")?; + + stmt.query_map([], |row| { + Ok(Domain { + domain: row.get(0)?, + domain_name: row.get(1)?, + }) + }) + .and_then(Iterator::collect) + }) + .await? + .map_err(error::ErrorInternalServerError) +} + +pub async fn get_page_by_name( + pool: &Pool, + domain: String, + pagename: String, +) -> Result, Error> { let pool = pool.clone(); let conn = web::block(move || pool.get()) @@ -35,7 +73,12 @@ pub async fn get_page_by_name(pool: &Pool, domain: String, pagename: String) -> .map_err(error::ErrorInternalServerError) } -pub async fn update_page(pool: &Pool, domain: String, page_name: String, page_text: String) -> Result { +pub async fn update_page( + pool: &Pool, + domain: String, + page_name: String, + page_text: String, +) -> Result { let pool = pool.clone(); let conn = web::block(move || pool.get()) diff --git a/src/index.rs b/src/index.rs index cd073d7..c52fff5 100644 --- a/src/index.rs +++ b/src/index.rs @@ -5,17 +5,23 @@ use askama_actix::Template; use askama_actix::TemplateToResponse; use crate::commons::AppData; +use crate::db; +use crate::db::Domain; #[derive(Template)] #[template(path = "index.html")] pub struct PageTemplate { - pub name: String, - pub root: String, + pub app_name: String, + pub base_url: String, + pub domains: Vec, } #[get("/")] async fn index(data: web::Data) -> impl Responder { - let name = data.name.to_owned(); - let root = data.root.to_owned(); - PageTemplate { name, root }.to_response() + let app_name = data.app_name.to_owned(); + let base_url = data.base_url.to_owned(); + + let domains = db::get_domains(&data.db_pool).await.unwrap(); + + PageTemplate { app_name, base_url, domains }.to_response() } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 208237c..9a14f11 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,16 +14,16 @@ async fn main() -> std::io::Result<()> { let ip = args.ip; let port = args.port; - let root = args.root; + let base_url = args.root; let db = args.db; let manager = SqliteConnectionManager::file(db); let pool = Pool::new(manager).unwrap(); let appdata = AppData { - name: String::from("CheezeNotes"), - root, - pool: pool.clone(), + app_name: String::from("CheezeNotes"), + base_url, + db_pool: pool.clone(), }; HttpServer::new(move || { diff --git a/src/page.rs b/src/page.rs index 9f59d74..95dd73f 100644 --- a/src/page.rs +++ b/src/page.rs @@ -1,4 +1,5 @@ use actix_web::http::header::ContentType; +use actix_web::web::Query; use actix_web::{get, put, Responder}; use actix_web::{web, HttpResponse}; use serde::Deserialize; @@ -12,36 +13,49 @@ use crate::db; #[derive(Template)] #[template(path = "page.html")] pub struct PageTemplate { - pub name: String, - pub root: String, + pub app_name: String, + pub base_url: String, pub md: String, pub init: String, } #[derive(Debug, Deserialize)] +#[allow(non_snake_case)] struct QueryParams { pub data: Option, + pub fromDomain: Option, + pub fromPage: Option, } -async fn get_data(data: & web::Data, domain: String, page_name: String) -> String { - let fut_page_datas = db::get_page_by_name(&data.pool, domain.to_owned(), page_name.to_owned()); +fn new_page_text(page_name: String, domain_from: &Option, page_from: &Option) -> String { + let mut retour = String::from(""); + if let Some(domain_f) = domain_from { + if let Some(page_f) = page_from { + retour = format!("[retour](/{}/{})\n", domain_f, page_f); + } + } + retour + "# " + page_name.replace("_", " ").as_str() +} + +async fn get_data(data: &web::Data, domain: String, page_name: String, params: &Query) -> String { + let fut_page_datas = db::get_page_by_name(&data.db_pool, domain.to_owned(), page_name.to_owned()); let page_datas = fut_page_datas.await.unwrap(); match page_datas.first() { - None => String::from("# ") + page_name.replace("_", " ").as_str(), + None => new_page_text(page_name, ¶ms.fromDomain, ¶ms.fromPage), Some(dat) => (*dat.page_text).to_string(), } } #[get("/{domain}/{page}")] async fn page( - path: web::Path<(String, String,)>, + path: web::Path<(String, String)>, data: web::Data, params: web::Query, ) -> impl Responder { let domain = &path.0; let page_name = &path.1; - let md = get_data(&data, domain.to_owned(), page_name.to_owned()).await; + let md = get_data(&data, domain.to_owned(), page_name.to_owned(), ¶ms).await; match ¶ms.data { Some(_) => { @@ -52,13 +66,13 @@ async fn page( None => {} } - let name = data.name.to_owned() + " - " + page_name.as_str(); - let root = data.root.to_owned(); + let app_name = data.app_name.to_owned() + " - " + page_name.as_str(); + let base_url = data.base_url.to_owned(); //let init = String::from("init();"); - let init = format!("init();"); + let init = format!("init({:?}, {:?});", domain, page_name); PageTemplate { - name, - root, + app_name, + base_url, md, init, } @@ -76,7 +90,7 @@ async fn save_page( if pagename == "index" { return HttpResponse::Ok(); } - db::update_page(&data.pool, domain.to_owned(), pagename.to_owned(), body) + db::update_page(&data.db_pool, domain.to_owned(), pagename.to_owned(), body) .await .unwrap(); HttpResponse::Ok() diff --git a/static/cheezenotes.css b/static/cheezenotes.css index 0b1d64a..1ec4f7f 100644 --- a/static/cheezenotes.css +++ b/static/cheezenotes.css @@ -35,6 +35,11 @@ body { background-color: #dddddd; } +p.domain { + padding-left: 2rem; + font-size: 2rem; +} + div#content { position: absolute; margin: 0; @@ -47,9 +52,11 @@ div#content { } div#margindiv { - max-width: 1200px; + /*max-width: 1600px; margin-left: auto; - margin-right: auto; + margin-right: auto;*/ + margin-left: .5rem; + margin-right: .5rem; top: 0; bottom: 0; } @@ -60,8 +67,8 @@ div#cheezenotes { margin-top: 0; margin-bottom: 3rem; padding-top: 1rem; - padding-left: 3rem; - padding-right: 3rem; + padding-left: 1rem; + padding-right: 1rem; padding-bottom: 1rem; background-color: #ffffff; min-height: 100%; @@ -79,9 +86,11 @@ div#buttons { top: 0; left: 0; right: 0; + /*margin-left: .5rem; + margin-right: .5rem; margin-left: auto; margin-right: auto; - max-width: 1200px; + max-width: 1600px;*/ } div#buttons button.button { @@ -142,9 +151,11 @@ div#buttons #lockButtonLabel { } div.ta { - margin-left: auto; + margin-left: .5rem; + margin-right: .5rem; + /*margin-left: auto; margin-right: auto; - max-width: 1200px; + max-width: 1600px;*/ } textarea#ta { @@ -171,6 +182,10 @@ div#cheezenotes:focus { outline: none; } +div#cheezenotes input.checkbox { + vertical-align: bottom; +} + div#cheezenotes div.line { border-bottom: 1px solid #dddddd; padding-top: 0rem; diff --git a/static/modules/cheezenotes.js b/static/modules/cheezenotes.js index 1afb227..b81f16f 100644 --- a/static/modules/cheezenotes.js +++ b/static/modules/cheezenotes.js @@ -356,8 +356,10 @@ function onpopstate(e) { }).catch((error) => { alert(error); }); } -function init() { +function init(domain, page) { let cheezenotes = document.getElementById('cheezenotes'); + window.domain = domain; + window.page = page; dpwidth(cheezenotes); diff --git a/static/modules/md.js b/static/modules/md.js index 833704f..f7b5529 100644 --- a/static/modules/md.js +++ b/static/modules/md.js @@ -104,7 +104,7 @@ function onlink(e) { if (link.host !== document.location.host) { open(link.href); } else { - fetch(link.href + "?data=").then((response) => { + fetch(link.href + '?data=&fromDomain=' + window.domain + '&fromPage=' + window.page).then((response) => { let ta = document.getElementById('ta'); response.text().then((data) => { let content = document.getElementById('content'); @@ -114,6 +114,15 @@ function onlink(e) { window.history.pushState({}, "", link.href); document.title = 'CheezeNotes - ' + link.getAttribute('data-href'); ta.value = data; + let url = link.getAttribute('data-href').split('/'); + let page = url[0]; + let domain = window.domain; + if (url.length == 3) { + domain = url[1]; + page = url[2]; + } + window.domain = domain; + window.page = page; load(document.getElementById('ta'), cheezenotes); /*let editModeButton = document.getElementById('editModeButton'); @@ -198,6 +207,14 @@ function formatLine(line) { token = /^(\s*>(\s|$))/i; elem.classList.add('bq1'); elem.classList.add('bq'); + } else if (line.match(/^\s*\[[xXvV]?\]\s+/i)) { + //token = /^(\s*\[[xXvV]?\]\s+)/i; + let checked = ''; + if (line.match(/^\s*\[[xXvV]\]\s+/i)) { + checked = ' checked="checked"'; + } + line = line.replace(/^(\s*\[[xXvV]?\]\s+)/i, '$1') + elem.classList.add('checkbox'); } else { elem.classList.add('body'); } @@ -534,12 +551,37 @@ function addLink(line, listLink) { return line; } -function formatLink(line) { - line = line.replace(/(\[!([^\]]*?)\]\(([^\)]+?)\))/ig, '[!$2]($3)'); - line = line.replace(/(\[([^\]]+?)\]\(([^\)]+?)\))/ig, '[$2]($3)'); - line = line.replace(/(\[([^\]]+?)\]\(\))/ig, '[$2]()'); - line = line.replace(/(\[\]\(([^\)]+?)\))/ig, '[]($2)'); - return line; +/*function formatLink(link) { + link = link.replace(/(\[!([^\]]*?)\]\(([^\)]+?)\))/i, '[!$2]($3)'); + link = link.replace(/(\[([^\]]+?)\]\(([^\)]+?)\))/i, '[$2]($3)'); + link = link.replace(/(\[([^\]]+?)\]\(\))/i, '[$2]()'); + link = link.replace(/(\[\]\(([^\)]+?)\))/i, '[]($2)'); + return link; +}*/ + +function formatLink(link) { + let matches = link.match(/\[(.*)\]\((.*)\)/); + let libelle = matches[1]; + let url = matches[2]; + if (url == '' && libelle == '') { + return link; + } + let href = url; + if (href == '') { + href = libelle; + } + if (href.match(/^[^\:\/]+\/.*$/)) { + href = '/' + href; + } + if (libelle == '') { + return '[](' + url + ')'; + } else { + if (libelle.startsWith('!')) { + return '[' + libelle + '](' + url + ')'; + } else { + return '[' + libelle + '](' + url + ')'; + } + } } function addBold(line) { diff --git a/templates/index.html b/templates/index.html index de55b3f..c2448ee 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,10 +7,13 @@ - {{name}} - + {{app_name}} + -

+

{{app_name}}

+ {% for domain in domains %} +

{{ domain.domain_name }}

+ {% endfor %} diff --git a/templates/page.html b/templates/page.html index 618ccc3..57d124e 100644 --- a/templates/page.html +++ b/templates/page.html @@ -9,9 +9,9 @@ - {{name}} - - + {{app_name}} + + @@ -23,7 +23,7 @@