~/selfhut

selfhut/src/repository/tree.rs -rw-r--r-- 4.75 kB
50967860 — Arthur Melton allow donation 2 years ago

            
7dbdfabf arthurmelton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
616316d3 Arthur Melton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
616316d3 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
0016c2cc arthurmelton
00c0a257 Arthur Melton
144cd6f8 arthurmelton
00c0a257 Arthur Melton
5ec2ce6e Arthur Melton
0016c2cc arthurmelton
00c0a257 Arthur Melton
468a751a Arthur Melton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
0016c2cc arthurmelton
7dbdfabf arthurmelton
144cd6f8 arthurmelton
7dbdfabf arthurmelton
0016c2cc arthurmelton
7dbdfabf arthurmelton
0016c2cc arthurmelton
7dbdfabf arthurmelton
50967860 Arthur Melton
468a751a Arthur Melton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
00c0a257 Arthur Melton
0016c2cc arthurmelton
00c0a257 Arthur Melton
144cd6f8 arthurmelton
00c0a257 Arthur Melton
b1605a54 Arthur Melton
0016c2cc arthurmelton
00c0a257 Arthur Melton
468a751a Arthur Melton
00c0a257 Arthur Melton
7dbdfabf arthurmelton
























































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
109
110
111
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: "/",
                payment: CONFIG.payment_link.clone()
            }
        ))
}

#[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,
                    payment: CONFIG.payment_link.clone()
                }
            ))
        },
        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()),
                    payment: CONFIG.payment_link.clone()
                }
            ))
        }
    }
}