aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2024-05-09 19:32:17 +0200
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2025-06-15 01:30:29 +0200
commitb9e24d2b8000cb16bc4167b684e82667471061ff (patch)
tree180053906fee67e148e1366c75ebba1bb4ef176c
parent731ddadbb5760c3ee5619c493d856374b4bea16d (diff)
downloadhaunt-blog-b9e24d2b8000cb16bc4167b684e82667471061ff.tar.gz
haunt-blog-b9e24d2b8000cb16bc4167b684e82667471061ff.tar.bz2
haunt-blog-b9e24d2b8000cb16bc4167b684e82667471061ff.zip
tests: add forgetten test files
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r--tests/Makefile264
-rw-r--r--tests/Makefile.empty190
-rw-r--r--tests/links.txt72
-rw-r--r--tests/markdown-article-lines.txt72
4 files changed, 598 insertions, 0 deletions
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000..1259aee
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,264 @@
+# Copyright (C) 2023-2024 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+CURL ?= curl
+BLOG_URL ?= https://blog.replicant.us/page
+
+GUILE_PATCH = 0001-SRFI-19-Add-support-for-ISO-8601-zones-with-a-colon.patch
+GUIX_COMMIT ?= b25b94335a3ee8d68d2145da8e5ea0325ecea451
+GUIX_SHELL ?= guix time-machine --commit=$(GUIX_COMMIT) -- shell -C
+GUIX_PYTHON_PACKAGES ?= python python-beautifulsoup4 python-html2text python-sh
+
+CONVERT ?= $(GUIX_SHELL) $(GUIX_PYTHON_PACKAGES) -- python3 convert.py
+HAUNT ?= $(GUIX_SHELL) --with-patch=guile=patches/$(GUILE_PATCH) haunt -- haunt
+
+VENDOR_REPLICANT_ARTWORK_REV ?= fc213d2ca94cef9047d1e4a71c21c4c4c87f349d
+VENDOR_REPLICANT_ARTWORK_PATH ?= external/vendor_replicant_artwork
+
+SENTINEL =
+
+.PHONY: \
+ all \
+ build \
+ deploy \
+ generate-wordpress-articles \
+ help \
+ markdown \
+ serve \
+ update-makefile \
+ $(SENTINEL)
+
+# Input: wordpress/articles/2015_07_replicant-source-code-hosting-and-rmll-2015.html
+# Output: https://blog.replicant.us/2015/07/replicant-source-code-hosting-and-rmll-2015/
+define get-wordpress-article-url
+
+(use-modules (ice-9 regex))
+
+;; Input: wordpress/articles/2015_07_replicant-source-code-hosting-and-rmll-2015.html
+;; Output: 2015_07_replicant-source-code-hosting-and-rmll-2015.html
+(define (local-filename name)
+ (list-ref (string-split name #\/) 2))
+
+;; Output: 2015
+(define year
+ (car (string-split (local-filename "$@") #\_)))
+
+;; Output: 07
+(define month
+ (cadr (string-split (local-filename "$@") #\_)))
+
+;; Output: replicant-source-code-hosting-and-rmll-2015.html
+(define html-page
+ (regexp-substitute
+ #f
+ (string-match
+ "[0-9]{4}_[0-9]{2}_"
+ "$@")
+ 'post))
+
+;; Output: replicant-source-code-hosting-and-rmll-2015
+(define page-path
+ (regexp-substitute
+ #f
+ (string-match
+ ".html"
+ html-page)
+ 'pre))
+
+(string-append "https://blog.replicant.us/" year "/" month "/" page-path "/")
+endef
+
+WORDPRESS_PAGES = \
+ wordpress/pages/replicant_blog_page_8.html \
+ wordpress/pages/replicant_blog_page_7.html \
+ wordpress/pages/replicant_blog_page_6.html \
+ wordpress/pages/replicant_blog_page_5.html \
+ wordpress/pages/replicant_blog_page_4.html \
+ wordpress/pages/replicant_blog_page_3.html \
+ wordpress/pages/replicant_blog_page_2.html \
+ wordpress/pages/replicant_blog_page_1.html \
+ wordpress/pages/replicant_blog_page_0.html \
+ $(SENTINEL)
+
+MARKDOWN_ARTICLES = \
+ markdown/2010_09_welcome-to-replicant.md \
+ markdown/2010_11_fdroid-a-free-software-alternative-to-google-market.md \
+ markdown/2011_03_new-replicant-test-images-available.md \
+ markdown/2011_04_replicant-2-2-sdk-available.md \
+ markdown/2011_04_replicant-lacks-tracking-antifeatures.md \
+ markdown/2011_05_replicant-2-2-preview-007.md \
+ markdown/2011_06_replicant-2-2-preview-008-is-out.md \
+ markdown/2011_08_nexus-s-support-in-replicant-being-worked-on.md \
+ markdown/2011_09_introducing-replicant-on-htc-dream-video.md \
+ markdown/2011_10_new-replicant-2-2-preview-images-0009-released.md \
+ markdown/2011_11_replicant-2-3-preview-images-for-nexus-one-released.md \
+ markdown/2011_11_replicant-on-nexus-s-preview.md \
+ markdown/2012_01_nexus-s-status-update-with-new-images.md \
+ markdown/2012_02_wiki-and-tracker-are-now-powered-by-redmine.md \
+ markdown/2012_03_galaxy-s-support-upcoming.md \
+ markdown/2012_04_new-set-of-replicant-2-3-images-including-galaxy-s-support.md \
+ markdown/2012_04_nexus-sgalaxy-s-privacy-issues.md \
+ markdown/2012_09_replicant-2-3-0004-images-release.md \
+ markdown/2012_09_replicant-2-3-0005-images-fixing-the-ussd-vulnerability.md \
+ markdown/2012_11_replicant-4-0-0001-images-release.md \
+ markdown/2013_01_replicant-4-0-sdk-release.md \
+ markdown/2013_02_replicant-4-0-0002-images-release.md \
+ markdown/2013_04_replicant-4-0-0003-images-release.md \
+ markdown/2013_07_announcing-the-free-software-foundation-fundraising-program-for-replicant.md \
+ markdown/2013_07_replicant-4-0-0004-images-release.md \
+ markdown/2013_08_opening-the-replicant-forums.md \
+ markdown/2013_10_replicant-4-0-0005-images-release.md \
+ markdown/2013_11_fairphone.md \
+ markdown/2014_01_replicant-4-2-kicks-out.md \
+ markdown/2014_03_unveiling-the-samsung-galaxy-back-door.md \
+ markdown/2014_06_replicant-4-2-on-the-goldelico-gta04.md \
+ markdown/2014_06_replicant-at-the-15th-libre-software-meeting-in-montpellier-france-this-july.md \
+ markdown/2014_07_replicant-4-2-0002-images-release.md \
+ markdown/2014_09_replicant-homepage-and-roadmap-for-the-future.md \
+ markdown/2014_12_replicant-4-2-0003-images-release.md \
+ markdown/2015_01_replicant-at-fosdem-2015.md \
+ markdown/2015_04_whats-happening-or-not-at-replicant.md \
+ markdown/2015_07_replicant-source-code-hosting-and-rmll-2015.md \
+ markdown/2015_07_rmll-feedback-optimus-black-advancement-and-cccamp.md \
+ markdown/2015_08_replicant-and-friends-at-chaos-communication-camp-2015.md \
+ markdown/2015_09_replicant-4-2-0004-images-release.md \
+ markdown/2015_09_upcoming-events-for-replicant-in-octobernovember-2015.md \
+ markdown/2015_12_shops-selling-devices-pre-installed-with-replicant.md \
+ markdown/2016_01_replicant-at-fosdem-2016.md \
+ markdown/2016_05_coliberator-2016-keynotes-and-workshops.md \
+ markdown/2016_07_media-from-2016-replicant-talks.md \
+ markdown/2016_07_replicant-at-pseshsf-2016.md \
+ markdown/2016_08_replicant-6-early-work-upstream-work-and-f-droid-issue.md \
+ markdown/2017_02_replicant-6-0-development-updates.md \
+ markdown/2017_04_there-wont-be-a-replicant-6-0-sdk-because-there-is-already-something-better.md \
+ markdown/2017_05_replicant-6-0-released.md \
+ markdown/2017_09_a-new-replicant-6-0-release.md \
+ markdown/2017_12_contributions-to-arcep-work-on-terminal-devices-and-public-consultation.md \
+ markdown/2017_12_third-replicant-6-0-release.md \
+ markdown/2018_01_les-terminaux-sont-ils-le-maillon-faible-de-louverture-dinternet.md \
+ markdown/2018_03_final-days-for-the-upstream-linux-allwinner-vpu-support-crowdfunding-campaign.md \
+ markdown/2019_01_meeting-point-at-fosdem.md \
+ markdown/2019_01_replicant-meeting-at-fosdem-2019.md \
+ markdown/2019_01_replicant-will-receive-a-device-from-necuno-solutions.md \
+ markdown/2019_06_replicant-contributors-meeting-the-2728-july-in-france.md \
+ markdown/2019_07_graphics-support-for-replicant-9.md \
+ markdown/2019_12_replicant-36c3.md \
+ markdown/2020_01_replicant-at-fosdem-2020.md \
+ markdown/2020_04_what-could-go-wrong-with-devices-that-have-non-replaceable-batteries.md \
+ markdown/2020_07_late-report-from-fosdem-2020.md \
+ markdown/2020_12_call-for-a-community-manager.md \
+ markdown/2021_05_presenting-replicants-community-manager.md \
+ markdown/2021_06_replicant-is-looking-for-volunteers-to-add-support-for-the-gsd4t-gps-chip.md \
+ markdown/2022_06_new-replicant-6-0-0004-release-and-replicant-11-status.md \
+ markdown/2023_02_replicant-at-fosdem-2023.md \
+ markdown/2023_12_replicant-37c3.md \
+ markdown/2024_03_replicant-status-and-report-of-the-37c3-and-fosdem-2024-conferences.md \
+ $(SENTINEL)
+
+all: help
+
+wordpress/articles:
+ mkdir -p $@
+
+wordpress/pages:
+ mkdir -p $@
+
+wordpress/pages/replicant_blog_page_%.html: wordpress/pages
+ $(CURL) $(BLOG_URL)/$(subst replicant_blog_page_,,$*)/ -o $@
+
+generate-wordpress-articles: build
+ $(GUIX_SHELL) $(GUIX_PYTHON_PACKAGES) \
+ -- \
+ python3 haunthtml2wordpress.py \
+ ./site/replicant-status-and-report-of-the-37c3-and-fosdem-2024-conferences.html
+
+links.txt: $(WORDPRESS_PAGES)
+ @echo -n '' > $@
+ @for f in $(WORDPRESS_PAGES) ; do \
+ echo "Processing $$f" > /dev/stderr ; \
+ guix shell -C python python-beautifulsoup4 -- \
+ python3 get_links.py $$f | sort -u >> $@ ; \
+ done
+
+# do not depend on links.txt as a human is supposed to review it manually
+update-makefile:
+ guile build/update-makefile-markdown-articles.scm
+
+wordpress/articles/%.html:
+ curl "$(guile $(get-wordpress-article-url))" -o $@
+
+markdown/%.md: wordpress/articles/%.html
+ mkdir -p markdown
+ $(CONVERT) $^ $@
+
+markdown: $(MARKDOWN_ARTICLES)
+
+$(VENDOR_REPLICANT_ARTWORK_PATH):
+ git clone \
+ https://git.replicant.us/replicant/vendor_replicant_artwork \
+ $(VENDOR_REPLICANT_ARTWORK_PATH)
+
+static/replicant_banner_white.png: vendor_replicant_artwork_revision.txt
+ install -m 644 \
+ $(VENDOR_REPLICANT_ARTWORK_PATH)/replicant_banner_white.png \
+ $@
+
+vendor_replicant_artwork_revision.txt: $(VENDOR_REPLICANT_ARTWORK_PATH) Makefile
+ if [ ! -f $@ ] || [ "`cat $@`" != "$(VENDOR_REPLICANT_ARTWORK_REV)" ] ; \
+ then \
+ rm -f $@ ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) fetch origin ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) \
+ checkout -f $(VENDOR_REPLICANT_ARTWORK_REV) ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) reset --hard ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) clean -dfx ; \
+ echo $(VENDOR_REPLICANT_ARTWORK_REV) > $@ ; \
+ fi
+
+build: static/replicant_banner_white.png
+ $(HAUNT) build
+
+deploy: build
+ rsync -av site/ root@git.replicant.us:/var/www/blog.test.replicant.us/
+
+help:
+ @printf "%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n" \
+ "Available commands:" \
+ "make build # Generate the HTML files with haunt." \
+ "make deploy # Copy the html files to https://blog.test.replicant.us" \
+ "make links.txt # Create links.txt file with blog post links." \
+ " # For security reasons This file needs to be manually" \
+ " # reviewed manually before usage." \
+ "make markdown # create markdown pages. To be done after reviewing links.txt." \
+ "make check # Run tests." \
+
+serve:
+ $(HAUNT) serve -w -p $(HAUNT_PORT)
+
+website.tar.gz: build
+ tar \
+ --exclude-vcs \
+ --format=gnu \
+ --owner=0 --group=0 --numeric-owner \
+ --sort=name \
+ -czf \
+ website.tar.gz \
+ site \
+ pages/img \
+ index.html \
+ --transform="s#^site#web#" \
+ --transform="s#^pages/img/#web/img/#"
+check: build
+ ./tests.sh
diff --git a/tests/Makefile.empty b/tests/Makefile.empty
new file mode 100644
index 0000000..fe94e5c
--- /dev/null
+++ b/tests/Makefile.empty
@@ -0,0 +1,190 @@
+# Copyright (C) 2023-2024 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+CURL ?= curl
+BLOG_URL ?= https://blog.replicant.us/page
+
+GUILE_PATCH = 0001-SRFI-19-Add-support-for-ISO-8601-zones-with-a-colon.patch
+GUIX_COMMIT ?= b25b94335a3ee8d68d2145da8e5ea0325ecea451
+GUIX_SHELL ?= guix time-machine --commit=$(GUIX_COMMIT) -- shell -C
+GUIX_PYTHON_PACKAGES ?= python python-beautifulsoup4 python-html2text python-sh
+
+CONVERT ?= $(GUIX_SHELL) $(GUIX_PYTHON_PACKAGES) -- python3 convert.py
+HAUNT ?= $(GUIX_SHELL) --with-patch=guile=patches/$(GUILE_PATCH) haunt -- haunt
+
+VENDOR_REPLICANT_ARTWORK_REV ?= fc213d2ca94cef9047d1e4a71c21c4c4c87f349d
+VENDOR_REPLICANT_ARTWORK_PATH ?= external/vendor_replicant_artwork
+
+SENTINEL =
+
+.PHONY: \
+ all \
+ build \
+ deploy \
+ generate-wordpress-articles \
+ help \
+ markdown \
+ serve \
+ update-makefile \
+ $(SENTINEL)
+
+# Input: wordpress/articles/2015_07_replicant-source-code-hosting-and-rmll-2015.html
+# Output: https://blog.replicant.us/2015/07/replicant-source-code-hosting-and-rmll-2015/
+define get-wordpress-article-url
+
+(use-modules (ice-9 regex))
+
+;; Input: wordpress/articles/2015_07_replicant-source-code-hosting-and-rmll-2015.html
+;; Output: 2015_07_replicant-source-code-hosting-and-rmll-2015.html
+(define (local-filename name)
+ (list-ref (string-split name #\/) 2))
+
+;; Output: 2015
+(define year
+ (car (string-split (local-filename "$@") #\_)))
+
+;; Output: 07
+(define month
+ (cadr (string-split (local-filename "$@") #\_)))
+
+;; Output: replicant-source-code-hosting-and-rmll-2015.html
+(define html-page
+ (regexp-substitute
+ #f
+ (string-match
+ "[0-9]{4}_[0-9]{2}_"
+ "$@")
+ 'post))
+
+;; Output: replicant-source-code-hosting-and-rmll-2015
+(define page-path
+ (regexp-substitute
+ #f
+ (string-match
+ ".html"
+ html-page)
+ 'pre))
+
+(string-append "https://blog.replicant.us/" year "/" month "/" page-path "/")
+endef
+
+WORDPRESS_PAGES = \
+ wordpress/pages/replicant_blog_page_8.html \
+ wordpress/pages/replicant_blog_page_7.html \
+ wordpress/pages/replicant_blog_page_6.html \
+ wordpress/pages/replicant_blog_page_5.html \
+ wordpress/pages/replicant_blog_page_4.html \
+ wordpress/pages/replicant_blog_page_3.html \
+ wordpress/pages/replicant_blog_page_2.html \
+ wordpress/pages/replicant_blog_page_1.html \
+ wordpress/pages/replicant_blog_page_0.html \
+ $(SENTINEL)
+
+
+all: help
+
+wordpress/articles:
+ mkdir -p $@
+
+wordpress/pages:
+ mkdir -p $@
+
+wordpress/pages/replicant_blog_page_%.html: wordpress/pages
+ $(CURL) $(BLOG_URL)/$(subst replicant_blog_page_,,$*)/ -o $@
+
+generate-wordpress-articles: build
+ $(GUIX_SHELL) $(GUIX_PYTHON_PACKAGES) \
+ -- \
+ python3 haunthtml2wordpress.py \
+ ./site/replicant-status-and-report-of-the-37c3-and-fosdem-2024-conferences.html
+
+links.txt: $(WORDPRESS_PAGES)
+ @echo -n '' > $@
+ @for f in $(WORDPRESS_PAGES) ; do \
+ echo "Processing $$f" > /dev/stderr ; \
+ guix shell -C python python-beautifulsoup4 -- \
+ python3 get_links.py $$f | sort -u >> $@ ; \
+ done
+
+# do not depend on links.txt as a human is supposed to review it manually
+update-makefile:
+ guile build/update-makefile-markdown-articles.scm
+
+wordpress/articles/%.html:
+ curl "$(guile $(get-wordpress-article-url))" -o $@
+
+markdown/%.md: wordpress/articles/%.html
+ mkdir -p markdown
+ $(CONVERT) $^ $@
+
+markdown: $(MARKDOWN_ARTICLES)
+
+$(VENDOR_REPLICANT_ARTWORK_PATH):
+ git clone \
+ https://git.replicant.us/replicant/vendor_replicant_artwork \
+ $(VENDOR_REPLICANT_ARTWORK_PATH)
+
+static/replicant_banner_white.png: vendor_replicant_artwork_revision.txt
+ install -m 644 \
+ $(VENDOR_REPLICANT_ARTWORK_PATH)/replicant_banner_white.png \
+ $@
+
+vendor_replicant_artwork_revision.txt: $(VENDOR_REPLICANT_ARTWORK_PATH) Makefile
+ if [ ! -f $@ ] || [ "`cat $@`" != "$(VENDOR_REPLICANT_ARTWORK_REV)" ] ; \
+ then \
+ rm -f $@ ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) fetch origin ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) \
+ checkout -f $(VENDOR_REPLICANT_ARTWORK_REV) ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) reset --hard ; \
+ git -C $(VENDOR_REPLICANT_ARTWORK_PATH) clean -dfx ; \
+ echo $(VENDOR_REPLICANT_ARTWORK_REV) > $@ ; \
+ fi
+
+build: static/replicant_banner_white.png
+ $(HAUNT) build
+
+deploy: build
+ rsync -av site/ root@git.replicant.us:/var/www/blog.test.replicant.us/
+
+help:
+ @printf "%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n" \
+ "Available commands:" \
+ "make build # Generate the HTML files with haunt." \
+ "make deploy # Copy the html files to https://blog.test.replicant.us" \
+ "make links.txt # Create links.txt file with blog post links." \
+ " # For security reasons This file needs to be manually" \
+ " # reviewed manually before usage." \
+ "make markdown # create markdown pages. To be done after reviewing links.txt." \
+ "make check # Run tests." \
+
+serve:
+ $(HAUNT) serve -w -p $(HAUNT_PORT)
+
+website.tar.gz: build
+ tar \
+ --exclude-vcs \
+ --format=gnu \
+ --owner=0 --group=0 --numeric-owner \
+ --sort=name \
+ -czf \
+ website.tar.gz \
+ site \
+ pages/img \
+ index.html \
+ --transform="s#^site#web#" \
+ --transform="s#^pages/img/#web/img/#"
+check: build
+ ./tests.sh
diff --git a/tests/links.txt b/tests/links.txt
new file mode 100644
index 0000000..8b844e0
--- /dev/null
+++ b/tests/links.txt
@@ -0,0 +1,72 @@
+https://blog.replicant.us/2010/09/welcome-to-replicant/
+https://blog.replicant.us/2010/11/fdroid-a-free-software-alternative-to-google-market/
+https://blog.replicant.us/2011/03/new-replicant-test-images-available/
+https://blog.replicant.us/2011/04/replicant-2-2-sdk-available/
+https://blog.replicant.us/2011/04/replicant-lacks-tracking-antifeatures/
+https://blog.replicant.us/2011/05/replicant-2-2-preview-007/
+https://blog.replicant.us/2011/06/replicant-2-2-preview-008-is-out/
+https://blog.replicant.us/2011/08/nexus-s-support-in-replicant-being-worked-on/
+https://blog.replicant.us/2011/09/introducing-replicant-on-htc-dream-video/
+https://blog.replicant.us/2011/10/new-replicant-2-2-preview-images-0009-released/
+https://blog.replicant.us/2011/11/replicant-2-3-preview-images-for-nexus-one-released/
+https://blog.replicant.us/2011/11/replicant-on-nexus-s-preview/
+https://blog.replicant.us/2012/01/nexus-s-status-update-with-new-images/
+https://blog.replicant.us/2012/02/wiki-and-tracker-are-now-powered-by-redmine/
+https://blog.replicant.us/2012/03/galaxy-s-support-upcoming/
+https://blog.replicant.us/2012/04/new-set-of-replicant-2-3-images-including-galaxy-s-support/
+https://blog.replicant.us/2012/04/nexus-sgalaxy-s-privacy-issues/
+https://blog.replicant.us/2012/09/replicant-2-3-0004-images-release/
+https://blog.replicant.us/2012/09/replicant-2-3-0005-images-fixing-the-ussd-vulnerability/
+https://blog.replicant.us/2012/11/replicant-4-0-0001-images-release/
+https://blog.replicant.us/2013/01/replicant-4-0-sdk-release/
+https://blog.replicant.us/2013/02/replicant-4-0-0002-images-release/
+https://blog.replicant.us/2013/04/replicant-4-0-0003-images-release/
+https://blog.replicant.us/2013/07/announcing-the-free-software-foundation-fundraising-program-for-replicant/
+https://blog.replicant.us/2013/07/replicant-4-0-0004-images-release/
+https://blog.replicant.us/2013/08/opening-the-replicant-forums/
+https://blog.replicant.us/2013/10/replicant-4-0-0005-images-release/
+https://blog.replicant.us/2013/11/fairphone/
+https://blog.replicant.us/2014/01/replicant-4-2-kicks-out/
+https://blog.replicant.us/2014/03/unveiling-the-samsung-galaxy-back-door/
+https://blog.replicant.us/2014/06/replicant-4-2-on-the-goldelico-gta04/
+https://blog.replicant.us/2014/06/replicant-at-the-15th-libre-software-meeting-in-montpellier-france-this-july/
+https://blog.replicant.us/2014/07/replicant-4-2-0002-images-release/
+https://blog.replicant.us/2014/09/replicant-homepage-and-roadmap-for-the-future/
+https://blog.replicant.us/2014/12/replicant-4-2-0003-images-release/
+https://blog.replicant.us/2015/01/replicant-at-fosdem-2015/
+https://blog.replicant.us/2015/04/whats-happening-or-not-at-replicant/
+https://blog.replicant.us/2015/07/replicant-source-code-hosting-and-rmll-2015/
+https://blog.replicant.us/2015/07/rmll-feedback-optimus-black-advancement-and-cccamp/
+https://blog.replicant.us/2015/08/replicant-and-friends-at-chaos-communication-camp-2015/
+https://blog.replicant.us/2015/09/replicant-4-2-0004-images-release/
+https://blog.replicant.us/2015/09/upcoming-events-for-replicant-in-octobernovember-2015/
+https://blog.replicant.us/2015/12/shops-selling-devices-pre-installed-with-replicant/
+https://blog.replicant.us/2016/01/replicant-at-fosdem-2016/
+https://blog.replicant.us/2016/05/coliberator-2016-keynotes-and-workshops/
+https://blog.replicant.us/2016/07/media-from-2016-replicant-talks/
+https://blog.replicant.us/2016/07/replicant-at-pseshsf-2016/
+https://blog.replicant.us/2016/08/replicant-6-early-work-upstream-work-and-f-droid-issue/
+https://blog.replicant.us/2017/02/replicant-6-0-development-updates/
+https://blog.replicant.us/2017/04/there-wont-be-a-replicant-6-0-sdk-because-there-is-already-something-better/
+https://blog.replicant.us/2017/05/replicant-6-0-released/
+https://blog.replicant.us/2017/09/a-new-replicant-6-0-release/
+https://blog.replicant.us/2017/12/contributions-to-arcep-work-on-terminal-devices-and-public-consultation/
+https://blog.replicant.us/2017/12/third-replicant-6-0-release/
+https://blog.replicant.us/2018/01/les-terminaux-sont-ils-le-maillon-faible-de-louverture-dinternet/
+https://blog.replicant.us/2018/03/final-days-for-the-upstream-linux-allwinner-vpu-support-crowdfunding-campaign/
+https://blog.replicant.us/2019/01/meeting-point-at-fosdem/
+https://blog.replicant.us/2019/01/replicant-meeting-at-fosdem-2019/
+https://blog.replicant.us/2019/01/replicant-will-receive-a-device-from-necuno-solutions/
+https://blog.replicant.us/2019/06/replicant-contributors-meeting-the-2728-july-in-france/
+https://blog.replicant.us/2019/07/graphics-support-for-replicant-9/
+https://blog.replicant.us/2019/12/replicant-36c3/
+https://blog.replicant.us/2020/01/replicant-at-fosdem-2020/
+https://blog.replicant.us/2020/04/what-could-go-wrong-with-devices-that-have-non-replaceable-batteries/
+https://blog.replicant.us/2020/07/late-report-from-fosdem-2020/
+https://blog.replicant.us/2020/12/call-for-a-community-manager/
+https://blog.replicant.us/2021/05/presenting-replicants-community-manager/
+https://blog.replicant.us/2021/06/replicant-is-looking-for-volunteers-to-add-support-for-the-gsd4t-gps-chip/
+https://blog.replicant.us/2022/06/new-replicant-6-0-0004-release-and-replicant-11-status/
+https://blog.replicant.us/2023/02/replicant-at-fosdem-2023/
+https://blog.replicant.us/2023/12/replicant-37c3/
+https://blog.replicant.us/2024/03/replicant-status-and-report-of-the-37c3-and-fosdem-2024-conferences/
diff --git a/tests/markdown-article-lines.txt b/tests/markdown-article-lines.txt
new file mode 100644
index 0000000..8aae072
--- /dev/null
+++ b/tests/markdown-article-lines.txt
@@ -0,0 +1,72 @@
+ markdown/2010_09_welcome-to-replicant.md \
+ markdown/2010_11_fdroid-a-free-software-alternative-to-google-market.md \
+ markdown/2011_03_new-replicant-test-images-available.md \
+ markdown/2011_04_replicant-2-2-sdk-available.md \
+ markdown/2011_04_replicant-lacks-tracking-antifeatures.md \
+ markdown/2011_05_replicant-2-2-preview-007.md \
+ markdown/2011_06_replicant-2-2-preview-008-is-out.md \
+ markdown/2011_08_nexus-s-support-in-replicant-being-worked-on.md \
+ markdown/2011_09_introducing-replicant-on-htc-dream-video.md \
+ markdown/2011_10_new-replicant-2-2-preview-images-0009-released.md \
+ markdown/2011_11_replicant-2-3-preview-images-for-nexus-one-released.md \
+ markdown/2011_11_replicant-on-nexus-s-preview.md \
+ markdown/2012_01_nexus-s-status-update-with-new-images.md \
+ markdown/2012_02_wiki-and-tracker-are-now-powered-by-redmine.md \
+ markdown/2012_03_galaxy-s-support-upcoming.md \
+ markdown/2012_04_new-set-of-replicant-2-3-images-including-galaxy-s-support.md \
+ markdown/2012_04_nexus-sgalaxy-s-privacy-issues.md \
+ markdown/2012_09_replicant-2-3-0004-images-release.md \
+ markdown/2012_09_replicant-2-3-0005-images-fixing-the-ussd-vulnerability.md \
+ markdown/2012_11_replicant-4-0-0001-images-release.md \
+ markdown/2013_01_replicant-4-0-sdk-release.md \
+ markdown/2013_02_replicant-4-0-0002-images-release.md \
+ markdown/2013_04_replicant-4-0-0003-images-release.md \
+ markdown/2013_07_announcing-the-free-software-foundation-fundraising-program-for-replicant.md \
+ markdown/2013_07_replicant-4-0-0004-images-release.md \
+ markdown/2013_08_opening-the-replicant-forums.md \
+ markdown/2013_10_replicant-4-0-0005-images-release.md \
+ markdown/2013_11_fairphone.md \
+ markdown/2014_01_replicant-4-2-kicks-out.md \
+ markdown/2014_03_unveiling-the-samsung-galaxy-back-door.md \
+ markdown/2014_06_replicant-4-2-on-the-goldelico-gta04.md \
+ markdown/2014_06_replicant-at-the-15th-libre-software-meeting-in-montpellier-france-this-july.md \
+ markdown/2014_07_replicant-4-2-0002-images-release.md \
+ markdown/2014_09_replicant-homepage-and-roadmap-for-the-future.md \
+ markdown/2014_12_replicant-4-2-0003-images-release.md \
+ markdown/2015_01_replicant-at-fosdem-2015.md \
+ markdown/2015_04_whats-happening-or-not-at-replicant.md \
+ markdown/2015_07_replicant-source-code-hosting-and-rmll-2015.md \
+ markdown/2015_07_rmll-feedback-optimus-black-advancement-and-cccamp.md \
+ markdown/2015_08_replicant-and-friends-at-chaos-communication-camp-2015.md \
+ markdown/2015_09_replicant-4-2-0004-images-release.md \
+ markdown/2015_09_upcoming-events-for-replicant-in-octobernovember-2015.md \
+ markdown/2015_12_shops-selling-devices-pre-installed-with-replicant.md \
+ markdown/2016_01_replicant-at-fosdem-2016.md \
+ markdown/2016_05_coliberator-2016-keynotes-and-workshops.md \
+ markdown/2016_07_media-from-2016-replicant-talks.md \
+ markdown/2016_07_replicant-at-pseshsf-2016.md \
+ markdown/2016_08_replicant-6-early-work-upstream-work-and-f-droid-issue.md \
+ markdown/2017_02_replicant-6-0-development-updates.md \
+ markdown/2017_04_there-wont-be-a-replicant-6-0-sdk-because-there-is-already-something-better.md \
+ markdown/2017_05_replicant-6-0-released.md \
+ markdown/2017_09_a-new-replicant-6-0-release.md \
+ markdown/2017_12_contributions-to-arcep-work-on-terminal-devices-and-public-consultation.md \
+ markdown/2017_12_third-replicant-6-0-release.md \
+ markdown/2018_01_les-terminaux-sont-ils-le-maillon-faible-de-louverture-dinternet.md \
+ markdown/2018_03_final-days-for-the-upstream-linux-allwinner-vpu-support-crowdfunding-campaign.md \
+ markdown/2019_01_meeting-point-at-fosdem.md \
+ markdown/2019_01_replicant-meeting-at-fosdem-2019.md \
+ markdown/2019_01_replicant-will-receive-a-device-from-necuno-solutions.md \
+ markdown/2019_06_replicant-contributors-meeting-the-2728-july-in-france.md \
+ markdown/2019_07_graphics-support-for-replicant-9.md \
+ markdown/2019_12_replicant-36c3.md \
+ markdown/2020_01_replicant-at-fosdem-2020.md \
+ markdown/2020_04_what-could-go-wrong-with-devices-that-have-non-replaceable-batteries.md \
+ markdown/2020_07_late-report-from-fosdem-2020.md \
+ markdown/2020_12_call-for-a-community-manager.md \
+ markdown/2021_05_presenting-replicants-community-manager.md \
+ markdown/2021_06_replicant-is-looking-for-volunteers-to-add-support-for-the-gsd4t-gps-chip.md \
+ markdown/2022_06_new-replicant-6-0-0004-release-and-replicant-11-status.md \
+ markdown/2023_02_replicant-at-fosdem-2023.md \
+ markdown/2023_12_replicant-37c3.md \
+ markdown/2024_03_replicant-status-and-report-of-the-37c3-and-fosdem-2024-conferences.md \