17 Commits

Author SHA1 Message Date
eaeaa67807 moved skeleton files to cache so that the python code doesn't need to be updated dynamically. 2024-07-10 14:52:38 -06:00
d6b96c3980 Merge pull request #11 from kkYrusobad/patch-1
Create gruvbox.css
2022-01-30 14:26:13 -08:00
d429fdc231 Create gruvbox.css
Gruvbox color scheme for the startpage.
2021-11-19 14:33:13 +05:30
a666c05e7c updated README 2021-08-20 17:12:58 -07:00
45f5fe950a updated readme 2021-08-20 17:11:12 -07:00
39b1038467 forced all entries to stay on a single line 2020-09-24 14:21:52 -07:00
e3b9fd9fc3 Updated README with credits to original design 2020-09-05 16:54:40 -07:00
4b5236b3f1 Merge pull request #8 from aruffj/master
Added theme based on "tomorrow-night-eighties"
2020-09-05 16:47:59 -07:00
d1b4d27a35 Added theme based on "tomorrow-night-eighties"
Colorscheme based on chriskempson "tomorrow-night-eitghties"
2020-09-03 11:19:26 +02:00
5af56f68ae updated README 2020-08-27 17:54:12 -07:00
14a00433f8 browsers will no longer cache colors.css which fixes colors not updating 2020-08-26 15:52:43 -07:00
d60c0212e7 added better nginx conf to disable cache 2020-08-26 15:44:46 -07:00
666cb6d933 install now adds starttree.py to path, which can be run from any directory 2020-08-26 15:41:53 -07:00
8ef7375fac fixed bug with no such file or directory error 2020-08-25 10:59:47 -07:00
b782436526 added nice themes 2020-08-24 19:21:42 -07:00
82388ab9cc Update README 2020-08-24 18:36:19 -07:00
b05b6cda4d init.py is now a bash script: init.sh 2020-08-24 18:35:10 -07:00
21 changed files with 477 additions and 98 deletions

View File

@ -1,5 +1,5 @@
# StartTree # StartTree
A terminal-style home page replicating the tree command. A terminal-style home page replicating the tree command, modified from [this](https://notabug.org/nytly/home) start page, which no longer exists.
<p align="center"> <p align="center">
<img src="/images/StartTree.png", title="StartTree"/> <img src="/images/StartTree.png", title="StartTree"/>
@ -18,22 +18,27 @@ A terminal-style home page replicating the tree command.
</div> </div>
# Usage # Usage
## Requirements
Requires the `bs4` python package.
## Installation ## Installation
To install StartTree for the first time, run the following commands: To install StartTree for the first time, run the following commands:
(Note: If the `~/.config/StartTree` directory already exists, `init.py` will not execute to prevent accidentally overwriting a custom config. ) (Note: If the `~/.config/StartTree` directory already exists, `init.sh` will not copy the example config to prevent accidentally overwriting a custom config. )
``` ```
git clone https://github.com/Paul-Houser/StartTree.git git clone https://github.com/Paul-Houser/StartTree.git
cd StartTree cd StartTree
./init.py chmod +x init.sh
chmod +x generate.py
./init.sh
./generate.py ./generate.py
``` ```
This will create the directory `~/.config/StartTree` containing the default `config.yaml`, as well as generate the html/css, which you can view by pointing your browser at `$HOME/.cache/StartTree/index.html`. This will create the directory `~/.config/StartTree` containing the default `config.yaml`, install `starttree.py` to your `$PATH`, as well as generate the html/css, which you can view by pointing your browser at `$HOME/.cache/StartTree/index.html`.
## Config ## Config
The config should be placed in `~/.config/StartTree/config.yaml` The config should be placed in `~/.config/StartTree/config.yaml`
## Updating the HTML ## Updating the HTML
To re-generate the html/css after editing the config, navigate to the `StartTree` directory and execute `./generate.py`. To re-generate the html/css after editing the config, execute `starttree.py` from any directory.
# Example Config # Example Config
```yaml ```yaml
@ -48,7 +53,7 @@ tree_1: # each column should be named 'tree_X' where X is unique for each tree.
# or containing characters that cannot be in a yaml variable name. # or containing characters that cannot be in a yaml variable name.
frontpage: frontpage:
- "https://www.reddit.com/" - "https://www.reddit.com/"
- "front page" # - "front page"
unixporn: "https://www.reddit.com/r/unixporn/" unixporn: "https://www.reddit.com/r/unixporn/"
tree_2: tree_2:
other: other:
@ -78,10 +83,4 @@ vim docker-compose.yaml # edit specifics to your liking
docker-compose -f docker-compose.yaml up -d docker-compose -f docker-compose.yaml up -d
``` ```
This will make the `NGINX` server persist across reboots. You can point your browser's new tab and home page to `localhost:p<port#>` and you should your startpage! This will make the `NGINX` server persist across reboots. You can point your browser's new tab and home page to `localhost:<port#>` and you should see your startpage!
### NOTE:
Currently, docker is unaware if a file changes on the fly (like generating a new colorscheme or adding new shortcuts), so you have to restart the container with
`docker-compose -f docker-compose.yaml restart <servicename>`

46
docker/data/default.conf Normal file
View File

@ -0,0 +1,46 @@
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
expires -1;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

View File

@ -8,6 +8,7 @@ services:
- $HOME/.cache/StartTree/index.html:/usr/share/nginx/html/index.html - $HOME/.cache/StartTree/index.html:/usr/share/nginx/html/index.html
- $HOME/.cache/StartTree/styles/style.css:/usr/share/nginx/html/styles/style.css - $HOME/.cache/StartTree/styles/style.css:/usr/share/nginx/html/styles/style.css
- $HOME/.cache/StartTree/styles/Hack.ttf:/usr/share/nginx/html/styles/Hack.ttf - $HOME/.cache/StartTree/styles/Hack.ttf:/usr/share/nginx/html/styles/Hack.ttf
- $HOME/.cache/StartTree/default.conf:/etc/nginx/conf.d/default.conf # modified conf to disable page caching :)
ports: ports:
- "9876:80" - "9876:80"
environment: environment:

View File

@ -1,7 +1,6 @@
#!/bin/python3 #!/bin/python3
import yaml import yaml
import os
from os.path import expanduser from os.path import expanduser
from shutil import copyfile from shutil import copyfile
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@ -24,7 +23,6 @@ def prettifyHTML(html):
def parse_yaml(): def parse_yaml():
with open(config_path, mode='r') as file: with open(config_path, mode='r') as file:
file_dict = yaml.full_load(file) file_dict = yaml.full_load(file)
file.close()
return file_dict return file_dict
def print_keys(dictionary): def print_keys(dictionary):
@ -45,28 +43,28 @@ def gen_list_indices(html_file, file_dict):
def gen_col_headers(html_file, file_dict): def gen_col_headers(html_file, file_dict):
for key in file_dict: for key in file_dict:
html_file.write("<li>\n") html_file.write("<li>\n")
html_file.write(" <h1>" + key + "</h1>\n") html_file.write("<h1>" + key + "</h1>\n")
html_file.write(" <ul>\n") html_file.write("<ul>\n")
# generate list indices # generate list indices
gen_list_indices(html_file, file_dict[key]) gen_list_indices(html_file, file_dict[key])
html_file.write(" </ul>\n") html_file.write("</ul>\n")
html_file.write("</li>\n") html_file.write("</li>\n")
def gen_columns(html_file, file_dict): def gen_columns(html_file, file_dict):
for key in file_dict: for key in file_dict:
if key.split("_")[0] == "tree": if key.split("_")[0] == "tree":
html_file.write("<div class=\"column\">\n") html_file.write("<div class=\"column\">\n")
html_file.write(" <div class=\"tree\">\n") html_file.write("<div class=\"tree\">\n")
html_file.write(" <h1>.</h1>\n") html_file.write("<h1>.</h1>\n")
html_file.write(" <ul>\n") html_file.write("<ul>\n")
# generate the column headers # generate the column headers
gen_col_headers(html_file, file_dict[key]) gen_col_headers(html_file, file_dict[key])
html_file.write(" </ul>\n") html_file.write("</ul>\n")
html_file.write(" </div>\n") html_file.write("</div>\n")
html_file.write("</div>\n") html_file.write("</div>\n")
@ -74,7 +72,7 @@ def gen_html(file_dict):
print("Generating index.html...") print("Generating index.html...")
# open files # open files
skeleton_html = open('./skeletons/index.html', 'r') skeleton_html = open(cache_dir + '/skeletons/index.html', 'r')
cache_html = open(cache_dir + '/index.html', 'w+') cache_html = open(cache_dir + '/index.html', 'w+')
# copy skeleton_html to cache_html until Column Start comment # copy skeleton_html to cache_html until Column Start comment
@ -100,7 +98,7 @@ def gen_html(file_dict):
print("Done!") print("Done!")
def gen_style(file_dict): def gen_style(file_dict):
skeleton_style = open('./skeletons/style.css', 'r') skeleton_style = open(cache_dir + '/skeletons/style.css', 'r')
cache_style = open(cache_dir + '/styles/style.css', 'w') cache_style = open(cache_dir + '/styles/style.css', 'w')
# find style attributes in file_dict # find style attributes in file_dict
@ -115,7 +113,7 @@ def gen_style(file_dict):
if theme == "pywal": if theme == "pywal":
theme = home + '/.cache/wal/colors.css' theme = home + '/.cache/wal/colors.css'
else: else:
theme = '../themes/' + theme + '.css' theme = cache_dir + '/themes/' + theme + '.css'
copyfile(theme, home + '/.cache/StartTree/styles/colors.css') copyfile(theme, home + '/.cache/StartTree/styles/colors.css')

72
init.py
View File

@ -1,72 +0,0 @@
#!/bin/python3
import yaml
import os
from os.path import expanduser
from shutil import copyfile
from bs4 import BeautifulSoup
import sys
import subprocess
# Install dependencies
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'bs4'])
# get home directory
home = expanduser("~")
# get config path
config_dir = home + '/.config/StartTree'
config_path = home + '/.config/StartTree/config.yaml'
# get cache path
cache_dir = home + '/.cache/StartTree'
def setup():
# check if .config path exists
if not os.path.isdir(home + '/.config'):
print("The directory '~/.config' does not exist, or you do not have permissions to edit it.")
exit()
if not os.path.isdir(home + '/.cache'):
print("The directory '~/.cache' does not exist, or you do not have permissions to edit it.")
exit()
# check if .config/StartTree exists, create it and config if not
if not os.path.isdir(config_dir):
print("Creating '~/.config/StartTree'...")
os.mkdir(config_dir)
print("Copying config.yaml")
copyfile("./config.yaml", config_path)
print("")
# check if config.yaml exists
if not os.path.exists(config_path):
print("No config.yaml found in '~/.config/StartTree'")
print("Copy the example config with:")
print("\tcp ./config.yaml $HOME/.config/StartTree/config.yaml")
print("or create your own in that directory.")
exit()
# create directory structure in .cache
if not os.path.isdir(cache_dir):
print("Creating '" + cache_dir + "'...")
os.mkdir(cache_dir)
print("symlinking themes")
os.symlink(os.getcwd() + '/themes', home + '/.cache/StartTree/themes')
print("Creating '" + cache_dir + "/styles'")
os.mkdir(cache_dir + '/styles')
print("Creating style.css")
copyfile("./skeletons/style.css", cache_dir + '/styles/style.css')
print("Creating Hack.ttf")
copyfile("./skeletons/Hack.ttf", cache_dir + '/styles/Hack.ttf')
def main():
setup()
if __name__ == '__main__':
main()

71
init.sh Executable file
View File

@ -0,0 +1,71 @@
#!/bin/bash
config_dir=$HOME/.config/StartTree
config_path=$HOME/.config/StartTree/config.yaml
cache_dir=$HOME/.cache/StartTree
# check if .config path exists
if [ ! -d "$HOME/.config" ]; then
echo "The directory '~/.config' does not exist, or you do not have permissions to edit it."
exit
fi
# check if .cache path exists
if [ ! -d "$HOME/.cache" ]; then
echo "The directory '~/.cache' does not exist, or you do not have permissions to edit it."
exit
fi
# check if .local/bin exists
if [ ! -d "$HOME/.local/bin" ]; then
echo "The directory '~/.local/bin' does not exist, or you do not have permissions to edit it."
exit
fi
# check if .config/StartTree exists, create it and config if not
if [ ! -d "$config_dir" ]; then
echo "Creating '~/.config/StartTree'..."
mkdir $config_dir
echo "Copying config.yaml..."
cp ./config.yaml $config_path
echo
fi
# check if config.yaml exists
if [ ! -f "$config_path" ]; then
echo "No config.yaml found in '~/.config/StartTree'"
echo "Copy the example config with:"
echo "\tcp ./config.yaml $HOME/.config/StartTree/config.yaml"
echo "or create your own in that directory."
exit
fi
# create directory structure in .cache
if [ ! -d "$cache_dir" ]; then
echo "Creating '$cache_dir'..."
mkdir $cache_dir
echo "Symlinking themes..."
ln -s $(pwd)/themes $HOME/.cache/StartTree/themes
echo "Symlinking skeleton files..."
ln -s $(pwd)/skeletons $HOME/.cache/StartTree/skeletons
echo "Creating '$cache_dir/styles'..."
mkdir "$cache_dir/styles"
fi
echo "Creating style.css..."
cp "./skeletons/style.css" "$cache_dir/styles/style.css"
echo "Creating Hack.ttf..."
cp "./skeletons/Hack.ttf" "$cache_dir/styles/Hack.ttf"
# add to path
FILEPATH=$(readlink -f "generate.py")
ln -s $FILEPATH $HOME/.local/bin/starttree.py
echo "generate.py has been linked to $HOME/.local/bin/"
echo "Make sure this directory is in your \$PATH"
FILEPATH=$(readlink -f "docker/data/default.conf")
ln -s $FILEPATH $HOME/.cache/StartTree/default.conf

View File

@ -59,6 +59,7 @@ h1 {
ul { ul {
list-style: none; list-style: none;
padding-left: 2.5rem; padding-left: 2.5rem;
white-space:nowrap;
} }
li { li {

24
themes/carnival.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #bfc7c7;
--cursor: #bfc7c7;
/* Colors */
--color0: #000000;
--color1: #0e9da8;
--color2: #82b4b9;
--color3: #1063aa;
--color4: #2e45aa;
--color5: #7e3ca9;
--color6: #b82589;
--color7: #bfc7c7;
--color8: #415758;
--color9: #0e9da8;
--color10: #82b4b9;
--color11: #1063aa;
--color12: #2e45aa;
--color13: #7e3ca9;
--color14: #b82589;
--color15: #bfc7c7;
}

24
themes/cotton-candy.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #8fc5c6;
--cursor: #8fc5c6;
/* Colors */
--color0: #000000;
--color1: #9E2A5E;
--color2: #D03C6E;
--color3: #9D596B;
--color4: #378B77;
--color5: #346D8A;
--color6: #CD6A8C;
--color7: #8fc5c6;
--color8: #64898a;
--color9: #9E2A5E;
--color10: #D03C6E;
--color11: #9D596B;
--color12: #378B77;
--color13: #346D8A;
--color14: #CD6A8C;
--color15: #8fc5c6;
}

24
themes/desert-sky.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #c8c4c2;
--cursor: #c8c4c2;
/* Colors */
--color0: #000000;
--color1: #b07247;
--color2: #a89e88;
--color3: #89c0c0;
--color4: #69a4b7;
--color5: #358ec0;
--color6: #1a6eae;
--color7: #c8c4c2;
--color8: #5a504a;
--color9: #b07247;
--color10: #a89e88;
--color11: #89c0c0;
--color12: #69a4b7;
--color13: #358ec0;
--color14: #1a6eae;
--color15: #c8c4c2;
}

24
themes/ferns.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #a1bfa2;
--cursor: #a1bfa2;
/* Colors */
--color0: #000000;
--color1: #264D33;
--color2: #316B37;
--color3: #255546;
--color4: #316E4A;
--color5: #3E6848;
--color6: #3F8648;
--color7: #a1bfa2;
--color8: #708571;
--color9: #264D33;
--color10: #316B37;
--color11: #255546;
--color12: #316E4A;
--color13: #3E6848;
--color14: #3F8648;
--color15: #a1bfa2;
}

23
themes/gruvbox.css Normal file
View File

@ -0,0 +1,23 @@
/* gruv for starttree */
:root {
--background: #282828;
--foreground: #ebdbb2;
--cursor: #bfc7c7;
--color0: #282828;
--color1: #cc241d;
--color2: #98971a;
--color3: #d79921;
--color4: #458588;
--color5: #b16286;
--color6: #689d6a;
--color7: #a89984;
--color8: #928374;
--color9: #fb4934;
--color10: #b8bb26;
--color11: #fabd2f;
--color12: #83a598;
--color13: #d3869b;
--color14: #8ec07c;
--color15: #ebdbb2;
}

24
themes/intrigue.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #a6c1b8;
--cursor: #a6c1b8;
/* Colors */
--color0: #000000;
--color1: #554B41;
--color2: #962A30;
--color3: #F21B2B;
--color4: #DF4D49;
--color5: #2EA564;
--color6: #F7934A;
--color7: #a6c1b8;
--color8: #748780;
--color9: #554B41;
--color10: #962A30;
--color11: #F21B2B;
--color12: #DF4D49;
--color13: #2EA564;
--color14: #F7934A;
--color15: #a6c1b8;
}

24
themes/just-red.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #e58997;
--cursor: #e58997;
/* Colors */
--color0: #000000;
--color1: #BB243D;
--color2: #CC1B37;
--color3: #E11F3D;
--color4: #D8213E;
--color5: #E2203E;
--color6: #B42D44;
--color7: #e58997;
--color8: #a05f69;
--color9: #BB243D;
--color10: #CC1B37;
--color11: #E11F3D;
--color12: #D8213E;
--color13: #E2203E;
--color14: #B42D44;
--color15: #e58997;
}

24
themes/neon-pink-dark.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #9fc8e0;
--cursor: #9fc8e0;
/* Colors */
--color0: #000000;
--color1: #8B1374;
--color2: #2D3090;
--color3: #512F91;
--color4: #325AB7;
--color5: #4C5AA5;
--color6: #B91F9E;
--color7: #9fc8e0;
--color8: #6f8c9c;
--color9: #8B1374;
--color10: #2D3090;
--color11: #512F91;
--color12: #325AB7;
--color13: #4C5AA5;
--color14: #B91F9E;
--color15: #9fc8e0;
}

24
themes/neon.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #93d2d4;
--cursor: #93d2d4;
/* Colors */
--color0: #000000;
--color1: #205556;
--color2: #445142;
--color3: #B63632;
--color4: #9A9746;
--color5: #2E52C2;
--color6: #C610BE;
--color7: #93d2d4;
--color8: #669394;
--color9: #205556;
--color10: #445142;
--color11: #B63632;
--color12: #9A9746;
--color13: #2E52C2;
--color14: #C610BE;
--color15: #93d2d4;
}

24
themes/orange-dark.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #9f9f9f;
--cursor: #9f9f9f;
/* Colors */
--color0: #000000;
--color1: #2c3433;
--color2: #5e2711;
--color3: #303d44;
--color4: #9d350a;
--color5: #505c5b;
--color6: #5e7078;
--color7: #9f9f9f;
--color8: #3f3f3f;
--color9: #2c3433;
--color10: #5e2711;
--color11: #303d44;
--color12: #9d350a;
--color13: #505c5b;
--color14: #5e7078;
--color15: #9f9f9f;
}

24
themes/slick-red.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #c5c5c5;
--cursor: #c5c5c5;
/* Colors */
--color0: #000000;
--color1: #26292e;
--color2: #292c31;
--color3: #842133;
--color4: #c91a36;
--color5: #cf1f3b;
--color6: #c52c46;
--color7: #c5c5c5;
--color8: #515152;
--color9: #26292e;
--color10: #292c31;
--color11: #842133;
--color12: #c91a36;
--color13: #cf1f3b;
--color14: #c52c46;
--color15: #c5c5c5;
}

24
themes/this-ones-good.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #aba0cb;
--cursor: #aba0cb;
/* Colors */
--color0: #000000;
--color1: #8B2039;
--color2: #A5244B;
--color3: #E22A66;
--color4: #B55F40;
--color5: #EB9346;
--color6: #0A6389;
--color7: #aba0cb;
--color8: #77708e;
--color9: #8B2039;
--color10: #A5244B;
--color11: #E22A66;
--color12: #B55F40;
--color13: #EB9346;
--color14: #0A6389;
--color15: #aba0cb;
}

View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #2d2d2d;
--foreground: #cccccc;
--cursor: #cccccc;
/* Colors */
--color0: #2d2d2d;
--color1: #f2777a;
--color2: #99cc99;
--color3: #ffcc66;
--color4: #6699cc;
--color5: #cc99cc;
--color6: #66cccc;
--color7: #cccccc;
--color8: #999999;
--color9: #f2777a;
--color10: #99cc99;
--color11: #ffcc66;
--color12: #6699cc;
--color13: #cc99cc;
--color14: #66cccc;
--color15: #ffffff;
}

24
themes/water-fire.css Normal file
View File

@ -0,0 +1,24 @@
:root {
/* Special */
--background: #000000;
--foreground: #c0c6c7;
--cursor: #c0c6c7;
/* Colors */
--color0: #000000;
--color1: #128faa;
--color2: #558fa9;
--color3: #9790a6;
--color4: #b17379;
--color5: #b45255;
--color6: #bf3032;
--color7: #c0c6c7;
--color8: #425458;
--color9: #128faa;
--color10: #558fa9;
--color11: #9790a6;
--color12: #b17379;
--color13: #b45255;
--color14: #bf3032;
--color15: #c0c6c7;
}