refactoring and work on file search
This commit is contained in:
parent
4def21c97d
commit
7f2685d328
9 changed files with 181 additions and 155 deletions
94
src-tauri/src/file_tree.rs
Normal file
94
src-tauri/src/file_tree.rs
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
use html_tag::HtmlTag;
|
||||||
|
use shellexpand;
|
||||||
|
use std::{
|
||||||
|
fs::{self, DirEntry},
|
||||||
|
path::Path,
|
||||||
|
};
|
||||||
|
#[tauri::command]
|
||||||
|
pub fn dir_tree_html(basepath: &str, filter: Vec<String>) -> String {
|
||||||
|
match shellexpand::full(basepath) {
|
||||||
|
Ok(path) => add_dir_tree_node(&Path::new(&path.into_owned()), &filter).to_html(),
|
||||||
|
|
||||||
|
Err(_) => String::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn add_dir_tree_node(path: &Path, filter: &Vec<String>) -> HtmlTag {
|
||||||
|
let mut html = HtmlTag::new("div")
|
||||||
|
.with_class("filetree-node")
|
||||||
|
.with_id(&format!(
|
||||||
|
"{}",
|
||||||
|
Path::new(path)
|
||||||
|
.file_name()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_string_lossy()
|
||||||
|
))
|
||||||
|
.with_attribute("expanded", "false")
|
||||||
|
.with_child(
|
||||||
|
HtmlTag::new("button")
|
||||||
|
.with_class("filetree-directory-button")
|
||||||
|
.with_child(
|
||||||
|
HtmlTag::new("img")
|
||||||
|
.with_class("filetree-icon")
|
||||||
|
.with_attribute("src", "images/directory.svg"),
|
||||||
|
)
|
||||||
|
.with_child(
|
||||||
|
HtmlTag::new("a").with_body(
|
||||||
|
&Path::new(path)
|
||||||
|
.file_name()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_string_lossy(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if let Ok(entries) = fs::read_dir(path) {
|
||||||
|
for dir_entry_res in entries {
|
||||||
|
println!("{:?}", dir_entry_res);
|
||||||
|
if let Ok(dir_entry) = dir_entry_res {
|
||||||
|
if let Ok(metadata) = fs::metadata(dir_entry.path()) {
|
||||||
|
if metadata.is_file() {
|
||||||
|
html.add_child(div_from_dir_entry(&dir_entry))
|
||||||
|
} else if metadata.is_dir() {
|
||||||
|
html.add_child(
|
||||||
|
add_dir_tree_node(&dir_entry.path(), &filter)
|
||||||
|
.with_attribute("style", "visibility: hidden; height: 0px;"), // .with_style("visibility", "hidden")
|
||||||
|
// .with_style("height", "0px"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn div_from_dir_entry(dir_entry: &DirEntry) -> HtmlTag {
|
||||||
|
let mut file_div = HtmlTag::new("div")
|
||||||
|
.with_class("filetree-node")
|
||||||
|
.with_id(&format!("{}", dir_entry.path().to_string_lossy()))
|
||||||
|
.with_attribute("style", "visibility: hidden; height: 0px;");
|
||||||
|
let mut file_button = HtmlTag::new("button").with_class("filetree-file-button");
|
||||||
|
match dir_entry
|
||||||
|
.path()
|
||||||
|
.extension()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_string_lossy()
|
||||||
|
.to_string()
|
||||||
|
.as_str()
|
||||||
|
{
|
||||||
|
"md" => file_button.add_child(
|
||||||
|
HtmlTag::new("img")
|
||||||
|
.with_class("filetree-icon")
|
||||||
|
.with_attribute("src", "images/markdown.svg"),
|
||||||
|
),
|
||||||
|
|
||||||
|
_ => file_button.add_child(
|
||||||
|
HtmlTag::new("img")
|
||||||
|
.with_class("filetree-icon")
|
||||||
|
.with_attribute("src", "images/file.svg"),
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
file_button.add_child(HtmlTag::new("a").with_body(&dir_entry.file_name().to_string_lossy()));
|
||||||
|
file_div.add_child(file_button);
|
||||||
|
return file_div;
|
||||||
|
}
|
||||||
|
|
@ -1,152 +1,12 @@
|
||||||
use comrak::{format_html, nodes::NodeValue, parse_document, Arena, Options};
|
mod file_tree;
|
||||||
use html_tag::HtmlTag;
|
mod markdown_parser;
|
||||||
use shellexpand;
|
mod search;
|
||||||
use std::{
|
use std::env;
|
||||||
env,
|
|
||||||
fs,
|
|
||||||
path::{absolute, Path},
|
|
||||||
};
|
|
||||||
use tauri_plugin_fs::FsExt;
|
use tauri_plugin_fs::FsExt;
|
||||||
|
|
||||||
|
use file_tree::dir_tree_html;
|
||||||
|
use markdown_parser::parse_markdown;
|
||||||
|
|
||||||
|
|
||||||
#[tauri::command]
|
|
||||||
fn parse_markdown(document: &str, pathtemplate: &str, basepath: &str) -> String {
|
|
||||||
let rendered_markdown: String;
|
|
||||||
let path = "/foo/bar.txt";
|
|
||||||
println!("{:?}", shellexpand::full(path));
|
|
||||||
let arena = Arena::new();
|
|
||||||
|
|
||||||
// Parse the document into a root `AstNode`
|
|
||||||
let mut options = Options::default();
|
|
||||||
options.render.unsafe_ = true;
|
|
||||||
// options.render.hardbreaks = true;
|
|
||||||
let root = parse_document(&arena, document, &options);
|
|
||||||
|
|
||||||
// Iterate over all the descendants of root.
|
|
||||||
|
|
||||||
if let Ok(resolved_basepath) = shellexpand::full(&basepath) {
|
|
||||||
println!(
|
|
||||||
"{:?}",
|
|
||||||
env::set_current_dir(&resolved_basepath.into_owned())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
for node in root.descendants() {
|
|
||||||
if let NodeValue::Image(ref mut image_node) = node.data.borrow_mut().value {
|
|
||||||
let image_path = Path::new(&image_node.url).to_path_buf();
|
|
||||||
|
|
||||||
let absolute_image_path_res = absolute(image_node.url.clone());
|
|
||||||
|
|
||||||
let absolute_image_path = absolute_image_path_res.unwrap_or(image_path.clone());
|
|
||||||
let absolute_image_path_str = absolute_image_path.as_path().to_string_lossy();
|
|
||||||
if let Ok(resolved_path) = shellexpand::full(&absolute_image_path_str) {
|
|
||||||
image_node.url = pathtemplate.replace("FILEPATH", &resolved_path);
|
|
||||||
}
|
|
||||||
println!("{}", image_node.url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let mut html = vec![];
|
|
||||||
format_html(root, &options, &mut html).unwrap();
|
|
||||||
// println!("{}", String::from_utf8(html.clone()).unwrap());
|
|
||||||
rendered_markdown = String::from_utf8(html).unwrap();
|
|
||||||
return rendered_markdown.to_owned();
|
|
||||||
// String::from_str("lololo").unwrap()
|
|
||||||
}
|
|
||||||
// <div class="filetree-node" id="folder3">
|
|
||||||
// <button class="filetree-element">
|
|
||||||
// <img class="topbar_icon" src="images/dropdown.svg" />folder 3
|
|
||||||
// </button>
|
|
||||||
// </div>
|
|
||||||
|
|
||||||
fn add_dir_tree_node(path: &Path, filter: &Vec<String>) -> HtmlTag {
|
|
||||||
let mut html = HtmlTag::new("div")
|
|
||||||
.with_class("filetree-node")
|
|
||||||
.with_id(&format!(
|
|
||||||
"{}",
|
|
||||||
Path::new(path)
|
|
||||||
.file_name()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_string_lossy()
|
|
||||||
))
|
|
||||||
.with_attribute("expanded", "false")
|
|
||||||
.with_child(
|
|
||||||
HtmlTag::new("button")
|
|
||||||
.with_class("filetree-directory-button")
|
|
||||||
.with_child(
|
|
||||||
HtmlTag::new("img")
|
|
||||||
.with_class("filetree-icon")
|
|
||||||
.with_attribute("src", "images/directory.svg"),
|
|
||||||
)
|
|
||||||
.with_child(
|
|
||||||
HtmlTag::new("a").with_body(
|
|
||||||
&Path::new(path)
|
|
||||||
.file_name()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_string_lossy(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
if let Ok(entries) = fs::read_dir(path) {
|
|
||||||
for dir_entry_res in entries {
|
|
||||||
println!("{:?}", dir_entry_res);
|
|
||||||
if let Ok(dir_entry) = dir_entry_res {
|
|
||||||
if let Ok(metadata) = fs::metadata(dir_entry.path()) {
|
|
||||||
if metadata.is_file() {
|
|
||||||
let mut file_div = HtmlTag::new("div")
|
|
||||||
.with_class("filetree-node")
|
|
||||||
.with_id(&format!("{}", dir_entry.path().to_string_lossy()))
|
|
||||||
.with_attribute("style", "visibility: hidden; height: 0px;");
|
|
||||||
let mut file_button =
|
|
||||||
HtmlTag::new("button").with_class("filetree-file-button");
|
|
||||||
match dir_entry
|
|
||||||
.path()
|
|
||||||
.extension()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_string_lossy()
|
|
||||||
.to_string()
|
|
||||||
.as_str()
|
|
||||||
{
|
|
||||||
"md" => file_button.add_child(
|
|
||||||
HtmlTag::new("img")
|
|
||||||
.with_class("filetree-icon")
|
|
||||||
.with_attribute("src", "images/markdown.svg"),
|
|
||||||
),
|
|
||||||
|
|
||||||
_ => file_button.add_child(
|
|
||||||
HtmlTag::new("img")
|
|
||||||
.with_class("filetree-icon")
|
|
||||||
.with_attribute("src", "images/file.svg"),
|
|
||||||
),
|
|
||||||
};
|
|
||||||
|
|
||||||
file_button.add_child(
|
|
||||||
HtmlTag::new("a").with_body(&dir_entry.file_name().to_string_lossy()),
|
|
||||||
);
|
|
||||||
file_div.add_child(file_button);
|
|
||||||
|
|
||||||
html.add_child(file_div)
|
|
||||||
} else if metadata.is_dir() {
|
|
||||||
html.add_child(
|
|
||||||
add_dir_tree_node(&dir_entry.path(), &filter)
|
|
||||||
.with_attribute("style", "visibility: hidden; height: 0px;"), // .with_style("visibility", "hidden")
|
|
||||||
// .with_style("height", "0px"),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
#[tauri::command]
|
|
||||||
fn dir_tree_html(basepath: &str, filter: Vec<String>) -> String {
|
|
||||||
match shellexpand::full(basepath) {
|
|
||||||
Ok(path) => add_dir_tree_node(&Path::new(&path.into_owned()), &filter).to_html(),
|
|
||||||
|
|
||||||
Err(_) => String::new(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
tauri::Builder::default()
|
tauri::Builder::default()
|
||||||
|
|
|
||||||
49
src-tauri/src/markdown_parser.rs
Normal file
49
src-tauri/src/markdown_parser.rs
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
use comrak::{format_html, nodes::NodeValue, parse_document, Arena, Options};
|
||||||
|
use std::{
|
||||||
|
env,
|
||||||
|
|
||||||
|
path::{absolute, Path},
|
||||||
|
};
|
||||||
|
#[tauri::command]
|
||||||
|
pub fn parse_markdown(document: &str, pathtemplate: &str, basepath: &str) -> String {
|
||||||
|
let rendered_markdown: String;
|
||||||
|
let path = "/foo/bar.txt";
|
||||||
|
println!("{:?}", shellexpand::full(path));
|
||||||
|
let arena = Arena::new();
|
||||||
|
|
||||||
|
// Parse the document into a root `AstNode`
|
||||||
|
let mut options = Options::default();
|
||||||
|
options.render.unsafe_ = true;
|
||||||
|
// options.render.hardbreaks = true;
|
||||||
|
let root = parse_document(&arena, document, &options);
|
||||||
|
|
||||||
|
// Iterate over all the descendants of root.
|
||||||
|
|
||||||
|
if let Ok(resolved_basepath) = shellexpand::full(&basepath) {
|
||||||
|
println!(
|
||||||
|
"{:?}",
|
||||||
|
env::set_current_dir(&resolved_basepath.into_owned())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for node in root.descendants() {
|
||||||
|
if let NodeValue::Image(ref mut image_node) = node.data.borrow_mut().value {
|
||||||
|
let image_path = Path::new(&image_node.url).to_path_buf();
|
||||||
|
|
||||||
|
let absolute_image_path_res = absolute(image_node.url.clone());
|
||||||
|
|
||||||
|
let absolute_image_path = absolute_image_path_res.unwrap_or(image_path.clone());
|
||||||
|
let absolute_image_path_str = absolute_image_path.as_path().to_string_lossy();
|
||||||
|
if let Ok(resolved_path) = shellexpand::full(&absolute_image_path_str) {
|
||||||
|
image_node.url = pathtemplate.replace("FILEPATH", &resolved_path);
|
||||||
|
}
|
||||||
|
println!("{}", image_node.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut html = vec![];
|
||||||
|
format_html(root, &options, &mut html).unwrap();
|
||||||
|
// println!("{}", String::from_utf8(html.clone()).unwrap());
|
||||||
|
rendered_markdown = String::from_utf8(html).unwrap();
|
||||||
|
return rendered_markdown.to_owned();
|
||||||
|
// String::from_str("lololo").unwrap()
|
||||||
|
}
|
||||||
21
src-tauri/src/search.rs
Normal file
21
src-tauri/src/search.rs
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
pub fn search_files(searchstring: &str, filter: Vec<&str>) -> HtmlTag{
|
||||||
|
|
||||||
|
if let Ok(entries) = fs::read_dir(path) {
|
||||||
|
for dir_entry_res in entries {
|
||||||
|
if let Ok(dir_entry) = dir_entry_res {
|
||||||
|
if let Ok(metadata) = fs::metadata(dir_entry.path()) {
|
||||||
|
if metadata.is_file() {
|
||||||
|
html.add_child(div_from_dir_entry(&dir_entry))
|
||||||
|
} else if metadata.is_dir() {
|
||||||
|
html.add_child(
|
||||||
|
add_dir_tree_node(&dir_entry.path(), &filter)
|
||||||
|
.with_attribute("style", "visibility: hidden; height: 0px;"), // .with_style("visibility", "hidden")
|
||||||
|
// .with_style("height", "0px"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
0
src/filesearch.js
Normal file
0
src/filesearch.js
Normal file
|
|
@ -18,9 +18,9 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<dialog id="search_dialog">
|
<dialog id="file-search-dialog">
|
||||||
|
|
||||||
<div id="search_dialog_input" contenteditable></div>
|
<div id="file-search-dialog-input" contenteditable></div>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
import { showGlobalSearch, escape } from "./ui.js";
|
import { showFileSearch, escape } from "./ui.js";
|
||||||
|
|
||||||
document
|
document
|
||||||
.addEventListener("keydown",
|
.addEventListener("keydown",
|
||||||
function(event) {
|
function(event) {
|
||||||
if (event.ctrlKey && event.key === "k") {
|
if (event.ctrlKey && event.key === "k") {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
showGlobalSearch();
|
showFileSearch();
|
||||||
|
|
||||||
}
|
}
|
||||||
if (event.key == "Escape"){
|
if (event.key == "Escape"){
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,7 @@ dialog {
|
||||||
height: 20%;
|
height: 20%;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
}
|
}
|
||||||
#search_dialog_input{
|
#file-search-dialog-input{
|
||||||
border: solid;
|
border: solid;
|
||||||
border-color: var(--accent-color);
|
border-color: var(--accent-color);
|
||||||
border-top-right-radius:10px;
|
border-top-right-radius:10px;
|
||||||
|
|
|
||||||
10
src/ui.js
10
src/ui.js
|
|
@ -23,16 +23,18 @@ document.addEventListener("keydown", handleShortcut);
|
||||||
document.getElementById("hide-sidebar").onclick = function () {
|
document.getElementById("hide-sidebar").onclick = function () {
|
||||||
toggle_visibility("sidebar");
|
toggle_visibility("sidebar");
|
||||||
};
|
};
|
||||||
const global_search_dialog = document.querySelector("dialog");
|
const global_search_dialog = document.getElementById("file-search-dialog");
|
||||||
export function showGlobalSearch() {
|
export function showFileSearch() {
|
||||||
topmost_element = "global-search";
|
topmost_element = "file-search";
|
||||||
global_search_dialog.show();
|
global_search_dialog.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
let topmost_element = "";
|
let topmost_element = "";
|
||||||
|
|
||||||
export function escape(){
|
export function escape(){
|
||||||
if (topmost_element === "global-search"){
|
if (topmost_element === "file-search"){
|
||||||
global_search_dialog.close();
|
global_search_dialog.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue