summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2025-05-01 21:13:25 -0300
committerEuAndreh <eu@euandre.org>2025-05-01 21:13:25 -0300
commitcc45d895ccf6d6a64ef0c9ad9cc3ec42ac45fa55 (patch)
tree6456f83c69227177b7eb1faf3f226f46ae6e92a2
parentsrc/content/incidents/index.adoc: Hoist links to variables (diff)
downloadpapo.im-cc45d895ccf6d6a64ef0c9ad9cc3ec42ac45fa55.tar.gz
papo.im-cc45d895ccf6d6a64ef0c9ad9cc3ec42ac45fa55.tar.xz
Update to support i18n
-rw-r--r--.gitignore33
-rw-r--r--Makefile198
-rw-r--r--deps.mk343
-rwxr-xr-xmkdeps.sh147
-rw-r--r--po/en.po48
-rw-r--r--po/note.txt5
-rw-r--r--po/papo.im.pot46
-rw-r--r--po/po4a.cfg9
-rw-r--r--po/pt.po46
l---------src/collections/blog1
l---------src/collections/en/blog1
l---------src/collections/en/incidents1
l---------src/collections/incidents1
-rw-r--r--src/content/en/about.adoc (renamed from src/content/about.adoc)0
-rw-r--r--src/content/en/blog/1970/01/01/launch.adoc (renamed from src/content/blog/1970/01/01/launch.adoc)0
-rw-r--r--src/content/en/blog/2000/01/01/feature-ann.adoc (renamed from src/content/blog/2000/01/01/feature-ann.adoc)1
-rw-r--r--src/content/en/blog/categories.adoc2
-rw-r--r--src/content/en/blog/index.adoc (renamed from src/content/blog/index.adoc)0
-rw-r--r--src/content/en/incidents/2000/01/01/service-start.adoc (renamed from src/content/incidents/2000/01/01/service-start.adoc)0
-rw-r--r--src/content/en/incidents/index.adoc (renamed from src/content/incidents/index.adoc)0
-rw-r--r--src/content/en/index.adoc (renamed from src/content/index.adoc)0
-rw-r--r--src/content/en/pricing.adoc (renamed from src/content/pricing.adoc)0
-rw-r--r--src/content/en/privacy.adoc (renamed from src/content/privacy.adoc)0
-rw-r--r--src/content/en/slide/2011/11/11/test.adoc10
-rw-r--r--src/content/en/terms.adoc (renamed from src/content/terms.adoc)0
-rw-r--r--src/content/favicon.pngbin0 -> 17842 bytes
-rw-r--r--src/content/pt/sobre.adoc7
-rw-r--r--src/content/public.asc.txt (renamed from src/content/public.asc)0
-rw-r--r--src/headers/en.txt2
-rw-r--r--src/headers/pt.txt2
-rw-r--r--src/headers/ref.txt (renamed from src/headers.txt)0
-rw-r--r--src/linkonly-dirs.txt0
-rw-r--r--src/names/categories/en.txt1
-rw-r--r--src/names/categories/pt.txt1
-rw-r--r--src/names/categories/ref.txt1
-rw-r--r--src/names/category/en.txt1
-rw-r--r--src/names/category/pt.txt1
-rw-r--r--src/names/category/ref.txt1
l---------src/pages/en1
l---------src/pages/pt1
l---------src/pages/root1
l---------src/slides/en1
-rw-r--r--src/static.conf3
-rw-r--r--src/symlinks.txt3
44 files changed, 658 insertions, 261 deletions
diff --git a/.gitignore b/.gitignore
index 99f41e7..cfa522f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+*.sentinel
*.htmlbody
*.embedded-config
*.conf
@@ -5,31 +6,17 @@
*.links
*.caslinks
*.html
-*.html.*.txt
*.indexentry
*.feedentry
+*.mapentry
*.sortdata
*.categorydata
-sortdata.txt
-categories.txt
-categories.xml
-index.htmlheader
-index.htmlfooter
-index.htmllisting
-feed.xml
-feed.*.xml
+*.txt
+*.xml
+*.htmlheader
+*.htmlfooter
+*.htmllisting
+*.ps
+*.pdf
*.gz
-/src/sources.txt
-/src/all-contents.txt
-/src/all-filelists.txt
-/src/install.txt
-/src/sort-expected.txt
-/src/sort-given.txt
-/sources.txt
-/install.txt
-/email.txt
-/baseurl.txt
-/fingerprint.txt
-/expiry.txt
-/src/content/security.txt
-/src/content/.well-known/security.txt
+/src/content/.gitignore
diff --git a/Makefile b/Makefile
index 9284186..8679ad3 100644
--- a/Makefile
+++ b/Makefile
@@ -19,14 +19,16 @@ EXEC = ./
## Where to store the installation. Empty by default.
DESTDIR =
LDLIBS =
-PUBURL = public.asc
+PUBURL = public.asc.txt
+FFMFLAGS = -y -hide_banner -loglevel warning
+BASEURL = /
.SUFFIXES:
-.SUFFIXES: .adoc .conf .snippets .indexentry .feedentry .sortdata .xml .txt
+.SUFFIXES: .adoc .conf .snippets .indexentry .feedentry .mapentry .sortdata .xml
.SUFFIXES: .htmlbody .htmlheader .htmlfooter .htmllisting .html .links .caslinks
-.SUFFIXES: .categorydata .gz
+.SUFFIXES: .txt .categorydata .gz .torrent .flac .ogg .ps .pdf
.adoc.conf:
mkwb conf src/global.conf $< > $@
@@ -43,9 +45,6 @@ PUBURL = public.asc
.conf.htmlfooter:
mkwb html -F $< > $@
-.conf.htmllisting:
- mkwb indexbody $< > $@
-
.adoc.snippets:
mkwb snippets $< > $@
@@ -55,6 +54,9 @@ PUBURL = public.asc
.htmlbody.feedentry:
mkwb feedentry $< > $@
+.conf.mapentry:
+ mkwb mapentry $< > $@
+
.conf.sortdata:
mkwb sortdata $< > $@
@@ -69,47 +71,67 @@ PUBURL = public.asc
printf "%s\n" "_" | sha256sum | \
printf "%s\t%s\n" "`cut -d" " -f1`" "_"' > $@
+.flac.ogg:
+ ffmpeg $(FFMFLAGS) -i $< -ar 48000 -vn -c:a libvorbis -b:a 320k $@
+
+.adoc.ps:
+ eslaides < $< > $@
+
+.ps.pdf:
+ ps2pdf - < $< > $@
+
all:
include deps.mk
-sources.adoc = $(articles.adoc) $(listings.adoc) $(pages.adoc)
-sources.htmlbody = $(sources.adoc:.adoc=.htmlbody)
-sources.html = $(sources.adoc:.adoc=.html)
-sources.snippets = $(sources.adoc:.adoc=.snippets)
-sources.snippets.gz = $(sources.adoc:.adoc=.snippets.gz)
-sources.conf = $(sources.adoc:.adoc=.conf)
-sources.links = $(sources.adoc:.adoc=.links)
-sources.caslinks = $(sources.adoc:.adoc=.caslinks)
-articles.indexentry = $(articles.adoc:.adoc=.indexentry)
-articles.feedentry = $(articles.adoc:.adoc=.feedentry)
-articles.sortdata = $(articles.adoc:.adoc=.sortdata)
-articles.categorydata = $(articles.adoc:.adoc=.categorydata)
-listings.htmlheader = $(listings.adoc:.adoc=.htmlheader)
-listings.htmlfooter = $(listings.adoc:.adoc=.htmlfooter)
-listings.htmllisting = $(listings.adoc:.adoc=.htmllisting)
-listings.html = $(listings.adoc:.adoc=.html)
-categories.xml = $(categories.txt:.txt=.xml)
-categories.xml.gz = $(categories.txt:.txt=.xml.gz)
+listings.adoc = $(categories.adoc) $(indexes.adoc)
+sources.adoc = $(articles.adoc) $(listings.adoc) $(pages.adoc)
+sources.htmlbody = $(sources.adoc:.adoc=.htmlbody)
+sources.html = $(sources.adoc:.adoc=.html)
+sources.snippets = $(sources.adoc:.adoc=.snippets)
+sources.snippets.gz = $(sources.adoc:.adoc=.snippets.gz)
+sources.conf = $(sources.adoc:.adoc=.conf)
+sources.links = $(sources.adoc:.adoc=.links)
+sources.caslinks = $(sources.adoc:.adoc=.caslinks)
+sources.mapentry = $(sources.adoc:.adoc=.mapentry)
+articles.indexentry = $(articles.adoc:.adoc=.indexentry)
+articles.feedentry = $(articles.adoc:.adoc=.feedentry)
+articles.sortdata = $(articles.adoc:.adoc=.sortdata)
+articles.categorydata = $(articles.adoc:.adoc=.categorydata)
+listings.htmlheader = $(listings.adoc:.adoc=.htmlheader)
+listings.htmlfooter = $(listings.adoc:.adoc=.htmlfooter)
+listings.html = $(listings.adoc:.adoc=.html)
+indexes.htmllisting = $(indexes.adoc:.adoc=.htmllisting)
+categories.htmllisting = $(categories.adoc:.adoc=.htmllisting)
+categories.txt = $(categories.adoc:.adoc=.txt)
+categories.xml = $(categories.adoc:.adoc=.xml)
+categories.xml.gz = $(categories.adoc:.adoc=.xml.gz)
+sources.media.torrent = $(sources.media:=.torrent)
+slides.ps = $(slides.adoc:.adoc=.ps)
+slides.pdf = $(slides.adoc:.adoc=.pdf)
sources = \
$(sources.adoc) \
$(sources.extras) \
$(images.svg) \
src/content/favicon.ico \
+ src/content/favicon.png \
src/content/style.css \
src/content/$(PUBURL) \
dynamic-contents = \
$(sources.html) \
+ $(slides.pdf) \
$(feeds.xml) \
+ src/content/sitemap.xml \
static-contents = \
$(sources.extras) \
$(images.svg) \
src/content/favicon.ico \
+ src/content/favicon.png \
src/content/style.css \
src/content/$(PUBURL) \
src/content/.well-known/security.txt \
@@ -130,8 +152,6 @@ contents.gz = \
contents = \
$(dynamic-contents) \
$(static-contents) \
- src/content/security.txt \
- src/content/security.txt.gz \
all-filelists = \
$(sources.snippets) \
@@ -147,64 +167,84 @@ all-contents = \
derived-assets = \
$(dynamic-contents) \
$(contents.gz) \
+ $(sources.html) \
$(sources.htmlbody) \
$(sources.snippets) \
$(sources.snippets.gz) \
+ $(sources.conf) \
$(sources.links) \
$(sources.caslinks) \
- $(sources.conf) \
+ $(sources.mapentry) \
src/dyn.conf \
src/base.conf \
src/global.conf \
- $(listings.htmlheader) \
- $(listings.htmlfooter) \
- $(listings.htmllisting) \
$(articles.indexentry) \
$(articles.feedentry) \
$(articles.sortdata) \
$(articles.categorydata) \
+ $(listings.htmlheader) \
+ $(listings.htmlfooter) \
+ $(listings.html) \
+ $(indexes.htmllisting) \
+ $(categories.htmllisting) \
$(categories.txt) \
$(categories.xml) \
$(categories.xml.gz) \
+ $(slides.ps) \
+ $(slides.pdf) \
email.txt \
baseurl.txt \
fingerprint.txt \
expiry.txt \
- src/content/security.txt \
- src/content/security.txt.gz \
+ expiry-epoch.txt \
+ now.txt \
src/content/.well-known/security.txt \
src/all-contents.txt \
src/all-filelists.txt \
+ src/all-symlinks.txt \
src/install.txt \
src/sort-expected.txt \
src/sort-given.txt \
src/sources.txt \
install.txt \
sources.txt \
+ src/content/.gitignore \
+ i18n.sentinel \
+
+captured-assets = \
+ src/content/$(PUBURL) \
+ src/content/favicon.ico \
+ src/content/favicon.png \
+ $(sources.media.torrent) \
side-assets = \
- src/collections/*/*/*/*/*.html.*.txt \
- src/collections/*/*/*/*/*.html.*.txt.gz \
- src/collections/*/index.html.*.txt \
- src/collections/*/sortdata.txt \
- src/collections/*/feed.*.xml \
- src/collections/*/feed.*.xml.gz \
- src/collections/*/*.sortdata \
+ src/collections/*/*/*/*/*/*.html.*.txt \
+ src/collections/*/*/*/*/*/*.txt.gz \
+ src/collections/*/*/index.html.*.txt \
+ src/collections/*/*/sortdata.txt \
+ src/collections/*/*/feed.*.xml \
+ src/collections/*/*/feed.*.xml.gz \
+ src/collections/*/*/*.sortdata \
src/pages/*/*.html.*.txt \
src/content/.well-known/ \
+ `cat src/all-symlinks.txt 2>/dev/null` \
+ `cat src/linkonly-dirs.txt 2>/dev/null` \
## Default target. Builds all artifacts required for testing
## and installation.
all: $(derived-assets)
-all: src/content/$(PUBURL) src/content/favicon.ico
+all: $(captured-assets)
$(derived-assets): Makefile deps.mk
-$(sources.conf): src/global.conf src/headers.txt
+$(sources.conf): src/global.conf
+src/content/.gitignore: src/symlinks.txt
+ cd src/content/ && mkwb symlinks ../symlinks.txt > $(@F)
+
src/dyn.conf: email.txt baseurl.txt fingerprint.txt
printf "export url_pre='%s'\n" "`cat baseurl.txt`" > $@
printf "export email='%s'\n" "`cat email.txt`" >> $@
@@ -219,19 +259,25 @@ src/global.conf: src/base.conf
mkwb conf -G src/base.conf > $@
$(listings.html):
- cat $*.htmlheader $*.htmllisting $*.htmlbody $*.htmlfooter > $@
+ cat $*.htmlheader $*.htmlbody $*.htmllisting $*.htmlfooter > $@
+
+$(indexes.htmllisting):
+ mkwb indexbody $*.conf > $@
+
+$(categories.htmllisting):
+ mkwb categoriesbody $*.conf > $@
-$(categories.txt):
- mkwb categories $(@D) > $@
+$(categories.txt): src/global.conf
+ mkwb categories src/global.conf $(@D) > $@
-$(categories.xml):
+$(categories.xml): src/global.conf
for f in `cat $*.txt`; do \
c="`printf '%s\n' "$$f" | cut -d. -f2`"; \
mkwb feed src/global.conf "$$f" > $(@D)/feed."$$c".xml; \
printf '%s\n' $(@D)/feed."$$c".xml; \
done > $@
-$(feeds.xml):
+$(feeds.xml): src/global.conf
mkwb feed src/global.conf $(@D)/sortdata.txt > $@
$(contents.gz):
@@ -250,6 +296,17 @@ src/content/favicon.ico.gz: src/content/favicon.ico
src/content/favicon.ico: src/content/img/favicon.svg
convert src/content/img/favicon.svg $@
+src/content/favicon.png: src/content/img/favicon.svg
+ convert src/content/img/favicon.svg $@
+
+$(sources.media.torrent):
+ F="`printf '%s\n' $* | cut -d/ -f3-`" && \
+ mktorrent -xfd -n $(*F) -o $@ -w "https://$(NAME)$(BASEURL)$${F}" $*
+
+src/content/sitemap.xml.gz: src/content/sitemap.xml
+src/content/sitemap.xml: $(sources.mapentry)
+ mkwb sitemap $(sources.mapentry) > $@
+
email.txt: meta.json
jq -r '.email' < meta.json > $@
@@ -267,10 +324,11 @@ expiry.txt: src/content/$(PUBURL)
awk -F: '/^pub:/ { print $$7 }' | \
xargs -I% date -Is -d@% > $@
-src/content/security.txt.gz: src/content/.well-known/security.txt.gz
-src/content/security.txt: src/content/.well-known/security.txt
-src/content/security.txt src/content/security.txt.gz:
- ln -fs .well-known/$(@F) $@
+expiry-epoch.txt: expiry.txt
+ date -d "`cat expiry.txt`" '+%s' > $@
+
+now.txt:
+ now > $@
src/content/.well-known/security.txt.gz: src/content/.well-known/security.txt
src/content/.well-known/security.txt: email.txt baseurl.txt expiry.txt
@@ -278,7 +336,7 @@ src/content/.well-known/security.txt: email.txt baseurl.txt expiry.txt
printf 'Contact: mailto:%s\n' "`cat email.txt`" > $@
printf 'Expires: %s\n' "`cat expiry.txt`" >> $@
printf 'Encryption: %s/$(PUBURL)\n' "`cat baseurl.txt`" >> $@
- printf 'Preferred-Languages: en, pt, fr, eo, es\n' >> $@
+ printf 'Preferred-Languages: en, pt, fr, eo, es, de\n' >> $@
src/sources.txt:
printf '%s\n' $(sources) > $@
@@ -286,8 +344,11 @@ src/sources.txt:
src/all-contents.txt:
printf '%s\n' $(all-contents) > $@
-src/all-filelists.txt:
- printf '%s\n' $(all-filelists) > $@
+src/all-filelists.txt: src/all-symlinks.txt
+ printf '%s\n' $(all-filelists) src/all-symlinks.txt > $@
+
+src/all-symlinks.txt: src/content/.gitignore
+ sed 's|^|src/content|' src/content/.gitignore > $@
src/install.txt: src/all-contents.txt src/all-filelists.txt $(all-filelists)
cat src/all-contents.txt `cat src/all-filelists.txt` > $@
@@ -297,6 +358,10 @@ install.txt: src/install.txt
sources.txt install.txt:
sed 's|^src/content/||' src/$(@F) > $@
+i18n.sentinel: po/po4a.cfg po/note.txt $(sources.po) $(po4a.in)
+ po4a po/po4a.cfg
+ touch $@
+
src/sort-expected.txt:
@@ -334,9 +399,36 @@ check-unit-links-internal: $(sources.links-internal-check)
check-unit-links-external:
+symlink-deps = \
+ $(sources.html) \
+ $(feeds.xml) \
+ $(categories.xml) \
+ src/content/.well-known/security.txt \
+
+check-unit-symlinks: src/all-symlinks.txt $(symlink-deps)
+ find `cat src/all-symlinks.txt` | xargs -n1 test -e
+
+
check-unit-links: check-unit-links-internal check-unit-links-external
+check-unit-links: check-unit-symlinks
+
+
+MAXSIZE = 52428800 # from spec: https://www.sitemaps.org/protocol.html
+check-unit-sitemap-size: src/content/sitemap.xml
+ test "`stat --printf='%s' src/content/sitemap.xml`" -le $(MAXSIZE)
+
+check-unit-sitemap-count: src/content/sitemap.xml
+ test "`grep -cF '</url>' src/content/sitemap.xml`" -le 50000
+
+check-unit-sitemap: check-unit-sitemap-count check-unit-sitemap-size
+
+
+check-unit-expiry: expiry-epoch.txt now.txt
+ test "`cat expiry-epoch.txt`" -gt "`cat now.txt`"
+
check-unit: check-unit-sorting check-unit-updatedat check-unit-links
+check-unit: check-unit-sitemap check-unit-expiry
integration-tests = \
diff --git a/deps.mk b/deps.mk
index 1681e74..bb99954 100644
--- a/deps.mk
+++ b/deps.mk
@@ -1,26 +1,29 @@
pages.adoc = \
- src/content/about.adoc \
- src/content/index.adoc \
- src/content/pricing.adoc \
- src/content/privacy.adoc \
- src/content/terms.adoc \
+ src/content/en/about.adoc \
+ src/content/en/index.adoc \
+ src/content/en/pricing.adoc \
+ src/content/en/privacy.adoc \
+ src/content/en/terms.adoc \
+ src/content/pt/sobre.adoc \
articles.adoc = \
- src/content/blog/1970/01/01/launch.adoc \
- src/content/blog/2000/01/01/feature-ann.adoc \
- src/content/incidents/2000/01/01/service-start.adoc \
+ src/content/en/blog/1970/01/01/launch.adoc \
+ src/content/en/blog/2000/01/01/feature-ann.adoc \
+ src/content/en/incidents/2000/01/01/service-start.adoc \
-listings.adoc = \
- src/content/blog/index.adoc \
- src/content/incidents/index.adoc \
+slides.adoc = \
+ src/content/en/slide/2011/11/11/test.adoc \
-categories.txt = \
- src/content/blog/categories.txt \
- src/content/incidents/categories.txt \
+categories.adoc = \
+ src/content/en/blog/categories.adoc \
+
+indexes.adoc = \
+ src/content/en/blog/index.adoc \
+ src/content/en/incidents/index.adoc \
feeds.xml = \
- src/content/blog/feed.xml \
- src/content/incidents/feed.xml \
+ src/content/en/blog/feed.xml \
+ src/content/en/incidents/feed.xml \
images.svg = \
src/content/img/atom/dark.svg \
@@ -39,133 +42,185 @@ images.svg = \
src/content/img/shield/dark.svg \
src/content/img/shield/light.svg \
+sources.media = \
+
+sources.tarballs = \
+
sources.extras = \
-src/content/about.htmlbody src/content/about.snippets src/content/about.conf: src/content/about.adoc
-src/content/index.htmlbody src/content/index.snippets src/content/index.conf: src/content/index.adoc
-src/content/pricing.htmlbody src/content/pricing.snippets src/content/pricing.conf: src/content/pricing.adoc
-src/content/privacy.htmlbody src/content/privacy.snippets src/content/privacy.conf: src/content/privacy.adoc
-src/content/terms.htmlbody src/content/terms.snippets src/content/terms.conf: src/content/terms.adoc
-src/content/blog/1970/01/01/launch.htmlbody src/content/blog/1970/01/01/launch.snippets src/content/blog/1970/01/01/launch.conf: src/content/blog/1970/01/01/launch.adoc
-src/content/blog/2000/01/01/feature-ann.htmlbody src/content/blog/2000/01/01/feature-ann.snippets src/content/blog/2000/01/01/feature-ann.conf: src/content/blog/2000/01/01/feature-ann.adoc
-src/content/incidents/2000/01/01/service-start.htmlbody src/content/incidents/2000/01/01/service-start.snippets src/content/incidents/2000/01/01/service-start.conf: src/content/incidents/2000/01/01/service-start.adoc
-src/content/blog/index.htmlbody src/content/blog/index.snippets src/content/blog/index.conf: src/content/blog/index.adoc
-src/content/incidents/index.htmlbody src/content/incidents/index.snippets src/content/incidents/index.conf: src/content/incidents/index.adoc
-src/content/about.html: src/content/about.conf src/content/about.htmlbody
-src/content/index.html: src/content/index.conf src/content/index.htmlbody
-src/content/pricing.html: src/content/pricing.conf src/content/pricing.htmlbody
-src/content/privacy.html: src/content/privacy.conf src/content/privacy.htmlbody
-src/content/terms.html: src/content/terms.conf src/content/terms.htmlbody
-src/content/blog/1970/01/01/launch.html: src/content/blog/1970/01/01/launch.conf src/content/blog/1970/01/01/launch.htmlbody
-src/content/blog/2000/01/01/feature-ann.html: src/content/blog/2000/01/01/feature-ann.conf src/content/blog/2000/01/01/feature-ann.htmlbody
-src/content/incidents/2000/01/01/service-start.html: src/content/incidents/2000/01/01/service-start.conf src/content/incidents/2000/01/01/service-start.htmlbody
-src/content/blog/index.html: src/content/blog/index.conf src/content/blog/index.htmlbody
-src/content/incidents/index.html: src/content/incidents/index.conf src/content/incidents/index.htmlbody
-
-src/content/about.html.gz: src/content/about.html
-src/content/index.html.gz: src/content/index.html
-src/content/pricing.html.gz: src/content/pricing.html
-src/content/privacy.html.gz: src/content/privacy.html
-src/content/terms.html.gz: src/content/terms.html
-src/content/blog/1970/01/01/launch.html.gz: src/content/blog/1970/01/01/launch.html
-src/content/blog/2000/01/01/feature-ann.html.gz: src/content/blog/2000/01/01/feature-ann.html
-src/content/incidents/2000/01/01/service-start.html.gz: src/content/incidents/2000/01/01/service-start.html
-src/content/blog/index.html.gz: src/content/blog/index.html
-src/content/incidents/index.html.gz: src/content/incidents/index.html
-src/content/about.snippets.gz: src/content/about.snippets
-src/content/index.snippets.gz: src/content/index.snippets
-src/content/pricing.snippets.gz: src/content/pricing.snippets
-src/content/privacy.snippets.gz: src/content/privacy.snippets
-src/content/terms.snippets.gz: src/content/terms.snippets
-src/content/blog/1970/01/01/launch.snippets.gz: src/content/blog/1970/01/01/launch.snippets
-src/content/blog/2000/01/01/feature-ann.snippets.gz: src/content/blog/2000/01/01/feature-ann.snippets
-src/content/incidents/2000/01/01/service-start.snippets.gz: src/content/incidents/2000/01/01/service-start.snippets
-src/content/blog/index.snippets.gz: src/content/blog/index.snippets
-src/content/incidents/index.snippets.gz: src/content/incidents/index.snippets
-src/content/blog/categories.xml.gz: src/content/blog/categories.xml
-src/content/incidents/categories.xml.gz: src/content/incidents/categories.xml
-src/content/blog/feed.xml.gz: src/content/blog/feed.xml
-src/content/incidents/feed.xml.gz: src/content/incidents/feed.xml
-
-src/content/about.updatedat-check: src/content/about.conf
-src/content/index.updatedat-check: src/content/index.conf
-src/content/pricing.updatedat-check: src/content/pricing.conf
-src/content/privacy.updatedat-check: src/content/privacy.conf
-src/content/terms.updatedat-check: src/content/terms.conf
-src/content/blog/1970/01/01/launch.updatedat-check: src/content/blog/1970/01/01/launch.conf
-src/content/blog/2000/01/01/feature-ann.updatedat-check: src/content/blog/2000/01/01/feature-ann.conf
-src/content/incidents/2000/01/01/service-start.updatedat-check: src/content/incidents/2000/01/01/service-start.conf
-src/content/blog/index.updatedat-check: src/content/blog/index.conf
-src/content/incidents/index.updatedat-check: src/content/incidents/index.conf
-src/content/about.links-internal-check: src/content/about.links
-src/content/index.links-internal-check: src/content/index.links
-src/content/pricing.links-internal-check: src/content/pricing.links
-src/content/privacy.links-internal-check: src/content/privacy.links
-src/content/terms.links-internal-check: src/content/terms.links
-src/content/blog/1970/01/01/launch.links-internal-check: src/content/blog/1970/01/01/launch.links
-src/content/blog/2000/01/01/feature-ann.links-internal-check: src/content/blog/2000/01/01/feature-ann.links
-src/content/incidents/2000/01/01/service-start.links-internal-check: src/content/incidents/2000/01/01/service-start.links
-src/content/blog/index.links-internal-check: src/content/blog/index.links
-src/content/incidents/index.links-internal-check: src/content/incidents/index.links
-src/content/about.caslinks: src/content/about.links
-src/content/index.caslinks: src/content/index.links
-src/content/pricing.caslinks: src/content/pricing.links
-src/content/privacy.caslinks: src/content/privacy.links
-src/content/terms.caslinks: src/content/terms.links
-src/content/blog/1970/01/01/launch.caslinks: src/content/blog/1970/01/01/launch.links
-src/content/blog/2000/01/01/feature-ann.caslinks: src/content/blog/2000/01/01/feature-ann.links
-src/content/incidents/2000/01/01/service-start.caslinks: src/content/incidents/2000/01/01/service-start.links
-src/content/blog/index.caslinks: src/content/blog/index.links
-src/content/incidents/index.caslinks: src/content/incidents/index.links
-
-src/content/blog/1970/01/01/launch.feedentry: src/content/blog/1970/01/01/launch.conf src/content/blog/1970/01/01/launch.htmlbody
-src/content/blog/2000/01/01/feature-ann.feedentry: src/content/blog/2000/01/01/feature-ann.conf src/content/blog/2000/01/01/feature-ann.htmlbody
-src/content/incidents/2000/01/01/service-start.feedentry: src/content/incidents/2000/01/01/service-start.conf src/content/incidents/2000/01/01/service-start.htmlbody
-src/content/blog/1970/01/01/launch.sortdata: src/content/blog/1970/01/01/launch.conf
-src/content/blog/2000/01/01/feature-ann.sortdata: src/content/blog/2000/01/01/feature-ann.conf
-src/content/incidents/2000/01/01/service-start.sortdata: src/content/incidents/2000/01/01/service-start.conf
-src/content/blog/1970/01/01/launch.categorydata: src/content/blog/1970/01/01/launch.conf
-src/content/blog/2000/01/01/feature-ann.categorydata: src/content/blog/2000/01/01/feature-ann.conf
-src/content/incidents/2000/01/01/service-start.categorydata: src/content/incidents/2000/01/01/service-start.conf
-
-src/content/blog/index.htmlheader src/content/blog/index.htmlfooter: src/content/blog/index.conf
-src/content/incidents/index.htmlheader src/content/incidents/index.htmlfooter: src/content/incidents/index.conf
-src/content/blog/index.html: src/content/blog/index.htmlheader src/content/blog/index.htmlfooter
-src/content/incidents/index.html: src/content/incidents/index.htmlheader src/content/incidents/index.htmlfooter
-src/content/blog/index.html: src/content/blog/index.htmllisting src/content/blog/index.htmlbody
-src/content/incidents/index.html: src/content/incidents/index.htmllisting src/content/incidents/index.htmlbody
-
-
-articles.blog.adoc = \
- src/content/blog/1970/01/01/launch.adoc \
- src/content/blog/2000/01/01/feature-ann.adoc \
-
-articles.blog.sortdata = $(articles.blog.adoc:.adoc=.sortdata)
-articles.blog.indexentry = $(articles.blog.adoc:.adoc=.indexentry)
-articles.blog.feedentry = $(articles.blog.adoc:.adoc=.feedentry)
-articles.blog.categorydata = $(articles.blog.adoc:.adoc=.categorydata)
-src/content/blog/sortdata.txt: deps.mk
- printf '%s\n' $(articles.blog.sortdata) > $@
-
-src/content/blog/categories.txt src/content/blog/feed.xml src/content/blog/index.htmllisting: src/content/blog/sortdata.txt $(articles.blog.sortdata)
-src/content/blog/index.htmllisting: $(articles.blog.indexentry)
-src/content/blog/categories.txt: $(articles.blog.categorydata)
-src/content/blog/categories.xml: src/content/blog/categories.txt
-src/content/blog/categories.txt src/content/blog/feed.xml: $(articles.blog.feedentry)
-
-
-articles.incidents.adoc = \
- src/content/incidents/2000/01/01/service-start.adoc \
-
-articles.incidents.sortdata = $(articles.incidents.adoc:.adoc=.sortdata)
-articles.incidents.indexentry = $(articles.incidents.adoc:.adoc=.indexentry)
-articles.incidents.feedentry = $(articles.incidents.adoc:.adoc=.feedentry)
-articles.incidents.categorydata = $(articles.incidents.adoc:.adoc=.categorydata)
-src/content/incidents/sortdata.txt: deps.mk
- printf '%s\n' $(articles.incidents.sortdata) > $@
-
-src/content/incidents/categories.txt src/content/incidents/feed.xml src/content/incidents/index.htmllisting: src/content/incidents/sortdata.txt $(articles.incidents.sortdata)
-src/content/incidents/index.htmllisting: $(articles.incidents.indexentry)
-src/content/incidents/categories.txt: $(articles.incidents.categorydata)
-src/content/incidents/categories.xml: src/content/incidents/categories.txt
-src/content/incidents/categories.txt src/content/incidents/feed.xml: $(articles.incidents.feedentry)
+sources.po = \
+ po/en.po \
+ po/papo.im.pot \
+ po/pt.po \
+
+po4a.in = \
+ src/content/en/about.adoc \
+
+src/content/en/about.html.gz: src/content/en/about.html
+src/content/en/index.html.gz: src/content/en/index.html
+src/content/en/pricing.html.gz: src/content/en/pricing.html
+src/content/en/privacy.html.gz: src/content/en/privacy.html
+src/content/en/terms.html.gz: src/content/en/terms.html
+src/content/pt/sobre.html.gz: src/content/pt/sobre.html
+src/content/en/blog/1970/01/01/launch.html.gz: src/content/en/blog/1970/01/01/launch.html
+src/content/en/blog/2000/01/01/feature-ann.html.gz: src/content/en/blog/2000/01/01/feature-ann.html
+src/content/en/incidents/2000/01/01/service-start.html.gz: src/content/en/incidents/2000/01/01/service-start.html
+src/content/en/blog/index.html.gz: src/content/en/blog/index.html
+src/content/en/incidents/index.html.gz: src/content/en/incidents/index.html
+src/content/en/blog/categories.html.gz: src/content/en/blog/categories.html
+src/content/en/about.snippets.gz: src/content/en/about.snippets
+src/content/en/index.snippets.gz: src/content/en/index.snippets
+src/content/en/pricing.snippets.gz: src/content/en/pricing.snippets
+src/content/en/privacy.snippets.gz: src/content/en/privacy.snippets
+src/content/en/terms.snippets.gz: src/content/en/terms.snippets
+src/content/pt/sobre.snippets.gz: src/content/pt/sobre.snippets
+src/content/en/blog/1970/01/01/launch.snippets.gz: src/content/en/blog/1970/01/01/launch.snippets
+src/content/en/blog/2000/01/01/feature-ann.snippets.gz: src/content/en/blog/2000/01/01/feature-ann.snippets
+src/content/en/incidents/2000/01/01/service-start.snippets.gz: src/content/en/incidents/2000/01/01/service-start.snippets
+src/content/en/blog/index.snippets.gz: src/content/en/blog/index.snippets
+src/content/en/incidents/index.snippets.gz: src/content/en/incidents/index.snippets
+src/content/en/blog/categories.snippets.gz: src/content/en/blog/categories.snippets
+src/content/en/slide/2011/11/11/test.pdf.gz: src/content/en/slide/2011/11/11/test.pdf
+src/content/en/blog/feed.xml.gz: src/content/en/blog/feed.xml
+src/content/en/incidents/feed.xml.gz: src/content/en/incidents/feed.xml
+
+src/content/en/about.htmlbody src/content/en/about.snippets src/content/en/about.conf: src/content/en/about.adoc
+src/content/en/index.htmlbody src/content/en/index.snippets src/content/en/index.conf: src/content/en/index.adoc
+src/content/en/pricing.htmlbody src/content/en/pricing.snippets src/content/en/pricing.conf: src/content/en/pricing.adoc
+src/content/en/privacy.htmlbody src/content/en/privacy.snippets src/content/en/privacy.conf: src/content/en/privacy.adoc
+src/content/en/terms.htmlbody src/content/en/terms.snippets src/content/en/terms.conf: src/content/en/terms.adoc
+src/content/pt/sobre.htmlbody src/content/pt/sobre.snippets src/content/pt/sobre.conf: src/content/pt/sobre.adoc
+src/content/en/blog/1970/01/01/launch.htmlbody src/content/en/blog/1970/01/01/launch.snippets src/content/en/blog/1970/01/01/launch.conf: src/content/en/blog/1970/01/01/launch.adoc
+src/content/en/blog/2000/01/01/feature-ann.htmlbody src/content/en/blog/2000/01/01/feature-ann.snippets src/content/en/blog/2000/01/01/feature-ann.conf: src/content/en/blog/2000/01/01/feature-ann.adoc
+src/content/en/incidents/2000/01/01/service-start.htmlbody src/content/en/incidents/2000/01/01/service-start.snippets src/content/en/incidents/2000/01/01/service-start.conf: src/content/en/incidents/2000/01/01/service-start.adoc
+src/content/en/blog/index.htmlbody src/content/en/blog/index.snippets src/content/en/blog/index.conf: src/content/en/blog/index.adoc
+src/content/en/incidents/index.htmlbody src/content/en/incidents/index.snippets src/content/en/incidents/index.conf: src/content/en/incidents/index.adoc
+src/content/en/blog/categories.htmlbody src/content/en/blog/categories.snippets src/content/en/blog/categories.conf: src/content/en/blog/categories.adoc
+src/content/en/about.html: src/content/en/about.conf src/content/en/about.htmlbody
+src/content/en/index.html: src/content/en/index.conf src/content/en/index.htmlbody
+src/content/en/pricing.html: src/content/en/pricing.conf src/content/en/pricing.htmlbody
+src/content/en/privacy.html: src/content/en/privacy.conf src/content/en/privacy.htmlbody
+src/content/en/terms.html: src/content/en/terms.conf src/content/en/terms.htmlbody
+src/content/pt/sobre.html: src/content/pt/sobre.conf src/content/pt/sobre.htmlbody
+src/content/en/blog/1970/01/01/launch.html: src/content/en/blog/1970/01/01/launch.conf src/content/en/blog/1970/01/01/launch.htmlbody
+src/content/en/blog/2000/01/01/feature-ann.html: src/content/en/blog/2000/01/01/feature-ann.conf src/content/en/blog/2000/01/01/feature-ann.htmlbody
+src/content/en/incidents/2000/01/01/service-start.html: src/content/en/incidents/2000/01/01/service-start.conf src/content/en/incidents/2000/01/01/service-start.htmlbody
+src/content/en/blog/index.html: src/content/en/blog/index.conf src/content/en/blog/index.htmlbody
+src/content/en/incidents/index.html: src/content/en/incidents/index.conf src/content/en/incidents/index.htmlbody
+src/content/en/blog/categories.html: src/content/en/blog/categories.conf src/content/en/blog/categories.htmlbody
+
+src/content/en/about.updatedat-check: src/content/en/about.conf
+src/content/en/index.updatedat-check: src/content/en/index.conf
+src/content/en/pricing.updatedat-check: src/content/en/pricing.conf
+src/content/en/privacy.updatedat-check: src/content/en/privacy.conf
+src/content/en/terms.updatedat-check: src/content/en/terms.conf
+src/content/pt/sobre.updatedat-check: src/content/pt/sobre.conf
+src/content/en/blog/1970/01/01/launch.updatedat-check: src/content/en/blog/1970/01/01/launch.conf
+src/content/en/blog/2000/01/01/feature-ann.updatedat-check: src/content/en/blog/2000/01/01/feature-ann.conf
+src/content/en/incidents/2000/01/01/service-start.updatedat-check: src/content/en/incidents/2000/01/01/service-start.conf
+src/content/en/blog/index.updatedat-check: src/content/en/blog/index.conf
+src/content/en/incidents/index.updatedat-check: src/content/en/incidents/index.conf
+src/content/en/blog/categories.updatedat-check: src/content/en/blog/categories.conf
+src/content/en/about.links-internal-check: src/content/en/about.links
+src/content/en/index.links-internal-check: src/content/en/index.links
+src/content/en/pricing.links-internal-check: src/content/en/pricing.links
+src/content/en/privacy.links-internal-check: src/content/en/privacy.links
+src/content/en/terms.links-internal-check: src/content/en/terms.links
+src/content/pt/sobre.links-internal-check: src/content/pt/sobre.links
+src/content/en/blog/1970/01/01/launch.links-internal-check: src/content/en/blog/1970/01/01/launch.links
+src/content/en/blog/2000/01/01/feature-ann.links-internal-check: src/content/en/blog/2000/01/01/feature-ann.links
+src/content/en/incidents/2000/01/01/service-start.links-internal-check: src/content/en/incidents/2000/01/01/service-start.links
+src/content/en/blog/index.links-internal-check: src/content/en/blog/index.links
+src/content/en/incidents/index.links-internal-check: src/content/en/incidents/index.links
+src/content/en/blog/categories.links-internal-check: src/content/en/blog/categories.links
+src/content/en/about.caslinks: src/content/en/about.links
+src/content/en/index.caslinks: src/content/en/index.links
+src/content/en/pricing.caslinks: src/content/en/pricing.links
+src/content/en/privacy.caslinks: src/content/en/privacy.links
+src/content/en/terms.caslinks: src/content/en/terms.links
+src/content/pt/sobre.caslinks: src/content/pt/sobre.links
+src/content/en/blog/1970/01/01/launch.caslinks: src/content/en/blog/1970/01/01/launch.links
+src/content/en/blog/2000/01/01/feature-ann.caslinks: src/content/en/blog/2000/01/01/feature-ann.links
+src/content/en/incidents/2000/01/01/service-start.caslinks: src/content/en/incidents/2000/01/01/service-start.links
+src/content/en/blog/index.caslinks: src/content/en/blog/index.links
+src/content/en/incidents/index.caslinks: src/content/en/incidents/index.links
+src/content/en/blog/categories.caslinks: src/content/en/blog/categories.links
+
+src/content/en/blog/1970/01/01/launch.feedentry: src/content/en/blog/1970/01/01/launch.conf src/content/en/blog/1970/01/01/launch.htmlbody
+src/content/en/blog/2000/01/01/feature-ann.feedentry: src/content/en/blog/2000/01/01/feature-ann.conf src/content/en/blog/2000/01/01/feature-ann.htmlbody
+src/content/en/incidents/2000/01/01/service-start.feedentry: src/content/en/incidents/2000/01/01/service-start.conf src/content/en/incidents/2000/01/01/service-start.htmlbody
+src/content/en/blog/1970/01/01/launch.sortdata: src/content/en/blog/1970/01/01/launch.conf
+src/content/en/blog/2000/01/01/feature-ann.sortdata: src/content/en/blog/2000/01/01/feature-ann.conf
+src/content/en/incidents/2000/01/01/service-start.sortdata: src/content/en/incidents/2000/01/01/service-start.conf
+src/content/en/blog/1970/01/01/launch.categorydata: src/content/en/blog/1970/01/01/launch.conf
+src/content/en/blog/2000/01/01/feature-ann.categorydata: src/content/en/blog/2000/01/01/feature-ann.conf
+src/content/en/incidents/2000/01/01/service-start.categorydata: src/content/en/incidents/2000/01/01/service-start.conf
+
+src/content/en/blog/index.htmlheader src/content/en/blog/index.htmlfooter: src/content/en/blog/index.conf
+src/content/en/incidents/index.htmlheader src/content/en/incidents/index.htmlfooter: src/content/en/incidents/index.conf
+src/content/en/blog/categories.htmlheader src/content/en/blog/categories.htmlfooter: src/content/en/blog/categories.conf
+src/content/en/blog/index.htmllisting: src/content/en/blog/index.conf
+src/content/en/incidents/index.htmllisting: src/content/en/incidents/index.conf
+src/content/en/blog/categories.htmllisting: src/content/en/blog/categories.conf
+src/content/en/blog/index.html: src/content/en/blog/index.htmlheader src/content/en/blog/index.htmlfooter
+src/content/en/incidents/index.html: src/content/en/incidents/index.htmlheader src/content/en/incidents/index.htmlfooter
+src/content/en/blog/categories.html: src/content/en/blog/categories.htmlheader src/content/en/blog/categories.htmlfooter
+src/content/en/blog/index.html: src/content/en/blog/index.htmllisting src/content/en/blog/index.htmlbody
+src/content/en/incidents/index.html: src/content/en/incidents/index.htmllisting src/content/en/incidents/index.htmlbody
+src/content/en/blog/categories.html: src/content/en/blog/categories.htmllisting src/content/en/blog/categories.htmlbody
+
+
+src/content/en/slide/2011/11/11/test.ps: src/content/en/slide/2011/11/11/test.adoc
+src/content/en/slide/2011/11/11/test.pdf: src/content/en/slide/2011/11/11/test.ps
+
+
+
+articles.en.blog.adoc = \
+ src/content/en/blog/1970/01/01/launch.adoc \
+ src/content/en/blog/2000/01/01/feature-ann.adoc \
+
+articles.en.blog.sortdata = $(articles.en.blog.adoc:.adoc=.sortdata)
+articles.en.blog.indexentry = $(articles.en.blog.adoc:.adoc=.indexentry)
+articles.en.blog.feedentry = $(articles.en.blog.adoc:.adoc=.feedentry)
+articles.en.blog.categorydata = $(articles.en.blog.adoc:.adoc=.categorydata)
+src/content/en/blog/sortdata.txt: deps.mk
+ printf '%s\n' $(articles.en.blog.sortdata) > $@
+
+src/content/en/blog/feed.xml: src/content/en/blog/sortdata.txt
+src/content/en/blog/feed.xml: $(articles.en.blog.sortdata)
+src/content/en/blog/index.htmllisting: src/content/en/blog/sortdata.txt
+src/content/en/blog/index.htmllisting: $(articles.en.blog.sortdata)
+src/content/en/blog/categories.htmllisting: src/content/en/blog/sortdata.txt
+src/content/en/blog/categories.htmllisting: $(articles.en.blog.sortdata)
+src/content/en/blog/categories.txt: src/content/en/blog/sortdata.txt
+src/content/en/blog/categories.txt: $(articles.en.blog.sortdata)
+src/content/en/blog/index.htmllisting src/content/en/blog/categories.htmllisting: $(articles.en.blog.indexentry)
+src/content/en/blog/categories.txt: $(articles.en.blog.categorydata)
+src/content/en/blog/categories.txt src/content/en/blog/feed.xml: $(articles.en.blog.feedentry)
+src/content/en/blog/categories.htmllisting src/content/en/blog/categories.xml: src/content/en/blog/categories.txt
+src/content/en/blog/categories.xml.gz: src/content/en/blog/categories.xml
+
+
+articles.en.incidents.adoc = \
+ src/content/en/incidents/2000/01/01/service-start.adoc \
+
+articles.en.incidents.sortdata = $(articles.en.incidents.adoc:.adoc=.sortdata)
+articles.en.incidents.indexentry = $(articles.en.incidents.adoc:.adoc=.indexentry)
+articles.en.incidents.feedentry = $(articles.en.incidents.adoc:.adoc=.feedentry)
+articles.en.incidents.categorydata = $(articles.en.incidents.adoc:.adoc=.categorydata)
+src/content/en/incidents/sortdata.txt: deps.mk
+ printf '%s\n' $(articles.en.incidents.sortdata) > $@
+
+src/content/en/incidents/feed.xml: src/content/en/incidents/sortdata.txt
+src/content/en/incidents/feed.xml: $(articles.en.incidents.sortdata)
+src/content/en/incidents/index.htmllisting: src/content/en/incidents/sortdata.txt
+src/content/en/incidents/index.htmllisting: $(articles.en.incidents.sortdata)
+src/content/en/incidents/categories.htmllisting: src/content/en/incidents/sortdata.txt
+src/content/en/incidents/categories.htmllisting: $(articles.en.incidents.sortdata)
+src/content/en/incidents/categories.txt: src/content/en/incidents/sortdata.txt
+src/content/en/incidents/categories.txt: $(articles.en.incidents.sortdata)
+src/content/en/incidents/index.htmllisting src/content/en/incidents/categories.htmllisting: $(articles.en.incidents.indexentry)
+src/content/en/incidents/categories.txt: $(articles.en.incidents.categorydata)
+src/content/en/incidents/categories.txt src/content/en/incidents/feed.xml: $(articles.en.incidents.feedentry)
+src/content/en/incidents/categories.htmllisting src/content/en/incidents/categories.xml: src/content/en/incidents/categories.txt
+src/content/en/incidents/categories.xml.gz: src/content/en/incidents/categories.xml
diff --git a/mkdeps.sh b/mkdeps.sh
index c02c483..69424ad 100755
--- a/mkdeps.sh
+++ b/mkdeps.sh
@@ -5,28 +5,51 @@ export LANG=POSIX.UTF-8
normalize() {
- xargs realpath |
- awk -vPWD="$PWD/" '{ print substr($0, length(PWD) + 1) }' |
- sort
+ xargs realpath --relative-to=. | sort
}
pages() {
- find src/pages/*/*.adoc -type f | normalize
+ find src/pages/*/*.adoc -type f | normalize
}
articles() {
- find src/collections/*/*/ -type f -name '*.adoc' | normalize
+ find src/collections/*/*/*/ -type f -name '*.adoc' | normalize
}
-listings() {
- find src/collections/*/index.adoc | normalize
+slides() {
+ find src/slides/*/*/ -type f -name '*.adoc' | normalize
+}
+
+indexes() {
+ find src/collections/*/*/index.adoc | normalize
+}
+
+categories() {
+ grep -l '^:type: categories$' src/collections/*/*/*.adoc | normalize
+}
+
+media() {
+ find src/content/ \( -type f -and \! -type l \) -and \( \
+ -name '*.flac' -or \
+ -name '*.ogg' -or \
+ -name '*.webm' \
+ \)
+}
+
+tarballs() {
+ find src/content/ \( -type f -and \! -type l \) -and \( \
+ -name '*.tar.gz' \
+ \)
}
extras() {
- find src/content/ -type f \
- -name '*.flac' -or \
- -name '*.webm' -or \
- -name '*.tar.gz'
+ media
+ tarballs
+}
+
+listings() {
+ indexes
+ categories
}
files() {
@@ -36,23 +59,34 @@ files() {
}
-pages | varlist 'pages.adoc'
-articles | varlist 'articles.adoc'
-listings | varlist 'listings.adoc'
-listings | sed 's|/index\.adoc$|/categories.txt|' | varlist 'categories.txt'
-listings | sed 's|/index\.adoc$|/feed.xml|' | varlist 'feeds.xml'
-find src/content/img/ -name '*.svg' | varlist 'images.svg'
-extras | varlist 'sources.extras'
+pages | varlist 'pages.adoc'
+articles | varlist 'articles.adoc'
+slides | varlist 'slides.adoc'
+categories | varlist 'categories.adoc'
+indexes | varlist 'indexes.adoc'
+indexes | sed 's|/index\.adoc$|/feed.xml|' | varlist 'feeds.xml'
+find src/content/img/ -name '*.svg' | varlist 'images.svg'
+media | varlist 'sources.media'
+tarballs | varlist 'sources.tarballs'
+extras | varlist 'sources.extras'
+find po/*.po po/*.pot | varlist 'sources.po'
-files | sed 's/^\(.*\)\.adoc$/\1.htmlbody\t\1.snippets\t\1.conf:\t\1.adoc/'
-files | sed 's/^\(.*\)\.adoc$/\1.html:\t\1.conf\t\1.htmlbody/'
+cat po/po4a.cfg |
+ awk '$1 == "[type:" && $2 == "asciidoc]" && $4 != "" && $0=$3' |
+ varlist 'po4a.in'
+
+
+{
+ files | sed 's/^\(.*\)\.adoc$/\1.html/'
+ files | sed 's/^\(.*\)\.adoc$/\1.snippets/'
+ slides | sed 's/^\(.*\)\.adoc$/\1.pdf/'
+ indexes | sed 's|^\(.*\)/index\.adoc$|\1/feed.xml|'
+} | sed 's/^\(.*\)$/\1.gz:\t\1/'
printf '\n'
-files | sed 's/^\(.*\)\.adoc$/\1.html.gz:\t\1.html/'
-files | sed 's/^\(.*\)\.adoc$/\1.snippets.gz:\t\1.snippets/'
-listings | sed 's|^\(.*\)/index\.adoc$|\1/categories.xml.gz:\t\1/categories.xml|'
-listings | sed 's|^\(.*\)/index\.adoc$|\1/feed.xml.gz:\t\1/feed.xml|'
+files | sed 's/^\(.*\)\.adoc$/\1.htmlbody\t\1.snippets\t\1.conf:\t\1.adoc/'
+files | sed 's/^\(.*\)\.adoc$/\1.html:\t\1.conf\t\1.htmlbody/'
printf '\n'
files | sed 's/^\(.*\)\.adoc$/\1.updatedat-check:\t\1.conf/'
@@ -66,32 +100,71 @@ articles | sed 's/^\(.*\)\.adoc$/\1.categorydata:\t\1.conf/'
printf '\n'
listings | sed 's/^\(.*\)\.adoc$/\1.htmlheader\t\1.htmlfooter:\t\1.conf/'
+listings | sed 's/^\(.*\)\.adoc$/\1.htmllisting:\t\1.conf/'
listings | sed 's/^\(.*\)\.adoc$/\1.html:\t\1.htmlheader\t\1.htmlfooter/'
listings | sed 's/^\(.*\)\.adoc$/\1.html:\t\1.htmllisting\t\1.htmlbody/'
+printf '\n'
+
+media | sed 's/^\(.*\)$/\1.torrent:\t\1/'
+printf '\n'
-for colllink in src/collections/*; do
+slides | sed 's/^\(.*\)\.adoc$/\1.ps:\t\1.adoc/'
+slides | sed 's/^\(.*\)\.adoc$/\1.pdf:\t\1.ps/'
+printf '\n'
+
+
+
+collectionentries() {
+ langlink="$1"
+ colllink="$2"
+ lang="$(basename "$langlink")"
c="$(printf '%s' "$colllink" | normalize)"
+ plural="$(cat src/names/categories/"$lang".txt)"
printf '\n\n'
name="$(basename "$c")"
- find "$c"/*/ -type f -name '*.adoc' | varlist "articles.$name.adoc"
- art=articles # so things fit in 80 columns
+ art=articles."$lang"
+ find "$c"/*/ -type f -name '*.adoc' | varlist "$art.$name.adoc"
echo "$art.$name.sortdata = \$($art.$name.adoc:.adoc=.sortdata)"
echo "$art.$name.indexentry = \$($art.$name.adoc:.adoc=.indexentry)"
echo "$art.$name.feedentry = \$($art.$name.adoc:.adoc=.feedentry)"
echo "$art.$name.categorydata = \$($art.$name.adoc:.adoc=.categorydata)"
-
printf '%s/sortdata.txt:\tdeps.mk\n' "$c"
- printf '\tprintf %s $(articles.%s.sortdata) > $@\n\n' "'%s\n'" "$name"
+ printf '\tprintf %s $(%s.%s.sortdata) > $@\n\n' "'%s\n'" "$art" "$name"
+
+ listings="
+ feed.xml
+ index.htmllisting
+ $plural.htmllisting
+ $plural.txt
+ "
+ for lst in $listings; do
+ printf '%s/%s:\t%s/sortdata.txt\n' "$c" "$lst" "$c"
+ printf '%s/%s:\t$(%s.%s.sortdata)\n' "$c" "$lst" "$art" "$name"
+ done
+
+ printf '%s/index.htmllisting\t' "$c"
+ printf '%s/%s.htmllisting:\t' "$c" "$plural"
+ printf '$(%s.%s.indexentry)\n' "$art" "$name"
+
+ printf '%s/%s.txt:\t' "$c" "$plural"
+ printf '$(%s.%s.categorydata)\n' "$art" "$name"
+
+ printf '%s/%s.txt\t' "$c" "$plural"
+ printf '%s/feed.xml:\t' "$c"
+ printf '$(%s.%s.feedentry)\n' "$art" "$name"
+
+ printf '%s/%s.htmllisting\t' "$c" "$plural"
+ printf '%s/%s.xml:\t' "$c" "$plural"
+ printf '%s/%s.txt\n' "$c" "$plural"
+
+ printf '%s/%s.xml.gz:\t%s/%s.xml\n' "$c" "$plural" "$c" "$plural"
+}
- printf '%s/categories.txt\t%s/feed.xml\t%s/index.htmllisting:' \
- "$c" "$c" "$c"
- printf '\t%s/sortdata.txt\t$(articles.%s.sortdata)\n' "$c" "$name"
- printf '%s/index.htmllisting:\t$(articles.%s.indexentry)\n' "$c" "$name"
- printf '%s/categories.txt:\t$(articles.%s.categorydata)\n' "$c" "$name"
- printf '%s/categories.xml:\t%s/categories.txt\n' "$c" "$c"
- printf '%s/categories.txt\t%s/feed.xml:\t$(articles.%s.feedentry)\n' \
- "$c" "$c" "$name"
+for langlink in src/collections/*; do
+ for colllink in "$langlink"/*; do
+ collectionentries "$langlink" "$colllink"
+ done
done
diff --git a/po/en.po b/po/en.po
new file mode 100644
index 0000000..32077e4
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,48 @@
+# English translations for PACKAGE package
+# Copyright (C) 2025 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Automatically generated, 2025.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-05-01 20:58-0300\n"
+"PO-Revision-Date: 2025-05-01 20:50-0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: Plain text
+#: src/headers/ref.txt:6
+msgid ""
+"pricing.html\tPricing privacy.html\tPrivacy terms.html\tTerms about."
+"html\tAbout blog/\tBlog incidents/\tIncidents"
+msgstr ""
+"pricing.html\tPricing privacy.html\tPrivacy terms.html\tTerms about."
+"html\tAbout blog/\tBlog incidents/\tIncidents"
+
+#. type: Plain text
+#: src/names/categories/ref.txt:1
+msgid "categories"
+msgstr ""
+
+#. type: Plain text
+#: src/names/category/ref.txt:1
+msgid "category"
+msgstr ""
+
+#. type: Title =
+#: src/content/en/about.adoc:1
+#, no-wrap
+msgid "About"
+msgstr "About"
+
+#. type: Title ==
+#: src/content/en/about.adoc:3
+#, no-wrap
+msgid "It's a good service"
+msgstr "It's a good service"
diff --git a/po/note.txt b/po/note.txt
new file mode 100644
index 0000000..45279a4
--- /dev/null
+++ b/po/note.txt
@@ -0,0 +1,5 @@
+PO4A-HEADER: mode=eof
+
+
+
+// Generated from po4a(1).
diff --git a/po/papo.im.pot b/po/papo.im.pot
new file mode 100644
index 0000000..ebc7ad0
--- /dev/null
+++ b/po/papo.im.pot
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-05-01 20:58-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Plain text
+#: src/headers/ref.txt:6
+msgid ""
+"pricing.html\tPricing privacy.html\tPrivacy terms.html\tTerms "
+"about.html\tAbout blog/\tBlog incidents/\tIncidents"
+msgstr ""
+
+#. type: Plain text
+#: src/names/categories/ref.txt:1
+msgid "categories"
+msgstr ""
+
+#. type: Plain text
+#: src/names/category/ref.txt:1
+msgid "category"
+msgstr ""
+
+#. type: Title =
+#: src/content/en/about.adoc:1
+#, no-wrap
+msgid "About"
+msgstr ""
+
+#. type: Title ==
+#: src/content/en/about.adoc:3
+#, no-wrap
+msgid "It's a good service"
+msgstr ""
diff --git a/po/po4a.cfg b/po/po4a.cfg
new file mode 100644
index 0000000..e6453e0
--- /dev/null
+++ b/po/po4a.cfg
@@ -0,0 +1,9 @@
+[options] --keep 0 --master-charset UTF-8 --localized-charset UTF-8 --addendum-charset UTF-8
+
+[po_directory] po
+
+[type: text] src/headers/ref.txt $lang:src/headers/$lang.txt
+[type: text] src/names/categories/ref.txt $lang:src/names/categories/$lang.txt
+[type: text] src/names/category/ref.txt $lang:src/names/category/$lang.txt
+
+[type: asciidoc] src/content/en/about.adoc pt:src/content/pt/sobre.adoc add_$lang:po/note.txt
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..b409533
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,46 @@
+# Portuguese translations for PACKAGE package
+# Copyright (C) 2025 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Automatically generated, 2025.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-05-01 20:58-0300\n"
+"PO-Revision-Date: 2025-05-01 20:50-0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: Plain text
+#: src/headers/ref.txt:6
+msgid ""
+"pricing.html\tPricing privacy.html\tPrivacy terms.html\tTerms about."
+"html\tAbout blog/\tBlog incidents/\tIncidents"
+msgstr ""
+
+#. type: Plain text
+#: src/names/categories/ref.txt:1
+msgid "categories"
+msgstr ""
+
+#. type: Plain text
+#: src/names/category/ref.txt:1
+msgid "category"
+msgstr ""
+
+#. type: Title =
+#: src/content/en/about.adoc:1
+#, no-wrap
+msgid "About"
+msgstr ""
+
+#. type: Title ==
+#: src/content/en/about.adoc:3
+#, no-wrap
+msgid "It's a good service"
+msgstr ""
diff --git a/src/collections/blog b/src/collections/blog
deleted file mode 120000
index 8c3a331..0000000
--- a/src/collections/blog
+++ /dev/null
@@ -1 +0,0 @@
-../content/blog \ No newline at end of file
diff --git a/src/collections/en/blog b/src/collections/en/blog
new file mode 120000
index 0000000..973ecf5
--- /dev/null
+++ b/src/collections/en/blog
@@ -0,0 +1 @@
+../../content/en/blog \ No newline at end of file
diff --git a/src/collections/en/incidents b/src/collections/en/incidents
new file mode 120000
index 0000000..024c5fb
--- /dev/null
+++ b/src/collections/en/incidents
@@ -0,0 +1 @@
+../../content/en/incidents \ No newline at end of file
diff --git a/src/collections/incidents b/src/collections/incidents
deleted file mode 120000
index 607e060..0000000
--- a/src/collections/incidents
+++ /dev/null
@@ -1 +0,0 @@
-../content/incidents \ No newline at end of file
diff --git a/src/content/about.adoc b/src/content/en/about.adoc
index 8f8dd75..8f8dd75 100644
--- a/src/content/about.adoc
+++ b/src/content/en/about.adoc
diff --git a/src/content/blog/1970/01/01/launch.adoc b/src/content/en/blog/1970/01/01/launch.adoc
index f82187d..f82187d 100644
--- a/src/content/blog/1970/01/01/launch.adoc
+++ b/src/content/en/blog/1970/01/01/launch.adoc
diff --git a/src/content/blog/2000/01/01/feature-ann.adoc b/src/content/en/blog/2000/01/01/feature-ann.adoc
index c7c3cca..220a7ff 100644
--- a/src/content/blog/2000/01/01/feature-ann.adoc
+++ b/src/content/en/blog/2000/01/01/feature-ann.adoc
@@ -1,4 +1,5 @@
= Feature announcement
+:categories: ann
== New feature X
diff --git a/src/content/en/blog/categories.adoc b/src/content/en/blog/categories.adoc
new file mode 100644
index 0000000..feb64ff
--- /dev/null
+++ b/src/content/en/blog/categories.adoc
@@ -0,0 +1,2 @@
+= Articles by category
+:type: categories
diff --git a/src/content/blog/index.adoc b/src/content/en/blog/index.adoc
index 075f77f..075f77f 100644
--- a/src/content/blog/index.adoc
+++ b/src/content/en/blog/index.adoc
diff --git a/src/content/incidents/2000/01/01/service-start.adoc b/src/content/en/incidents/2000/01/01/service-start.adoc
index d5013c0..d5013c0 100644
--- a/src/content/incidents/2000/01/01/service-start.adoc
+++ b/src/content/en/incidents/2000/01/01/service-start.adoc
diff --git a/src/content/incidents/index.adoc b/src/content/en/incidents/index.adoc
index 9d57213..9d57213 100644
--- a/src/content/incidents/index.adoc
+++ b/src/content/en/incidents/index.adoc
diff --git a/src/content/index.adoc b/src/content/en/index.adoc
index 7bf7d54..7bf7d54 100644
--- a/src/content/index.adoc
+++ b/src/content/en/index.adoc
diff --git a/src/content/pricing.adoc b/src/content/en/pricing.adoc
index 5318ba6..5318ba6 100644
--- a/src/content/pricing.adoc
+++ b/src/content/en/pricing.adoc
diff --git a/src/content/privacy.adoc b/src/content/en/privacy.adoc
index a77b26c..a77b26c 100644
--- a/src/content/privacy.adoc
+++ b/src/content/en/privacy.adoc
diff --git a/src/content/en/slide/2011/11/11/test.adoc b/src/content/en/slide/2011/11/11/test.adoc
new file mode 100644
index 0000000..e34479a
--- /dev/null
+++ b/src/content/en/slide/2011/11/11/test.adoc
@@ -0,0 +1,10 @@
+---
+# Rollout, feature flag, experiment, operational toggle
+
+@Different use cases for backend, frontend and mobile
+
+---
+.
+.
+.
+# "Feature flags" tend to come up when talking about continuous deployment
diff --git a/src/content/terms.adoc b/src/content/en/terms.adoc
index cecbc54..cecbc54 100644
--- a/src/content/terms.adoc
+++ b/src/content/en/terms.adoc
diff --git a/src/content/favicon.png b/src/content/favicon.png
new file mode 100644
index 0000000..fdc9d9b
--- /dev/null
+++ b/src/content/favicon.png
Binary files differ
diff --git a/src/content/pt/sobre.adoc b/src/content/pt/sobre.adoc
new file mode 100644
index 0000000..2d0d479
--- /dev/null
+++ b/src/content/pt/sobre.adoc
@@ -0,0 +1,7 @@
+= About
+
+== It's a good service
+
+
+
+// Generated from po4a(1).
diff --git a/src/content/public.asc b/src/content/public.asc.txt
index e69de29..e69de29 100644
--- a/src/content/public.asc
+++ b/src/content/public.asc.txt
diff --git a/src/headers/en.txt b/src/headers/en.txt
new file mode 100644
index 0000000..464fe1b
--- /dev/null
+++ b/src/headers/en.txt
@@ -0,0 +1,2 @@
+pricing.html Pricing privacy.html Privacy terms.html Terms about.html About
+blog/ Blog incidents/ Incidents
diff --git a/src/headers/pt.txt b/src/headers/pt.txt
new file mode 100644
index 0000000..464fe1b
--- /dev/null
+++ b/src/headers/pt.txt
@@ -0,0 +1,2 @@
+pricing.html Pricing privacy.html Privacy terms.html Terms about.html About
+blog/ Blog incidents/ Incidents
diff --git a/src/headers.txt b/src/headers/ref.txt
index 27f2ac3..27f2ac3 100644
--- a/src/headers.txt
+++ b/src/headers/ref.txt
diff --git a/src/linkonly-dirs.txt b/src/linkonly-dirs.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/linkonly-dirs.txt
diff --git a/src/names/categories/en.txt b/src/names/categories/en.txt
new file mode 100644
index 0000000..36e8f75
--- /dev/null
+++ b/src/names/categories/en.txt
@@ -0,0 +1 @@
+categories
diff --git a/src/names/categories/pt.txt b/src/names/categories/pt.txt
new file mode 100644
index 0000000..36e8f75
--- /dev/null
+++ b/src/names/categories/pt.txt
@@ -0,0 +1 @@
+categories
diff --git a/src/names/categories/ref.txt b/src/names/categories/ref.txt
new file mode 100644
index 0000000..36e8f75
--- /dev/null
+++ b/src/names/categories/ref.txt
@@ -0,0 +1 @@
+categories
diff --git a/src/names/category/en.txt b/src/names/category/en.txt
new file mode 100644
index 0000000..46e72f3
--- /dev/null
+++ b/src/names/category/en.txt
@@ -0,0 +1 @@
+category
diff --git a/src/names/category/pt.txt b/src/names/category/pt.txt
new file mode 100644
index 0000000..46e72f3
--- /dev/null
+++ b/src/names/category/pt.txt
@@ -0,0 +1 @@
+category
diff --git a/src/names/category/ref.txt b/src/names/category/ref.txt
new file mode 100644
index 0000000..46e72f3
--- /dev/null
+++ b/src/names/category/ref.txt
@@ -0,0 +1 @@
+category
diff --git a/src/pages/en b/src/pages/en
new file mode 120000
index 0000000..2d811cf
--- /dev/null
+++ b/src/pages/en
@@ -0,0 +1 @@
+../content/en \ No newline at end of file
diff --git a/src/pages/pt b/src/pages/pt
new file mode 120000
index 0000000..12d2087
--- /dev/null
+++ b/src/pages/pt
@@ -0,0 +1 @@
+../content/pt \ No newline at end of file
diff --git a/src/pages/root b/src/pages/root
deleted file mode 120000
index efcdaa6..0000000
--- a/src/pages/root
+++ /dev/null
@@ -1 +0,0 @@
-../content \ No newline at end of file
diff --git a/src/slides/en b/src/slides/en
new file mode 120000
index 0000000..5cbb4c2
--- /dev/null
+++ b/src/slides/en
@@ -0,0 +1 @@
+../content/en/slide \ No newline at end of file
diff --git a/src/static.conf b/src/static.conf
index f2ec25f..b11a528 100644
--- a/src/static.conf
+++ b/src/static.conf
@@ -1,5 +1,6 @@
+export headers_dir=src/headers
+export names_dir=src/names
export root_dir=src/content
-export header_links=src/headers.txt
export list_addr='~euandreh/papoim@lists.sr.ht'
export discussions_url_prefix='https://lists.sr.ht/~euandreh/papoim?search='
export sourcecode_url_prefix="$sourcecode_url/tree"
diff --git a/src/symlinks.txt b/src/symlinks.txt
new file mode 100644
index 0000000..19ba6d8
--- /dev/null
+++ b/src/symlinks.txt
@@ -0,0 +1,3 @@
+# "Official" redirections
+index.html en/index.html
+security.txt .well-known/security.txt