1
0
mirror of https://github.com/venthur/blag.git synced 2025-11-26 05:02:58 +00:00

7 Commits

Author SHA1 Message Date
Bastian Venthur
f707f33fbc make linter happy 2025-07-18 11:58:35 +02:00
Bastian Venthur
3c617acfaf Merge branch 'master' into performance 2025-07-18 09:39:48 +02:00
Bastian Venthur
c94f9793b0 improved performance test 2025-01-22 14:46:14 +01:00
Bastian Venthur
5cddb62603 Merge branch 'master' into performance 2025-01-22 14:14:46 +01:00
Bastian Venthur
a3da95ea19 added benchmark 2024-10-29 12:13:05 +01:00
Bastian Venthur
c4f3c09730 WIP 2024-10-29 10:16:48 +01:00
Bastian Venthur
5943dab690 wip 2024-10-29 10:16:48 +01:00
10 changed files with 140 additions and 122 deletions

View File

@@ -18,11 +18,10 @@ jobs:
- "3.11" - "3.11"
- "3.12" - "3.12"
- "3.13" - "3.13"
- "3.14"
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
@@ -35,8 +34,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: "3.x" python-version: "3.x"
@@ -49,8 +48,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: "3.x" python-version: "3.x"
@@ -64,8 +63,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
- uses: actions/setup-python@v6 - uses: actions/setup-python@v5
with: with:
python-version: "3.x" python-version: "3.x"

View File

@@ -2,9 +2,7 @@
## [unreleased] -- ## [unreleased] --
* Added Python 3.14 compatibility
* Removed requirements.txt and requirements-dev.txt * Removed requirements.txt and requirements-dev.txt
* Added footnotes extension for markdown
## [2.3.3] -- 2025-04-27 ## [2.3.3] -- 2025-04-27

View File

@@ -63,6 +63,10 @@ serve-docs: $(VENV)
manpage: $(VENV) manpage: $(VENV)
help2man $(BIN)/blag --no-info -n "blog-aware, static site generator" -o debian/blag.1 help2man $(BIN)/blag --no-info -n "blog-aware, static site generator" -o debian/blag.1
.PHONY: benchmark
benchmark: $(VENV)
$(BIN)/pytest --no-cov -s -rP tests/benchmark.py
.PHONY: clean .PHONY: clean
clean: clean:
rm -rf build dist *.egg-info rm -rf build dist *.egg-info

View File

@@ -21,7 +21,6 @@ blag is named after [the blag of the webcomic xkcd][blagxkcd].
* Theming support using [Jinja2][] templates * Theming support using [Jinja2][] templates
* Generation of Atom feeds for blog content * Generation of Atom feeds for blog content
* Fenced code blocks and syntax highlighting using [Pygments][] * Fenced code blocks and syntax highlighting using [Pygments][]
* Markdown footnotes
* Integrated devserver * Integrated devserver
* Available on [PyPI][] * Available on [PyPI][]

View File

@@ -34,7 +34,6 @@ def markdown_factory() -> Markdown:
"fenced_code", "fenced_code",
"codehilite", "codehilite",
"smarty", "smarty",
"footnotes",
MarkdownLinkExtension(), MarkdownLinkExtension(),
], ],
output_format="html", output_format="html",

View File

@@ -5,80 +5,80 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #49483e } .hll { background-color: #49483e }
.c { color: #959077 } /* Comment */ .c { color: #959077 } /* Comment */
.err { color: #ED007E; background-color: #1E0010 } /* Error */ .err { color: #ed007e; background-color: #1e0010 } /* Error */
.esc { color: #F8F8F2 } /* Escape */ .esc { color: #f8f8f2 } /* Escape */
.g { color: #F8F8F2 } /* Generic */ .g { color: #f8f8f2 } /* Generic */
.k { color: #66D9EF } /* Keyword */ .k { color: #66d9ef } /* Keyword */
.l { color: #AE81FF } /* Literal */ .l { color: #ae81ff } /* Literal */
.n { color: #F8F8F2 } /* Name */ .n { color: #f8f8f2 } /* Name */
.o { color: #FF4689 } /* Operator */ .o { color: #ff4689 } /* Operator */
.x { color: #F8F8F2 } /* Other */ .x { color: #f8f8f2 } /* Other */
.p { color: #F8F8F2 } /* Punctuation */ .p { color: #f8f8f2 } /* Punctuation */
.ch { color: #959077 } /* Comment.Hashbang */ .ch { color: #959077 } /* Comment.Hashbang */
.cm { color: #959077 } /* Comment.Multiline */ .cm { color: #959077 } /* Comment.Multiline */
.cp { color: #959077 } /* Comment.Preproc */ .cp { color: #959077 } /* Comment.Preproc */
.cpf { color: #959077 } /* Comment.PreprocFile */ .cpf { color: #959077 } /* Comment.PreprocFile */
.c1 { color: #959077 } /* Comment.Single */ .c1 { color: #959077 } /* Comment.Single */
.cs { color: #959077 } /* Comment.Special */ .cs { color: #959077 } /* Comment.Special */
.gd { color: #FF4689 } /* Generic.Deleted */ .gd { color: #ff4689 } /* Generic.Deleted */
.ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */ .ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */
.ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .ges { color: #f8f8f2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.gr { color: #F8F8F2 } /* Generic.Error */ .gr { color: #f8f8f2 } /* Generic.Error */
.gh { color: #F8F8F2 } /* Generic.Heading */ .gh { color: #f8f8f2 } /* Generic.Heading */
.gi { color: #A6E22E } /* Generic.Inserted */ .gi { color: #a6e22e } /* Generic.Inserted */
.go { color: #66D9EF } /* Generic.Output */ .go { color: #66d9ef } /* Generic.Output */
.gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */ .gp { color: #ff4689; font-weight: bold } /* Generic.Prompt */
.gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */ .gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */
.gu { color: #959077 } /* Generic.Subheading */ .gu { color: #959077 } /* Generic.Subheading */
.gt { color: #F8F8F2 } /* Generic.Traceback */ .gt { color: #f8f8f2 } /* Generic.Traceback */
.kc { color: #66D9EF } /* Keyword.Constant */ .kc { color: #66d9ef } /* Keyword.Constant */
.kd { color: #66D9EF } /* Keyword.Declaration */ .kd { color: #66d9ef } /* Keyword.Declaration */
.kn { color: #FF4689 } /* Keyword.Namespace */ .kn { color: #ff4689 } /* Keyword.Namespace */
.kp { color: #66D9EF } /* Keyword.Pseudo */ .kp { color: #66d9ef } /* Keyword.Pseudo */
.kr { color: #66D9EF } /* Keyword.Reserved */ .kr { color: #66d9ef } /* Keyword.Reserved */
.kt { color: #66D9EF } /* Keyword.Type */ .kt { color: #66d9ef } /* Keyword.Type */
.ld { color: #E6DB74 } /* Literal.Date */ .ld { color: #e6db74 } /* Literal.Date */
.m { color: #AE81FF } /* Literal.Number */ .m { color: #ae81ff } /* Literal.Number */
.s { color: #E6DB74 } /* Literal.String */ .s { color: #e6db74 } /* Literal.String */
.na { color: #A6E22E } /* Name.Attribute */ .na { color: #a6e22e } /* Name.Attribute */
.nb { color: #F8F8F2 } /* Name.Builtin */ .nb { color: #f8f8f2 } /* Name.Builtin */
.nc { color: #A6E22E } /* Name.Class */ .nc { color: #a6e22e } /* Name.Class */
.no { color: #66D9EF } /* Name.Constant */ .no { color: #66d9ef } /* Name.Constant */
.nd { color: #A6E22E } /* Name.Decorator */ .nd { color: #a6e22e } /* Name.Decorator */
.ni { color: #F8F8F2 } /* Name.Entity */ .ni { color: #f8f8f2 } /* Name.Entity */
.ne { color: #A6E22E } /* Name.Exception */ .ne { color: #a6e22e } /* Name.Exception */
.nf { color: #A6E22E } /* Name.Function */ .nf { color: #a6e22e } /* Name.Function */
.nl { color: #F8F8F2 } /* Name.Label */ .nl { color: #f8f8f2 } /* Name.Label */
.nn { color: #F8F8F2 } /* Name.Namespace */ .nn { color: #f8f8f2 } /* Name.Namespace */
.nx { color: #A6E22E } /* Name.Other */ .nx { color: #a6e22e } /* Name.Other */
.py { color: #F8F8F2 } /* Name.Property */ .py { color: #f8f8f2 } /* Name.Property */
.nt { color: #FF4689 } /* Name.Tag */ .nt { color: #ff4689 } /* Name.Tag */
.nv { color: #F8F8F2 } /* Name.Variable */ .nv { color: #f8f8f2 } /* Name.Variable */
.ow { color: #FF4689 } /* Operator.Word */ .ow { color: #ff4689 } /* Operator.Word */
.pm { color: #F8F8F2 } /* Punctuation.Marker */ .pm { color: #f8f8f2 } /* Punctuation.Marker */
.w { color: #F8F8F2 } /* Text.Whitespace */ .w { color: #f8f8f2 } /* Text.Whitespace */
.mb { color: #AE81FF } /* Literal.Number.Bin */ .mb { color: #ae81ff } /* Literal.Number.Bin */
.mf { color: #AE81FF } /* Literal.Number.Float */ .mf { color: #ae81ff } /* Literal.Number.Float */
.mh { color: #AE81FF } /* Literal.Number.Hex */ .mh { color: #ae81ff } /* Literal.Number.Hex */
.mi { color: #AE81FF } /* Literal.Number.Integer */ .mi { color: #ae81ff } /* Literal.Number.Integer */
.mo { color: #AE81FF } /* Literal.Number.Oct */ .mo { color: #ae81ff } /* Literal.Number.Oct */
.sa { color: #E6DB74 } /* Literal.String.Affix */ .sa { color: #e6db74 } /* Literal.String.Affix */
.sb { color: #E6DB74 } /* Literal.String.Backtick */ .sb { color: #e6db74 } /* Literal.String.Backtick */
.sc { color: #E6DB74 } /* Literal.String.Char */ .sc { color: #e6db74 } /* Literal.String.Char */
.dl { color: #E6DB74 } /* Literal.String.Delimiter */ .dl { color: #e6db74 } /* Literal.String.Delimiter */
.sd { color: #E6DB74 } /* Literal.String.Doc */ .sd { color: #e6db74 } /* Literal.String.Doc */
.s2 { color: #E6DB74 } /* Literal.String.Double */ .s2 { color: #e6db74 } /* Literal.String.Double */
.se { color: #AE81FF } /* Literal.String.Escape */ .se { color: #ae81ff } /* Literal.String.Escape */
.sh { color: #E6DB74 } /* Literal.String.Heredoc */ .sh { color: #e6db74 } /* Literal.String.Heredoc */
.si { color: #E6DB74 } /* Literal.String.Interpol */ .si { color: #e6db74 } /* Literal.String.Interpol */
.sx { color: #E6DB74 } /* Literal.String.Other */ .sx { color: #e6db74 } /* Literal.String.Other */
.sr { color: #E6DB74 } /* Literal.String.Regex */ .sr { color: #e6db74 } /* Literal.String.Regex */
.s1 { color: #E6DB74 } /* Literal.String.Single */ .s1 { color: #e6db74 } /* Literal.String.Single */
.ss { color: #E6DB74 } /* Literal.String.Symbol */ .ss { color: #e6db74 } /* Literal.String.Symbol */
.bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */ .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.fm { color: #A6E22E } /* Name.Function.Magic */ .fm { color: #a6e22e } /* Name.Function.Magic */
.vc { color: #F8F8F2 } /* Name.Variable.Class */ .vc { color: #f8f8f2 } /* Name.Variable.Class */
.vg { color: #F8F8F2 } /* Name.Variable.Global */ .vg { color: #f8f8f2 } /* Name.Variable.Global */
.vi { color: #F8F8F2 } /* Name.Variable.Instance */ .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.vm { color: #F8F8F2 } /* Name.Variable.Magic */ .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.il { color: #AE81FF } /* Literal.Number.Integer.Long */ .il { color: #ae81ff } /* Literal.Number.Integer.Long */

View File

@@ -5,9 +5,9 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #ffffcc } .hll { background-color: #ffffcc }
.c { color: #3D7B7B; font-style: italic } /* Comment */ .c { color: #3D7B7B; font-style: italic } /* Comment */
.err { border: 1px solid #F00 } /* Error */ .err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */ .k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666 } /* Operator */ .o { color: #666666 } /* Operator */
.ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.cp { color: #9C6500 } /* Comment.Preproc */ .cp { color: #9C6500 } /* Comment.Preproc */
@@ -24,34 +24,34 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */ .gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #04D } /* Generic.Traceback */ .gt { color: #0044DD } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */ .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.kp { color: #008000 } /* Keyword.Pseudo */ .kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */ .kt { color: #B00040 } /* Keyword.Type */
.m { color: #666 } /* Literal.Number */ .m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */ .s { color: #BA2121 } /* Literal.String */
.na { color: #687822 } /* Name.Attribute */ .na { color: #687822 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */ .nb { color: #008000 } /* Name.Builtin */
.nc { color: #00F; font-weight: bold } /* Name.Class */ .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #800 } /* Name.Constant */ .no { color: #880000 } /* Name.Constant */
.nd { color: #A2F } /* Name.Decorator */ .nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #717171; font-weight: bold } /* Name.Entity */ .ni { color: #717171; font-weight: bold } /* Name.Entity */
.ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.nf { color: #00F } /* Name.Function */ .nf { color: #0000FF } /* Name.Function */
.nl { color: #767600 } /* Name.Label */ .nl { color: #767600 } /* Name.Label */
.nn { color: #00F; font-weight: bold } /* Name.Namespace */ .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */ .nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */ .nv { color: #19177C } /* Name.Variable */
.ow { color: #A2F; font-weight: bold } /* Operator.Word */ .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #BBB } /* Text.Whitespace */ .w { color: #bbbbbb } /* Text.Whitespace */
.mb { color: #666 } /* Literal.Number.Bin */ .mb { color: #666666 } /* Literal.Number.Bin */
.mf { color: #666 } /* Literal.Number.Float */ .mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666 } /* Literal.Number.Hex */ .mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666 } /* Literal.Number.Integer */ .mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666 } /* Literal.Number.Oct */ .mo { color: #666666 } /* Literal.Number.Oct */
.sa { color: #BA2121 } /* Literal.String.Affix */ .sa { color: #BA2121 } /* Literal.String.Affix */
.sb { color: #BA2121 } /* Literal.String.Backtick */ .sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */ .sc { color: #BA2121 } /* Literal.String.Char */
@@ -66,9 +66,9 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
.s1 { color: #BA2121 } /* Literal.String.Single */ .s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */ .ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */ .bp { color: #008000 } /* Name.Builtin.Pseudo */
.fm { color: #00F } /* Name.Function.Magic */ .fm { color: #0000FF } /* Name.Function.Magic */
.vc { color: #19177C } /* Name.Variable.Class */ .vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */ .vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */ .vi { color: #19177C } /* Name.Variable.Instance */
.vm { color: #19177C } /* Name.Variable.Magic */ .vm { color: #19177C } /* Name.Variable.Magic */
.il { color: #666 } /* Literal.Number.Integer.Long */ .il { color: #666666 } /* Literal.Number.Integer.Long */

View File

@@ -151,10 +151,3 @@ header h2 {
display: inline; display: inline;
font-size: 1.2rem; font-size: 1.2rem;
} }
hr {
border: none;
border-top: 1px solid var(--foreground-dim);
opacity: 0.3;
margin: 2rem 0;
}

40
tests/benchmark.py Normal file
View File

@@ -0,0 +1,40 @@
"""Benchmark for Blag."""
import os
from argparse import Namespace
import blag
from blag.blag import build
def test_performance(args: Namespace) -> None:
"""Test performance.
This test checks how quickly blag can generate `FILES` amount of pages from
markdown.
"""
FILES = 1000
print(f"Generating {FILES} files")
# create random markdown files in the content directory
with open(os.path.join(blag.__path__[0], "content", "testpage.md")) as fh:
markdown = fh.read()
for i in range(FILES):
with open(f"content/{i}.md", "w") as f:
f.write(markdown)
f.write(str(i))
from time import time
t = time()
build(args)
t_first = time() - t
print(t_first)
t = time()
build(args)
t_second = time() - t
print(t_second)
print(f"First run: {t_first:.2f}s, second run: {t_second:.2f}s")
print(f"Speedup: {t_first/t_second:.2f}")

View File

@@ -111,17 +111,3 @@ this --- is -- a test ...
assert "mdash" not in html assert "mdash" not in html
assert "ndash" not in html assert "ndash" not in html
assert "hellip" not in html assert "hellip" not in html
def test_footnotes() -> None:
"""Test footnote extension."""
md = markdown_factory()
md1 = """
this is a footnote[^1]
[^1]: this is the footnotetext
"""
html, meta = convert_markdown(md, md1)
assert "<hr>" in html
assert "<ol>" in html
assert "footnotetext" in html