Files
robbis.space/themes/gokarna/screenshot.py
Robert Rapp 1f354130bb Theme fest ins Repo uebernehmen statt als Submodule
Ein normaler git clone holt Submodules nicht mit - geprueft: nach dem
Klonen des Repos war themes/gokarna leer. Portainer klont ebenso, der
Build im Container waere also an dem fehlenden Theme gescheitert.

Gokarna liegt jetzt direkt im Repo, festgeschrieben auf Commit 8306042,
den Stand, mit dem die Seite bisher gebaut wurde. .gitmodules entfaellt.

Nachteil: Theme-Updates muessen kuenftig von Hand eingespielt werden.
Dafuer baut das Repo aus jedem beliebigen Klon heraus, ohne
Sonderbehandlung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 01:25:39 +02:00

105 lines
3.6 KiB
Python

"""
Open firefox in headless mode and take screenshots of
all the pages in both light and dark mode
Setup:
pip install selenium==4.10.0 pillow soldier
Add geckodriver to $PATH. Link: https://github.com/mozilla/geckodriver/releases
"""
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from PIL import Image
import os
import soldier
SCREENSHOT_OPTIONS = [
{'path': '/', 'filename': 'images/screenshot-{color_pref}-home.png'},
{'path': '/posts/', 'filename': 'images/screenshot-{color_pref}-list.png'},
{'path': '/posts/theme-documentation-basics/', 'filename': 'images/screenshot-{color_pref}-post.png'},
]
DARK_THEME = (34, 39, 45, 255)
LIGHT_THEME = (255, 255, 255, 255)
def get_dominant_color(img_path):
pil_img = Image.open(img_path)
img = pil_img.copy()
img.convert("RGB")
img.resize((1, 1), resample=0)
dominant_color = img.getpixel((0, 0))
return dominant_color
def take_screenshots(driver, base_url, screenshot_options):
for opt in screenshot_options:
driver.get(base_url + opt['path'])
color_a_filename = opt['filename'].format(color_pref='color-a')
color_b_filename = opt['filename'].format(color_pref='color-b')
driver.save_screenshot(color_a_filename)
# Change theme by clicking the theme toggle button
for elem in driver.find_elements(By.CLASS_NAME, 'dark-theme-toggle'):
# Hidden hamburger menu for mobile raises Exception on clicking
if elem.is_displayed():
elem.click()
driver.save_screenshot(color_b_filename)
for f in (color_a_filename, color_b_filename):
if get_dominant_color(f) == LIGHT_THEME:
os.rename(f, opt['filename'].format(color_pref='light'))
elif get_dominant_color(f) == DARK_THEME:
os.rename(f, opt['filename'].format(color_pref='dark'))
else:
raise Exception('Image does not match theme')
print(f'Saved {opt["path"]}')
def merge_home_images():
light_home = Image.open('images/screenshot-light-home.png')
dark_home = Image.open('images/screenshot-dark-home.png')
if light_home.size != dark_home.size:
raise Exception('Image sizes should be same')
width, height = light_home.size
light_home_half = light_home.crop((0, 0, int(width/2), height))
dark_home_half = dark_home.crop((int(width/2), 0, width, height))
merged_img = Image.new('RGB', (width, height))
# Since we are merging horizontally, we will keep the offset of x-axis
x_offset = 0
for img in (light_home_half, dark_home_half):
merged_img.paste(img, (x_offset, 0))
x_offset += img.size[0]
merged_img.save('images/screenshot.png')
merged_img.save('images/tn.png')
print('Created merged image for hugo showcase')
def main():
server_process = soldier.run('hugo --source="exampleSite/" server', background=True, shell=True)
service = Service()
options = Options()
options.add_argument('--headless')
if os.getenv('FIREFOX_PATH'):
options.binary_location = os.getenv('FIREFOX_PATH')
driver = webdriver.Firefox(service=service, options=options)
# To offset screen size based on window size
driver.set_window_size(1500, 1085)
base_url = 'http://127.0.0.1:1313'
take_screenshots(driver, base_url, SCREENSHOT_OPTIONS)
merge_home_images()
driver.quit()
server_process.kill(with_honor=False)
if __name__ == '__main__':
main()