~/selfhut

selfhut/src/repository/tree.rs -rw-r--r-- 4.58 kB
7dbdfabf — arthurmelton I did alot, I should have commited more 2 years ago
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use rocket_dyn_templates::{context, Template};
use crate::config::CONFIG;
use crate::utils::repo_config::repo_config;
use crate::git::commits::get_commits;
use crate::git::main_branch::main_branch;
use crate::git::file::{files, file};
use crate::PathBufWithDotfiles;
use std::ffi::OsStr;
use syntect::easy::HighlightLines;
use syntect::parsing::SyntaxSet;
use syntect::highlighting::{ThemeSet, Style};
use syntect::util::LinesWithEndings;
use syntect::html::highlighted_html_for_string;
use std::path::Path;

#[get("/<repo>/tree", rank=2)]
pub fn tree_main(repo: String) -> Option<Template> {
    let main_branch = main_branch(repo.clone())?;
    Some(Template::render(
            "repository/tree",
            context! {
                title: format!("/ :: {}", repo.clone()),
                repo: repo.clone(),
                config: repo_config(repo.clone()),
                domain: CONFIG.domain.to_string(),
                active: "tree",
                commit: match get_commits(repo.clone(), 1, None) {
                    Some(x) => match x.get(0) {
                        Some(x) => Some(x.clone()),
                        None => None
                    }
                    None => None
                },
                branch: main_branch.clone(),
                files: files(repo, main_branch, "".to_string()),
                current_dir_file: "/",
                current_dir: "/"
            }
        ))
}

#[get("/<repo>/tree/<branch>/<location..>", rank=2)]
pub fn tree(repo: String, branch: String, location: PathBufWithDotfiles) -> Option<Template> {
    match file(repo.clone(), branch.clone(), location.get().display().to_string()) {
        Some(file) => {
            let mut content = "".to_string();
            let mut lines: Vec<usize> = (1..1).collect();
            if file.1.is_some() {
                let ps = SyntaxSet::load_defaults_newlines();
                let ts = ThemeSet::load_defaults();
                let syntax = match ps.find_syntax_by_extension(Path::new(&file.0.name).extension().and_then(OsStr::to_str).unwrap_or("txt")) {
                    Some(x) => x,
                    None => ps.find_syntax_by_extension("txt").unwrap()
                };
                let s = file.1.as_ref().unwrap();
                lines = (1..s.lines().count()+1).collect();
                content = highlighted_html_for_string(s, &ps, syntax, &ts.themes["Solarized (light)"]).ok()?
            }
            Some(Template::render(
                "repository/file",
                context! {
                    title: format!("/{} :: {}", location.get().display(), repo.clone()),
                    repo: repo.clone(),
                    config: repo_config(repo.clone()),
                    domain: CONFIG.domain.to_string(),
                    active: "tree",
                    commit: match get_commits(repo.clone(), 1, None) {
                        Some(x) => match x.clone().get(0) {
                            Some(x) => Some(x.clone()),
                            None => None
                        }
                        None => None
                    },
                    branch: branch.clone(),
                    files: file,
                    current_dir_file: format!("/{}/", location.get().display()).replace("//", "/"),
                    current_dir: format!("/{}", location.get().display()),
                    fluid: "true",
                    content,
                    lines
                }
            ))
        },
        None => { 
            Some(Template::render(
                "repository/tree",
                context! {
                    title: format!("/{} :: {}", location.get().display(), repo.clone()),
                    repo: repo.clone(),
                    config: repo_config(repo.clone()),
                    domain: CONFIG.domain.to_string(),
                    active: "tree",
                    commit: match get_commits(repo.clone(), 1, None) {
                        Some(x) => match x.clone().get(0) {
                            Some(x) => Some(x.clone()),
                            None => None
                        }
                        None => None
                    },
                    branch: branch.clone(),
                    files: files(repo, branch, location.get().display().to_string()),
                    current_dir_file: format!("/{}/", location.get().display()).replace("//", "/"),
                    current_dir: format!("/{}", location.get().display())
                }
            ))
        }
    }
}