From 8f615bc2197ec0bb14d04183424277fe8f143448 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 9 Mar 2023 19:10:09 +0100 Subject: [PATCH 1/5] correction affichage --- db/db.sqlite3 | Bin 106496 -> 114688 bytes src/commons.rs | 3 +++ src/main.rs | 3 ++- static/cheezenotes.css | 9 +++++---- static/modules/cheezenotes.js | 27 +++++++++++---------------- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/db/db.sqlite3 b/db/db.sqlite3 index d4757bc0f04f5e94789a1e392bbbfd9c36c083df..9a67e74a6ca8407d5d9b5354687aa1668c21e1d0 100644 GIT binary patch delta 4789 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 z std::io::Result<()> { let ip = args.ip; let port = args.port; let root = args.root; + let db = args.db; - let manager = SqliteConnectionManager::file("db/db.sqlite3"); + let manager = SqliteConnectionManager::file(db); let pool = Pool::new(manager).unwrap(); let appdata = AppData { diff --git a/static/cheezenotes.css b/static/cheezenotes.css index 1f0cacc..a200c02 100644 --- a/static/cheezenotes.css +++ b/static/cheezenotes.css @@ -321,15 +321,16 @@ div#cheezenotes div.lasttablerow span.tablerow { div#cheezenotes div.cheezenotes_line span.token { font-weight: 1; - color: #1353b3; + color: transparent; overflow: hidden; -} - -div#cheezenotes div.cheezenotes_line span.token { font-size: 0; + vertical-align: baseline; + transition-property: font-size, color; + transition-duration: .2s; } div#cheezenotes:focus div.cheezenotes_line span.token { + color: #1353b3; font-size: 95%; } diff --git a/static/modules/cheezenotes.js b/static/modules/cheezenotes.js index 3778801..775f0a3 100644 --- a/static/modules/cheezenotes.js +++ b/static/modules/cheezenotes.js @@ -215,19 +215,6 @@ function oncopy(e) { //alert(e.clipboardData.getData('text/plain')); } -function onlockbutton(e) { - let lockButton = document.getElementById('lockButton'); - let lockButtonLabel = document.getElementById('lockButtonLabel'); - let cheezenotes = document.getElementById('cheezenotes'); - if (lockButton.checked) { - cheezenotes.contentEditable = false; - lockButtonLabel.innerText = 'visibility'; - } else { - cheezenotes.contentEditable = true; - lockButtonLabel.innerText = 'visibility_off'; - } -} - function ondrag(e) { // alert('drag'); } @@ -323,13 +310,21 @@ function onblur(e) { let cheezenotes = document.getElementById('cheezenotes'); redrawTables(cheezenotes); onsave(); - hideTokens(); + // hideTokens(); disableFormatButtons(); } -function onfocus() { +function onfocus(e) { + let editModeButton = document.getElementById('editModeButton'); + if (editModeButton.classList.contains('buttonoff')) { + e.preventDefault(); + let cheezenotes = document.getElementById('cheezenotes'); + cheezenotes.contentEditable = false; + cheezenotes.blur(); + return false; + } redrawTables(cheezenotes, dpwidth()); - showTokens(); + // showTokens(); enableFormatButtons(); } From 7c59f6769957171aa5897a28d62c4636c48a5c69 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Fri, 10 Mar 2023 16:33:50 +0100 Subject: [PATCH 2/5] =?UTF-8?q?am=C3=A9lioration=20continue...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/{db copy.sqlite3 => db-sauve.sqlite3} | Bin 106496 -> 122880 bytes db/db.sql | 6 ++-- db/db.sqlite3 | Bin 114688 -> 217088 bytes src/db.rs | 19 +++++----- src/main.rs | 4 +-- src/page.rs | 43 ++++++++--------------- static/cheezenotes.css | 10 +++--- static/modules/caret.js | 17 ++++++++- static/modules/cheezenotes.js | 43 +++++++++++++---------- static/modules/md.js | 16 +++++++-- 10 files changed, 91 insertions(+), 67 deletions(-) rename db/{db copy.sqlite3 => db-sauve.sqlite3} (79%) diff --git a/db/db copy.sqlite3 b/db/db-sauve.sqlite3 similarity index 79% rename from db/db copy.sqlite3 rename to db/db-sauve.sqlite3 index a531d5d350cd9b0263740310c54fd53ef0e3f28d..2280fcd54e1a457791e8d0ad7262d932addd0d73 100644 GIT binary patch delta 11772 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 VMJ4|6sa5!Kr+CZNgVXmS{|y^v4!!^Y delta 1280 zcmah|TWl0n7(V};neCj}nVquR3#F7Ul)9yKyVR0aklG7DL=mekw1D7lr_*(^m+9=b zfR~i6z(P`>mm!>r7!piSG)gy%*-~DrL`hUkNS}PDv3)=dit)h*G>WqgN{l9+oc~MC zf4={A{__t`=L}BUMwSTZ6hdf8Rz_E@XV9sX|GX?rpgfscI#gtexn+dPXXOv&33)7K z)H3Oilab6wV|j%Yz9 z8tn;0`{FN1xD+By(fNP*vjm33upBh#bJrW5-yVb5- zTz+32)cRiR@7n!<7ty1-SBu8`0^#s38JFGXDKULZ${fg@D(!+W%8qnfu z^$NTN%;BkJ>F=tpGIl#I2Blw%Yf;twz~^HLE(CMVSB5zzl+Ibxo$dJ_LRxDWkI7aL z7G{t*D74$|z)Z@x2I-kpF^7{%b>^f2-8j8{>XIs8whr0e;HKERlu^O5hd|*nQ9ld< zPVDWXBjfOO=1u@q;*czl0AC?%Bl20w_#D`?D|Ie2TLb%9dh$K6Wp-VFcgfpq6XX^U zWFTpWctyV8I48X$4cL<05oC-S9T}q)M&u$qiFlkuI4Oq6e2!_Gw?)}AY%TNKX!BB9 z=ZCd9{V})I3W0u84o}gh2B^#tD&4#NL5ZWt^vAD}#^Nc4k~>AjxDxVK|M8Y=C&?I{K>) z?gYMqpJT2w*Hgy(3{LQVdcX(AXj=$^|8~w=Y0S~lahUy|FfRKTvcWyXKg0W^8*tAW zwDOd3844Zi>nAspu3km;#x-xmK4$CWJg+aJ1E0WB(K@X?UX{q@Jmbw-&AQCNPvIwy zzPSP1Y_jQPF7wd_Xu^5T$n+fRApaOK+ByyS=1_@;UOWvgY=Td?7AoNrV#3MgzviMP z15hqqySPsc>%F~dM2+^*=aaA_Ths9cDtma%0GEz5_!x(!%Pz2FG0smJS0T@_u6}aU N-y(E(@2 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 delta 5558 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 hy|V^qeG>&g09m84!D3u|- Result, Error> { +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()) @@ -19,12 +20,13 @@ pub async fn get_page_by_name(pool: &Pool, pagename: String) -> Result web::block(move || { let mut stmt = conn - .prepare("SELECT page_name, page_text from pages WHERE active=true and page_name=?")?; + .prepare("SELECT domain, page_name, page_text from pages WHERE active=true and domain=? and page_name=?")?; - stmt.query_map([pagename], |row| { + stmt.query_map([domain, pagename], |row| { Ok(Page { - page_name: row.get(0)?, - page_text: row.get(1)?, + domain: row.get(0)?, + page_name: row.get(1)?, + page_text: row.get(2)?, }) }) .and_then(Iterator::collect) @@ -33,7 +35,7 @@ pub async fn get_page_by_name(pool: &Pool, pagename: String) -> Result .map_err(error::ErrorInternalServerError) } -pub async fn update_page(pool: &Pool, 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()) @@ -42,10 +44,9 @@ pub async fn update_page(pool: &Pool, page_name: String, page_text: String) -> R web::block(move || { let mut stmt = conn - .prepare("insert or replace into pages (page_name, page_text, active) values (?, ?, true)")?; - stmt.execute([page_name, page_text, ]) + .prepare("insert or replace into pages (domain, page_name, page_text, active) values (?, ?, ?, true)")?; + stmt.execute([domain, page_name, page_text, ]) }) .await? .map_err(error::ErrorInternalServerError) } - diff --git a/src/main.rs b/src/main.rs index 2e13a9a..208237c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,10 +30,10 @@ async fn main() -> std::io::Result<()> { App::new() .app_data(web::Data::new(appdata.to_owned())) .service(index::index) - .service(page::page) - .service(page::save_page) .service(actix_files::Files::new("/static", "./static")) .service(actix_files::Files::new("/static/modules", "./static/modules")) + .service(page::page) + .service(page::save_page) }) .bind((ip, port))? .run() diff --git a/src/page.rs b/src/page.rs index 505199c..9f59d74 100644 --- a/src/page.rs +++ b/src/page.rs @@ -3,8 +3,6 @@ use actix_web::{get, put, Responder}; use actix_web::{web, HttpResponse}; use serde::Deserialize; -use std::fs; - use askama_actix::Template; use askama_actix::TemplateToResponse; @@ -25,37 +23,25 @@ struct QueryParams { pub data: Option, } -async fn get_data(data: & web::Data, pagename: String) -> String { - let fut_page_datas = db::get_page_by_name(&data.pool, pagename.to_owned()); +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()); let page_datas = fut_page_datas.await.unwrap(); - let md; match page_datas.first() { - None => { - let filename = String::from("pages/") + pagename.as_str() + ".md"; - md = match fs::read_to_string(filename) { - Ok(txt) => { - db::update_page(&data.pool, pagename.to_owned(), txt.to_owned()) - .await - .unwrap(); - txt - } - Err(_) => String::from("# ") + pagename.replace("_", " ").as_str(), - }; - } - Some(dat) => md = (*dat.page_text).to_string(), + None => String::from("# ") + page_name.replace("_", " ").as_str(), + Some(dat) => (*dat.page_text).to_string(), } - md } -#[get("/page/{page}")] +#[get("/{domain}/{page}")] async fn page( - path: web::Path<(String,)>, + path: web::Path<(String, String,)>, data: web::Data, params: web::Query, ) -> impl Responder { - let pagename = &path.0; + let domain = &path.0; + let page_name = &path.1; - let md = get_data(&data, pagename.to_owned()).await; + let md = get_data(&data, domain.to_owned(), page_name.to_owned()).await; match ¶ms.data { Some(_) => { @@ -66,7 +52,7 @@ async fn page( None => {} } - let name = data.name.to_owned() + " - " + pagename.as_str(); + let name = data.name.to_owned() + " - " + page_name.as_str(); let root = data.root.to_owned(); //let init = String::from("init();"); let init = format!("init();"); @@ -79,17 +65,18 @@ async fn page( .to_response() } -#[put("/page/{page}")] +#[put("/{domain}/{page}")] async fn save_page( body: String, - path: web::Path<(String,)>, + path: web::Path<(String, String)>, data: web::Data, ) -> impl Responder { - let pagename = &path.0; + let domain = &path.0; + let pagename = &path.1; if pagename == "index" { return HttpResponse::Ok(); } - db::update_page(&data.pool, pagename.to_owned(), body) + db::update_page(&data.pool, domain.to_owned(), pagename.to_owned(), body) .await .unwrap(); HttpResponse::Ok() diff --git a/static/cheezenotes.css b/static/cheezenotes.css index a200c02..0b1d64a 100644 --- a/static/cheezenotes.css +++ b/static/cheezenotes.css @@ -46,7 +46,7 @@ div#content { overflow: auto; } -div #margindiv { +div#margindiv { max-width: 1200px; margin-left: auto; margin-right: auto; @@ -149,7 +149,7 @@ div.ta { textarea#ta { position: relative; - top: 3rem; + top: 0; display: none; width: 100%; height: 15rem; @@ -325,13 +325,13 @@ div#cheezenotes div.cheezenotes_line span.token { overflow: hidden; font-size: 0; vertical-align: baseline; - transition-property: font-size, color; - transition-duration: .2s; + /*transition-property: font-size, color; + transition-duration: .2s;*/ } div#cheezenotes:focus div.cheezenotes_line span.token { color: #1353b3; - font-size: 95%; + font-size: 90%; } div#cheezenotes div.body { diff --git a/static/modules/caret.js b/static/modules/caret.js index 6bab702..2cd6146 100644 --- a/static/modules/caret.js +++ b/static/modules/caret.js @@ -1,3 +1,18 @@ +function insertAtLineStart(txtBefore) { + let ret = saveSelection(); + let line = ret[0]; + let txt = line.innerText; + if (txt == '\n') { + txt = ""; + } + line.innerHTML = txtBefore + txt; + let span = document.createElement('span'); + span.innerHTML = txtBefore; + ret[1] = ret[1] + span.innerText.length;; + ret[3] = ret[3] + span.innerText.length;; + loadSelection(ret); +} + function insertTextAtCaret(txtBefore, txtAfter = '') { let ret = saveSelection(); let line = ret[0]; @@ -190,4 +205,4 @@ function setEndPositionInText(obj, position) { return 0; } -export { saveSelection, loadSelection, insertTextAtCaret }; \ No newline at end of file +export { saveSelection, loadSelection, insertTextAtCaret, insertAtLineStart }; \ No newline at end of file diff --git a/static/modules/cheezenotes.js b/static/modules/cheezenotes.js index 775f0a3..1afb227 100644 --- a/static/modules/cheezenotes.js +++ b/static/modules/cheezenotes.js @@ -1,13 +1,13 @@ -import { saveSelection, loadSelection, insertTextAtCaret } from './caret.js'; +import { saveSelection, loadSelection, insertTextAtCaret, insertAtLineStart } from './caret.js'; import { formatLine, load, save, formatTable, redrawTables, appendData, dpwidth } from './md.js'; const showtokens = [ { fontSize: 0 }, - { fontSize: '95%' } + { fontSize: '90%' } ]; const hidetokens = [ - { fontSize: '95%' }, + { fontSize: '90%' }, { fontSize: 0 } ]; @@ -21,14 +21,14 @@ function timeoutSave() { function showTokens() { let tokens = document.getElementsByClassName('token'); for (let i = 0; i < tokens.length; i++) { - tokens[i].animate(showtokens, { duration: 200, iterations: 1 }); + tokens[i].animate(showtokens, { duration: 50, iterations: 1 }); } } function hideTokens() { let tokens = document.getElementsByClassName('token'); for (let i = 0; i < tokens.length; i++) { - tokens[i].animate(hidetokens, { duration: 200, iterations: 1 }); + tokens[i].animate(hidetokens, { duration: 50, iterations: 1 }); } } @@ -82,7 +82,12 @@ function onh1button(e) { e.preventDefault(); let cheezenotes = document.getElementById('cheezenotes'); cheezenotes.focus(); - insertTextAtCaret('#', ''); + let sel = saveSelection(); + if (sel[0].classList.contains('h')) { + return false; + } else { + insertAtLineStart('# '); + } onedit(e); return false; } @@ -91,7 +96,12 @@ function onh2button(e) { e.preventDefault(); let cheezenotes = document.getElementById('cheezenotes'); cheezenotes.focus(); - insertTextAtCaret('##', ''); + let sel = saveSelection(); + if (sel[0].classList.contains('h')) { + return false; + } else { + insertAtLineStart('## '); + } onedit(e); return false; } @@ -100,7 +110,12 @@ function onh3button(e) { e.preventDefault(); let cheezenotes = document.getElementById('cheezenotes'); cheezenotes.focus(); - insertTextAtCaret('###', ''); + let sel = saveSelection(); + if (sel[0].classList.contains('h')) { + return false; + } else { + insertAtLineStart('### '); + } onedit(e); return false; } @@ -310,21 +325,13 @@ function onblur(e) { let cheezenotes = document.getElementById('cheezenotes'); redrawTables(cheezenotes); onsave(); - // hideTokens(); + hideTokens(); disableFormatButtons(); } function onfocus(e) { - let editModeButton = document.getElementById('editModeButton'); - if (editModeButton.classList.contains('buttonoff')) { - e.preventDefault(); - let cheezenotes = document.getElementById('cheezenotes'); - cheezenotes.contentEditable = false; - cheezenotes.blur(); - return false; - } redrawTables(cheezenotes, dpwidth()); - // showTokens(); + showTokens(); enableFormatButtons(); } diff --git a/static/modules/md.js b/static/modules/md.js index 203d130..dfdb329 100644 --- a/static/modules/md.js +++ b/static/modules/md.js @@ -94,17 +94,23 @@ function onlink(e) { if (link.host !== document.location.host) { open(link.href); } else { - //open(link.href, '_self'); fetch(link.href + "?data=").then((response) => { let ta = document.getElementById('ta'); response.text().then((data) => { let content = document.getElementById('content'); let left = content.scrollLeft; let top = content.scrollTop; - window.history.replaceState({top: top, left: left}, ""); + window.history.replaceState({ top: top, left: left }, ""); window.history.pushState({}, "", link.href); + document.title = 'CheezeNotes - ' + link.getAttribute('data-href'); ta.value = data; load(document.getElementById('ta'), document.getElementById('cheezenotes')); + + let editModeButton = document.getElementById('editModeButton'); + if (editModeButton.classList.contains('buttonoff')) { + let cheezenotes = document.getElementById('cheezenotes'); + cheezenotes.contentEditable = false; + } content.scrollTop = 0; content.scrollLeft = 0; }); @@ -149,21 +155,27 @@ function formatLine(line) { } else if (line.match(/^\s*######(\s|$)/i)) { token = /^(\s*######(\s|$))/i; elem.classList.add('h6'); + elem.classList.add('h'); } else if (line.match(/^\s*#####(\s|$)/i)) { token = /^(\s*#####(\s|$))/i; elem.classList.add('h5'); + elem.classList.add('h'); } else if (line.match(/^\s*####(\s|$)/i)) { token = /^(\s*####(\s|$))/i; elem.classList.add('h4'); + elem.classList.add('h'); } else if (line.match(/^\s*###(\s|$)/i)) { token = /^(\s*###(\s|$))/i; elem.classList.add('h3'); + elem.classList.add('h'); } else if (line.match(/^\s*##(\s|$)/)) { token = /^(\s*##(\s|$))/i; elem.classList.add('h2'); + elem.classList.add('h'); } else if (line.match(/^\s*#(\s|$)/i)) { token = /^(\s*#(\s|$))/i; elem.classList.add('h1'); + elem.classList.add('h'); } else if (line.match(/^\s*>\s*>\s*>(\s|$)/i)) { token = /^(\s*>\s*>\s*>(\s|$))/i; elem.classList.add('bq3'); From 591d152c9f162157c53088a9ea0fbfb95842f9f2 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Fri, 10 Mar 2023 16:45:22 +0100 Subject: [PATCH 3/5] correction erreur bouton consultation simple --- db/db.sqlite3 | Bin 217088 -> 217088 bytes static/modules/md.js | 20 +++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/db/db.sqlite3 b/db/db.sqlite3 index 5ace3b6843050f0f2d376b42502c5c7cf2e94fab..074112033e7f91232baebe61a4f3a5eafda94fdc 100644 GIT binary patch delta 406 zcmZozz}v8ZcY-wIlZi6Uj88TuEad0sQ(<6XyvD$NjC%@)5aYG&0tURTju%+RW%MfxpRMn*k$Z12<4Wg1-%<&U8A@21Z@x9{#q? zg$l0xg8aPhy1lg3CO$<(MgebRo$A|4i22?owvoVKhIY+pAvahIySGQxn z$;i^;(ipk@=P^b;PDaM*92XcD3kvYh;yl4Ri)9P{4fdt%+c}c9@43L}$f9>!kVRUQ zDJ3;6u{5WoB(=DN;gAT6v@}z4X=ZU|UMiGgxRof&BCXFj{k%1^#B}GYjD?IE+qYh2 zT*V~C#^@x*A}tRyA~!QHQ#U<7Cyn83d*uzr?Ugr}I>H6nr!%my)-iA-u}8BXWvyd2 z+t{eWyjfV(g9*vilcUA$8TF<+o@CUTZhMk(?&c(kdF(vAAV0HD0(zBw(#FO%c97qq UL4I>#V(C$8jM{$hB%=}=0Dbjy_5c6? delta 434 zcmZozz}v8ZcY-wIrHL}mjF&bhEac~BpU%L<9?ig!#2(Em%qqOGk(qV7nK82m)AVR_ zW_!ld(;ZJTYOyp*Hade?Gq)#MFwbM>VSoS$AZ0q4Mm0V87r zH-9gK1b-t)o$Pd;4UD?X?fi|K3l%*0`Is7AfTAXiia?UJWcsB2j740`Y+o5TZ*khP zecjmjoQG?TniLxxx`izs$OG`|5 zzRFn0D7<~^RmN3JOtOrV9|(#wI<;5cVBB7LgQ+8&ALKa3YYcoU+{d`5a0qP{5D?*G zZjMacE_0OeCZiB9&l3h_W;F)>bDT-cY9P3=QIL_7=Lr)to3vFHeu Gne+gqsCVB0 diff --git a/static/modules/md.js b/static/modules/md.js index dfdb329..833704f 100644 --- a/static/modules/md.js +++ b/static/modules/md.js @@ -1,5 +1,15 @@ import { saveSelection, loadSelection } from "./caret.js"; +function setEditable() { + let editModeButton = document.getElementById('editModeButton'); + let cheezenotes = document.getElementById('cheezenotes'); + if (editModeButton.classList.contains('buttonoff')) { + cheezenotes.contentEditable = false; + } else { + cheezenotes.contentEditable = true; + } +} + function load(textarea, div) { div.innerHTML = ''; let lines = textarea.value.split('\n'); @@ -89,7 +99,7 @@ function onlink(e) { let cheezenotes = document.getElementById('cheezenotes'); if (cheezenotes.contentEditable == 'false') { e.preventDefault(); - cheezenotes.contentEditable = true; + setEditable(); let link = e.currentTarget; if (link.host !== document.location.host) { open(link.href); @@ -104,13 +114,13 @@ function onlink(e) { window.history.pushState({}, "", link.href); document.title = 'CheezeNotes - ' + link.getAttribute('data-href'); ta.value = data; - load(document.getElementById('ta'), document.getElementById('cheezenotes')); + load(document.getElementById('ta'), cheezenotes); - let editModeButton = document.getElementById('editModeButton'); + /*let editModeButton = document.getElementById('editModeButton'); if (editModeButton.classList.contains('buttonoff')) { let cheezenotes = document.getElementById('cheezenotes'); cheezenotes.contentEditable = false; - } + }*/ content.scrollTop = 0; content.scrollLeft = 0; }); @@ -125,7 +135,7 @@ function onlink(e) { function onlinkout(e) { let cheezenotes = document.getElementById('cheezenotes'); if (cheezenotes.contentEditable == 'false') { - cheezenotes.contentEditable = true; + setEditable(); } } From c3f404534a775af3cc2b9ac297d533038d7a0424 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Fri, 10 Mar 2023 21:28:21 +0100 Subject: [PATCH 4/5] =?UTF-8?q?m=C3=A0j=20base=20de=20donn=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/db.sqlite3 | Bin 217088 -> 217088 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/db.sqlite3 b/db/db.sqlite3 index 074112033e7f91232baebe61a4f3a5eafda94fdc..16d71f049694ba6278687ec9f2ac833c079e47e4 100644 GIT binary patch delta 1316 zcmbtUUu;uV7(ajS>0Nu0$MsKI+ zgY0Yrw`9Q$9&R9jn~5)mm=u@XfDi1&5ECPNkbw{h)0n7;6M68}v)xLT_~>~!55Mnx zzu)is&Uen(yf!wk&Fb*sTwO1GSbl547XSb#@I25y(MHri@Fjc{o-d1W81g=ck~*K7 z=o5Pt-tb{SEew|o)Bflg{0-DPMGxh{HyzA6_XtI-iB4Sm#fpEQX97iS6ou0tv$W(! zVy|`TDlEDXTLP{uTPll1ri!RYE4n@&x8^%>+`7uKm$hyPv|6wWr`51XDf+exs%p*M zgaPYV7p|g?f!QuR!aP-E5oC!OVKZde@+`v_0W!N4gU$Rf>IiN=Z;a7wI*6tt=KWjS;;QS<@8PF>tq@=q>2ARNbI?5UcQ=|D( zDw7#Ca(VFM7NT!M8;)WoSY@=DaE>-?ZEWBUqdvle4rEo`fLqv4DM{W6PhZ!=R__h? z!ZAjJgg3#Bgb|}?4!7j8hG7mcT1$ANgZC73nc;kD&@lUz45%Tz!RfTTfKoJ@j<)+r zP)8&3z`xdh2ob#zW=3;nu3+p-BogIDcKWgnQnc}c%9$>VN@V3o1hK38$OTjFq z^7+2aVXI>W?uao)LA7km<0XraIQiN1x-n!QUxDrLMOS~A@Pre|=iVtAX4EJgOchGz zZdZSZ@c3rY!CdLkXgaw$VEug)8a2LKz_l(Vo6_L)(=ObChZ&LB_BpZj)DGfe;AP^w z?mKCF?!hsi7l7vx<&nY4RGwXf9TIDWlsCLonch2Vu=!8VMc^^qpS!!^MR%ku&O-a! zRWzisC-zW1o~TUR(kk+5Z|_!kLbO!~_uNM*?dhb#hKiPphQPp~NP`wS*+hwt= Ol9`yu*mu8%G36hy?sN+P delta 1355 zcmZ`(Urbw77(d@R=ib}W(%V0j0%xOTtYWia1~o&&77Y_&Gn-3BwlPMue=e-1Eyyi1 z`armhZ5SIe+2V0a)a}6~E+nRzdS6V`2Mi>-5F89o#S(R$u24XoKYv6b4$2IzWHZ$h3tY~S@68iGP*hK`2og4UxnbkPn2$i5H{-g z)Hg8Xq*4{K-?8tNs^q^5hE4LE={63^kNJAWUoyJo&2dc;w*}jcYNJzTY%IVJMoE;P zkCGV8Z!_A>d;7^Y*;z)HQG$K|N}kSf=R6EzIl)Kfp}AJNLcdUNE1xQ+ElyXI73qQU zlQbsV7J^iL{lnM$B(5;XnXgtDubG^_pXe#ITl1qgg)xGt@LpO9iArQu9(4 zuuQT8IZa1*J(T$^h?gxu4cy`31?X)HP*yKo)>=5I4e0}osidaqy_J;JS$Nw}Dlw3b z^=tY`MM6(QVmPIzvfBE?-3w6BGqdKf4jqoAvLV5i9PWOcKQT0*>&I&;YqI!DaWey1 z5j?BsV(Ij;&EGt_2)m>@%36R=wvsK-Wu9GxW_YoNvWUfzPMsdo^pKYAi)C|qXBA~( z>#IcHpURyYj(2SS;Q#yrnpbRr3~eI)pw%EVdmG+Ro)vAZwm6b;(Z(DW%@10;R0KlF zc&NEtFevC1r2eSpP3Lbgs=8jl607dFEcumHh`O3UV!?I`Gw-g#jt9=`$eD25aJ0fL zxLzO*aZ_q8`3+243bOwpXak27{PBi1ZpG+8|S&#@B$^|!{ zF0=Y~-?q5SSAAp*t6j%L-V<+ap!fWw13QaD!46U9mkv?iR)-ncLGs`}*V!vL@|g|m znVn=0@hBWoX$0BgN{=!ljgZ|1V|x+BqS>1?rgZE7BMrXijW&t-U$dx-`@xHKUi`@C zw~KV1+0cjZ6XYUpt1))Utl{JG;_z#g^_w&=%)+2jDo2?T5~WNPjB`p+hkBlnTTydP Hlr-l*Ha(jP From abc51ad87c8f27b36b84f836d8fad219e3833107 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Thu, 16 Mar 2023 09:19:13 +0100 Subject: [PATCH 5/5] 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 @@