russell.ballestrini.net/Makefile
Russell Ballestrini b5232587c2 Add JSONResume theme targets & OG/Twitter meta tag support
- Makefile: Add jsonresume-all-html target to export resume in 30 themes
- Makefile: Curate list of 30 tested working JSONResume themes
- pelicanconf.py: Add extract_first_image filter for social media unfurling
- Resume: Add Queues skill category (SQS, RabbitMQ, ZMQ)
2025-12-15 08:19:25 -05:00

149 lines
8 KiB
Makefile

.PHONY: html help clean regenerate serve devserver publish pygments jsonresume jsonresume-themes jsonresume-preview jsonresume-export jsonresume-all-html
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
help:
@echo 'Makefile for a pelican Web site '
@echo ' '
@echo 'Usage: '
@echo ' make venv setup virtual environment '
@echo ' make resume (re)generate the resume PDF '
@echo ' make jsonresume copy JSONResume to output '
@echo ' make jsonresume-themes install resume-cli & 30 themes '
@echo ' make jsonresume-preview THEME=x preview with theme (default: even) '
@echo ' make jsonresume-export THEME=x export HTML with theme '
@echo ' make jsonresume-all-html export resume as HTML in all themes'
@echo ' make cover-letters (re)generate cover letter PDFs '
@echo ' make html (re)generate the web site '
@echo ' make clean remove the generated files '
@echo ' make regenerate regenerate files upon modification '
@echo ' make publish generate using production settings '
@echo ' make serve serve site at http://localhost:8000'
@echo ' make devserver serve and regenerate together '
@echo ' make pygments generate pygments stylesheets '
@echo ' '
THEME_REPO_URL ?= git@github.com:russellballestrini/pelican-svbhack.git
venv:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
mkdir -p pelican-themes
cd pelican-themes && git clone $(THEME_REPO_URL)
venv/bin/pelican-themes -i pelican-themes/pelican-svbhack/
resume: jsonresume
venv/bin/rst2pdf content/pages/russell.ballestrini.resume.rst --stylesheets content/pages/russell.ballestrini.resume.style -o output/uploads/russell.ballestrini.resume.pdf
@echo "Creating softlinks for various job titles..."
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf founding.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf software.developer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf senior.software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf staff.software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf principal.software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf full.stack.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf site.reliability.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf sre.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf devops.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf backend.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf platform.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf infrastructure.engineer.russell.ballestrini.resume.pdf
@echo "Resume softlinks created!"
jsonresume:
@mkdir -p output/uploads
cp content/pages/russell.ballestrini.resume.json output/uploads/russell.ballestrini.resume.json
cp content/pages/unturf.resume.json output/uploads/unturf.resume.json
@echo "JSONResume files copied to output/uploads/"
# JSONResume themes - 30 tested working themes
JSONRESUME_THEMES = classy cora dark-classy-responsive elegant eloquent even kards kendall \
light-classy-responsive lucide modern modern-extended modern-plain msresume nameme one \
onepage-plus printclassy projects rnord rocketspacer sceptile simplyelegant stackoverflow \
stackoverflow-ru straightforward tan-responsive techlead timeline-fixed waterfall
jsonresume-themes:
@echo "Installing resume-cli & 30 tested themes..."
npm install resume-cli $(addprefix jsonresume-theme-,$(JSONRESUME_THEMES)) --legacy-peer-deps
@echo "Done! Preview with: make jsonresume-preview THEME=even"
# Preview JSONResume with a theme (default: even)
THEME ?= even
RESUME_FILE ?= content/pages/russell.ballestrini.resume.json
jsonresume-preview:
@echo "Previewing $(RESUME_FILE) with theme: $(THEME)"
npx resume serve --theme $(THEME) --resume $(RESUME_FILE)
# Export JSONResume to HTML with a theme
jsonresume-export:
@mkdir -p output/uploads
@echo "Exporting $(RESUME_FILE) with theme: $(THEME)"
npx resume export output/uploads/russell.ballestrini.resume.html --theme $(THEME) --resume $(RESUME_FILE)
@echo "Exported to output/uploads/russell.ballestrini.resume.html"
# Export JSONResume as HTML in all themes (uses direct node render to avoid resume-cli issues)
jsonresume-all-html:
@mkdir -p output/uploads/jsonresume-themes
@echo "Generating HTML for all themes..."
@for theme in $(JSONRESUME_THEMES); do \
echo " Generating $$theme..."; \
node -e "try { \
const t = require('jsonresume-theme-$$theme'); \
const r = require('./$(RESUME_FILE)'); \
require('fs').writeFileSync('output/uploads/jsonresume-themes/russell.ballestrini.$$theme.html', t.render(r)); \
console.log(' OK'); \
} catch(e) { console.log(' Failed:', e.message.split('\n')[0]); }" 2>/dev/null || echo " Failed: $$theme"; \
done
@echo "HTML files saved to output/uploads/jsonresume-themes/"
@echo "Open in browser & print to PDF"
cover-letter:
@if [ -z "$(FILE)" ]; then \
echo "Usage: make cover-letter FILE=filename-without-extension"; \
echo "Example: make cover-letter FILE=2025-11-29-runpod-principal-software-engineer-storage-systems-russell-ballestrini"; \
exit 1; \
fi
@mkdir -p output/uploads/cover-letters
@echo "Generating PDF for $(FILE)..."
@venv/bin/rst2pdf content/pages/cover-letters/$(FILE).rst -o output/uploads/cover-letters/$(FILE).pdf
@echo "PDF generated: output/uploads/cover-letters/$(FILE).pdf"
cover-letters:
@mkdir -p output/uploads/cover-letters
@for letter in content/pages/cover-letters/*.rst; do \
basename=$$(basename $$letter .rst); \
echo "Generating PDF for $$basename..."; \
venv/bin/rst2pdf $$letter -o output/uploads/cover-letters/$$basename.pdf; \
done
@echo "All cover letters generated in output/uploads/cover-letters/"
html: pygments
venv/bin/pelican content -o output -s pelicanconf.py
clean:
[ ! -d output ] || rm -rf output
regenerate:
venv/bin/pelican -r content -o output -s pelicanconf.py
serve:
venv/bin/pelican -l content -o output -s pelicanconf.py
devserver:
venv/bin/pelican -lr content -o output -s pelicanconf.py
publish:
venv/bin/pelican content -o output -s publishconf.py
pygments:
@echo "Generating pygments stylesheets..."
venv/bin/python -c "from pygments.formatters import HtmlFormatter; print(HtmlFormatter(style='monokai').get_style_defs('.highlight'))" > pelican-themes/pelican-svbhack/static/css/pygments-dark.css
venv/bin/python -c "from pygments.formatters import HtmlFormatter; print(HtmlFormatter(style='default').get_style_defs('.highlight'))" > pelican-themes/pelican-svbhack/static/css/pygments-light.css
@echo "Patching to remove hardcoded backgrounds..."
sed -i 's/.highlight { background: #272822; color: #f8f8f2 }/.highlight { color: #f8f8f2 }/' pelican-themes/pelican-svbhack/static/css/pygments-dark.css
sed -i 's/.highlight { background: #f8f8f8; }/.highlight { }/' pelican-themes/pelican-svbhack/static/css/pygments-light.css
@echo "Done! Pygments stylesheets generated and patched."