From 7c5b082ee399f2f6b5310eed664a6b17cf44ba89 Mon Sep 17 00:00:00 2001
From: Alvie Rahman page generated by notes2web$(basename "$dir") notes
" >> $output/index.md
- find "$dir" -name '*.md' -exec bash -c "_addarticletoindex '{}'" \;
- find "$dir" -not -path '**/.git/**' -not -name '*.md' -type f -exec bash -c "_addtextarticletoindex '{}'" \;
-}
-
-
-function _addtextarticletoindex {
- [[ "$(file -b "$1")" == "ASCII text" ]] || exit
- pandoc\
- -t html\
- -V "filepath=${1}.html"\
- -V "title=$1"\
- --template "$listitem_template"\
- "$1"\
- >> $output/index.md
-}
-
-
-function _addarticletoindex {
- echo "adding $1 to list of notes"
- pandoc\
- -t html\
- -V "filepath=${1}.html"\
- --template "$listitem_template"\
- "$1"\
- >> $output/index.md
-}
-
-
-export -f _renderarticle
-export -f _rendertextarticle
-export -f _adddirtoindex
-export -f _addarticletoindex
-export -f _addtextarticletoindex
-
-
-#render each markdown file in every folder passed in args
-for dir in "$@"
-do
- find "$dir" -name '*.md' -exec bash -c "_renderarticle '{}'" \;
- find "$dir" -not -path '**/.git/**' -not -name '*.md' -type f -exec bash -c "_rendertextarticle '{}'" \;
-done
-
-
-# create an intermediate markdown file of links to each article
-echo "---" > $output/index.md
-[[ -z "$name" ]] && echo "title: notes" >> $output/index.md || echo "title: ${name}'s notes" >> $output/index.md
-echo "---" >> $output/index.md
-
-
-# mark folders to be included in notes2web's index
-for file in "$@"
-do
- [[ ! -f "$file" ]] && echo "the presence of this files tells notes2web that it should be added to the notes2web index" > "$file/.2web"
-done
-
-
-# add articles to index and render
-find -name '.2web' -exec bash -c "_adddirtoindex '{}'" \;
-
-
-echo "copying styles.css to current directory"
-cp "$stylesheet" "$output/styles.css"
-
-
-echo "rendering index.md"
-pandoc\
- -t html\
- --template "$index_template"\
- -o "$output/index.html"\
- "$output/index.md"
diff --git a/notes2web.py b/notes2web.py
new file mode 100755
index 0000000..a8a7764
--- /dev/null
+++ b/notes2web.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python3
+
+
+from bs4 import BeautifulSoup as bs
+import magic
+import sys
+import pathlib
+import pypandoc
+import shutil
+import os
+import re
+
+TEXT_ARTICLE_TEMPLATE_FOOT = None
+TEXT_ARTICLE_TEMPLATE_HEAD = None
+INDEX_TEMPLATE_FOOT = None
+INDEX_TEMPLATE_HEAD = None
+
+def get_files(folder):
+ markdown = []
+ plaintext = []
+ other = []
+
+ for root, folders, files in os.walk(folder):
+ for filename in files:
+ name = os.path.join(root, filename)
+ if os.path.splitext(name)[1] == '.md':
+ markdown.append(name)
+ elif re.match(r'^text/', magic.from_file(name, mime=True)):
+ plaintext.append(name)
+ other.append(name)
+ else:
+ other.append(name)
+
+ return markdown, plaintext, other
+
+def get_dirs(folder):
+ r = []
+
+ for root, folders, files in os.walk(folder):
+ [r.append(os.path.join(root, folder)) for folder in folders]
+
+ return r
+
+
+def get_args():
+ """ Get command line arguments """
+
+ import argparse
+ parser = argparse.ArgumentParser()
+ parser.add_argument('notes', type=pathlib.Path)
+ parser.add_argument('-o', '--output-dir', type=pathlib.Path, default='web')
+ parser.add_argument('-t', '--template', type=pathlib.Path, default=pathlib.Path('/opt/notes2web/templates/article.html'))
+ parser.add_argument('-H', '--template-text-head', type=pathlib.Path, default=pathlib.Path('/opt/notes2web/templates/textarticlehead.html'))
+ parser.add_argument('-f', '--template-text-foot', type=pathlib.Path, default=pathlib.Path('/opt/notes2web/templates/textarticlefoot.html'))
+ parser.add_argument('-i', '--template-index-head', type=pathlib.Path, default=pathlib.Path('/opt/notes2web/templates/indexhead.html'))
+ parser.add_argument('-I', '--template-index-foot', type=pathlib.Path, default=pathlib.Path('/opt/notes2web/templates/indexfoot.html'))
+ parser.add_argument('-s', '--stylesheet', type=pathlib.Path, default=pathlib.Path('/opt/notes2web/styles.css'))
+ return parser.parse_args()
+
+
+def main(args):
+ """ Entry point for script """
+
+ with open(args.template_text_foot) as fp:
+ TEXT_ARTICLE_TEMPLATE_FOOT = fp.read()
+
+ with open(args.template_text_head) as fp:
+ TEXT_ARTICLE_TEMPLATE_HEAD = fp.read()
+
+ with open(args.template_index_foot) as fp:
+ INDEX_TEMPLATE_FOOT = fp.read()
+
+ with open(args.template_index_head) as fp:
+ INDEX_TEMPLATE_HEAD = fp.read()
+
+ if not os.path.exists(args.output_dir):
+ os.makedirs(args.output_dir, exist_ok=True)
+
+ if os.path.isfile(args.output_dir):
+ print("Output directory ({output_dir}) cannot be a file.")
+
+
+ markdown_files, plaintext_files, other_files = get_files(args.notes)
+
+ print(f"{markdown_files=}")
+ for filename in markdown_files:
+ html = pypandoc.convert_file(filename, 'html', extra_args=[f'--template={args.template}'])
+ output_filename = os.path.splitext(re.sub(f"^{args.notes.name}", args.output_dir.name, filename))[0] + '.html'
+ os.makedirs(os.path.dirname(output_filename), exist_ok=True)
+
+ with open(output_filename, 'w+') as fp:
+ fp.write(html)
+
+ print(f"{plaintext_files=}")
+ for filename in plaintext_files:
+ output_filename = re.sub(f"^{args.notes.name}", args.output_dir.name, filename) + '.html'
+ os.makedirs(os.path.dirname(output_filename), exist_ok=True)
+ title = os.path.basename(output_filename)
+ html = re.sub(r'\$title\$', title, TEXT_ARTICLE_TEMPLATE_HEAD)
+ html = re.sub(r'\$raw\$', os.path.basename(filename), html)
+ with open(filename) as fp:
+ html += fp.read()
+ html += TEXT_ARTICLE_TEMPLATE_FOOT
+
+ with open(output_filename, 'w+') as fp:
+ fp.write(html)
+
+ print(f"{other_files=}")
+ for filename in other_files:
+ output_filename = re.sub(f"^{args.notes.name}", args.output_dir.name, filename)
+ os.makedirs(os.path.dirname(output_filename), exist_ok=True)
+ shutil.copyfile(filename, output_filename)
+
+
+ dirs_to_index = [args.output_dir.name] + get_dirs(args.output_dir)
+ print(f"{dirs_to_index=}")
+ for directory in dirs_to_index:
+ paths = os.listdir(directory)
+ print(f"{paths=}")
+
+ indexentries = []
+
+ for path in paths:
+ if path == 'index.html':
+ continue
+
+ fullpath = os.path.join(directory, path)
+ print(fullpath)
+ if os.path.splitext(path)[1] == '.html':
+ with open(fullpath) as fp:
+ soup = bs(fp.read(), 'html.parser')
+
+ try:
+ title = soup.find('title').get_text()
+ except AttributeError:
+ title = path
+ else:
+ title = path
+
+ if title.strip() == '':
+ title = path
+
+ indexentries.append({
+ 'title': title,
+ 'path': path,
+ 'isdirectory': os.path.isdir(fullpath)
+ })
+
+ indexentries.sort(key=lambda entry: entry['title'])
+ indexentries.sort(key=lambda entry: entry['isdirectory'], reverse=True)
+
+ html = re.sub(r'\$title\$', directory, INDEX_TEMPLATE_HEAD)
+ for entry in indexentries:
+ html += f""
+ html += INDEX_TEMPLATE_FOOT
+
+ with open(os.path.join(directory, 'index.html'), 'w+') as fp:
+ fp.write(html)
+
+ shutil.copyfile(args.stylesheet, os.path.join(args.output_dir.name, 'styles.css'))
+
+ return 0
+
+
+if __name__ == '__main__':
+ try:
+ sys.exit(main(get_args()))
+ except KeyboardInterrupt:
+ sys.exit(0)
diff --git a/readme.md b/readme.md
index 0b15af7..84c0175 100644
--- a/readme.md
+++ b/readme.md
@@ -18,7 +18,7 @@ View your notes as a static html site.
## Usage
```
-$ notes2web NOTES_DIRECTORY_1 [NOTES_DIRECTORY_2 [...]]
+$ notes2web.py NOTES_DIRECTORY_1 [NOTES_DIRECTORY_2 [...]]
```
The command will generate a website in the `$output` directory (`./web` by default).
@@ -28,6 +28,8 @@ Then you just have to point a webserver at `$output`.
## Config
+NOT CURRENTLY IMPLEMENTED
+
`notes2web` looks for a config file called `.notes2web.conf` in your current directory and your home
directory.
Default config values:
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..9056194
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+beautifulsoup4==4.9.3
+pypandoc==1.5
+soupsieve==2.2.1
diff --git a/templates/indexfoot.html b/templates/indexfoot.html
new file mode 100644
index 0000000..3de525c
--- /dev/null
+++ b/templates/indexfoot.html
@@ -0,0 +1,2 @@
+
This file was not rendered by notes2web because it is a plaintext file, not a markdown file. + You access the raw file here. Below is an unformatted representation of the file:
diff --git a/templates/indexhead.html b/templates/indexhead.html new file mode 100644 index 0000000..6f5b02e --- /dev/null +++ b/templates/indexhead.html @@ -0,0 +1,11 @@ +
+ + + + +
+ + +