summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Schlosser <christoph@linux.com>2025-09-18 22:05:48 +0200
committerChristoph Schlosser <christoph@linux.com>2025-09-18 22:05:48 +0200
commit74cd345f76dd01034c804f75e7f16b42e9c0643c (patch)
treeb1105460df469168e052ec278bbb9b96a829ca33
parentf2056d0a59cd7234610dd7da1ea2c3e2a4be0f00 (diff)
downloadgit2hugo-74cd345f76dd01034c804f75e7f16b42e9c0643c.tar.gz
g2h: Add breadcrumb navigations to file and tree pages
-rw-r--r--README.md2
-rw-r--r--g2h/file.py11
-rw-r--r--g2h/file_page.py3
-rw-r--r--g2h/tree_page.py3
-rw-r--r--templates/_breadcrumbs.md1
-rw-r--r--templates/file.md2
-rw-r--r--templates/tree.md2
-rw-r--r--tests/file_page_test.py2
-rw-r--r--tests/file_test.py14
-rw-r--r--tests/tree_page_test.py2
10 files changed, 36 insertions, 6 deletions
diff --git a/README.md b/README.md
index b941d34..2e47831 100644
--- a/README.md
+++ b/README.md
@@ -58,7 +58,7 @@ For a full list of options, their defaults and how they're changing the behavior
File content in a codeblock with file extension based language detection.
For binary files a note that it can't be displayed.
- [x] Don't treat pictures as binary files.
- - [ ] Breadcrumbs for navigating.
+ - [x] Breadcrumbs for navigating.
- [ ] Add button to download raw file.
- [ ] Nav bar for navigating the pages mentioned above.
- [ ] Link to special readme, if a readme can be found, rendering markdown.
diff --git a/g2h/file.py b/g2h/file.py
index 8f683cd..e07f251 100644
--- a/g2h/file.py
+++ b/g2h/file.py
@@ -1,5 +1,16 @@
import os
+def generate_breadcrumbs(content_subdir, commit, dir, files):
+ breadcrumbs = '[/](/{})'.format(os.path.join(content_subdir, tree_join(commit, '')))
+ subpath = ''
+ for segment in dir.split(os.sep):
+ if not segment or len(segment) == 0:
+ continue
+ subpath = os.path.join(subpath, sanitize_file_name(segment, files))
+ breadcrumbs += '/[{}](/{})'.format(segment, os.path.join(content_subdir, tree_join(commit, subpath)))
+ return breadcrumbs
+
+
def sanitize_file_name(file_name, files):
if not file_name.startswith('.'):
return file_name
diff --git a/g2h/file_page.py b/g2h/file_page.py
index b154ee5..67ddf6d 100644
--- a/g2h/file_page.py
+++ b/g2h/file_page.py
@@ -2,7 +2,7 @@ import base64
import filetype
import os
-from .file import sanitize_file_name, tree_join
+from .file import generate_breadcrumbs, sanitize_file_name, tree_join
from .page import Page
from .tree import safe_join
@@ -37,6 +37,7 @@ class FilePage(Page):
content, file_type = bytes_to_content(file_bytes)
return {
+ 'breadcrumbs': generate_breadcrumbs(self.content_subdir, self.commit, os.path.join(self.file_path, self.file_name), self.tree.blobs),
'content': content,
'content_subdir': self.content_subdir,
'file_extension': os.path.splitext(self.file_name)[1].lstrip('.'),
diff --git a/g2h/tree_page.py b/g2h/tree_page.py
index 9b7a0d5..c36212c 100644
--- a/g2h/tree_page.py
+++ b/g2h/tree_page.py
@@ -1,6 +1,6 @@
import os
-from .file import sanitize_file_name, tree_join
+from .file import generate_breadcrumbs, sanitize_file_name, tree_join
from .page import Page
from .tree import safe_join
@@ -41,6 +41,7 @@ class TreePage(Page):
def context(self):
return {
+ 'breadcrumbs': generate_breadcrumbs(self.content_subdir, self.commit, self.sub_tree, self.tree.blobs),
'content_subdir': self.content_subdir,
'entries': self._get_entries(),
# TODO: Make this fit the rest of the system.
diff --git a/templates/_breadcrumbs.md b/templates/_breadcrumbs.md
new file mode 100644
index 0000000..d190b00
--- /dev/null
+++ b/templates/_breadcrumbs.md
@@ -0,0 +1 @@
+{{ breadcrumbs }}
diff --git a/templates/file.md b/templates/file.md
index 12a5a81..28f458a 100644
--- a/templates/file.md
+++ b/templates/file.md
@@ -1,5 +1,7 @@
{% include '_head.md' %}
+{% include '_breadcrumbs.md' %}
+
{% if type == 'text' %}
```{{ file_extension }}
{{ content }}
diff --git a/templates/tree.md b/templates/tree.md
index 53644bc..8a30cee 100644
--- a/templates/tree.md
+++ b/templates/tree.md
@@ -1,6 +1,8 @@
{% include '_head.md' %}
{% if entries %}
+{% include '_breadcrumbs.md' %}
+
| Name | Last modified |
|------|---------------|
{%- for entry in entries %}
diff --git a/tests/file_page_test.py b/tests/file_page_test.py
index a1123de..3fff51e 100644
--- a/tests/file_page_test.py
+++ b/tests/file_page_test.py
@@ -41,6 +41,7 @@ def test_context():
assert(context['file_extension'] == 'txt')
assert(context['title'] == 'file test: test_file.txt')
assert(context['type'] == 'text')
+ assert(context['breadcrumbs'] == '[/](/file/content/123/t/)/[test_file.txt](/file/content/123/t/test_file.txt)')
def test_context_dot_file():
file = MagicMock()
@@ -57,6 +58,7 @@ def test_context_dot_file():
assert(context['file_extension'] == '')
assert(context['title'] == 'file test: .file')
assert(context['type'] == 'text')
+ assert(context['breadcrumbs'] == '[/](/file/content/123/t/)/[.file](/file/content/123/t/_file)')
def test_bytes_to_content_text():
content, type = bytes_to_content('test'.encode())
diff --git a/tests/file_test.py b/tests/file_test.py
index 838df71..d1b40bd 100644
--- a/tests/file_test.py
+++ b/tests/file_test.py
@@ -1,9 +1,9 @@
import os
import pytest
-from unittest.mock import Mock
+from unittest.mock import MagicMock, Mock
-from g2h.file import sanitize_file_name, tree_join
+from g2h.file import generate_breadcrumbs, sanitize_file_name, tree_join
def test_sanitize_not_necessary():
assert(sanitize_file_name('foo', None) == 'foo')
@@ -24,3 +24,13 @@ def test_tree_join():
commit = Mock()
commit.hexsha = '123'
assert(tree_join(commit, 'test') == os.path.join('123', 't', 'test'))
+
+def test_generate_breadcrumbs():
+ commit = Mock()
+ commit.hexsha = '123'
+ assert(generate_breadcrumbs('', commit, '', None) == '[/](/123/t/)')
+ assert(generate_breadcrumbs('', commit, 'sub', None) == '[/](/123/t/)/[sub](/123/t/sub)')
+ assert(generate_breadcrumbs('', commit, 'sub/dir', None) == '[/](/123/t/)/[sub](/123/t/sub)/[dir](/123/t/sub/dir)')
+ assert(generate_breadcrumbs('', commit, 'sub/dir/file.txt', None) == '[/](/123/t/)/[sub](/123/t/sub)/[dir](/123/t/sub/dir)/[file.txt](/123/t/sub/dir/file.txt)')
+ assert(generate_breadcrumbs('content sub', commit, 'sub', None) == '[/](/content sub/123/t/)/[sub](/content sub/123/t/sub)')
+ assert(generate_breadcrumbs('', commit, 'sub/.file', MagicMock()) == '[/](/123/t/)/[sub](/123/t/sub)/[.file](/123/t/sub/_file)')
diff --git a/tests/tree_page_test.py b/tests/tree_page_test.py
index 891e940..a298728 100644
--- a/tests/tree_page_test.py
+++ b/tests/tree_page_test.py
@@ -53,6 +53,7 @@ def test_context_empty():
assert(context['content_subdir'] == '')
assert(context['subdir'] == '/123/t/tree/path')
assert(context['title'] == 'tree test: Tree')
+ assert(context['breadcrumbs'] == '[/](/123/t/)')
def test_context_entries():
tree = MagicMock()
@@ -111,7 +112,6 @@ def test_get_files():
commit.tree = tree
expected = []
for case in [ None, '.file', 'README', 'main.cc' ]:
- print(str(case))
if case:
add_node(tree, case)
expected.append(case)