~demifiend/m4-website

2d626378a0e1cc5890f93e95b26255923a4df21c — Matthew Graybosch 5 months ago 3928855
everything personal has been stripped out.
17 files changed, 36 insertions(+), 328 deletions(-)

A feeds/feed.m4
R inc/{atom.m4 => feeds.m4}
R inc/{map.m4 => sitemaps.m4}
M inc/variables.m4
M makefile
D posse/feed.m4
D site/about/index.m4
D site/bio/index.m4
D site/blog/blueshift/index.m4
D site/blog/fifteen-years-with-catherine-gatt/index.m4
D site/blog/i-want-my-bsd/index.m4
D site/blog/index.m4
D site/blog/missing-pseudonymous-web/index.m4
M site/index.m4
R seo/{sitemap.m4 => maps/sitemap.m4}
R page.template => templates/page.m4
R post.template => templates/post.m4
A feeds/feed.m4 => feeds/feed.m4 +4 -0
@@ 0,0 1,4 @@
m4_include(feeds.m4)
_FEED_BEGIN()
m4_dnl _ENTRY([], [], [], [])
_FEED_END()

R inc/atom.m4 => inc/feeds.m4 +0 -0

R inc/map.m4 => inc/sitemaps.m4 +0 -0

M inc/variables.m4 => inc/variables.m4 +15 -15
@@ 17,11 17,11 @@ m4_divert

m4_changequote(`[',`]')

m4_define([_V_PAGE_TITLE],[Change this so people don't get confused.])
m4_define([_V_PAGE_DESCRIPTION], [Please describe this page so Google can monetize it at your expense.])
m4_define([_V_TITLE], [The Matthew Graybösch Experience])
m4_define([_V_SLOGAN], [the website of a developer, author, metalhead, and cynical idealist])
m4_define([_V_URL], [https://test.matthewgraybosch.com])
m4_define([_V_PAGE_TITLE],[Page Title])
m4_define([_V_PAGE_DESCRIPTION], [Page Description for SEO])
m4_define([_V_TITLE], [Site Title Here])
m4_define([_V_SLOGAN], [Site Tagline (goes under title)])
m4_define([_V_URL], [root URL of site])
m4_define([_V_PAGE_URL], [index.html])
m4_define([_V_PAGE_SOURCE], [index.m4])
m4_define([_V_STYLESHEET], [assets/css/styles.css])


@@ 29,16 29,16 @@ m4_define([_V_RSS_FEED], [feed.xml])
m4_define([_V_LANG], [en])
m4_define([_V_LOCALE], [en_US])
m4_define([_V_ENCODING], [utf-8])
m4_define([_V_OG_IMAGE], [assets/images/starbreakercollage.jpg])
m4_define([_V_AUTHOR], [Matthew Graybosch])
m4_define([_V_FEDIVERSE], [https://mastodon.sdf.org/@starbreaker])
m4_define([_V_SCROBBLER], [https://libre.fm/user/starbreaker])
m4_define([_V_GIT], [https://git.sr.ht/~demifiend/])
m4_define([_V_EMAIL], [hello@matthewgraybosch.com])
m4_define([_V_ICBM],[40.27,-76.88])
m4_define([_V_REGION], [US-PA])
m4_define([_V_CITY], [Harrisburg])
m4_define([_V_EXPOSURE],[http://exposure.money/pay/c3RhcmJyZWFrZXI6Mi41Ng])
m4_define([_V_OG_IMAGE], [default image for OpenGraph metadata])
m4_define([_V_AUTHOR], [Website author's name])
m4_define([_V_FEDIVERSE], [Fediverse profile URL])
m4_define([_V_SCROBBLER], [Scrobbler profile URL])
m4_define([_V_GIT], [Online Git repository URLs])
m4_define([_V_EMAIL], [an email address that you've hardened against spammers])
m4_define([_V_ICBM],[Latitude/Longitude for geo location metadata])
m4_define([_V_REGION], [Country & state/province location metadata])
m4_define([_V_CITY], [City geo location metadata])
m4_define([_V_EXPOSURE],[donation link])
m4_define([_V_PUB_YEAR], m4_esyscmd(date "+%Y"))
m4_define([_V_EPOCH], m4_esyscmd(date "+%s"))
m4_define([_V_BUILD_TIMESTAMP], m4_esyscmd(date "+%Y-%m-%dT%I:%M:%S.000-05:00"| tr -d '\n'))

M makefile => makefile +13 -16
@@ 1,45 1,42 @@
# Set valid file suffixes (extensions for all you DOS types)
.SUFFIXES: .m4 .html .atom .xml
.SUFFIXES: .m4 .html .xml

.m4.html:
	@m4 -P -E -I ./inc "$<" | grep "[^[:blank:]]" > "$@"

.m4.atom:
	@m4 -P -E -I ./inc "$<" | grep "[^[:blank:]]" > "$@"

.m4.xml:
	@m4 -P -E -I ./inc "$<" | grep "[^[:blank:]]" > "$@"

# Find all M4 files except includes.
SITE!=find site/ -name "*.m4"
POSSE!=find posse/ -name "*.m4"
SEO!=find seo/ -name "*.m4"
FEEDS!=find feeds/ -name "*.m4"
SITEMAPS!=find sitemaps/ -name "*.m4"

# Form all output counterparts.
HTML=${SITE:.m4=.html}
ATOM=${POSSE:.m4=.atom}
XML=${SEO:.m4=.xml}
FEED=${FEEDS:.m4=.xml}
SITEMAP=${SITEMAPS:.m4=.xml}

# Initiate phase one...
# Power up the bass cannon...
# FIRE!
all: $(HTML) $(ATOM) $(XML)
	@cp posse/feed.atom site/feed.xml
	@cp seo/sitemap.xml site/sitemap.xml
all: $(HTML) $(FEED) $(SITEMAP)
	@cp feeds/feed.xml site/feed.xml
	@cp sitemaps/sitemap.xml site/sitemap.xml

# Let's clear out the cruft.
clean:
	@rm $(HTML)
	@rm $(ATOM)
	@rm $(XML)
	@rm $(FEED)
	@rm $(SITEMAP)
	@rm site/feed.xml
	@rm site/sitemap.xml

# Deployment Settings
LOCAL_PATH=/var/www/htdocs/localhost/
LOCAL_PATH=""
SSH_OPTS=-o StrictHostKeyChecking=no
REMOTE_HOST=asuraemulator@fireplug.dreamhost.com
REMOTE_PATH=/home/asuraemulator/test.matthewgraybosch.com/
REMOTE_HOST=""
REMOTE_PATH=""

local:
	@cp -R site/* ${LOCAL_PATH}

D posse/feed.m4 => posse/feed.m4 +0 -9
@@ 1,9 0,0 @@
m4_include(atom.m4)
_FEED_BEGIN()
m4_dnl _ENTRY([], [], [], [])
_ENTRY(
[I Miss Being on the Pseudonymous Web],
[blog/missing-pseudonymous-web],
[2020-01-01],
[Does having everything you put online tied to the name on your government-issued identification actually benefit you? I am not convinced it does. I am convinced that it benefits people who do not have your best interests in mind.])
_FEED_END()

D site/about/index.m4 => site/about/index.m4 +0 -36
@@ 1,36 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [About])
m4_define([_V_PAGE_DESCRIPTION], [Information about this website])
m4_define([_V_PAGE_URL], [about/index.html])
m4_define([_V_PAGE_SOURCE], [about/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_H1([About])
_P([This is my personal website. If you remember me from _A_SOCIAL([https://plus.google.com/+MatthewGraybosch], [a ghost town (and we liked it that way)], [Google+]), please bookmark it and send me an email to say hello. Just use the "contact" link up top.])
_H2([Technical Info])
_P([If you do web development or run your own site, you might be interested in knowing a bit more about how my site is built.])
_UL_BEGIN()
_LI([This entire site was built and deployed on _A_EXT([https://sourcehut.org/], [the hacker's forge], [Sourcehut]) using a default installation of _A_EXT([https://openbsd.org], [free, functional, and secure], [OpenBSD]).])
_LI([You can _A_SOCIAL([https://git.sr.ht/~demifiend/m4-website/], [this site on Sourcehut], [see the source]) for yourself if you're curious.])
_LI([This site has been hosted by Dreamhost since 2010.])
_UL_END()
_P([If I weren't trying to be less pretentious, I'd call this part a "colophon".])
_H2([Disclaimer])
_P([I'd like to think this reminder is unnecessary, but here we go anyway.])
_UL_BEGIN()
_LI([This is my _I([personal website]). Its content is for entertainment purposes only.])
_LI([Everything I post here is _I([my]) opinion unless attributed to somebody else.])
_LI([Nothing I post here should be construed as representing the opinions or positions of whomever I happen to be working for at my day job.])
_UL_END()
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()

D site/bio/index.m4 => site/bio/index.m4 +0 -23
@@ 1,23 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [About])
m4_define([_V_PAGE_DESCRIPTION], [Information about this website])
m4_define([_V_PAGE_URL], [about/index.html])
m4_define([_V_PAGE_SOURCE], [about/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_H1([Bio])
_P([I'm just another working-class schmuck with a day job and a dream, a long-haired metalhead with delusions of erudition who writes science fantasy and codes for a living.])
_P([I've written several novels and short stories, all of which are part of my _A([https://www.starbreakersaga.com], [heavy metal + science fantasy], [Starbreaker]) saga. My day job involves software development using Microsoft tech and JavaScript (for my sins) at a large consultancy. At home, I prefer to use free and open-source software.])
_P([I currently live in Central Pennsylvania with my wife and cats. I'm entirely too fond of loud music, spicy food, terrible jokes, obscure allusions, and melodrama for anybody's good, least of all my own.])
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()

D site/blog/blueshift/index.m4 => site/blog/blueshift/index.m4 +0 -29
@@ 1,29 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [blueshift])
m4_define([_V_PAGE_DESCRIPTION], [a replacement for redshift built with POSIX shell, core utilities, and sct])
m4_define([_V_PAGE_URL], [blog/blueshift/index.html])
m4_define([_V_PAGE_SOURCE], [blog/blueshift/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_ARTICLE_BEGIN()
_DIV_BEGIN()
_H1([blueshift])
_I([published on _TIME([2019-10-22], [22 October 2019])])
_DIV_END()
_SECTION_BEGIN()
_P([I put together a little POSIX shell script for running _CODE([sct]) with arbitrary color temperature values at particular times because I didn't know that the tool came with _CODE([sctd]) for that very purpose. It's called "blueshift" because I wrote it to replace a heavier app called redshift. Everything you need to know is in the _A_EXT([https://git.sr.ht/~demifiend/blueshift], [blueshift on Sourcehut], [git repository]).])
_SECTION_END()
_ARTICLE_END()
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()


D site/blog/fifteen-years-with-catherine-gatt/index.m4 => site/blog/fifteen-years-with-catherine-gatt/index.m4 +0 -35
@@ 1,35 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [Fifteen Years with Catherine Gatt])
m4_define([_V_PAGE_DESCRIPTION], [Today is our fifteenth wedding anniversary. We're still beating the odds into the ground, and then beating 'em some more.])
m4_define([_V_PAGE_URL], [blog/fifteen-years-with-catherine-gatt/index.html])
m4_define([_V_PAGE_SOURCE], [blog/fifteen-years-with-catherine-gatt/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_ARTICLE_BEGIN()
_DIV_BEGIN()
_H1([Fifteen Years with Catherine Gatt])
_I([published on _TIME([2019-10-31], [31 October 2019])])
_DIV_END()
_SECTION_BEGIN()
_P([Today is my fifteenth wedding anniversary with Catherine Gatt. Yes, we got married on Halloween. We were a bit pressed for time due to her being in the US on a K1 visa, and we figured, "If we do it on Halloween, we won't have an excuse to forget." We've known each other for almost twenty years, however; we met on a Yahoo! writers' board in May 2000.])
_P([I was living alone in a third-floor walkup in a rough neighborhood, and had had dialup net access for about a month. She had made some interesting comments about imagination, and we ended up having an exchange based on her comments. I then asked her, via email, if she'd like to exchange stories.])
_P([We continued our conversation, and agreed to meet in July 2002. I flew to Australia to meet her, spent six days together, and did not want to leave. We developed a (rather expensive without VOIP!) habit of nightly phone calls and long chats over IM, until after year I broke down and asked her to marry me.])
_P([I repeated the question the next morning, after a night's sleep. We spent a year preparing, and dealing with immigration authorities in both the US and Australia; I was willing to go there, but I had the better job at the time, and she wanted to come to the US. The end of August 2004 saw me waiting outside the international arrivals entrance at Newark Airport with an bouquet and an engagement ring. I proposed to her as soon as she came out.])
_P([It hasn't always been easy, and I've probably made it harder than it needed to be, but I have no regrets. She says the same; I ask her every year.])
_P([We laugh, however, whenever somebody complains about the difficulties of a "long-distance relationship" where the separation is a town, a state, or even the width of the continent. We kept it up with both the breadth of North America and the entire Pacific Ocean between us for four years.])
_P([Not only did we beat the odds by making a long-distance relationship work for four years, but by remaining married fifteen years we've been beating the divorce odds as well. It hasn't always been easy, but it _I([has]) been worthwhile.])
_SECTION_END()
_ARTICLE_END()
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()


D site/blog/i-want-my-bsd/index.m4 => site/blog/i-want-my-bsd/index.m4 +0 -52
@@ 1,52 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [I Want My BSD])
m4_define([_V_PAGE_DESCRIPTION], [Information about this website])
m4_define([_V_PAGE_URL], [blog/i-want-my-bsd/index.html])
m4_define([_V_PAGE_SOURCE], [blog/i-want-my-bsd/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_ARTICLE_BEGIN()
_DIV_BEGIN()
_H1([I Want My BSD])
_I([published on _TIME([2019-09-24], [24 September 2019])])
_SECTION_BEGIN()
_P([I’m a novelist you probably haven’t read, I code for a living (using mainly Microsoft tech, _A_EXT([https://www.macmillandictionary.com/us/dictionary/american/for-my-sins], [blame Iron Maiden], [for my sins])), and I’ve been running _A_EXT([https://openbsd.org/], [accept no substitutes], [OpenBSD]) on my personal computers since 2017. If you’re familiar with the _A_EXT([https://runbsd.info/], [don't call them "distros"]. [various BSD operating systems]) you might raise an eyebrow at my choice, since OpenBSD is the preferred OS of security-conscious system administrators.])
_P([One would think that it isn’t an OS for long-haired metalheads who write crappy sf on their lunch breaks. Nevertheless, it’s the OS with which I’m most comfortable. Nor is it my first Unix. My first Unix, if you’re willing to count experience gained in a college computer lab, was SunOS 3.x on a SPARCstation.])
_P([Exposure to Unix while learning C was a revelation, and while I never became a systems programmer, I got familiar enough with Unix that I soon chafed against the limitations of the PC DOS that came with my first PC (a secondhand IBM PS Value/Point) and the various incarnations of Windows with which I had to cope at school and later at work.])
_P([Once I left school and got a job as a developer, I built a new computer and ran a variety of Unix systems at home. Before I finally got around to trying OpenBSD on a secondhand Lenovo Thinkpad, I ran FreeBSD for a while, used Intel Macbooks, and did entirely too much distro-hopping.])
_P([If I learned anything, it was the following:])
_UL_BEGIN()
_LI([GNU/Linux is for people who loathe Microsoft])
_LI([OSX is for people who dislike Windows and are OK with throwing money at problems])
_LI([The BSDs are for people who actually like Unix])
_UL_END()
_P([For a while I thought I was just somebody who loathed Microsoft. For a while, I was somebody who loathed Windows and preferred to throw money at problems to avoid spending time. It was only recently that I remembered how much I had actually _I([enjoyed]) having access to an Unix system in college, and that memory came to me the first time I installed OpenBSD.])
_P([I was lucky; I had picked a laptop that had good hardware compatibility for little other reason than that I liked typing on it and that I could get a refurbished model for less than $300. Thus it was easy to just plug in a network cable so my Thinkpad could pull packages from the network and just follow the instructions on every step of the boot screen. The only point I lingered over was partitioning, since I wanted to use all of my drive’s space instead of settling for the defaults and growing disklabel partitions later.])
_P([I had “Money for Nothing” by Dire Straits on the stereo while the installer carried out my instructions, and found myself singing along in anticipation…])
_BQ_CITE_BEGIN([https://www.youtube.com/watch?v=lAD6Obi7Cag])
_P([I want my…_BR()I want my…_BR()I want my BSD…])
_BQ_END()
_P([Once it was done I logged in as root, read the _CODE([afterboot(8)]) man page, set up _CODE([doas.conf(5)]) so I could do admin stuff without logging in as root, and started breaking in my new system. The first thing that struck me was the breadth of documentation provided by OpenBSD man pages. The dev team does not do a half-assed job of documenting the system. If it’s in base, it’s got a man page, and that man page is comprehensive. Even config files have man pages (in section 5). I’ve never seen a GNU/Linux distribution as thoroughly documented as OpenBSD.])
_P([The next big surprise was the sheer generosity of the software included with the base system when you install every set. Need a text editor? Take your pick from _CODE([vi(1)]), _CODE([mg(1)]) (an Emacs clone), or the venerable standard Unix editor _CODE([ed(1)]). Need simple version control for personal projects? Why not _CODE([rcs(1)])? Want a graphical session? Just enable _CODE([xenodm(1)]) in _CODE([rc.conf.local(5)]); Xenocara (OpenBSD’s custom X.org build) even comes with three window managers: _CODE([twm(1)]), _CODE([fvwm(1)]), and _CODE([cwm(1)]). Want to run simple websites or send email? _CODE([httpd(8)]) and _CODE([smtpd(5)]) are there. Need a software firewall? _CODE([pf(4)]) is there and running by default. Hell, if you’re old-school enough to still prefer music on CDs and have your computer hooked up to a good pair of speakers, try _CODE([cdio(1)]).])
_P([Naturally, OpenBSD comes with the classic BSD games collection, with all your old favorites. Like text adventures? Try _CODE([adventure(6)]). Fancy a dungeon crawl? _CODE([hack(6)]) away. Enjoy simulations? Try _CODE([atc(6)]) for a taste of an air traffic controller’s duties (union-busting not necessarily included). We’ve even got _CODE([tetris(6)]).])
_P([There’s plenty you can do with the base system and its included tools and utilities. If the included public-domain Korn shell (_CODE([ksh(1)])) isn’t your cup of tea, you can always install bash, zsh, or fish using the package manager. Need a web browser? Pick a package. Need to do graphics editing? There’s a package for that. Musician or moviemaker? We’ve got packages for you. Setting up a industrial-strength home office PC? We’ve got LibreOffice, graphical email clients, and everything else you need. Want to typeset your own documents? TeX Live is in the packages collection, and so are GNU Emacs, vim, and neovim if the editors in base aren’t fancy enough for you. If you’re a developer working with languages not supported by the dev tools provided in base, or you’re using a more recent SCM than _CODE([cvs(1)]), then the package manager is your friend.])
_P([If you want something that isn’t provided by the OpenBSD base system, chances are there’s a package or a port available. If you want to build another machine and install the same packages that you have on the first, you can dump a list of installed packages to a file. If you want to remove all of your installed packages and start over with a clean base system, you can do that without reinstalling the entire OS.])
_P([However, it’s not the documentation, the robust and capable base system, or the package management that sold me on OpenBSD. It’s the fact that OpenBSD wasn’t made for me. The developers made it for themselves, and it just happens to be available if I want it and am willing to put in the time and effort to make it work for me. This isn’t to say that the community surrounding OpenBSD is rude or standoffish. I’ve found other BSD fans on social media friendly and patient – as long as you treat them like adults and act like an adult yourself. They’ll even help if you make it clear that you’ve tried to solve your problems on your own.])
_P([However, I don’t think you’ll see the core development team worrying about how make OpenBSD more appealing to the general public. It suits me because the system doesn’t cater to my ignorance or try to anticipate my requirements. It’s a rock-solid general-purpose toolkit, and what I do with it is entirely up to me.])
_P([Admittedly, my life as a writer would probably be easier if I were content to run Windows or use a Mac like the vast majority of authors, but I can’t help it. I want my BSD! It’s not like Unix hasn’t leaked into my writing. For example, in Silent Clarion the computer controlling an orbital weapons platform codenamed GUNGNIR is powered by OpenBSD, and its protagonist runs into a bit of trouble because she’s familiar with POSIX shells, but not Multics.])
_P([Rather than take the easy way out, I run OpenBSD on a Thinkpad T430s, a Thinkcentre M92P, and an Apple iMac G4 because I can. I do it because Unix is fun to run on secondhand hardware, and because I don’t think it’s a coincidence that both Unix and heavy metal date back to 1969.])
_SECTION_END()
_ARTICLE_END()
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()


D site/blog/index.m4 => site/blog/index.m4 +0 -70
@@ 1,70 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [Das Blög])
m4_define([_V_PAGE_DESCRIPTION], [A chill blod with heavy metal umlauts and an extremely low post frequency])
m4_define([_V_PAGE_URL], [blog/index.html])
m4_define([_V_PAGE_SOURCE], [blog/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_H1([Das Blög])
_P([This is a chill blog with heavy metal umlauts and an extremely low post frequency that only contains content I feel safe sharing at my day job.])
_T_BEGIN()
_THEAD_BEGIN()
_TR_BEGIN()
_TH([Date])
_TH([Title])
_TH([Category])
_TR_END()
_THEAD_END()
_TBODY_BEGIN()
_TR_BEGIN()
_TD([2020-01-01])
_TD([
_A([blog/missing-pseudonymous-web/], [a single identity is never enough], [I Miss Being on the Pseudonymous Web])
])
_TD([online identity])
_TR_END()
_TR_BEGIN()
_TD([2019-12-01])
_TD([
_A([blog/static-website-generation-m4-make-openbsd/], [a proof of concept that got out of control], [Static Website Generation and Deployment Using a default OpenBSD install])
])
_TD([OpenBSD])
_TR_END()
_TR_BEGIN()
_TD([2019-11-01])
_TD([
_A([blog/fifteen-years-with-catherine-gatt/], [beating the odds together for fifteen years], [Fifteen Years with Catherine Gatt])
])
_TD([marriage])
_TR_END()
_TR_BEGIN()
_TD([2019-10-22])
_TD([
_A([blog/blueshift/], [just an excuse to learn POSIX shell scripting], [Blueshift: a shell script for OpenBSD users])
])
_TD([POSIX shell])
_TR_END()
_TR_BEGIN()
_TD([2019-09-24])
_TD([
_A([blog/i-want-my-bsd/], [how I got into BSD, and why], [I Want My BSD])
])
_TD([unix])
_TR_END()
_TBODY_END()
_T_END()
_H2([Wasn't There More Here?])
_P([Don't worry. Your memory isn't playing tricks on you. There used to be more stuff on this website. I'm moving it elsewhere, but I'm not going to tell you where because I don't want that site directly tied to this one.])
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()


D site/blog/missing-pseudonymous-web/index.m4 => site/blog/missing-pseudonymous-web/index.m4 +0 -30
@@ 1,30 0,0 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [About])
m4_define([_V_PAGE_DESCRIPTION], [Information about this website])
m4_define([_V_PAGE_URL], [about/index.html])
m4_define([_V_PAGE_SOURCE], [about/index.m4])
_DOCTYPE()
_HTML_BEGIN()
_MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_ARTICLE_BEGIN()
_DIV_BEGIN()
_H1([])
_I([published on _TIME([2020-01-01], [1 January 2020])])
_DIV_END()
_SECTION_BEGIN()
_H2([Introduction])
_P([])
_SECTION_END()
_ARTICLE_END()
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()


M site/index.m4 => site/index.m4 +3 -11
@@ 1,6 1,6 @@
m4_include(website.m4)
m4_define([_V_PAGE_TITLE], [Home])
m4_define([_V_PAGE_DESCRIPTION], [Welcome to Matthew Graybosch's website])
m4_define([_V_PAGE_DESCRIPTION], [This is a website built with m4 and a makefile on OpenBSD.])
m4_define([_V_PAGE_URL], [index.html])
m4_define([_V_PAGE_SOURCE], [index.m4])
_DOCTYPE()


@@ 9,19 9,11 @@ _MAKE_HEAD()
_BODY_BEGIN()
_MAKE_SKIP_NAV()
_MAKE_HEADER()
_MAKE_TOP_NAV()
_MAIN_BEGIN()
_H1([Hello])
_P([I'm a long-haired metalhead from New York who writes literary rock operas and codes for a living. You may have heard of me. You might even have read something of mine.])
_P([If you're looking for my heavy metal saga, _B([Starbreaker]), please visit _A([https://www.starbreakersaga.com], [my Starbreaker saga, online], [starbreakersaga.com]). Otherwise, please feel free to poke around.])
_P([
_IMG([/assets/images/author-cropped.png], [Photo of the author atop Rockefeller Center in NYC], [200], [200])
_BR()
Photo by _A([https://www.catherinegatt.com], [my wife and occasional co-author], [Catherine Gatt]), 2007
])
_P([This is a website that you can build using m4 and a makefile on OpenBSD and other Unix-like operating systems that provide these tools.])
_P([You should have gotten this from the _A([https://git.sr.ht/~demifiend/m4-website/], [grab your copy online], [public git repository]). To get started, check out the included README file, and take a look at the m4 files in the inc/ directory. Change the values in variables.m4, use or or build upon the templates included in the templates/ directory, and adjust the makefile to suit you. If you want to do SEO, consider the sitemaps/ directory. If you want to make a blog, you'll want to check out the feeds/ directory as well.])
_MAIN_END()
_MAKE_NOSCRIPT()
_MAKE_BOTTOM_NAV()
_MAKE_FOOTER()
_BODY_END()
_HTML_END()

R seo/sitemap.m4 => sitemaps/sitemap.m4 +1 -2
@@ 1,6 1,5 @@
m4_include(map.m4)
m4_include(sitemaps.m4)

_SITEMAP_OPEN()
_ENTRY([index.html])
_ENTRY([about/index.html])
_SITEMAP_CLOSE()

R page.template => templates/page.m4 +0 -0

R post.template => templates/post.m4 +0 -0