From 7c59f6769957171aa5897a28d62c4636c48a5c69 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Fri, 10 Mar 2023 16:33:50 +0100 Subject: [PATCH] =?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');