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)
This commit is contained in:
parent
93ce9a9cab
commit
b5232587c2
4 changed files with 43 additions and 13 deletions
39
Makefile
39
Makefile
|
|
@ -1,4 +1,4 @@
|
|||
.PHONY: html help clean regenerate serve devserver publish pygments jsonresume jsonresume-themes jsonresume-preview jsonresume-export
|
||||
.PHONY: html help clean regenerate serve devserver publish pygments jsonresume jsonresume-themes jsonresume-preview jsonresume-export jsonresume-all-html
|
||||
|
||||
BASEDIR=$(CURDIR)
|
||||
INPUTDIR=$(BASEDIR)/content
|
||||
|
|
@ -13,9 +13,10 @@ help:
|
|||
@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 & themes '
|
||||
@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 '
|
||||
|
|
@ -59,16 +60,16 @@ jsonresume:
|
|||
cp content/pages/unturf.resume.json output/uploads/unturf.resume.json
|
||||
@echo "JSONResume files copied to output/uploads/"
|
||||
|
||||
# JSONResume themes - install resume-cli and ALL themes (~200+) locally
|
||||
# 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 locally..."
|
||||
npm install resume-cli
|
||||
@echo "Fetching all jsonresume themes from npm registry..."
|
||||
@curl -s "https://registry.npmjs.org/-/v1/search?text=jsonresume-theme&size=250" | \
|
||||
python3 -c "import sys,json; [print(p['package']['name']) for p in json.load(sys.stdin).get('objects',[]) if p['package']['name'].startswith('jsonresume-theme-')]" | \
|
||||
xargs -r npm install --ignore-scripts 2>/dev/null || true
|
||||
@echo "Installed 200+ themes! Preview with: make jsonresume-preview THEME=even"
|
||||
@echo "Popular themes: even, elegant, stackoverflow, actual, flat, kendall, orbit, paper, spartan, class"
|
||||
@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
|
||||
|
|
@ -84,6 +85,22 @@ jsonresume-export:
|
|||
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"; \
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@
|
|||
{
|
||||
"name": "Cloud Infrastructure",
|
||||
"level": "Expert",
|
||||
"keywords": ["AWS", "GCP", "Digital Ocean", "unsandbox", "CloudFormation", "ECS", "EC2", "SQS", "RDS", "DynamoDB", "RabbitMQ"]
|
||||
"keywords": ["AWS", "GCP", "Digital Ocean", "unsandbox", "CloudFormation", "ECS", "EC2", "RDS", "DynamoDB"]
|
||||
},
|
||||
{
|
||||
"name": "DevOps & CI/CD",
|
||||
|
|
@ -165,6 +165,11 @@
|
|||
"level": "Advanced",
|
||||
"keywords": ["Sqlite3", "MySQL", "PostgreSQL", "DynamoDB", "MongoDB"]
|
||||
},
|
||||
{
|
||||
"name": "Queues",
|
||||
"level": "Advanced",
|
||||
"keywords": ["SQS", "RabbitMQ", "ZMQ"]
|
||||
},
|
||||
{
|
||||
"name": "Web Technologies",
|
||||
"level": "Expert",
|
||||
|
|
|
|||
|
|
@ -91,4 +91,5 @@ Technical Skills
|
|||
- **Cloud**: AWS, GCP, Digital Ocean, unsandbox
|
||||
- **DevOps**: Gitlab, SaltStack, Ansible, Packer, Docker, Kubernetes, Firecracker, LXD/LXC, KVM, libvirt, gitlab-ci runners
|
||||
- **Databases**: Sqlite3, MySQL, PostgreSQL, DynamoDB, MongoDB
|
||||
- **Queues**: SQS, RabbitMQ, ZMQ
|
||||
- **Web**: Flask, Pyramid, uWSGI, Nginx, Apache, Caddy, SSE, Websockets, OpenAPI
|
||||
|
|
|
|||
|
|
@ -109,7 +109,14 @@ PLUGIN_PATHS = ["pelican-plugins", "lib"]
|
|||
PLUGINS = ["random_article", "strip_toc_summary"]
|
||||
|
||||
# register filters.
|
||||
# JINJA_FILTERS = {'linkpeek':linkpeek}
|
||||
import re
|
||||
|
||||
def extract_first_image(content):
|
||||
"""Extract first image URL from HTML content."""
|
||||
match = re.search(r'(?:src|href)=["\']([^"\']+\.(?:jpg|jpeg|png|gif|webp))["\']', content, re.IGNORECASE)
|
||||
return match.group(1) if match else None
|
||||
|
||||
JINJA_FILTERS = {'extract_first_image': extract_first_image}
|
||||
|
||||
# register linkpeek docutils directive.
|
||||
import sys
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue